目次


LangChainとは

LangChainとは、大規模言語モデル(Large Language Models、LLM)を活用した、アプリケーション開発を容易にするオープンソースのフレームワークです。

近年、生成AIの進化が著しく、特にLLMの進化はテキストを扱うタスクに大きな革命をもたらしています。LLMというと、OpenAI ChatGPTGoogle GeminiのようなAIチャットボットが一般的なイメージですが、これらの心臓部に使われているLLMをコントロールするAPIは一般に公開されており、そのAPIを用いれば、私たちもLLM技術を活用したアプリケーション開発を行えるようになっています。

しかし、LLM技術を効果的に活用したアプリケーション開発を行うには、LLMに対する深い専門知識と高い開発能力が求められます。そのような状況に対して、開発者がLLMの技術をアプリケーションへ簡単に組み込めるようにと登場したのがLangChainです。

LangChainはLLMのAPIを抽象化してインターフェイスを統一化しており、LLMを活用する上で「あったら便利だな」という機能拡張が詰め込まれたフレームワークになっています。対応プログラム言語としては、PythonとJavaScript/TypeScript向けの実装が行われています。

LangChainの発端は、2022年10月、AI関連企業に勤めるエンジニアのハリソン・チェイス氏が立ち上げたオープンソースプロジェクトです。直後にOpenAIのChatGPTがリリースされ生成AIの大ブームが起こり、LangChainのプロジェクトにも多数の開発者が参加し、現在に至るまで活発な活動が続けられています。

世界的に非常に盛り上がったため、彼はすぐに勤めていた会社を辞め、新しくLangChain, Inc.を設立しています。

LangChainを使用するメリット

LangChainを使用することのメリットは多数あります。中でも代表的なメリットとしては、以下のような例が挙げられます。

  • 開発効率の向上
  • 高い柔軟性とカスタマイズ性
  • LLMの制限を超えた高度な運用

開発効率の向上は、LangChainの抽象化による恩恵です。LLMとの複雑なやり取りを抽象化したモジュールを繋げてアプリケーションを作成することで、本来必要となるはずだった細部の理解や膨大なコード量を抑えることができます。LLMの専門家か初心者かにかかわらず、迅速なアプリケーション開発に取り掛かれるでしょう。

高い柔軟性とカスタマイズ性は、LangChainが数多くのLLMに対応できる点や、LLMとさまざまなツールを連携する仕組みが備わっているという点から生じるメリットのひとつです。LangChainを使えば、さまざまなLLMに対して統一されたインターフェイスでアクセスできるので、コードの大半を修正することなく、LLMを切り替えて試用することも可能です。さまざまなLLMとさまざまなツールを組み合わせることで、ニーズに対応したアプリケーション開発ができるようになります。

LLMの制限を超えた高度な運用は、上記2つのメリットが合わさることで実現できます。本来、LLMが公開しているAPIの機能はシンプルで、プロンプトとして送ることができるデータ量にも制限があったり、LLMが学習していない事柄にはうまく答えられなかったりすることもあります。

しかし、プロンプトとして送るデータに対してさまざまなツールで最適化を施すことによって、LLMが事前学習していない事柄にも対応できるようになるなど、あたかもLLMの制限を超えたような運用が可能になります。

LangChainには、目的に合わせてLLM向けにデータを処理する機能が多数備わっている上に、ネットを検索すれば数多くの使用例やサンプルコードが見つかります。誰でもすぐにLLMの真価に触れるアプリケーションを作成でき試すことができるという点が、LangChainのとても大きなメリットと言えるでしょう。

LangChainの主な機能

LangChainは、LLMを高度に運用するためのさまざまな機能が組み込まれたフレームワークです。開発者は必要に応じて各種機能を組み合わせることで、アプリケーションを作成していきます。ここからは、LangChainに備わる代表的な機能(モジュール)を見ていきましょう。

Model I/O

Model I/Oは、OpenAIやGeminiなどのプロバイダーが提供しているLLMを、切り替えたり組み合わせたりして利用する機能や、プロンプトの管理、最適化を担う機能、LLMからの出力形式を指定する機能などが含まれたモジュールです。

【関連記事】

Language models

