見出し画像

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:  お寿司の作り方は、お米を炊いて、お醤油とお砂糖を混ぜて、お米にかけて、お魚や野菜などをのせて、巻いて完成です!

「メモリ」の使い方について詳しくは、「メモリ入門ガイド」を参照してください。

関連



この記事が気に入ったらサポートをしてみませんか?