LangChain con Ollama y Docker

LangChain
Ollama
LLM
Docker
WSL2
Configurar LangChain para ejecutar LLM locales con Ollama y Docker
Published

June 26, 2025

En tutoriales y diversos artículos de LangChain he visto que usan muchos modelos LLMs comerciales como por ejemplo OpenAI, Claude, Gemini, etc. Y me estuve preguntando ¿cómo sería ejecutarlo con modelos locales como Llama3?, y ¿por qué no? Usar Docker1 y uv2.

Luego de un par de horas probando logré ejecutar LangChain usando Llama3 con ChatOllama3 dentro de Docker y en este pequeño blog te comparto algunos detalles importantes de cómo funciona.

1 Descripción del proyecto

El proyecto lo que hace es traducir un texto del idioma Inglés al Español usando Llama3 en local con Ollama.

2 Requerimientos

Para ejecutar el proyecto solo necesitarás tener Docker instalado y si tienes habilitada la GPU con tarjeta Nvidia se ejecutará con mayor rapidez.

3 Explicación del código

Dockerfile
FROM ubuntu:24.04

WORKDIR /app

# Prepare environment
RUN apt-get update \
  && apt-get install -y curl

# Install uv and ollama
1RUN curl -LsSf https://astral.sh/uv/install.sh | sh \
2  && curl -fsSL https://ollama.com/install.sh | sh

# Copy files to the image
COPY ./ /app/

# Run Ollama Serve, get Ollama model and run LangChain with uv
3CMD /bin/bash -c "ollama serve & sleep 2 && ollama pull llama3 && $HOME/.local/bin/uv run main.py ; pkill ollama"
1
Instalación de uv.
2
Instalación de Ollama.
3
Iniciar el server de Ollama en segundo plano, hay una espera de 2 segundos en lo que el server se levanta, luego descarga el modelo Llama3 para finalizar ejecutando con uv el proyecto.

Seguimos con el script de ejecución:

run.sh
# Build docker image
1docker build -f Dockerfile -t langchain_ollama_local .

# Run docker image with Nvidia GPU support
2docker run --gpus all -v ollama:/root/.ollama langchain_ollama_local
1
Compila la imagen del Dockerfile y le da como nombre langchain_ollama_local.
2
Crea y ejecuta un contenedor con la imagen construida en el paso anterior y creando un volumen compartido con el host con la intención de que en cada ejecución no descargue el modelo Llama3 (son más de 3GB).

Finalizamos con el siguiente archivo:

main.py
from langchain_ollama import ChatOllama

def main():
    print("Hello from langchain-local-llm-ollama!")
    human_request = "They say data is the new oil… and I'm the chemical engineer!"
    print(human_request)
    llm = ChatOllama(
1        model="llama3",
2        temperature=0,
    )
    
    messages = [
3        ("system", "You are a helpful assistant that translates English to Spanish. Be concise don't ask question and translate the user sentence.",),
        ("human", human_request),
    ]
    ai_msg = llm.invoke(messages)
4    print(ai_msg.content)

if __name__ == "__main__":
    main()
1
Debe haberse descargado el model antes de usarse, la imagen se descarga desde Dockerfile.
2
Controla el nivel de “creatividad” del modelo, 0 indica la menor creatividad.
3
Prompt del sistema.
4
El mensaje generado da diferentes métricas de metadata. Usar esta opción si solo quieres el mensaje de salida.

4 Ejecución

Para ejecutar solo basta ejecutar el archivo run.sh con el siguiente comando:

sh ./run.sh

Para el ejemplo de este proyecto dio el siguiente resultado:

5 Notas finales

  • Usar la GPU hace que la respuesta sea más rápida.
  • Este proyecto solo traduce texto, pero ya tiene la base para ejecutar otros proyectos con LangChain con LLMs locales con Docker y Ollama.
  • La imagen de Docker de Ollama permite ejecutarse en GPU de AMD4 no la he probado pero interesante que ya se pueda hacer con gráficas AMD.
  • Repositorio con el código completo: langchain-local-llm-ollama