Language modelsはModel I/Oの機能の一部で、使用するLLMを切り替えたり、共通のインターフェイスで各種LLMを操作できるようにします。Language modelsは、さらにLLMsとChat modelsという2種類のモデルに対応したものへと分けられます。

  • LLMs
文字列(プロンプト)を入力し、文字列の出力を得るという、単純でわかりやすいLLMの利用形態です。

  • Chat models
メッセージ形式(構造化データ)で入力し、メッセージ形式の出力を得ます。チャットに特化したOpenAIのGPT4などは、Chat modelsで利用する必要があります。

Prompts

PromptsもModel I/Oの機能の一部で、プロンプトの管理、最適化を担います。さらにPromptsは、Prompt templatesとExample selectorsという2つの機能に大別されます。

  • Prompt templates
プロンプトをテンプレート化し、プログラム側からプロンプトを生成する機能です。テンプレートの文字列の一部に変数を埋め込み、プログラム側でプロンプトを制御できるようにします。

  • Example selectors
大量の教師データから、一部分のみをプロンプトとして入力する機能です。大量のデータからランダム抽出してプロンプトに入力するといった使い方ができます。

Retrieval

Retrievalは、PDFなどの外部データを用いて、LLMの回答精度を強化するためのモジュールです。例えば、会社の業務マニュアルをベースとした社内向けAIチャットボットの開発などに役立ちます。

本来プロバイダー側のLLMでは知りようのない業務マニュアルを補完データとして用意することで、LLMの判断力を利用した優秀な社内向けAIチャットボットを構築できます。このような既存ドキュメントとLLMの判断力を融合させたAI技術は、Retrieval-Augmented Generation(RAG)と呼ばれます。

RetrievalはDocument loaders、Document transformers、Text embedding models、Vector stores、Retrivers、Indexingという6つの機能で構成されています。

  • Document loaders
PDFやCSV、WordやHTMLなど、さまざまなデータ形式のドキュメントを読み込む機能です。100種類以上のデータ形式に対応しています。

  • Document transformers
読み込んだデータをLLMで扱いやすい形式に変換する機能です。代表的な機能としては、長大なドキュメントを適当な大きさに分割するといったものが挙げられます。

  • Text embedding models
文章や単語を数値ベクトルに変換する機能です。文章や単語の類似性や関連性などを直接判断することはコンピュータには困難なことですが、ベクトルに変換することで、文章や単語の関連性をコンピュータの得意な数値で判断できるようになります。

  • Vector stores
Text embedding modelsなどによって、数値ベクトル化されたデータを管理するための機能です。chromaDBをはじめとする、いろいろなベクトルデータベースに接続する機能が備わっています。

  • Retrievers
ドキュメントを検索する機能です。長大なドキュメントを分割したものからプロンプトに関連のあるドキュメントだけを抽出してLLMへ渡すことで、高い回答精度を保ちます。

  • Indexing
大量のドキュメントデータを整理する機能です。重複コンテンツのベクターストアへの書き出しや更新されていないコンテンツの再書き込みなどを避けることで、Retriversの検索性能が落ちないようにします。

【関連記事】

Agents

Agentsは、LLMにさまざまな外部ツールを渡し、プロンプトの内容に沿って適切なツールを使い分けることで、精度の高い回答を生成するモジュールです。ツールの実行自体はAgentsの機能ですが、目的に応じてどのツールを使うかはLLMが判断します。ここに人間的思考を模倣した判断力を期待できる点が、Agentsの興味深いところです。

Agentsで使えるようにLangChainに最初から登録されている外部ツールには、Google検索エンジンや専門分野検索エンジン、Wikipedia参照、数学問題解決が得意なツールなど、他にもさまざまなツールがあります。Agentsの機能を用いれば、ネット検索の最新情報をもとにした精度の高い回答を生成できます。

【関連記事】

Chains

Chainsは、複数のプロンプトを連続で入力していけるようにするモジュールです。先のプロンプトに対する回答を次のプロンプトの内容に組み込むことができるので、段階的に的確な回答を得られる可能性が高くなります。

