簡単
この文書では オーラマ Ollamaは大規模な言語モデルのためのオープンソースのデプロイツールであり、LangChainは言語モデルベースのアプリケーションを構築するためのフレームワークです。この2つを組み合わせることで、高度なAIモデルをローカル環境に迅速に展開し、利用することができる。
注:このドキュメントにはコアとなるコードの断片と詳細な説明が含まれています。完全なコードは notebook/c5/ollama_langchain_javascript にあります。
1.環境設定
Node.js環境の設定
まず、Node.jsがシステムにインストールされていることを確認する。Node.jsのウェブサイトから最新バージョンをダウンロードしてインストールできる。
プロジェクトの作成と依存関係のインストール
- runディレクトリに移動して実行する:
cd notebook/C5/ollama_langchain_javascript
npm init -y
- 必要な依存関係をインストールする:
npm install @langchain/ollama @langchain/core @langchain/community zod
- ある
package.json
ファイルに"type": "module"
でESモジュールのサポートを有効にする:
{
"type": "module",
// ... 其他配置
}
2.必要なモデルをダウンロードし、Ollamaを初期化する。
llama3.1 モデルのダウンロード
- 公式ウェブサイトhttps://ollama.com/download、Ollamaをダウンロードし、対応プラットフォームにインストールしてください。
- 利用可能な全モデルについては、https://ollama.ai/library。
- とおす
ollama pull <name-of-model>
コマンドを使用して、利用可能なLLMモデルを取得することができます(例:ollama pull llama3.1
).
コマンドラインは図のように実行される:
モデルの保管場所
- マックだ。
~/.ollama/models/
- Linux(またはWSL)。
/usr/share/ollama/.ollama/models
- ウィンドウズ
C:\Users\Administrator\.ollama\models
ダウンロードが完了したら、Ollamaサービスが開始されていることを確認する必要があります:
ollama ps
3.基本的な使用例
ChatOllamaで簡単な会話
実行可能 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
このコードはいくつかのことを行う:
- Ollamaクラスをインポートし、モデルとベースURLを指定して初期化します。
- 利用する
stream
メソッドはモデルに質問を送り、ブロックごとに応答を受け取ることができる。 - for-awaitループを使用して、すべてのレスポンスブロックを収集する。
- すべてのブロックを結合し、完全な応答を印刷する。
マルチモーダルモデルの使用
うごきだす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のようなマルチモーダルモデルを使って、画像とテキストの入力を処理する方法を示している:
- 画像ファイルを読み込み、base64エンコーディングに変換する。
- Ollamaモデルを初期化して
bind
メソッドは画像データをモデルにバインドします。 - 利用する
invoke
メソッドは画像に関する質問を送信する。 - モデルの応答を印刷する。
ツールコール
うごきだす 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
このコードは、ツールの定義と使用方法を示している:
- 利用する
tool
関数は、操作ロジックとパラメータスキーマを含む、シンプルな電卓ツールを定義します。 - ChatOllamaモデルを初期化します。
- 利用する
bindTools
メソッドはツールをモデルにバインドします。 - 利用する
invoke
メソッドは計算が必要な問題を送信し、モデルは自動的に適切なツールを呼び出す。
4.高度な使用法
カスタマイズされたプロンプトテンプレート
カスタマイズされたプロンプト・テンプレートは、コンテンツ生成の効率を向上させるだけでなく、アウトプットの一貫性と関連性を確保します。よく設計されたテンプレートを使用することで、出力コンテンツの制御とガイダンスを維持しながら、AIモデルの能力を活用することができます:
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
このコードでは、カスタムプロンプトテンプレートを作成して使用する方法を示します:
- システムメッセージとヒューマンメッセージテンプレートを定義する。
- 利用する
ChatPromptTemplate.fromMessages
完全なプロンプト・テンプレートを作成する。 - 利用する
pipe
メソッドは、キューテンプレートをモデルに接続し、処理チェーンを作成する。 - 入力された商品情報を処理するために、処理チェーンを使用して商品説明を生成する関数を定義します。
カスタムプロンプトテンプレートは、特に特定のフォーマットやスタイルでコンテンツを生成する必要がある場合に、幅広い用途で使用できます。以下に、実用的な使用例をいくつか示します:
- Eコマース商品説明文の生成:この例に示すように、商品ページの魅力とコンバージョン率を向上させるために、さまざまなスタイルの商品説明文を自動的に生成するために使用できます。
- カスタマーサービス対応テンプレート:クレーム対応、製品情報の提供など、さまざまなシナリオに対応するテンプレートを作成し、カスタマーサービス対応の一貫性と専門性を確保できます。
- ニュース原稿の作成:速報、詳細分析など、さまざまなタイプのニュース原稿を作成するためのテンプレートが用意されており、記者が最初の原稿を素早く作成できる。
- パーソナライズされたマーケティングメール:顧客データとマーケティング目標に基づいてパーソナライズされたマーケティングメールコンテンツを作成し、メールマーケティングの効果を向上させます。
高度な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
このコードは、Ollamaを使って構造化されたJSON出力を生成する方法を示している:
- 必要なJSON構造を指定するシステム・テンプレートを定義する。
- ナレッジグラフのリクエストを生成するためのヒューマンプロンプトテンプレートを作成します。
- ChatOllamaモデルを初期化します。
format: "json"
でJSON出力を取得する。 - システムのメッセージと人間のメッセージを組み合わせた医療知識グラフを生成し、モデルを呼び出す関数を定義する。
jsonフォーマットの具体的な出力から、この使い方を垣間見ることができる:
- 自動化された三項生成 従来のアプローチでは、知識グラフの作成には通常、かなりの量の手作業によるラベリング作業が必要であった。専門家は文書を注意深く読み、重要な概念とその関係を特定し、手作業でトリプル(主語-関係-目的語)を作成する必要がある。このプロセスは時間がかかるだけでなく、特に大量の文書を扱う場合にはエラーが発生しやすい。 我々のアプローチを用いることで、ビッグ・ランゲージ・モデルは、与えられた主題と概念から関連するノードと関係を自動的に生成することができる。これにより、知識グラフの構築プロセスが大幅に加速される。
- データ強化 このアプローチは、知識グラフの直接生成だけでなく、データの拡張にも利用できる。例えば
- 既存のトレーニング・データセットの拡張:既存のトリプルに基づき、モデルに新しい関連するトリプルを生成させる。
- 多様な例の作成:さまざまな病状のナレッジグラフを作成することで、データに多様性が加わる。
- 多言語データ生成:プロンプトを調整することで、多言語アプリケーションをサポートするために異なる言語のナレッジグラフを生成することができます。
- データ品質の向上 ビッグ・ランゲージ・モデルは、その広範な知識ベースを活用して、高品質で首尾一貫した知識グラフを生成することができる。適切に設計されたプロンプトにより、生成されたデータが特定の品質基準やドメイン仕様を満たすことを保証できる。
- 柔軟性と拡張性 このアプローチは非常に柔軟で、さまざまな地域やニーズに容易に適応できる:
- システムのプロンプトを変更することで、出力のJSON構造を変更し、異なるナレッジグラフ形式に対応することができる。
- このアプローチをテクノロジー、金融、教育など他の分野に拡張するのは簡単だ。
評決を下す
これらの例を用いて、OllamaとLangChainを使ってJavaScript環境で、単純な対話システムから複雑なナレッジグラフ生成まで、様々なAIアプリケーションを構築する方法を紹介する。これらのツールとテクニックは、強力なAIアプリケーションを開発するための強固な基盤を提供します。
OllamaとLangChainの組み合わせは、開発者に大きな柔軟性と可能性を提供します。特定のニーズに応じて適切なモデルやコンポーネントを選択し、アプリケーションのシナリオに合ったAIシステムを構築することができます。
テクノロジーが進化し続けるにつれ、より革新的なアプリケーションが登場することが期待されます。このガイドが、AI開発の旅立ちの一助となり、AI技術の無限の可能性を探求するあなたの創造力を刺激することを願っています。