Ollama в LangChain - интеграция JavaScript

краткое содержание

В этом документе описано, как использовать Оллама Интеграция с LangChain для создания мощных приложений ИИ. Ollama - это инструмент с открытым исходным кодом для развертывания больших языковых моделей, а LangChain - фреймворк для создания приложений на основе языковых моделей. Объединив их, мы можем быстро развернуть и использовать передовые модели ИИ в локальной среде.

Примечание: Этот документ содержит основные фрагменты кода и подробные объяснения. Полный код можно найти в notebook/c5/ollama_langchain_javascript.

 

1. настройки окружающей среды

Настройка среды Node.js

Во-первых, убедитесь, что в вашей системе установлен Node.js; вы можете загрузить и установить последнюю версию с сайта Node.js.

Создание проекта и установка зависимостей

  1. Перейдите в каталог запуска, чтобы запустить его:
cd notebook/C5/ollama_langchain_javascript
npm init -y
  1. Установите необходимые зависимости:
npm install @langchain/ollama @langchain/core @langchain/community zod
  1. существовать package.json добавив в файл "type": "module" чтобы включить поддержку модуля ES:
{
"type": "module",
// ... 其他配置
}

 

2. Загрузите нужную модель и инициализируйте Ollama

Скачать модель llama3.1

  1. Перейдите на официальный сайт https://ollama.com/download, чтобы скачать и установить Ollama на доступные поддерживаемые платформы.
  2. Посетите сайт https://ollama.ai/library, чтобы узнать обо всех доступных моделях.
  3. пройти (законопроект, проверку и т.д.) ollama pull <name-of-model> команда для получения доступных моделей LLM (например:ollama pull llama3.1).

Командная строка выполняется, как показано на рисунке:

Ollama 在 LangChain 中的使用 - JavaScript 集成

Место хранения модели:

  • Мак. ~/.ollama/models/
  • Linux (или WSL). /usr/share/ollama/.ollama/models
  • Окна. C:\Users\Administrator\.ollama\models

После завершения загрузки необходимо убедиться, что служба Ollama запущена:

ollama ps
Ollama 在 LangChain 中的使用 - JavaScript 集成

 

3. Примеры базового использования

Простые разговоры с ChatOllama

runnable base_chat.js файл, конкретный код выглядит следующим образом:

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(""));

Запустите код:

node base_chat.js

Этот код выполняет несколько действий:

  1. Импортируйте класс Ollama и инициализируйте его, указав модель и базовый URL.
  2. пользоваться stream Метод отправляет вопрос модели, что позволяет нам получать ответ блок за блоком.
  3. Используйте цикл for-await для сбора всех блоков ответа.
  4. Объедините все блоки и выведите полный ответ.

Использование мультимодальных моделей

быть в движенииbase_multimodal.jsфайл, конкретный код выглядит следующим образом:

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 });

Запустите код:

node base_multimodal.js

Этот код демонстрирует, как обрабатывать изображения и текст с помощью мультимодальной модели, такой как llava:

  1. Считывает файл изображения и преобразует его в кодировку base64.
  2. Инициализируйте модель Ollama и используйте bind Метод привязывает данные изображения к модели.
  3. пользоваться invoke Метод отправляет вопрос об изображении.
  4. Распечатайте ответ модели.

Вызов инструмента

быть в движении base_tool.js файл со следующим кодом:

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);

Запустите код:

node base_tool.js

Этот код показывает, как определять и использовать инструменты:

  1. пользоваться tool Функция определяет простой инструмент калькулятора, включая логику работы и схему параметров.
  2. Инициализируйте модель ChatOllama.
  3. пользоваться bindTools метод привязывает инструмент к модели.
  4. пользоваться invoke Метод отправляет проблему, которую необходимо вычислить, и модель автоматически вызывает соответствующий инструмент.

 

4. Расширенное использование

Индивидуальные шаблоны подсказок

Настроенные шаблоны подсказок не только повышают эффективность генерации контента, но и обеспечивают последовательность и релевантность выходных данных. Благодаря хорошо продуманным шаблонам мы можем полностью использовать возможности модели искусственного интеллекта, сохраняя при этом контроль и руководство над выходным контентом:

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));

Запустите код:

node advanced_prompt.js

Этот код показывает, как создать и использовать пользовательский шаблон подсказки:

  1. Определите шаблоны системных и человеческих сообщений.
  2. пользоваться ChatPromptTemplate.fromMessages Создайте полный шаблон подсказки.
  3. пользоваться pipe Метод соединяет шаблон кия с моделью, создавая цепочку обработки.
  4. Определите функцию для создания описания продукта, которая использует цепочку обработки для обработки входной информации о продукте.