例えば、「Chain1:とても暑い日にオススメの昼食は何ですか?」→「Chain2:<Chain1の回答>のレシピを教えてください。」といった連続プロンプトの構築を行えます。 ChainsにはSimple Chain、Sequential Chain、Custom Chainという3種類のChainが用意されています。

  • Simple Chain
Chainの最小単位となるものです。単体のChainでも実行はできますが、通常の非Chainの使い方と大きな差は生じません。

  • Sequential Chain
複数のChainを連続で繋げて入力できるChainです。先のChainへの回答を次のChainの入力とすることで段階的な回答を得られる、Chainsのメインとなる使い方です。

  • Custom Chain
自由にChainを繋ぎ合わすことができます。複数のChainの回答を入力するといった繋ぎ方もできます。

Memory

Memoryは、プロンプトやLLMの回答を保存するモジュールです。AgentsやChainsの内部での状態保持にも用いられ、例えばChainsにMemoryを利用すれば、複数のChain全体を通して同一の前提条件などを設定することができます。

本来、GPTなどのChat modelsの中で会話内容は保存されておらず、WebサービスのChatGPTのようにこれまでの会話内容を反映した回答が欲しい場合は、自前で会話内容を保存する仕組みを作っておく必要があります。その仕組みを提供してくれるのがMemoryです。

【関連記事】

【関連記事】

Callbacks

Callbacksは、LLM利用時のアプリケーションのロギング、モニタリング、ストリーミングなどを管理するモジュールです。プログラミングにおけるコールバックとは、一般的に「特定のイベント発生や条件が成立した時に呼び出される関数やメソッド」を指す言葉です。

それと同様に、LLM運用時に発生するイベントに合わせて指定した処理を実行できるようにするのが、Callbacksの主な機能です。主な用途としては次の3つが挙げられます。

  • ロギング
アプリケーション実行中に発生するイベントやデータを記録します。デバッグやパフォーマンス分析に役立ちます。

  • ストリーミング
新しいトークン(LLMで扱うテキストを最小単位に分割したもの)が生成されるたびに、リアルタイムに生成データをチェックできます。LLMとの間でどのようなトークンのやり取りが行われているか、逐次確認できます。

  • トークンカウント
一般的に、プロバイダーが提供するLLMは一度に消費できるトークン数に制限があったり、消費トークン数に応じた従量課金制となっています。Callbacksの機能を用いれば、消費トークン数を可視化できます。

LangChainの使い方

ここからは、LangChainを導入して使い始めるまでの手順を紹介していきます。ここでの使用環境はWindows PCを用い、統合開発環境にVisualStudio Code(以下、VS Code)、プログラミング言語としてPythonを導入済みの状態としています。

OpenAIアカウントの作成とAPI KEYの取得

今回の使用例では、LLMにOpenAIのGPTシリーズを用います。OpenAIのようなプロバイダー型のLLMを利用する場合は、アカウントを作成して、ユニークなAPI KEYを発行してもらうのが一般的です。従って、最初にOpenAIのアカウント作成とAPI KEYの取得を行います。

1.https://openai.com/にアクセスし、画面右上の「Log in」をクリックします。

2.ログイン画面が表示されます。すでにOpenAIアカウントを所持している場合はログインして手順8まで飛ばしてください。

初めてOpenAIを利用する場合は、メールアドレスでアカウントを新規登録するか、Googleアカウント、Microsoftアカウント、Apple IDのいずれかと連携することで始められます。メールアドレスで新規登録する場合は「サインアップ」をクリックします。

3.アカウント作成画面で、登録するメールアドレスを入力します。

4.パスワードを入力します。

5.入力したメールアドレスへ確認メールが送られるので、メール内のリンクを開いて確認します。

6.reCAPTCHAテストがあるので、実施して通過します。

7.氏名、所属(オプション)、生年月日を入力して「Agree」をクリックします。

8.ログイン後の画面で、WebサービスとしてのChatGPTを利用するか、開発者としてAPIを利用するかを選択します。ここでは右側のAPIを選択します。

9.デベロッパープラットフォームが表示されるので、画面左端のメニューから南京錠マークの「API keys」をクリックします。

10.初めてアカウントを作成した場合は、携帯電話へのショートメッセージで電話番号確認が必要となります。すでに電話番号確認済みの場合は「+Create new secret key」をクリックして手順13まで飛ばしてください。

