Esta es la primera parte de una inmersión más profunda en Ollama y lo que he aprendido sobre los LLM locales y cómo se pueden utilizar para aplicaciones basadas en inferencia. En esta publicación, aprenderá sobre:
Para comprender los conceptos básicos de los LLM (incluidos los LLM locales), puede consultar mi publicación anterior sobre este tema aquí .
En el espacio de los LLM locales, me encontré por primera vez con LMStudio. Si bien la aplicación en sí es fácil de usar, me gustó la simplicidad y maniobrabilidad que ofrece Ollama. Para conocer más sobre Ollama puedes ingresar aquí .
tl;dr: Ollama alberga su propia lista seleccionada de modelos a los que tienes acceso.
Puede descargar estos modelos a su máquina local y luego interactuar con esos modelos a través de una línea de comando. Alternativamente, cuando ejecuta el modelo, Ollama también ejecuta un servidor de inferencia alojado en el puerto 11434 (de forma predeterminada) con el que puede interactuar mediante API y otras bibliotecas como Langchain.
A partir de esta publicación, Ollama tiene 74 modelos, que también incluyen categorías como modelos integrados.
Descarga Ollama para el sistema operativo de tu elección. Una vez hecho esto, ejecuta el comando ollama
para confirmar que está funcionando. Debería mostrarte el menú de ayuda.
Usage: ollama [flags] ollama [command] Available Commands: serve Start ollama create Create a model from a Modelfile show Show information for a model run Run a model pull Pull a model from a registry push Push a model to a registry list List models cp Copy a model rm Remove a model help Help about any command Flags: -h, --help help for ollama -v, --version Show version information Use "ollama [command] --help" for more information about a command.
Para usar cualquier modelo, primero debe “sacarlos” de Ollama, de manera muy similar a como lo haría con una imagen de Dockerhub (si lo ha usado en el pasado) o algo como Elastic Container Registry (ECR).
Ollama viene con algunos modelos predeterminados (como llama2
, que es el LLM de código abierto de Facebook) que puedes ver ejecutándolo.
ollama list
Seleccione el modelo (digamos phi
) con el que le gustaría interactuar desde la página de la biblioteca de Ollama . Ahora puede desplegar este modelo ejecutando el comando
ollama pull phi
Una vez que se completa la descarga, puede verificar si el modelo está disponible localmente ejecutando:
ollama list
Ahora que el modelo está disponible, está listo para ejecutarse. Puede ejecutar un modelo usando el comando:
ollama run phi
La precisión de las respuestas no siempre es excelente, pero puede solucionarlo seleccionando diferentes modelos o tal vez haciendo algunos ajustes o implementando una solución similar a RAG por su cuenta para mejorar la precisión.
Lo que he demostrado anteriormente es cómo puedes usar los modelos de Ollama usando la línea de comando. Sin embargo, si verifica el servidor de inferencia que Llama está ejecutando, podrá ver que hay formas programáticas de acceder a él presionando el puerto 11434.
Si desea utilizar Langchain para acceder a su modelo de Ollama, puede usar algo como:
from langchain_community.llms import Ollama from langchain.chains import RetrievalQA prompt = "What is the difference between an adverb and an adjective?" llm = Ollama(model="mistral") qa = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=retriever, return_source_documents=True, ) response = qa(prompt)
También puedes crear tu propia variante de modelo utilizando el concepto de Modelfile
en Ollama. Para configurar más parámetros en su Modelfile, puede consultar estos documentos.
Archivo de modelo de ejemplo:
# Downloaded from Hugging Face https://huggingface.co/TheBloke/finance-LLM-GGUF/tree/main FROM "./finance-llm-13b.Q4_K_M.gguf" PARAMETER temperature 0.001 PARAMETER top_k 20 TEMPLATE """ {{.Prompt}} """ # set the system message SYSTEM """ You are Warren Buffet. Answer as Buffet only, and do so in short sentences. """
Una vez que tenga el Modelfile, puede crear su modelo usando
ollama create arjunrao87/financellm -f Modelfile
donde financellm
es el nombre de su modelo LLM y arjunrao87
sería reemplazado por su nombre de usuario de ollama.com (que también actúa como espacio de nombres de su registro de ollama en línea). En este punto, puedes usar tu modelo creado como cualquier otro modelo en Ollama.
También puede optar por enviar su modelo al registro remoto de ollama. Para que esto suceda, es necesario
Una vez que haya creado su llm local, puede enviarlo al registro de ollama usando:
ollama push arjunrao87/financellm
🦄 Ahora, vayamos a la parte buena.
Durante mi búsqueda para utilizar Ollama, uno de los descubrimientos más agradables fue este ecosistema de creadores de aplicaciones web basados en Python que encontré. Chainlit se puede utilizar para crear un chatbot completo como ChatGPT. Como dice su página,
Chainlit es un paquete Python de código abierto para crear IA conversacional lista para producción
Revisé algunos de los tutoriales de Chainlit para comprender lo que puedes hacer con Chainlit, que incluye cosas como crear secuencias de tareas (llamadas "pasos"), habilitar botones y acciones, enviar imágenes y todo tipo de cosas. Puedes seguir esta parte de mi viaje aquí .
Una vez que aprendí a Chainlit, quise armar un chatbot sencillo que básicamente usara Ollama para poder usar un LLM local para chatear (en lugar de decir ChatGPT o Claude).
Con menos de 50 líneas de código, puedes hacerlo usando Chainlit + Ollama. ¿No es una locura?
Chainlit como biblioteca es muy sencillo de usar. También utilicé Langchain para usar e interactuar con Ollama.
from langchain_community.llms import Ollama from langchain.prompts import ChatPromptTemplate import chainlit as cl
El siguiente paso es definir cómo desea que se vea la pantalla de carga del chatbot, utilizando el decorador @cl.on_chat_start
de chainlit —
@cl.on_chat_start async def on_chat_start(): elements = [cl.Image(name="image1", display="inline", path="assets/gemma.jpeg")] await cl.Message( content="Hello there, I am Gemma. How can I help you?", elements=elements ).send() .... ....
La interfaz Message
es lo que utiliza Chainlit para enviar respuestas a la interfaz de usuario. Puede construir mensajes con la clave content
simple y luego puede adornarlos con cosas como elements
que, en mi caso, agregué una Image
para mostrar una imagen cuando el usuario inicia sesión por primera vez.
El siguiente paso es invocar Langchain para crear una instancia de Ollama (con el modelo de su elección) y construir la plantilla de solicitud. El uso de cl.user_session
es principalmente para mantener la separación de los contextos e historiales de los usuarios, lo cual no es estrictamente necesario solo para ejecutar una demostración rápida.
Chain es una interfaz Langchain llamada Runnable
que se utiliza para crear cadenas personalizadas. Puedes leer mas al respecto aquí .
@cl.on_chat_start async def on_chat_start(): .... .... model = Ollama(model="mistral") prompt = ChatPromptTemplate.from_messages( [ ( "system", "You are a knowledgeable historian who answers super concisely", ), ("human", "{question}"), ] ) chain = prompt | model cl.user_session.set("chain", chain)
Ahora tiene todas las piezas para tener una interfaz de usuario de chatbot y aceptar entradas de usuarios. ¿Qué haces con las indicaciones que proporciona el usuario? Utilizará el controlador @cl.on_message
de Chainlit para hacer algo con el mensaje proporcionado por el usuario.
@cl.on_message async def on_message(message: cl.Message): chain = cl.user_session.get("chain") msg = cl.Message(content="") async for chunk in chain.astream( {"question": message.content}, ): await msg.stream_token(chunk) await msg.send()
chain.astream
como sugieren los documentos "transmitir fragmentos de la respuesta asíncrona", que es lo que queremos para nuestro bot.
Eso es realmente todo. Unas cuantas importaciones, un par de funciones, un poco de azúcar y tendrás un chatbot funcional.
Para ver el código completo, puedes ver mi GitHub .
Si este contenido es interesante para usted, presione el botón 👏 o suscríbase a mi boletín aquí → https://a1engineering.beehiiv.com/subscribe . ¡Me da la información de que necesito hacer más o menos algo! Gracias ❤️
También publicado aquí