Пользовательские шаблоны подсказок находят широкое применение на практике, особенно когда вам нужно создать контент в определенном формате или стиле. Ниже приведены некоторые практические сценарии применения:

  1. Генерация описаний товаров для электронной коммерции: как показано в этом примере, с его помощью можно автоматически генерировать различные стили описаний товаров для повышения привлекательности страницы товара и коэффициента конверсии.
  2. Шаблоны ответов службы поддержки клиентов: вы можете создавать шаблоны ответов для различных сценариев, таких как рассмотрение жалоб, предоставление информации о продукте и т. д., чтобы обеспечить последовательность и профессионализм в ответах службы поддержки клиентов.
  3. Создание новостных материалов: шаблоны могут быть разработаны для создания различных типов новостных материалов, таких как срочные новости, подробные анализы и т. д., чтобы помочь журналистам быстро подготовить свои первые наброски.
  4. Персонализированные маркетинговые электронные письма: генерируйте персонализированный контент маркетинговых писем на основе данных о клиентах и маркетинговых целей, чтобы повысить эффективность маркетинга по электронной почте.

Расширенный вывод JSON и генерация графа знаний

В этом примере мы показываем, как Ollama и LangChain могут быть использованы для создания структурированного JSON-вывода, особенно для создания графов знаний. Этот подход тесно связан с проектом Microsoft GraphRAG с открытым исходным кодом, особенно в части автоматизации извлечения знаний и генерации триад.

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);

Запустите код:

node advanced_json.js

Этот код демонстрирует, как генерировать структурированный вывод JSON с помощью Ollama:

  1. Определяет системный шаблон, задающий желаемую структуру JSON.
  2. Создайте шаблон человеческой подсказки для генерации запросов к Графу знаний.
  3. Инициализируйте модель ChatOllama, установите format: "json" чтобы получить вывод в формате JSON.
  4. Определите функцию для создания графа медицинских знаний, объединяющего сообщения системы и сообщения человека, и вызовите модель.

Мы можем получить представление о множестве способов использования этой функции через специфический вывод формата json:

  1. Автоматизированная генерация троичной системы : В традиционных подходах создание графов знаний обычно требует значительного объема ручной работы по маркировке. Экспертам приходится внимательно читать документы, выявлять важные понятия и их взаимосвязи, а затем вручную создавать тройки (субъект-отношения-объект). Этот процесс не только отнимает много времени, но и чреват ошибками, особенно при работе с большим количеством документов. Используя наш подход, Большая языковая модель может автоматически генерировать релевантные узлы и отношения из заданных предметов и понятий. Это значительно ускоряет процесс построения графа знаний.
  2. Расширение данных : Этот подход может быть использован не только для непосредственного создания графов знаний, но и для расширения данных. Например:
    • Расширение существующего набора обучающих данных: модель генерирует новые релевантные тройки на основе существующих.
    • Создание разнообразных примеров: создание графов знаний для различных медицинских заболеваний вносит разнообразие в данные.
    • Генерация данных на разных языках: настраивая подсказки, можно создавать графы знаний на разных языках для поддержки многоязычных приложений.
  3. Повышение качества данных : Большая языковая модель может быть использована для создания высококачественных, связных графов знаний на основе обширной базы знаний. С помощью хорошо продуманных подсказок мы можем гарантировать, что генерируемые данные соответствуют определенным стандартам качества и спецификациям области.
  4. Гибкость и масштабируемость : Этот подход очень гибкий и может быть легко адаптирован к различным областям и потребностям:
    • Модифицировав подсказки системы, мы можем изменить структуру JSON в выходных данных, чтобы приспособить их к различным форматам графов знаний.
    • Этот подход легко распространить на другие области, такие как технологии, финансы, образование и т. д.

 

вынести вердикт

На этих примерах мы показываем, как использовать Ollama и LangChain для создания различных приложений ИИ в среде JavaScript, от простых диалоговых систем до сложных графов знаний. Эти инструменты и методы закладывают прочный фундамент для разработки мощных приложений ИИ.

Сочетание Ollama и LangChain обеспечивает разработчикам большую гибкость и возможности. Вы можете выбрать подходящие модели и компоненты в соответствии с вашими конкретными потребностями и построить систему искусственного интеллекта, соответствующую сценарию вашего приложения.

По мере развития технологий мы ожидаем появления новых инновационных приложений. Мы надеемся, что это руководство поможет вам начать свой путь в области разработки ИИ и вдохновит вас на творческий поиск безграничных возможностей технологии ИИ.

© заявление об авторских правах

Похожие статьи

Нет комментариев

Вы должны войти в систему, чтобы участвовать в комментариях!
Войти сейчас
нет
Нет комментариев...