電話番号確認がまだの場合は「Start verification」をクリックします。

11.携帯電話番号を入力し「Send code」をクリックします。

12.携帯電話に届いた6桁のコードを入力します。コードが正しければ電話番号確認が完了します。

13.API KEYの発行画面に移ります。新しいAPI KEYを発行するにあたって、特定の名前を付けることで複数のAPI KEYを使い分けることができます。適当に名前を付けても良いですし、使い分けることがないのであれば空白で大丈夫です。

Permissionsは「All」のままで「Create secret key」をクリックします。

14.新しいAPI KEYが発行されました。ここで表示されているAPI KEYの文字列は、必ずコピーして別の場所へ保存しておきます。API KEY全体を確認できるのはこの画面だけで、後からはデベロッパープラットフォームの画面でも再確認できないので要注意です。

このAPI KEYはOpenAI APIへアクセスする自分専用の鍵で、他人に知られると自分の課金でLLMを利用されてしまう事態にもなります。厳重に保管するようにしましょう。API KEYを保存できたら「Done」をクリックします。

15.API KEYの取得が完了しました。

OpenAIへの課金

初めてOpenAIアカウントを作成した場合、フリートライアルとして$5のクレジットが付与されているはずなので、そのままOpenAI APIを試すことができます。

デベロッパープラットフォームで画面左端のメニューから歯車マークの「Settings」を開き、「Billing」をクリックするとクレジット残高を確認できます。フリートライアルクレジットは、3か月後に消滅する期間限定クレジットなので注意してください。

以前からOpenAIアカウントを所持していて現在クレジット残高が無い場合は、残高にチャージしなければOpenAI APIを利用できません。残高チャージ方法はクレジットカードのみに対応しています。

1.クレジットカード未登録の場合、クレジット残高確認の画面から「Add payment details」をクリックし、クレジットカードの登録を開始します。

2.個人利用か業務利用かを選択します。個人利用であれば「Individual」を選択します。

3.クレジットカード情報を入力し、「Continue」をクリックします。

4.チャージ金額を入力します。最小$5からチャージ可能となっており、少し試す程度であれば$5で十分です。金額入力欄の下はオートリチャージの設定となっていますが、本格的に運用するのでなければオフのままが良いでしょう。

「Continue」をクリックするとチャージ完了です。以後は同ページから「Add to credit balance」をクリックで再びチャージできます。

OpenAI APIの利用料金について

OpenAI APIの利用料金は、消費したトークン数に応じた従量課金制です。トークン数はプロンプト入力と回答出力の両方で消費し、1トークンあたりの料金は使用モデルによって変わります。

2024年3月時点での代表的なモデルの料金体系は、下記のようになっています。最新の料金体系については、OpenAIのWebサイトを確認してください。

GPT-4 Turbo

  • モデル名:gpt-4-0125-preview
  • 入力:$0.01/1000トークン
  • 出力:$0.03/1000トークン

GPT-3.5 Turbo

  • モデル名:gpt-3.5-turbo-0125
  • 入力:$0.0005/1000トークン
  • 出力:$0.0015/1000トークン

GPT-3.5 Turbo

  • モデル名:gpt-3.5-turbo-instruct
  • 入力:$0.0015/1000トークン
  • 出力:$0.002/1000トークン

トークンと文字数の関係は、英単語の場合「1単語=1トークン」「1記号=1トークン」と明快ですが、日本語の場合は必ずしも一律ではありません。目安としては「ひらがな1文字=1トークン以上」「漢字1文字=2~3トークン」となります。

なお、GPT-4 Turboを利用するには通常のクレジット残高が必要で、フリートライアルクレジットではGPT-4 Turboの利用はできないので注意してください。

関連モジュールのインストールと環境設定

LangChainを使用するのに必要なモジュールをPython環境へインストールします。

1.VS Codeを起動し、ターミナルで次のコマンドを実行します。LangChainはLLMのAPI KEYを環境変数から読み出すのでdotenvもインストールします。

ターミナルで実行

pip install langchain langchain-openai python-dotenv

