
LangChain.js クイックスタートガイド - TypeScript版
TypeScript版の「LangChain.js」のクイックスタートガイドをまとめました。
・LangChain.js v0.0.6
1. LangChain.js
「LangChain」は、「大規模言語モデル」 (LLM : Large language models) と連携するアプリの開発を支援するライブラリです。「LangChain.js」はそのTypeScript版になります。
「LLM」という革新的テクノロジーによって、開発者は今まで不可能だったことが可能になりました。しかし、「LLM」を単独で使用するだけでは、真に強力なアプリケーションを作成するのに不十分です。本当の力は、それを他の計算や知識と組み合わせた時にもたらされます。「LangChain」は、そのようなアプリケーションの開発をサポートします。
主な用途は、次の3つになります。
2. インストール
2-1. プロジェクトの準備
TypeScriptのプロジェクトの準備手順は、次のとおりです。
(1) Node.jsのインストール。
(2) yarnのインストール。
$ npm install -g yarn
(3) TypeScriptのプロジェクトの作成。
$ mkdir helloworld
$ cd helloworld
$ mkdir src
$ yarn init -y
$ yarn add -D typescript ts-node @types/node
インストールしたパッケージは、次のとおりです。
・typescript : typescriptのライブラリ
・@types/node : Node.jsの型定義ファイル
・ts-node : TypeScriptの.tsファイルを直接指定して実行
以下のファイルとフォルダが生成されます。
・package.json : インストールしたパッケージ一覧
・node_modules : インストールしたパッケージ
(4) 「package.json」に「scripts:」を追加。
実行コマンドです。
"scripts": {
"start": "node dist/index.js",
"build": "tsc",
"dev": "ts-node src/index.ts"
},
(5) 「tsconfig.json」の生成。
TypeScriptのコンパイル情報です。
・tsconfig.json
{
"compilerOptions": {
"target": "es2020",
"module": "commonjs",
"lib": ["es2020", "dom"],
"sourceMap": true,
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"moduleResolution": "node",
"baseUrl": "src",
"esModuleInterop": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
},
"include": ["src/**/*"],
"exclude": ["dist", "node_modules"],
"compileOnSave": false
}
(6) 「src」に「index.ts」を作成。
・src/index.ts
let str: string = "Hello World!";
console.log(str);
(7) デバッグ実行。
tsファイルをts-nodeで実行します。
$ yarn dev
Hello World!
(8) コンパイルと実行。
「dist」にjsファイルを生成して実行します。
$ yarn build
$ yarn start
Hello World!
2-2. インストール
インストール手順は、次のとおりです。
(1) LangChainのパッケージのインストール。
$ yarn add langchain openai dotenv
インストールしたパッケージは、次のとおりです。
・langchain : langchain.js
・openai : OpenAI API
・dotenv : 環境変数の利用
(2) 「.env」を作成して環境変数を設定。
以下のコードの <OpenAI_APIのトークン> にはOpenAI APIのトークンを指定します。(有料)
・.env
OPENAI_API_KEY="<OpenAI_APIのトークン>"
3. LangChain のモジュール
「LangChain」は、言語モデル アプリケーションの構築に使用できる多くのモジュールを提供します。モジュールを組み合わせて複雑なアプリケーションを作成したり、個別に使用したりできます。
主なモジュールは、次のとおりです。
・LLM : 言語モデルによる推論の実行。
・プロンプトテンプレート : ユーザー入力からのプロンプトの生成。
・チェーン : 複数のLLMやプロンプトの入出力を繋げる。
・エージェント : ユーザー入力を元にしたチェーンの動的呼び出し。
・メモリ : チェーンやエージェントで状態を保持。
4. LLM
「LangChain」の最も基本的な機能は、LLMを呼び出すことです。言語モデルによる推論を実行します。
今回は例として、ユーザー入力「コンピュータゲームを作る日本語の新会社名をを1つ提案してください」でLLMを呼び出します。
import { OpenAI } from "langchain/llms";
// 環境変数
require("dotenv").config();
export const run = async () => {
// LLMの準備
const llm = new OpenAI({ temperature: 0.9 });
// LLMの呼び出し
const res = await llm.call(
"コンピュータゲームを作る日本語の新会社名をを1つ提案してください"
);
console.log(res);
};
run();
ゲームクリエイターズ
「LLM」の使い方について詳しくは、「LLM入門ガイド」を参照してください。
5. プロンプトテンプレート
「プロンプトテンプレート」は、ユーザー入力からプロンプトを生成するためのテンプレートです。アプリケーションで LLM を使用する場合、通常、ユーザー入力を直接LLM に渡すことはありません。ユーザー入力を基に「プロンプトテンプレート」でプロンプトを作成して、それをLLMに渡します。
今回は例として、ユーザー入力「作るもの」を基に「○○を作る日本語の新会社名をを1つ提案してください」というプロンプトを生成します。
import { PromptTemplate } from "langchain/prompts";
// 環境変数
require("dotenv").config();
export const run = async () => {
// プロンプトテンプレートの準備
const prompt = new PromptTemplate({
inputVariables: ["product"],
template: "{product}を作る日本語の新会社名をを1つ提案してください",
});
// プロンプトの生成
console.log(prompt.format({ product: "家庭用ロボット" }));
};
run();
家庭用ロボットを作る日本語の新会社名をを1つ提案してください
「プロンプトテンプレート」の使い方について詳しくは、「プロンプトテンプレート入門ガイド」を参照してください。
6. チェーン
これまで、「LLM」や「プロンプトテンプレート」を単独で使用してきましたが、実際のアプリケーションでは、それらの組み合わせて使います。「チェーン」を使うことで、複数のLLMやプロンプトの入出力も繋げることができます。
「チェーン」は、LLMなどの「プリミティブ」または他の「チェーン」で構成され、最も基本的な「LLMChain」は「LLM」と「プロンプトテンプレート」で構成されます。
今回は例として、ユーザー入力「作るもの」を基に「○○を作る日本語の新会社名」を生成します。
import { LLMChain } from "langchain/chains";
import { OpenAI } from "langchain/llms";
import { PromptTemplate } from "langchain/prompts";
// 環境変数
require("dotenv").config();
export const run = async () => {
// LLMの準備
const llm = new OpenAI({ temperature: 0.9 });
// プロンプトテンプレートの準備
const prompt = new PromptTemplate({
inputVariables: ["product"],
template: "{product}を作る日本語の新会社名をを1つ提案してください",
});
// チェーンの準備
const chain = new LLMChain({ llm: llm, prompt });
// チェーンの実行
let res = await chain.call({ product: "家庭用ロボット" });
console.log(res["text"]);
};
run();
アイホームロボティックス
「チェーン」の使い方について詳しくは、「チェーン入門ガイド」を参照してください。
7. エージェント
「チェーン」はあらかじめ決められた順序で実行しますが、「エージェント」はLLMによって「実行するアクション」とその「順序」を決定します。
アクションは、「ツールを実行してその出力を観察」または「ユーザーに戻る」のいずれか、「ツール」は、Google検索などの特定の機能のことになります。
今回は例として、次の2つのツールを使うエージェントを作成します。
(1) パッケージのインストール。
「serpapi」を使うには「serpapi」パッケージが必要になります。
$ yarn add serpapi
(2) 「.env」に環境変数を設定。
以下のコードの <SerpAPIのトークン> にはSerpAPIのトークン、を指定します。
SERPAPI_API_KEY="<SerpAPIのトークン>"
(3) エージェントの実行。
「serpapi」と「llm-math」が役立ちそうな質問をします。
import { AgentExecutor, loadAgent } from "langchain/agents";
import { OpenAI } from "langchain/llms";
import { Calculator, SerpAPI } from "langchain/tools";
// 環境変数
require("dotenv").config();
export const run = async () => {
// LLMの準備
const llm = new OpenAI({ temperature: 0 });
// ツールの準備
const tools = [new SerpAPI(), new Calculator()];
// エージェントの準備
const agent = await loadAgent(
"lc://agents/zero-shot-react-description/agent.json",
{ llm: llm, tools }
);
const executor = AgentExecutor.fromAgentAndTools({
agent,
tools,
returnIntermediateSteps: true,
});
// エージェントの実行
const input1 = "富士山の高さは?それに2を掛けると?";
const res1 = await executor.call({ input: input1 });
console.log("Q:", input1);
console.log("A:", res1["output"]);
// エージェントの実行
const input2 = "ぼっち・ざ・ろっく!の作者の名前は?";
const res2 = await executor.call({ input: input2 });
console.log("Q:", input2);
console.log("A:", res2["output"]);
};
run();
Q: 富士山の高さは?それに2を掛けると?
A: Mt. Fuji's height is 12,388' and when multiplied by 2 it is 24,776'.
Q: ぼっち・ざ・ろっく!の作者の名前は?
A: Aki Hamaji
英語かつフィートではありますが、正解です。
「エージェント」の使い方について詳しくは、「エージェント入門ガイド」を参照してください。
8. メモリ
これまでの「チェーン」や「エージェント」はステートレスでしたが、「メモリ」を使うことで、「チェーン」や「エージェント」で過去の会話のやり取りを記憶することができます。過去の会話の記憶を使って、会話することができます。
(1) ConversationChainの準備。
「ConversationChain」は会話用のチェーンで、メモリの機能を持ちます。
import { ConversationChain } from "langchain/chains";
import { OpenAI } from "langchain/llms";
// 環境変数
require("dotenv").config();
export const run = async () => {
// LLMの準備
const llm = new OpenAI({ temperature: 0 });
// ConversationChainの準備
const chain = new ConversationChain({ llm: llm });
// 会話の実行
const input1 = "こんにちは!";
const res1 = await chain.call({ input: input1 });
console.log("Human:", input1);
console.log("AI:", res1["response"]);
// 会話の実行
const input2 = "AIさんの好きな料理は?";
const res2 = await chain.call({ input: input2 });
console.log("Human:", input2);
console.log("AI:", res2["response"]);
// 会話の実行
const input3 = "その料理の作り方は?";
const res3 = await chain.call({ input: input3 });
console.log("Human:", input3);
console.log("AI:", res3["response"]);
};
run();
Human: こんにちは!
AI: こんにちは!私はAIです。どうぞよろしくお願いします!
Human: AIさんの好きな料理は?
AI: 私の好きな料理は、和食です。特に、お寿司が大好きです!
Human: その料理の作り方は?
AI: お寿司の作り方は、お米を炊いて、お醤油とお砂糖を混ぜて、お米にかけて、お魚や野菜などをのせて、巻いて完成です!
「メモリ」の使い方について詳しくは、「メモリ入門ガイド」を参照してください。