Ollama en LangChain - Integración con Python
breve
Este documento describe cómo utilizar el Ollama Integración con LangChain para crear potentes aplicaciones de IA.Ollama es una herramienta de despliegue de código abierto para grandes modelos lingüísticos, mientras que LangChain es un marco para construir aplicaciones basadas en modelos lingüísticos. Combinando ambos, podemos desplegar y utilizar rápidamente modelos avanzados de IA en un entorno local.
Nota: Este documento contiene fragmentos de código básico y explicaciones detalladas. El código completo se encuentra en la páginaEste cuaderno JupyterEncontrado en.
1. Ajustes medioambientales
Configuración del entorno Conda
En primer lugar, necesitamos utilizar el entorno Conda en Jupyter. Ejecute el siguiente comando desde la línea de comandos:
conda create -n handlm python=3.10 -y
conda activate handlm
pip install jupyter
python -m ipykernel install --user --name=handlm
Después de la ejecución, reinicie Jupyter y seleccione el Kernel para ese entorno como se muestra:

⚠️ Nota
Atención: También es posible utilizar el entorno global directamente sin el entorno virtual de conda.
Instalación de dependencias
Antes de empezar, necesitamos instalar los siguientes paquetes:
langchain-ollama
: para integrar el modelo Ollama en el marco LangChainlangchain
Biblioteca principal de LangChain, que proporciona herramientas y abstracciones para crear aplicaciones de inteligencia artificial.langchain-community
: Incluye varias integraciones y herramientas aportadas por la comunidadPillow
: para el tratamiento de imágenes, que se utiliza en tareas multimodalesfaiss-cpu
: para construir RAG retriever
Se puede instalar con el siguiente comando:
pip install langchain-ollama langchain langchain-community Pillow faiss-cpu
2. Descargue los modelos necesarios e inicialice OllamaLLM
Descargar el modelo llama3.1
- Visite el sitio web oficial https://ollama.com/download para descargar e instalar Ollama en las plataformas compatibles disponibles.
- Visite https://ollama.ai/library para conocer todos los modelos disponibles.
- aprobar (una factura o inspección, etc.)
ollama pull <name-of-model>
para obtener los modelos LLM disponibles (por ejemplo:ollama pull llama3.1
).
La línea de comandos se ejecuta como se muestra en la figura:

Lugar de almacenamiento del modelo:
- Mac.
~/.ollama/models/
- Linux (o WSL).
/usr/share/ollama/.ollama/models
- Ventanas.
C:\Users\Administrator\.ollama\models
3. Ejemplos de uso básico
Mantener una conversación con ChatPromptTemplate
ChatPromptTemplate nos permite crear una plantilla reutilizable con uno o más parámetros. Estos parámetros pueden ser reemplazados dinámicamente en tiempo de ejecución para generar diferentes prompts.
template = """
你是一个乐于助人的AI,擅长于解决回答各种问题。
问题:{question}
"""
prompt = ChatPromptTemplate.from_template(template)
chain = prompt | model
chain.invoke({"question": "你比GPT4厉害吗?"})
En la sección Crear cadena, utilice el operador pipa |
Conecta el aviso con el modelo para formar un flujo de procesamiento. Este encadenamiento facilita la combinación y reutilización de distintos componentes.
invoke
desencadena toda la cadena de procesamiento, pasando nuestra pregunta a la plantilla y enviando el mensaje formateado al modelo para su procesamiento.
salida de streaming
La salida en flujo es una técnica que devuelve los resultados de forma incremental a medida que genera texto largo. Este método tiene varias ventajas importantes:
- Experiencia de usuario mejorada: los usuarios pueden ver resultados parciales inmediatamente, en lugar de esperar a que se complete toda la respuesta.
- Reducir el tiempo de espera: para respuestas largas, los usuarios pueden empezar a leer antes de que se genere la respuesta completa.
- Interacción en tiempo real: permite intervenir o finalizar durante el proceso de generación.
En la práctica, sobre todo en los chatbots o los sistemas de diálogo en tiempo real, la salida en streaming es casi imprescindible.
from langchain_ollama import ChatOllama
model = ChatOllama(model="llama3.1", temperature=0.7)
messages = [
("human", "你好呀"),
]
for chunk in model.stream(messages):
print(chunk.content, end='', flush=True)
model.stream()
es una envoltura de la interfaz de salida de flujo de la API de Ollama, que devuelve un objeto generador. Cuando se llama al método model.stream(messages)
Al hacerlo, se completan las siguientes operaciones:
- Envíe una solicitud a la API de Ollama para empezar a generar una respuesta.
- La API empieza a generar texto, pero en lugar de esperar a que esté todo generado, lo devuelve en pequeños trozos.
- Por cada pequeño fragmento de texto recibido, el
stream()
devuelve el bloque de texto. flush=True
Asegúrese de que cada clip se muestra inmediatamente, en lugar de esperar a que se llene el búfer.
Llamada a la herramienta
Las llamadas a herramientas son la capacidad de un modelo de IA para interactuar con funciones externas o API. Esto permite al modelo realizar tareas complejas como cálculos matemáticos, consultas de datos o llamadas a servicios externos.
def simple_calculator(operation: str, x: float, y: float) -> float:
'''实际的代码处理逻辑'''
llm = ChatOllama(
model="llama3.1",
temperature=0,
).bind_tools([simple_calculator])
result = llm.invoke("你知道一千万乘二是多少吗?")
bind_tools
nos permite registrar una función personalizada en el modelo. De este modo, cuando el modelo se encuentra con un problema que necesita ser calculado, puede llamar a esta función para obtener resultados precisos, en lugar de confiar en su conocimiento de pre-entrenamiento.
Esta capacidad resulta útil, por ejemplo, a la hora de crear aplicaciones de IA complejas:
- Crear chatbots que puedan acceder a datos en tiempo real
- Cree asistentes inteligentes que realicen tareas específicas (por ejemplo, reservas, consultas, etc.)
- Desarrollo de sistemas de IA capaces de realizar cálculos precisos u operaciones complejas
modelo multimodal
Ollama admite modelos multimodales como bakllava y llava. Los modelos multimodales son modelos de IA capaces de manejar múltiples tipos de entrada (por ejemplo, texto, imágenes, audio, etc.). Estos modelos destacan en la comprensión y generación de contenidos multimodales, lo que permite interacciones más complejas y naturales entre humanos y ordenadores.
En primer lugar, es necesario descargar el modelo multimodal. Ejecútalo en la línea de comandos:
ollama pull llava