2.ソースコードの保存フォルダに「.env」というテキストファイルを作成し、内容に次の1行を記述して保存します。

.envファイルに記述
OPENAI_API_KEY=<取得したOpenAI API KEY>

<取得したOpenAI API KEY>には、先の手順で取得したAPI KEYの文字列を記述します。以上で、LangChainを用いたLLMアプリケーションを作成する土台が整いました。

LangChainを使用したテスト

続いて、下記のサンプルコードを実行して試してみましょう。

サンプルコード


from dotenv import load_dotenv
from langchain_openai import OpenAI

#環境変数の読み込み

load_dotenv()

llm = OpenAI(model="gpt-3.5-turbo-instruct")

#プロンプトの設定

prompt = "日本の内閣総理大臣を新しい順に10人、任期も含めて挙げてください"

#生成と結果出力
output = llm.invoke(prompt)
print(output)


実行結果

1. 菅義偉(2020年9月 - 現在)
2. 安倍晋三(2012年12月 - 2020年8月)
3. 鳩山由紀夫(2009年9月 - 2010年6月)
4. 麻生太郎(2008年9月 - 2009年9月)
5. 福田康夫(2007年9月 - 2008年9月)
6. 安倍晋三(2006年9月 - 2007年9月)
7. 小泉純一郎(2001年4月 - 2006年9月)
8. 森喜朗(2000年4月 - 2001年4月)
9. 小渕恵三(1998年7月 - 2000年4月)
10. 原敬(1918年9月 - 1921年11月)

実行結果は得られましたが、内容が正しくありませんでした。

Google Geminiで試してみる

LangChainはさまざまなLLMへ対応していることも大きな特徴です。ここではGoogle Geminiでも同様のテストを実施してみます。Google Geminiは下位モデルのGemini Proであれば、無料で利用可能です。

1.WebブラウザにGoogleアカウントでログインしている状態とし、Google AI for DevelopersのWebサイトを表示、「Get API key in Google AI Studio」をクリックします。

2.Google AI StudioのWebサイトが開きます。初回は利用規約が表示されるので、少なくとも一番上のボックスにチェックを入れて「Continue」をクリックします。

3.続いて「Get API key」をクリックします。

4.API KEYを生成する画面が表示されるので「Create API key」をクリックします。

5.次の画面では「Create API key in new project」をクリックします。

6.API KEYが生成されました。OpenAIの時と同様に、生成されたAPI KEYの文字列はコピーして大事に保管しておきます。Google Geminiの場合、Google AI StudioのWebサイトからいつでもAPI KEYを確認することができます。

7.VS Codeのターミナルで次のコマンドを実行し、Google Geminiを利用するのに必要なモジュールをインストールします。

ターミナルで実行

pip install langchain-google-genai

8.環境変数ファイルの.envに次の1行を追記します。

.envファイルに追記

GOOGLE_API_KEY=<取得したGoogle API KEY>

<取得したGoogle API KEY>には、先の手順で取得したAPI KEYの文字列を記述します。

9.サンプルを実行

次のサンプルコードを実行してGoogle Geminiが使えるか試してみましょう。

サンプルコード


from dotenv import load_dotenv
from langchain_google_genai import GoogleGenerativeAI #変更箇所


#環境変数の読み込み
load_dotenv()

llm = GoogleGenerativeAI(model="gemini-pro") #変更箇所

#プロンプトの設定
prompt = "日本の内閣総理大臣を新しい順に10人、任期も含めて挙げてください"

#生成と結果出力
output = llm.invoke(prompt)
print(output)

先のOpenAI版のコードとの違いは2か所のみです。ここを変更するだけで、さまざまなLLMを試すことができます。

実行結果


1. 岸田文雄(2021年10月4日~)
2. 菅義偉(2020年9月16日~2021年10月4日)
3. 安倍晋三(2012年12月26日~2020年9月16日)
4. 野田佳彦(2011年9月2日~2012年12月26日)
5. 菅直人(2010年6月8日~2011年9月2日)
6. 鳩山由紀夫(2009年9月16日~2010年6月8日)
7. 麻生太郎(2008年9月24日~2009年9月16日)
8. 福田康夫(2007年9月26日~2008年9月24日)
9. 安倍晋三(2006年9月26日~2007年9月26日)
10. 小泉純一郎(2001年4月26日~2006年9月26日)


