簡単
この文書では オーラマ 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
ファイルに"タイプ": "モジュール"
でESモジュールのサポートを有効にする:
{
"type": "module", // ...
// ... その他の設定
}
2.必要なモデルをダウンロードし、Ollamaを初期化する。
llama3.1 モデルのダウンロード
- 公式ウェブサイトhttps://ollama.com/download、Ollamaをダウンロードし、対応プラットフォームにインストールしてください。
- 利用可能な全モデルについては、https://ollama.ai/library。
- とおす
OLLAMA プル <モデル名
コマンドを使用して、利用可能なLLMモデルを取得することができます(例:ollama pull llama3.1
).
コマンドラインは図のように実行される:
モデルの保管場所
- マックだ。
~/.ollama/models/
- Linux(またはWSL)。
/usr/share/ollama/.ollama/models
- ウィンドウズ
C: \UsersersAdministrator.ollama
ダウンロードが完了したら、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: "ollama3.1", // 実際に使用するモデルに置き換える。
}); const stream = await ollama.
const stream = await ollama.stream(
あなたはGPT4より優れていますか?`
);
const chunks = [];
for await (streamのconst chunks) { { { チャンクをプッシュします。
chunks.push(chunk);
}
console.log(chunks.join(""));
コードを実行する:
ノード base_chat.js
このコードはいくつかのことを行う:
- Ollamaクラスをインポートし、モデルとベースURLを指定して初期化します。
- 利用する
ストリーム
メソッドはモデルに質問を送り、ブロックごとに応答を受け取ることができる。 - 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")], }); { images: [imageData.toString("base64")], {.
}); const res = await model.
const res = await model.invoke("この画像に写っている動物は?")console.log({ res })
console.log({ res });
コードを実行する:
node base_multimodal.js
このコードは、llavaのようなマルチモーダルモデルを使って、画像とテキストの入力を処理する方法を示している:
- 画像ファイルを読み込み、base64エンコーディングに変換する。
- Ollamaモデルを初期化して
バインド
メソッドは画像データをモデルにバインドします。 - 利用する
呼ぶ
メソッドは画像に関する質問を送信する。 - モデルの応答を印刷する。
ツールコール
うごきだす base_tool.js
ファイルに以下のコードを追加する:
import { tool } from "@langchain/core/tools" ;
インポート チャットオラマ } 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 "multiply".
return x * y; case "divide": return x - y; case "multiply": return x - y
case "divide": if (y !
if (y !== 0) {
return x / y; } else { if (y ! == 0)
} else {
throw new Error("Cannot divide by zero"); }.
}
デフォルトでは
throw new Error("Invalid operation"); } default.
}
}, {
name: "simple_calculator", description: "Perform simple arithmetic operations", {
説明: "単純な算術演算を行う", { name: "simple_calculator", 説明: "単純な算術演算を行う", } }。
schema: z.object({
operation: z.enum(["add", "subtract", "multiply", "divide"]), x: z.number(), z.number(), z.number(), z.number(), z.number()
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(
"2の1,000万倍が何倍かわかりますか?simple_calculator'ツールを使って計算してください。"
);
console.log(result);
コードを実行する:
ノード base_tool.js
このコードは、ツールの定義と使用方法を示している:
- 利用する
工具
関数は、操作ロジックとパラメータスキーマを含む、シンプルな電卓ツールを定義します。 - ChatOllamaモデルを初期化します。
- 利用する
バインドツール
メソッドはツールをモデルにバインドします。 - 利用する
呼ぶ
メソッドは計算が必要な問題を送信し、モデルは自動的に適切なツールを呼び出す。
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, }); // ChatOllamaモデルを初期化する。
});
const systemMessageContent = `.
あなたは経験豊富なeコマースのコピーライティングの専門家です。あなたの仕事は、与えられた商品情報に基づいて魅力的な商品説明を作成することです。
説明が簡潔で、力強く、商品の主な利点を強調していることを確認してください。
`;
const humanMessageTemplate = `.
次の商品の魅力的な商品説明を作成してください:
製品タイプ: {product_type}
核となる機能: {key_feature}
ターゲットオーディエンス:{target_audience}
価格帯: {price_range}
ブランドポジショニング: {brand_positioning}
次の3つの異なるスタイルについて、それぞれ50字程度で説明してください:
1.合理的分析
2.感情的アピール
3.ストーリーテリング
`; const prompt = ChatPrompt
const prompt = ChatPromptTemplate.fromMessages([ )
SystemMessagePromptTemplate.fromTemplate(systemMessageContent)、
HumanMessagePromptTemplate.fromTemplate(humanMessageTemplate)、
]); const chain = prompt.pipe(model), humanMessagePromptTemplate.
const chain = prompt.pipe(model);
async関数 generateProductDescriptions(productInfo) { { {.
const response = await chain.invoke(productInfo); async function generateProductDescriptions(productInfo) { {.
return response.content; }.
}
// 使用例
コンストラスト productInfo = {
product_type: "スマートウォッチ", key_feature: "心拍数モニターと睡眠分析", } }.
key_feature: "心拍数モニターと睡眠分析"、
target_audience: "健康志向の若いプロフェッショナル"、
brand_positioning: "テクノロジーと健康の完璧な融合"
};
generateProductDescriptions(productInfo)
.then((result) => console.log(result))
.catch((error) => console.error("エラー:", エラー));
コードを実行する:
ノード advanced_prompt.js
このコードでは、カスタムプロンプトテンプレートを作成して使用する方法を示します:
- システムメッセージとヒューマンメッセージテンプレートを定義する。
- 利用する
チャットプロンプトテンプレート.fromMessages
完全なプロンプト・テンプレートを作成する。 - 利用する
パイプ
メソッドは、キューテンプレートをモデルに接続し、処理チェーンを作成する。 - 入力された商品情報を処理するために、処理チェーンを使用して商品説明を生成する関数を定義します。
カスタムプロンプトテンプレートは、特に特定のフォーマットやスタイルでコンテンツを生成する必要がある場合に、幅広い用途で使用できます。以下に、実用的な使用例をいくつか示します:
- 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", "label": "string", "type": "string"} ].
],
「関係": [
{ソース": "文字列", "ターゲット": "文字列", "リレーションシップ": "文字列" } ]。
]
}
すべてのノード ID が一意であり、リレーションシップが既存のノード ID を参照していることを確認します。
`;
const humanTemplate = `
医療トピック"{topic}"のナレッジグラフを作成してください。次の関連概念を含めてください: {概念}.
少なくとも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", // デフォルト値
format: "json", // デフォルト
}).
非同期関数 generateMedicalKnowledgeGraph(topic, concepts) { 以下のようにします。
try {
const humanMessageContent = await humanPrompt.format({
topic: トピック, concepts: コンセプト.format({)
concepts: concepts.join(","), }); 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(JSONMode.string)
console.log(JSON.stringify(result, null, 2)); return result; const messages = [systemMessage]; const humanMessage
return result; } catch (error) { { return result; }.
} catch (error) {
console.error("Error generating knowledge graph:", error); }.
}
}
// 使用例
const topic = "Diabetes";
const concepts = ["インスリン", "血糖値", "合併症", "食事管理", "運動療法"]; const concepts = ["インスリン", "血糖値", "合併症", "食事管理", "運動療法"]; }.
generateMedicalKnowledgeGraph(topic, concepts).
コードを実行する:
ノード advanced_json.js
このコードは、Ollamaを使って構造化されたJSON出力を生成する方法を示している:
- 必要なJSON構造を指定するシステム・テンプレートを定義する。
- ナレッジグラフのリクエストを生成するためのヒューマンプロンプトテンプレートを作成します。
- ChatOllamaモデルを初期化します。
フォーマット:"json"
でJSON出力を取得する。 - システムのメッセージと人間のメッセージを組み合わせた医療知識グラフを生成し、モデルを呼び出す関数を定義する。
jsonフォーマットの具体的な出力から、この使い方を垣間見ることができる:
- 自動化された三項生成 従来のアプローチでは、知識グラフの作成には通常、かなりの量の手作業によるラベリング作業が必要であった。専門家は文書を注意深く読み、重要な概念とその関係を特定し、手作業でトリプル(主語-関係-目的語)を作成する必要がある。このプロセスは時間がかかるだけでなく、特に大量の文書を扱う場合にはエラーが発生しやすい。 我々のアプローチを用いることで、ビッグ・ランゲージ・モデルは、与えられた主題と概念から関連するノードと関係を自動的に生成することができる。これにより、知識グラフの構築プロセスが大幅に加速される。
- データ強化 このアプローチは、知識グラフの直接生成だけでなく、データの拡張にも利用できる。例えば
- 既存のトレーニング・データセットの拡張:既存のトリプルに基づき、モデルに新しい関連するトリプルを生成させる。
- 多様な例の作成:さまざまな病状のナレッジグラフを作成することで、データに多様性が加わる。
- 多言語データ生成:プロンプトを調整することで、多言語アプリケーションをサポートするために異なる言語のナレッジグラフを生成することができます。
- データ品質の向上 ビッグ・ランゲージ・モデルは、その広範な知識ベースを活用して、高品質で首尾一貫した知識グラフを生成することができる。適切に設計されたプロンプトにより、生成されたデータが特定の品質基準やドメイン仕様を満たすことを保証できる。
- 柔軟性と拡張性 このアプローチは非常に柔軟で、さまざまな地域やニーズに容易に適応できる:
- システムのプロンプトを変更することで、出力のJSON構造を変更し、異なるナレッジグラフ形式に対応することができる。
- このアプローチをテクノロジー、金融、教育など他の分野に拡張するのは簡単だ。
評決を下す
これらの例を用いて、OllamaとLangChainを使ってJavaScript環境で、単純な対話システムから複雑なナレッジグラフ生成まで、様々なAIアプリケーションを構築する方法を紹介する。これらのツールとテクニックは、強力なAIアプリケーションを開発するための強固な基盤を提供します。
OllamaとLangChainの組み合わせは、開発者に大きな柔軟性と可能性を提供します。特定のニーズに応じて適切なモデルやコンポーネントを選択し、アプリケーションのシナリオに合ったAIシステムを構築することができます。
テクノロジーが進化し続けるにつれ、より革新的なアプリケーションが登場することが期待されます。このガイドが、AI開発の旅立ちの一助となり、AI技術の無限の可能性を探求するあなたの創造力を刺激することを願っています。