A continuación, podemos utilizar el siguiente código para procesar la imagen y la entrada de texto:
from langchain_ollama import ChatOllama
from langchain_core.messages import HumanMessage
from langchain_core.output_parsers import StrOutputParser
llm = ChatOllama(model="llava", temperature=0)
def prompt_func(data):
'''构造多模态输入'''
chain = prompt_func | llm | StrOutputParser()
query_chain = chain.invoke(
{"text": "这个图片里是什么动物啊?", "image": image_b64}
)
El punto clave aquí es:
- Preprocesamiento de la imagen: necesitamos convertir la imagen en una cadena codificada en base64.
- Función de sugerencia:
prompt_func
Se crea una entrada multimodal que contiene texto e imágenes. - Encadenamiento: utilizamos
|
conecta la función de sugerencia, el modelo y el analizador de salida.
Los modelos multimodales son útiles en muchos escenarios, por ejemplo:
- Generación de imágenes
- sistema visual de preguntas y respuestas
- Análisis y recomendación de contenidos basados en imágenes
4. Uso avanzado
Conversación mediante ConversationChain
ConversationChain
es una potente herramienta proporcionada por LangChain para gestionar diálogos de varias rondas. Combina modelos lingüísticos, plantillas de avisos y componentes en memoria para facilitar la creación de sistemas de diálogo conscientes del contexto.
memory = ConversationBufferMemory()
conversation = ConversationChain(
llm=model,
memory=memory,
verbose=True
)
# 进行对话
response = conversation.predict(input="你好,我想了解一下人工智能。")
print("AI:", response)
response = conversation.predict(input="能给我举个AI在日常生活中的应用例子吗?")
print("AI:", response)
response = conversation.predict(input="这听起来很有趣。AI在医疗领域有什么应用?")
print("AI:", response)
El componente clave aquí es:
ConversationBufferMemory
: Se trata de un sencillo componente en memoria que almacena el historial de todas las conversaciones anteriores.ConversationChain
: Combina un modelo de lenguaje, memoria y una plantilla de diálogo predeterminada.
Mantener el historial de diálogo es importante porque permite a los modelos:
- Comprender el contexto y la información mencionada anteriormente
- Generar respuestas más coherentes y pertinentes
- Gestión de situaciones complejas de diálogo en varias rondas
En la práctica, puede que tenga que considerar el uso de componentes de memoria más avanzados, como el ConversationSummaryMemory
para manejar diálogos largos y evitar sobrepasar el límite de longitud de contexto del modelo.
Plantillas de avisos personalizadas
Unas plantillas de instrucciones bien diseñadas son la clave para crear aplicaciones de IA eficaces. En este ejemplo, hemos creado una consulta compleja para generar descripciones de productos:
system_message = SystemMessage(content="""
你是一位经验丰富的电商文案撰写专家。你的任务是根据给定的产品信息创作吸引人的商品描述。
请确保你的描述简洁、有力,并且突出产品的核心优势。
""")
human_message_template = """
请为以下产品创作一段吸引人的商品描述:
产品类型: {product_type}
核心特性: {key_feature}
目标受众: {target_audience}
价格区间: {price_range}
品牌定位: {brand_positioning}
请提供以下三种不同风格的描述,每种大约50字:
1. 理性分析型
2. 情感诉求型
3. 故事化营销型
"""
# 示例使用
product_info = {
"product_type": "智能手表",
"key_feature": "心率监测和睡眠分析",
"target_audience": "注重健康的年轻专业人士",
"price_range": "中高端",
"brand_positioning": "科技与健康的完美结合"
}
Hay varias consideraciones de diseño importantes para esta estructura:
- system_prompt: define las funciones y tareas generales de la IA, estableciendo el tono de todo el diálogo.
- human_message_template: proporciona la estructura de las instrucciones específicas y los mensajes requeridos.
- Diseño multiparamétrico: permite flexibilidad para adaptarse a diferentes productos y requisitos.
- Diversidad de requisitos de salida: anime a los modelos a demostrar su diversidad exigiendo diferentes estilos de descripción.
Tenga en cuenta lo siguiente a la hora de diseñar una plantilla de aviso eficaz:
- Definir claramente el papel y la misión de la IA
- Proporcionar un formato de entrada claro y estructurado
- Contiene requisitos específicos de producción y orientaciones sobre el formato
- Estudiar cómo maximizar la capacidad y creatividad del modelo
Creación de un sencillo sistema de preguntas y respuestas RAG
RAG (Retrieval-Augmented Generation) es una técnica de Inteligencia Artificial que combina la recuperación y la generación para aumentar la capacidad de respuesta de un modelo lingüístico mediante la recuperación de información relevante:
- Dividir los documentos de la base de conocimientos en trozos y crear índices vectoriales
- Vectorizar el problema del usuario y recuperar los documentos pertinentes en un índice
- Proporcionar los documentos relevantes recuperados al modelo lingüístico como contexto junto con la pregunta original.
- El modelo lingüístico genera respuestas basadas en la información recuperada
La ventaja de la GAR es que ayuda a los modelos lingüísticos a acceder a información actualizada y especializada, reduce las ilusiones y mejora la precisión y pertinencia de las respuestas.
LangChain proporciona una variedad de componentes que pueden integrarse perfectamente con los modelos Ollama. Aquí mostraremos cómo utilizar el modelo Ollama junto con un almacén vectorial y un recuperador para crear un sencillo sistema de preguntas y respuestas RAG.
Lo primero que hay que hacer es asegurarse de que se descarga el modelo de incrustación, lo que puede hacerse ejecutando el siguiente comando en la línea de comandos:
ollama pull nomic-embed-text
Así podremos construir el sistema RAG:
# 初始化 Ollama 模型和嵌入
llm = ChatOllama(model="llama3.1")
embeddings = OllamaEmbeddings(model="nomic-embed-text")
# 准备文档
text = """
Datawhale 是一个专注于数据科学与 AI 领域的开源组织,汇集了众多领域院校和知名企业的优秀学习者,聚合了一群有开源精神和探索精神的团队成员。
Datawhale 以" for the learner,和学习者一起成长"为愿景,鼓励真实地展现自我、开放包容、互信互助、敢于试错和勇于担当。
同时 Datawhale 用开源的理念去探索开源内容、开源学习和开源方案,赋能人才培养,助力人才成长,建立起人与人,人与知识,人与企业和人与未来的联结。
如果你想在Datawhale开源社区发起一个开源项目,请详细阅读Datawhale开源项目指南[https://github.com/datawhalechina/DOPMC/blob/main/GUIDE.md]
"""
# 分割文本
text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=20)
chunks = text_splitter.split_text(text)
# 创建向量存储
vectorstore = FAISS.from_texts(chunks, embeddings)
retriever = vectorstore.as_retriever()
# 创建提示模板
template = """只能使用下列内容回答问题:
{context}
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
# 创建检索-问答链
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
)
# 使用链回答问题
question = "我想为datawhale贡献该怎么做?"
response = chain.invoke(question)
Este sistema RAG funciona de la siguiente manera:
- Segmentación de textos: uso
RecursiveCharacterTextSplitter
Divide el texto largo en trozos más pequeños. - Vectorización e indexación: uso de
OllamaEmbeddings
Convierte un bloque de texto en un vector y crea un índice vectorial con FAISS. - Recuperación: cuando se recibe una pregunta, el sistema vectoriza la pregunta y recupera el bloque de texto más pertinente en el índice FAISS.
- Generación de respuestas: los fragmentos de texto relevantes recuperados se proporcionan al modelo lingüístico junto con la pregunta original para generar la respuesta final.
El sistema RAG es muy útil en muchos escenarios de la vida real, por ejemplo:
- Atención al cliente: las consultas de los clientes pueden responderse rápidamente gracias a la base de conocimientos de la empresa.
- Ayuda a la investigación: ayuda a los investigadores a encontrar rápidamente la bibliografía pertinente y a resumir la información clave.
- Asistente personal: combina notas personales e información de Internet para ofrecer sugerencias y recuperación de información personalizadas.
llegar a un veredicto
Con estos ejemplos, mostramos cómo utilizar Ollama y LangChain para construir una gran variedad de aplicaciones de IA, desde sencillos sistemas de diálogo hasta complejos sistemas RAG de preguntas y respuestas. Estas herramientas y técnicas proporcionan una base sólida para desarrollar potentes aplicaciones de IA.
La combinación de Ollama y LangChain proporciona a los desarrolladores una gran flexibilidad y posibilidades. Puede elegir los modelos y componentes adecuados en función de sus necesidades específicas y construir un sistema de IA que se adapte al escenario de su aplicación.
A medida que la tecnología siga evolucionando, esperamos ver surgir más aplicaciones innovadoras. Esperamos que esta guía le ayude a iniciar su viaje de desarrollo de IA e inspire su creatividad para explorar las infinitas posibilidades de la tecnología de IA.
© declaración de copyright
El artículo está protegido por derechos de autor y no debe reproducirse sin autorización.
Artículos relacionados
Sin comentarios...