Inicio / Artículos

Ejecutar el mismo bucle de chat de OpenAI localmente con Ollama

Ejecuta el mismo bucle de chat de OpenAI localmente con Ollama: dirige el SDK de Python de OpenAI a localhost y mantén tu código. Sin clave de API, sin facturación por tokens, sin datos que salgan.

Editor: REACTAPP.TOP4 min de lectura1024 palabras

Fuentes: Part 5 — Run the Same Loop on Ollama (no API key, OpenAI dialect)

Los chats con proveedores alojados cuestan dinero, y cada solicitud se envía al centro de datos de otra persona. Al ejecutar un modelo abierto en tu propia máquina con Ollama, se eliminan ambos problemas. Lo mejor es que el código de chat basado en OpenAI sigue funcionando, ya que solo cambia la dirección.

Mismo dialecto, máquina diferente

Ollama es un servidor de modelos local. Después de instalarlo, descargas un modelo una sola vez, y los pesos se descargan de la misma manera que una imagen Docker. Luego, el servidor escucha solicitudes HTTP en localhost:11434. Lo que lo hace conveniente es que Ollama imita intencionadamente la API Chat Completions de OpenAI: la misma ruta /v1/chat/completions, la misma lista de mensajes con etiquetas de rol, la misma estructura de respuesta con choices[0].message.content, y los mismos contadores de uso.

Mover un bucle de chat de OpenAI, por lo tanto, no constituye una reescritura. Es un cambio de dirección. La ventaja es evidente: no hay clave API, no hay costo por token y los datos no salen de la máquina; a cambio, se obtiene la velocidad del propio hardware y la calidad de un modelo abierto en lugar de uno de vanguardia. Para aprender cómo funcionan los agentes, donde cientos de iteraciones son normales, eso representa una oferta muy buena.

Configuración y un solo turno

Descarga Ollama desde ollama.com. Se instala en un solo paso y ejecuta el servidor en segundo plano. A continuación, carga un modelo pequeño; llama3.2, de unos 2 GB, es una opción adecuada por defecto. No se necesita nada nuevo en el lado de Python, ya que el paquete estándar openai simplemente apunta a otra ubicación:

from openai import OpenAI

# Part 2's SDK, different address
client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama",  # required, unused
)

resp = client.chat.completions.create(
    model="llama3.2",
    messages=[
        {
            "role": "system",
            "content": "You are a concise "
                       "assistant.",
        },
        {
            "role": "user",
            "content": "Where are you running "
                       "right now?",
        },
    ],
    temperature=0,
)
print(resp.choices[0].message.content)

Dos configuraciones merecen mención. Al dirigir base_url a localhost, todo el tráfico se redirige lejos de OpenAI. La cadena api_key="ollama" parece inútil, pero no lo es: el SDK se niega a crear un cliente sin ninguna clave, mientras que Ollama ignora todo lo que se envíe, por lo que cualquier texto distinto de vacío servirá. Finalmente, model debe ser un nombre que ya hayas descargado. No existe un nivel de precios para seleccionar, solo lo que se encuentra en tu disco, lo cual mostrará ollama list.

El bucle de historial permanece igual

Una buena prueba de que se trata del “mismo dialecto” es si la función ask() anterior se ejecuta contra Ollama sin ninguna modificación. Así es. Solo el código que crea el cliente es diferente.

Una breve conversación lo demuestra, comenzando con un mensaje del sistema y desarrollándose a partir de ahí:

msgs = [{
    "role": "system",
    "content": "You are a concise assistant.",
}]

def ask(text: str) -> str:
    msgs.append(
        {"role": "user", "content": text}
    )
    resp = client.chat.completions.create(
        model="llama3.2",
        messages=msgs,  # full history
        temperature=0,
    )
    reply = resp.choices[0].message.content
    msgs.append({
        "role": "assistant",
        "content": reply,
    })
    return reply

print(ask("Define a context window."))
print(ask("Now for a five-year-old."))
print(ask("Which answer was shorter?"))

La tercera pregunta sigue demostrando el mecanismo de historial, y todo lo aprendido de la versión alojada se mantiene. El servidor no recuerda nada entre llamadas. La lista creciente de msgs es la razón por la cual las respuestas posteriores tardan más tiempo. Aquí no se cobra, pero sí se paga por segundo, y observar cómo un modelo local se ralentiza a medida que se acumula el historial hace que el costo del contexto parezca real de una manera en la que una factura nunca podría hacerlo.

Establezca sus expectativas en consecuencia. Un modelo con unos 3 mil millones de parámetros es notablemente menos preciso que GPT-4o o Claude. Puede divagar más allá de la instrucción del sistema o cometer errores al comparar, como determinar cuál de dos cosas es más corta. Eso no es un error en el bucle; es lo que se obtiene con 3 mil millones de parámetros, y ver esa diferencia de primera mano enseña más que leer resultados de pruebas.

Ejecutar el ejemplo

Tres comandos se encargan de ello. El primero instala el modelo, el segundo instala las dependencias de Python y el tercero ejecuta el script:

# one-time: install from ollama.com, then
ollama pull llama3.2

pip install -r requirements.txt
python examples/part05_ollama.py

Antes que nada, el script verifica que el servidor Ollama responda en localhost:11434. Si no lo hace, el script finaliza con instrucciones para instalarlo y descargarlo. Eso corresponde localmente a la estrategia de fallar rápidamente ante la ausencia de una clave API. Luego ejecuta la conversación de un turno y la de tres turnos, y registra el uso de tokens, ya que Ollama informa el uso en los mismos campos. No hay clave ni costo alguno. También se mantiene fuera de los entornos CI, por una razón diferente a los ejemplos alojados: las máquinas CI no ejecutan un servidor de modelos.

Cuando algo sale mal

  • Un error de “modelo no encontrado” significa que esa etiqueta específica aún no se ha descargado, así que ejecute ollama pull llama3.2.
  • Un error de conexión indica que el servidor no está en ejecución. Inícielo con ollama serve, aunque las instalaciones de escritorio lo lanzan automáticamente.
  • Hay una pausa de varios segundos antes del primer token al usarlo por primera vez, ya que el modelo se está cargando en la memoria. Nada se ha bloqueado.
  • Por qué vale la pena usar un endpoint local

    Los experimentos con agentes se repiten sin fin. Los pipelines de recuperación se reconstruyen, los bucles de razonamiento realizan varias llamadas al modelo para una sola pregunta, y los flujos de trabajo basados en grafos se vuelven a ejecutar después de cada pequeño ajuste de depuración. Pagar por token en cada una de esas ejecuciones acaba siendo costoso, mientras que un endpoint local gratuito permite experimentar sin tener que vigilar un contador. Dado que Ollama utiliza el dialecto de OpenAI, cualquier ejemplo puede ejecutarse de la misma manera cambiando solo la URL base y el nombre del modelo, nada más. El resultado es un entorno de pruebas con tokens ilimitados.

    El siguiente tema obvio es el RAG. Un modelo no puede conocer tus documentos, por lo que la verdadera pregunta es qué tokens merecen un lugar en la ventana de contexto.

    Leer más

  • Convertirse en ingeniero de IA en 2026 sin título en ciencias de la computación — Un plan paso a paso para convertirse en ingeniero de IA en 2026 sin tener título en esta área: las siete áreas de habilidad, proyectos pequeños, experiencia en el mundo real y networking inteligente.