LangChain con Ollama y Docker
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
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:
- 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:
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:
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