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
| Feature | Ollama | LM 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