Ollama en LangChain - Integración de JavaScript
Tutoriales prácticos sobre IAActualizado hace 5 meses Círculo de intercambio de inteligencia artificial 1.2K 00
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, y LangChain es un marco para la construcción de aplicaciones basadas en modelos lingüísticos. Combinando ambas, 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 notebook/c5/ollama_langchain_javascript.
1. Ajustes medioambientales
Configuración del entorno Node.js
En primer lugar, asegúrate de que tienes Node.js instalado en tu sistema; puedes descargar e instalar la última versión desde el sitio web de Node.js.
Creación de un proyecto e instalación de dependencias
- Cambie al directorio de ejecución para ejecutarlo:
cd notebook/C5/ollama_langchain_javascript
npm init -y
- Instale las dependencias necesarias:
npm install @langchain/ollama @langchain/core @langchain/community zod
- existe
package.json
añadiendo el campo"type": "module"
para activar la compatibilidad con el módulo ES:
{
"type": "module",
// ... 其他配置
}
2. Descargue el modelo deseado e inicialice Ollama
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
Una vez finalizada la descarga, debe asegurarse de que se inicia el servicio Ollama:
ollama ps

3. Ejemplos de uso básico
Conversaciones sencillas con ChatOllama
ejecutable base_chat.js
el código específico es el siguiente
import { Ollama } from "@langchain/community/llms/ollama";
const ollama = new Ollama({
baseUrl: "http://localhost:11434", // 确保Ollama服务已经启动
model: "llama3.1", // 替换为实际使用的模型
});
const stream = await ollama.stream(
`你比GPT4厉害吗?`
);
const chunks = [];
for await (const chunk of stream) {
chunks.push(chunk);
}
console.log(chunks.join(""));
Ejecuta el código:
node base_chat.js
Este código hace varias cosas:
- Importa la clase Ollama e inicialízala, especificando el modelo y la URL base.
- utilizar
stream
envía una pregunta al modelo, lo que nos permite recibir la respuesta bloque a bloque. - Utilice un bucle for-await para recoger todos los bloques de respuesta.
- Combina todos los bloques e imprime la respuesta completa.
Uso de modelos multimodales
estar en movimientobase_multimodal.js
el código específico es el siguiente
import { Ollama } from "@langchain/community/llms/ollama";
import * as fs from "node:fs/promises";
const imageData = await fs.readFile("../../../docs/images/C5-1-4.png"); // 可以替换为你想询问的图片
const model = new Ollama({
model: "llava",
baseUrl: "http://127.0.0.1:11434",
}).bind({
images: [imageData.toString("base64")],
});
const res = await model.invoke("图片里是什么动物呀?");
console.log({ res });
Ejecuta el código:
node base_multimodal.js
Este código demuestra cómo procesar entradas de imagen y texto utilizando un modelo multimodal como llava:
- Lee un archivo de imagen y lo convierte a codificación base64.
- Inicializar el modelo Ollama y utilizar la función
bind
vincula los datos de la imagen al modelo. - utilizar
invoke
envía una pregunta sobre una imagen. - Imprime la respuesta del modelo.
Llamada a la herramienta
estar en movimiento base_tool.js
con el siguiente código:
import { tool } from "@langchain/core/tools";
import { ChatOllama } from "@langchain/ollama";
import { z } from "zod";
// 定义简单计算器工具
const simpleCalculatorTool = tool((args) => {
const { operation, x, y } = args;
switch (operation) {
case "add":
return x + y;
case "subtract":
return x - y;
case "multiply":
return x * y;
case "divide":
if (y !== 0) {
return x / y;
} else {
throw new Error("Cannot divide by zero");
}
default:
throw new Error("Invalid operation");
}
}, {
name: "simple_calculator",
description: "Perform simple arithmetic operations",
schema: z.object({
operation: z.enum(["add", "subtract", "multiply", "divide"]),
x: z.number(),
y: z.number(),
}),
});
// 定义模型
const llm = new ChatOllama({
model: "llama3.1",
temperature: 0,
});
// 将工具绑定到模型
const llmWithTools = llm.bindTools([simpleCalculatorTool]);
// 使用模型进行工具调用
const result = await llmWithTools.invoke(
"你知道一千万乘二是多少吗?请使用 'simple_calculator' 工具来计算。"
);
console.log(result);
Ejecuta el código:
node base_tool.js
Este código muestra cómo definir y utilizar las herramientas:
- utilizar
tool
define una calculadora sencilla, incluyendo la lógica de funcionamiento y el esquema de parámetros. - Inicializar el modelo ChatOllama.
- utilizar
bindTools
vincula la herramienta al modelo. - utilizar
invoke
envía un problema que debe calcularse y el modelo llama automáticamente a la herramienta adecuada.
4. Uso avanzado
Plantillas de avisos personalizadas
Las plantillas de avisos personalizadas no sólo mejoran la eficacia de la generación de contenidos, sino que también garantizan la coherencia y pertinencia del resultado. Con plantillas bien diseñadas, podemos aprovechar las capacidades del modelo de IA y, al mismo tiempo, mantener el control y la orientación sobre el contenido de salida:
import { ChatOllama } from "@langchain/ollama";
import { ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate } from "@langchain/core/prompts";
// 初始化ChatOllama模型
const model = new ChatOllama({
model: "llama3.1",
temperature: 0.7,
});
const systemMessageContent = `
你是一位经验丰富的电商文案撰写专家。你的任务是根据给定的产品信息创作吸引人的商品描述。
请确保你的描述简洁、有力,并且突出产品的核心优势。
`;
const humanMessageTemplate = `
请为以下产品创作一段吸引人的商品描述:
产品类型: {product_type}
核心特性: {key_feature}
目标受众: {target_audience}
价格区间: {price_range}
品牌定位: {brand_positioning}
请提供以下三种不同风格的描述,每种大约50字:
1. 理性分析型
2. 情感诉求型
3. 故事化营销型
`;
const prompt = ChatPromptTemplate.fromMessages([
SystemMessagePromptTemplate.fromTemplate(systemMessageContent),
HumanMessagePromptTemplate.fromTemplate(humanMessageTemplate),
]);
const chain = prompt.pipe(model);
async function generateProductDescriptions(productInfo) {
const response = await chain.invoke(productInfo);
return response.content;
}
// 示例使用
const productInfo = {
product_type: "智能手表",
key_feature: "心率监测和睡眠分析",
target_audience: "注重健康的年轻专业人士",
price_range: "中高端",
brand_positioning: "科技与健康的完美结合"
};
generateProductDescriptions(productInfo)
.then((result) => console.log(result))
.catch((error) => console.error("Error:", error));
Ejecuta el código:
node advanced_prompt.js
Este código muestra cómo crear y utilizar una plantilla de aviso personalizada:
- Definir plantillas de mensajes de sistema y de mensajes humanos.
- utilizar
ChatPromptTemplate.fromMessages
Cree una plantilla de avisos completa. - utilizar
pipe
conecta la plantilla cue al modelo, creando una cadena de procesamiento. - Defina una función para generar una descripción de producto que utilice una cadena de procesamiento para procesar la información de producto de entrada.
Las plantillas de avisos personalizadas tienen una amplia gama de usos en la práctica, especialmente cuando se necesita generar contenido en un formato o estilo particular. A continuación se presentan algunos escenarios de aplicación práctica:
- Generación de descripciones de productos de comercio electrónico: como se muestra en este ejemplo, se puede utilizar para generar automáticamente diferentes estilos de descripciones de productos para mejorar el atractivo de la página del producto y la tasa de conversión.
- Plantillas de respuesta de atención al cliente: puede crear plantillas de respuesta para distintos escenarios, como la gestión de reclamaciones, el suministro de información sobre productos, etc., para garantizar la coherencia y la profesionalidad en las respuestas de atención al cliente.
- Generación de noticias: se pueden diseñar plantillas para generar distintos tipos de noticias, como noticias de última hora, análisis en profundidad, etc., para ayudar a los periodistas a redactar rápidamente sus primeros borradores.
- Correos electrónicos de marketing personalizados: Genere contenidos de correos electrónicos de marketing personalizados basados en los datos de los clientes y los objetivos de marketing para mejorar la eficacia del marketing por correo electrónico.
Salida JSON avanzada y generación de grafos de conocimiento
En este ejemplo, mostramos cómo Ollama y LangChain pueden utilizarse para generar una salida JSON estructurada, especialmente para crear grafos de conocimiento. Este enfoque está estrechamente relacionado con el proyecto de código abierto de Microsoft GraphRAG, especialmente en la automatización de la extracción de conocimientos y la generación de tríadas.
import { ChatOllama } from "@langchain/ollama";
import { PromptTemplate } from "@langchain/core/prompts";
import { HumanMessage, SystemMessage } from "@langchain/core/messages";
const systemTemplate = `
你是一位医疗领域的专家,擅长创建知识图谱。请将所有响应格式化为具有以下结构的JSON对象:
{
"节点": [
{"id": "string", "标签": "string", "类型": "string"}
],
"关系": [
{"源": "string", "目标": "string", "关系": "string"}
]
}
确保所有节点id都是唯一的,并且关系引用的是已存在的节点id。
`;
const humanTemplate = `
请为医疗主题"{topic}"创建一个知识图谱。包括以下相关概念: {concepts}。
提供至少5个节点和5个关系。请确保使用中文回答。
`;
const systemMessage = new SystemMessage(systemTemplate);
const humanPrompt = PromptTemplate.fromTemplate(humanTemplate);
const llmJsonMode = new ChatOllama({
baseUrl: "http://localhost:11434", // 默认值
model: "llama3.1",
format: "json",
});
async function generateMedicalKnowledgeGraph(topic, concepts) {
try {
const humanMessageContent = await humanPrompt.format({
topic: topic,
concepts: concepts.join("、"),
});
const humanMessage = new HumanMessage(humanMessageContent);
const messages = [systemMessage, humanMessage];
const result = await llmJsonMode.call(messages);
console.log(JSON.stringify(result, null, 2));
return result;
} catch (error) {
console.error("生成知识图谱时出错:", error);
}
}
// 使用示例
const topic = "糖尿病";
const concepts = ["胰岛素", "血糖", "并发症", "饮食管理", "运动疗法"];
generateMedicalKnowledgeGraph(topic, concepts);
Ejecuta el código:
node advanced_json.js
Este código demuestra cómo generar una salida JSON estructurada utilizando Ollama:
- Define una plantilla de sistema que especifica la estructura JSON deseada.
- Crear una plantilla de solicitud humana para generar solicitudes para el Knowledge Graph.
- Inicializar el modelo ChatOllama, establecer el parámetro
format: "json"
para obtener la salida JSON. - Defina una función para generar un grafo de conocimiento médico que combine los mensajes del sistema y los mensajes humanos y llame al modelo.
Podemos hacernos una idea de las muchas formas en que se puede utilizar a través de la salida específica del formato json:
- Generación ternaria automatizada En los enfoques tradicionales, la creación de grafos de conocimiento suele requerir un importante trabajo de etiquetado manual. Los expertos tienen que leer detenidamente los documentos, identificar los conceptos importantes y sus relaciones y, a continuación, crear manualmente las tripletas (sujeto-relación-objeto). Este proceso no sólo requiere mucho tiempo, sino que también es propenso a errores, especialmente cuando se trata de un gran número de documentos. Utilizando nuestro enfoque, el Big Language Model puede generar automáticamente nodos y relaciones relevantes a partir de temas y conceptos dados. Esto acelera enormemente el proceso de construcción de grafos de conocimiento.
- Mejora de los datos Este enfoque puede utilizarse no sólo para la generación directa de grafos de conocimiento, sino también para la mejora de los datos. Por ejemplo:
- Ampliación del conjunto de datos de entrenamiento existente: haciendo que el modelo genere nuevas triplas relevantes a partir de las existentes.
- Creación de ejemplos diversos: la generación de gráficos de conocimiento para distintas afecciones médicas añade diversidad a los datos.
- Generación de datos en varios idiomas: ajustando las instrucciones, se pueden generar gráficos de conocimiento en distintos idiomas para dar soporte a aplicaciones multilingües.
- Mejorar la calidad de los datos El Big Language Model puede aprovecharse para generar grafos de conocimiento coherentes y de alta calidad a partir de su amplia base de conocimientos. Con indicaciones bien diseñadas, podemos garantizar que los datos generados cumplen normas de calidad y especificaciones de dominio específicas.
- Flexibilidad y escalabilidad Este enfoque es muy flexible y puede adaptarse fácilmente a distintos ámbitos y necesidades:
- Modificando las instrucciones del sistema, podemos cambiar la estructura JSON de la salida para adaptarla a distintos formatos de grafos de conocimiento.
- Es fácil extender este enfoque a otros ámbitos como la tecnología, las finanzas, la educación, etc.
llegar a un veredicto
Con estos ejemplos, mostramos cómo utilizar Ollama y LangChain para construir una gran variedad de aplicaciones de IA en un entorno JavaScript, desde sencillos sistemas de diálogo hasta la generación de complejos grafos de conocimiento. 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...