初心者によるLangChain解説【イメージ画像あり】

Featured image of the post

概要

ライブラリ「LangChain」について学習したので、初心者目線で誰でも分かるように備忘録を残す。

この記事で分かること
  • LangChainって何?
  • LangChainは必要?
  • 何ができる?
  • 対応しているプログラミング言語は?

⚠️
初めて学習した際の備忘録です。
本記事はあくまで参考程度にご活用ください。
最新の正確な情報は公式ドキュメントをご確認ください。

LangChainとは

LLM(大規模言語モデル)を強化できるライブラリ✅

例:Open AI(ChatGPT)のモデルを強化することができる。

💡
簡単にいろいろな機能を追加できて便利!

LangChainの必要性

結論、複雑なLLMの開発をするならほぼ必須✅

LangChainがなくても、1から10まで全部自分でコードを書いて開発することもできる。

ただしそれだと非効率なのでLangChainを使うのがおすすめ!

💡
深い知識がなくても簡単に高機能のものが作れるようになる!

対応しているプログラミング言語

以下の2つの言語に対応している✅

  • Python
  • TypeScript

💡
ただしTypeScript版は一部制限がある。
詳細は以下を参照。

📄 初心者によるTypeScript版LangChain【①基礎編】

できること

ChatGPT単体では苦手なことが簡単に実装できる✅

具体例
  • 最新情報に対応したチャットボット開発(Toolsモジュールを使う)
  • 独自データ対応のチャットボット開発(Indexesモジュールを使う)
  • 計算問題を解くことができるLLM開発(Toolsモジュールを使う)

モジュール

大きく分けると以下の6つのモジュールが使える。

モジュール名 できることの一例
Models 「LLMs」「Chat Models」「Text Embedding Model」といったモデルをすべてLnagChain上で使える。
Prompts プロンプトの管理、最適化、シリアル化ができる。
Indexes PDFやCSVなどのデータを学習させることができる。
Chains 一回目の回答に応じて、二回目の質問を実行することができる。
Agents 回答がいい感じになるまで、何回も質問と回答を繰り返してくれる。
Memory 以前のやりとりを記憶できる。
💡
以下でイメージ画像を用いて詳しく解説する。

Modelsモジュール

「Modelsモジュール」=「さまざまなモデルが簡単に使える」

前提としてLangChainでは大まかに3種類のモデルが扱える。

モデル名 解説 詳しい解説
LLMs 大規模言語モデル text-davinchi-003 01.概要
02.モデルの種類
03.詳細な機能
Chat Models LLMモデルの派生。チャットに特化している。 gpt-3.5-turbo 01.概要
02.モデルの種類
03.詳細な機能
Text Embedding Models 単語を数値化して単語同士の関連度を計算するモデル text-embedding-ada-002 01.概要
02.モデルの種類
03.詳細な機能

モデルによって使い方が異なるが、LangChainなら同じような感覚で使えて開発が楽✅

イメージ

これらを簡単に組み合わせて開発することができる。

Image in a image block

💡
Modelsは特別な機能ではなく、LangChainの根幹を担うイメージ。

公式ドキュメント

Promptsモジュール

「Promptsモジュール」=「プロンプトの管理を簡単にしてくれる」

プロンプトの管理・最適化・シリアル化ができる機能

【補足】具体的な機能

Promptsモジュールは以下のような機能が使える。

機能名 解説 詳しい解説
Prompt Template プロンプトのテンプレートを作る 01.概要
02.詳細な機能
Example Selectors 質問するときにすべての教師データを使わず、一部の教師データだけを使う(*1) 01.概要
Output Parsers 回答の形式を指定する 01.概要

(*1)何のための機能?

  • 質問が長いときに文字数制限を超えないように使用する例の数を減らす。
  • 不要な教師データを使わないようにして回答の精度をあげる。

例:プロンプトのテンプレートを作る

どのような質問をするかテンプレートを作っておけば、ユーザーは文章の一部だけ入力すれば済むようにできる。

「〇〇の名産地を教えて」というテンプレートを作った場合。

Image in a image block
💡
たった3文字「りんご」と入力するだけで名産地が返ってくる!
質問するときの負担が減る✅

公式ドキュメント

Indexesモジュール

「Indexesモジュール」=「インデックスを扱うための機能」

独自データを学習させるにはインデックスというものが必要✅

【補足】具体的な機能

Indexesモジュールは以下のような機能が使える。

機能名 解説 詳しい解説
Document Loaders PDF、Webページなどの外部データを読み込む(*1) 01.概要
02.ローダーの種類(ファイル)
03.ローダーの種類(Web)
Text Splitters 文章を分割する 01.概要
02.テキストスプリッターの種類
Vectorstores 文章をベクトル化し、インデックスを生成する 01.概要
02.ベクターストアの種類
Retrievers 知りたい内容に関連する文章を検索する 01.概要&レトリーバーの種類

(*1)豆知識

学習のイメージ

開発者が事前に行う作業。

インデックスを生成して、LangChainが独自データを扱えるようにする。

Image in a image block

  • テキスト/CSV/PDFなどからインデックを生成できる。
  • Notionなどの外部データからインデックスを生成することもできる。

💡
とりあえず学習にはインデックスが必要なことを覚えておこう!

質問時のイメージ

ユーザーが質問したときの動作。

Image in a image block