こちらは内容も正確なようです。無料で利用できることも併せて、Google Geminiはとても優秀なLLMに見えます。

GPT4-Turboを試してみる

OpenAI LLMのGPT4-Turboを使用したサンプルコードを次に掲載します。GPT4-Turboはチャットモデル専用のため、メッセージの扱いなどに大きな変更が入ります。

サンプルコード


from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage

#環境変数の読み込み
load_dotenv()

chat = ChatOpenAI(model="gpt-4-0125-preview")

#メッセージ(プロンプト)の設定
messages = [
HumanMessage(content="日本の内閣総理大臣を新しい順に10人、任期も含めて挙げてください"),
]

#生成と結果出力
response = chat.invoke(messages)
print(response.content)

実行結果

以下は、2023年4月時点での日本の内閣総理大臣のリストです。ただし、任期については特定の首相の任期が終了する正確な日付は変動し得るため、年度での近似を記載しています。

1. 岸田文雄 (2021年10月 - 現職)
2. 菅義偉 (2020年9月 - 2021年10月)
3. 安倍晋三 (2012年12月 - 2020年9月) ※2期目
4. 野田佳彦 (2011年9月 - 2012年12月)
5. 菅直人 (2010年6月 - 2011年9月)
6. 鳩山由紀夫 (2009年9月 - 2010年6月)
7. 麻生太郎 (2008年9月 - 2009年9月)
8. 福田康夫 (2007年9月 - 2008年9月)
9. 安倍晋三 (2006年9月 - 2007年9月) ※1期目
10. 小泉純一郎 (2001年4月 - 2006年9月)

このリストは、新しい順に10人の日本の内閣総理大臣を示しており、各首相の任期を大まかな年度で表しています。注意点として、安倍晋 三は2期にわたって首相を務めていますが、ここではそれぞれ別の項目としてカウントしています。

かなり丁寧な回答が返ってきました。

LangChainの活用事例

実際にLangChainを利用することでどのようなアプリケーションを生み出せるのか、活用事例には次のようなものが考えられます。

  • サポート窓口の自動化
一般常識と判断力を併せ持つLLMに対応マニュアルなどの専門知識を付け加えることで、カスタマーサポートや社内サポートを任せられる、高度なAIチャットボットの開発が考えられます。

  • 大量のPDF文書から必要な情報を抽出
LangChainの機能とLLMの能力を駆使することで、大量のPDF文書をLLMで扱いやすいかたちへ整理できます。このかたちになれば、ユーザーからのアバウトな言い回しのデータ抽出依頼であっても、関連情報を含めてLLMの判断で効率的にデータ抽出することが可能です。従来の文書検索とは段違いの情報発見のしやすさとなるでしょう。

  • 自動情報収集/自動コンテンツ作成
LangChainはさまざまなタスクの自動化を得意とします。これを活かしてネット上の情報を自動的に収集したり、また収集した情報を元に新しいコンテンツを自動的に作り出したりといったアプリケーションも考えられます。

LangChainはLLMを本格的に利用する上でも無くてはならない存在

LangChainは、さまざまなLLMに対して統一したインターフェイスでアクセスできるようにした上に、LLM向けのデータ処理を得意とする多数の機能を備えた、非常に便利なフレームワークです。素のLLMでは難しい、最新情報を考慮に入れた判断が可能になるなど、LLMを本格的に利用する上でも無くてはならない存在と言えるでしょう。LLMを効果的に利用できることから注目度も高く、使用例やサンプルコードが沢山見つかる点も大きなプラスポイントです。

ただ、LLMもLangChainも、日々ダイナミックな変化を続ける技術です。これからLangChainを取り入れていこうと考えている方は、最新情報をキャッチアップする高いアンテナ感度を持ち続けると同時に、バージョン違いによるドキュメントやサンプルコードとの差異にも注意が必要になるでしょう。

この機会にぜひ、アプリケーション開発者の方はもちろん、LLMなどの生成AIに興味がある方も、一度触れてみてはいかがでしょうか。

【関連記事】