Módulo 4: Ollama - Introducción

Integración Python con Ollama

Descripción

Crearás chatbot con Ollama usando Python. Reutilizarás código de módulos anteriores con cambio mínimo.

Tiempo: 30 minutos
Dificultad: Media


🎯 Objetivos

  • ✅ Migrar chatbot a Ollama
  • ✅ Comparar con OpenAI/LM Studio
  • ✅ Medir performance

💻 Código: Chatbot Ollama

#!/usr/bin/env python3
"""Chatbot con Ollama API"""

from openai import OpenAI

# Cliente Ollama (compatible OpenAI SDK)
client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama"
)

messages = [
    {"role": "system", "content": "Eres un asistente útil."}
]

def chat(user_message: str) -> str:
    messages.append({"role": "user", "content": user_message})
    
    response = client.chat.completions.create(
        model="mistral",
        messages=messages
    )
    
    assistant_message = response.choices[0].message.content
    messages.append({"role": "assistant", "content": assistant_message})
    
    return assistant_message

# CLI
while True:
    user_input = input("Tú: ")
    if user_input.lower() == "salir":
        break
    response = chat(user_input)
    print(f"Bot: {response}\n")

Cambio vs Módulo 2: Solo 2 líneas (base_url + api_key)


🔄 Comparación Multi-Provider

import os
from openai import OpenAI

PROVIDER = os.getenv("LLM_PROVIDER", "ollama")  # ollama, openai, lmstudio

if PROVIDER == "openai":
    client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
    model = "gpt-3.5-turbo"
elif PROVIDER == "lmstudio":
    client = OpenAI(base_url="http://localhost:1234/v1", api_key="not-needed")
    model = "mistral-7b-instruct"
elif PROVIDER == "ollama":
    client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")
    model = "mistral"

# Resto del código idéntico
response = client.chat.completions.create(
    model=model,
    messages=[...]
)

Ventaja: Switch provider con environment variable


📊 Performance Benchmark

import time
from openai import OpenAI

def benchmark_provider(base_url, model, name):
    client = OpenAI(base_url=base_url, api_key="test")
    
    start = time.time()
    response = client.chat.completions.create(
        model=model,
        messages=[{"role": "user", "content": "Hola"}]
    )
    latency = time.time() - start
    
    print(f"{name}: {latency:.2f}s")
    return latency

# Test
print("Benchmark (primeras queries, cold start):")
benchmark_provider("http://localhost:11434/v1", "mistral", "Ollama")
benchmark_provider("http://localhost:1234/v1", "mistral-7b-instruct", "LM Studio")

Output típico:

Ollama: 4.5s
LM Studio: 4.8s

Similares porque ambos locales con mismo hardware


🚀 Ollama-Specific Features

Streaming responses:

response = client.chat.completions.create(
    model="mistral",
    messages=[...],
    stream=True  # Ollama default
)

for chunk in response:
    print(chunk.choices[0].delta.content, end="", flush=True)

Custom parameters:

response = client.chat.completions.create(
    model="mistral",
    messages=[...],
    temperature=0.7,
    top_p=0.9,
    max_tokens=500,
    # Ollama-specific
    num_ctx=4096,  # Context window
    repeat_penalty=1.1  # Penaliza repetición
)

✅ Ventajas de Ollama vs LM Studio

FeatureOllamaLM Studio
CLI❌ (solo GUI)
Automatización✅ Scripts❌ Manual
Docker
CI/CD
GUI
Beginner-friendly⚠️

Recomendación:

  • Dev local simple: LM Studio
  • Producción/servers: Ollama

🐛 Troubleshooting

Error: Model not loaded

# Verifica modelos
ollama list

# Pull si falta
ollama pull mistral

Performance lenta

# Verifica RAM disponible
free -h  # Linux
vm_stat  # macOS

# Cierra apps pesadas
# O usa modelo más pequeño (Q2 quantization)

✅ Resumen

  • Código idéntico a Módulo 2 (solo endpoint cambia)
  • Performance similar a LM Studio (mismo hardware)
  • Ollama mejor para automatización/producción
  • LM Studio mejor para beginners

Siguiente: 06-docker-deployment.md

Aprenderás a deployar Ollama en Docker container.

Tiempo: 40 min