※「検索」はベクトル検索エンジンと呼ばれるものを使う。(https://qiita.com/sonesuke/items/56a6e4b6532eafa104f4#ベクトル検索エンジン

💡
インデックスを使って、独自データについて回答してくれる!

他のライブラリもある

インデックスの扱いだけなら「LangChain」以外にも「LlamaIndex」というライブラリも有名。Pythonのみ対応している。

📄 初心者によるLlamaIndexの基本知識まとめ

💡
独自データを扱うだけならLlamaIndexの方がシンプルかも!

公式ドキュメント

Chainsモジュール

「Chainsモジュール」=「会話を繋げる機能」

(ユーザー質問 → AI回答)で終わらせず、複数のやりとりを繋げられる✅

【補足】具体的な機能

Chainsモジュールは大きく3種類のチェーンに分類できる。

機能名 解説
Simple Chain 質問と回答を1セットにしてSimple Chainと呼ぶ
例:(質問 → 回答)
Sequential Chain 複数のChainを直列に繋いだものを1セットにしてSequential Chainと呼ぶ
例:(質問 → 回答)→(質問 → 回答)
Custom Chain 複数のChainを任意に繋いだものを1セットにしてCustom Chainを呼ぶ
例:
(質問 → 回答)↘️
         ➡️(質問 → 回答)
(質問 → 回答)↗️

イメージ

Image in a image block

具体的には以下のような機能が使える。

機能名 解説 詳しい解説
LLMChain Simple Chainのこと(一番シンプル) 01.使い方
Index Related Chains インデックスを使ったチェーン 01.チェーンの種類
Sequential Chain Sequential Chainのこと 01.使い方
その他のチェーン その他にも様々なチェーンがある 01.その他チェーンの一覧
Prompt Selectors モデルに応じて使用するテンプレートを切り替える機能 01.使い方

💡
Chainsは特別な機能ではなく、LangChainの根幹を担うイメージ。

例:中間的な回答を挟むことで精度の高い回答を得る

ユーザーはざっくり質問をするだけでOK。

AIがしっかりした質問を作ってくれて、最終的には具体的な回答を得られる。

Image in a image block
💡
これをCoTプロンプティングという。
ざっくりした質問から複雑な回答を得たいときに有用!

例:長い文章を要約する

OpenAIでは、1回の質問の文字数に制限がある。

そのため長い文章は1回の質問に入り切らない😫

Image in a image block
💡
一旦分割し、2段階で要約することで、長い文章の要約を避けられる。

※「分割」はIndexesモジュールを使えば実装できる。

※「合成」はプログラム上で文字列を連結させるだけ。

公式ドキュメント

Agentsモジュール

「Agentsモジュール」=「Google検索などの外部の機能を駆使して、良い答えを導く機能」

Agentsは、(ユーザー質問 → AI回答)ではなく、良い答えになるまで何回も「試行」してくれる機能✅

【補足】具体的な機能

Agentsモジュールは以下のような機能が使える。

機能名 解説 詳しい解説
Agents 自動で良い答えに導いてくれる 01.概要
02.エージェントの種類
03.詳細な機能
Agent Executor Agentsを良い答えになるまで実行させる 01.概要
02.使い方
Tools Google検索などの外部機能を使う 01.概要
02.ツールの種類
03.ベクターストアと組み合わせる
04.ChatGPTを拡張
05.AWS Lambdaを使う
06.Webデータを使う
07.Zapierを使う
Toolkits 特定の問題を解決するためのToolsの集まり 01.概要&ツールキットの種類

イメージ

良い答えになるよう「繰り返しアクションを実行」してくれる。

Image in a image block

  • 開発者は事前に、AIがどんなツールを使えるかの選択肢を用意してあげる。

    (例:Google検索ツール、計算ツール)

  • AIは与えられたツールを使って、自動的に良い答えを導いてくれる。

    ※人は「どの順番でどのツールを使うか」指定しなくてOK😊
    ※AIが自動で「どのツールを使い、どの順番で解決していけばいいか」を考え、良い答えに導いてくれる🤖

💡
AgentsはPDCAサイクルを自分で回す優秀な機能!

公式ドキュメント

Memoryモジュール

「Memoryモジュール」=「過去の会話を保持する機能」

AIとのやりとりは基本的に1回1回独立している。

しかしMemoryを使うと過去のやり取りを記憶できる✅

【補足】具体的な機能

Memoryモジュールは以下のような機能が使える。

機能名 解説 詳しい解説
Memory 過去の会話を記憶する 01.概要
02.メモリーの種類

💡
ここでは代表的なメモリーの使い方を3種類紹介する

例:質問と回答を記憶する
Image in a image block

💡
質問や回答を記憶し、その後のやりとりに活かすことができる。

例:最初に前提情報を記憶しておく
Image in a image block

💡
前提となる情報を最初に記憶させておいて、その後のチェーン内でその情報を活かすことができる。

例:Chains、Agentsのやりとりを自動記憶する
Image in a image block

💡
最初に自動記憶を設定しておけば、その後のチェーンやAgentsのやりとりをすべて自動で記憶してくれる。

公式ドキュメント

利用方法

以下でインストール、プログラムの作成、実行を解説している。

📄 初心者によるTypeScript版LangChain【①基礎編】

💡
上記はTypeScript版の解説だが、Python版もほとんど同じ。

詳しい解説

参考サイト

初心者向けのLangChain解説

LangChainの基本

公式ドキュメント

APIリファレンス

チェーン

インデックス

エージェント

メモリ