このシリーズではChatGPTを中心とした最新の大規模言語モデル(LLM)に関する情報をまとめています。最新AI技術を使用した「ChatGPT」をはじめとした、自然言語処理技術の概要や活用方法について紹介しておりますので、ぜひ最後までご覧ください。

※大規模言語モデルは技術の進歩がとても速い分野となりますので、最新の情報もこちらからご確認ください。

今回の記事では、LangChainの概要の概要を紹介します。

今回の内容

・LangChainの概要

・LangChainの主な機能

・LangChainの実装例

LangChainとは

LangChainは、ChatGPTをはじめとする大規模言語モデルを効率的に拡張するためのライブラリです。LangChainを使用することで、独自データの読み込み、Google検索の実行、LLMが苦手とする計算問題の解決など、様々な機能が利用可能となります。これにより、高度な処理や知識の組み合わせが可能となり、パフォーマンスの向上や複雑な処理の実現が期待されます。

ChatGPTなどのモデルでは最新情報に対応していない、長文を入力できない、複雑な計算問題に回答できないなどの課題がありますが、LangChainを用いることで、これらの課題への対処が可能となります。

例えば、長いPDFの文章に関する質問への回答が必要な場合、LangChainを使用することで簡単に実装が可能となります。このような機能は、LangChainを使用しなくても実装できることがありますが、LangChainではこれらの機能がパッケージ化されており簡単に実装することが可能です。

詳細は以下のリンクからご覧ください。

LangChainの主な機能

LangChainの主要な機能を紹介します。

Models

大規模言語モデルを扱うためのモジュールです。LangChainを使用することで異なる種類の LLM を同じインターフェースで利用することができます。以下のようなモデルを扱うことができます。

  1. 大規模言語モデル (LLM):LLMは、テキスト文字列を入力として受け取り、テキスト文字列を出力として返すモデルです。これらのモデルは、LangChainで扱われる最初のタイプのモデルとしてカバーされます。
  2. チャットモデル:チャットモデルは、言語モデルに支えられているものの、APIがより構造化されているモデルです。具体的には、チャットメッセージのリストを入力として受け取り、チャットメッセージを返す形式をとります。
  3. テキスト埋め込みモデル:テキスト埋め込みモデルは、テキストを入力として受け取り、浮動小数点数のリストを返すモデルです。これらのモデルは、LangChainで扱われる3番目のタイプのモデルとなります。

Prompts

プロンプトは、モデルへの入力を指し、モデルをプログラミングする新しい方法を提供します。これは通常ハードコードされず、複数のコンポーネントから構成されます。LangChain ライブラリはプロンプトの管理、最適化、シリアル化などの機能をパッケージ化し、実装コストを抑え、チームで統一された方法でコーディングできるようにします。具体的には、プロンプトのテンプレート化やフューショットランニングが含まれます。

  1. プロンプト値: モデルへの入力を表すクラスで、プロンプトの構成要素です。
  2. プロンプトテンプレート: プロンプト値の構築を担当するクラスで、入力の構築を容易にします。
  3. セレクターの例: プロンプトに例を含めることが便利で、動的に選択することでより強力になります。ハードコーディングも可能ですが、セレクターの例が適切に機能します。
  4. 出力パーサー: 言語モデルやチャットモデルはテキストを出力しますが、テキストだけでなく、より構造化された情報も取得したい場合があります。出力パーサーは、出力のフォーマット方法をモデルに指示し、出力を目的のフォーマットに解析することを担当します。必要に応じて再試行を含むことができます。

Indexes

インデックスとは、外部データを活用して、効率的に回答を生成するための機能です。これは、PDFやCSVなどのデータを用いて、例えばローカルにある機密性の高いPDFを使用してチャットボットを作成する際に便利です。LangChainを用いれば、自社システム上で効率的に実装できます。インデックスは、言語モデル (LLM) が文書と最適に対話できるように文書を構造化する方法を指します。

インデックスがチェーンで使用される最も一般的な方法は、「検索」ステップです。このステップでは、ユーザーのクエリを取得し、最も関連性の高いドキュメントを返します。インデックスは検索以外にも使用でき、検索はインデックス以外のロジックを使用して関連ドキュメントを見つけることができます。そのため、「Retriever」インターフェースの概念があります。これは、ほとんどのチェーンが使用するインターフェースです。

非構造化データ(テキスト ドキュメントなど)のインデックス作成と検索が主な用途ですが、構造化データ(SQL テーブルなど)またはAPIとのやり取りについても、対応するユースケースがあります。LangChainでサポートされている主なインデックスと検索タイプは、ベクターデータベースを中心にしています。

このモジュールには、ドキュメントを操作するためのユーティリティ関数、さまざまな種類のインデックス、およびそれらのインデックスをチェーンで使用するための例が含まれています。主要なコンポーネントには、ドキュメントローダー(さまざまなソースからドキュメントをロードするクラス)、テキストスプリッター(テキストを小さなチャンクに分割するクラス)、ベクトルストア(最も一般的な種類のインデックスで、埋め込みに依存するもの)、およびレトリバー(関連ドキュメントをフェッチして言語モデルと結合するためのインターフェース)があります。

Memory

メモリは、チャットモデル(例えばChatGPT)のチェーンズやエージェンツの内部で状態を保持する機能です。チャット上のやり取りは基本的に静的化されており、状態が保持されず各クエリが独立したものとしてみなされてしまいます。しかし、メモリを用いることで過去の会話を記憶し、それに基づいて回答を生成することが可能となります。

メモリという概念は、会話の過程でデータを保存および取得するために使用されます。その方法は主に2つあります。

  1. 入力に基づいて関連するデータを取得する。
  2. 入力と出力に基づいて、それに応じて状態を更新する。

また、メモリには短期記憶と長期記憶の2種類が存在します。

短期記憶は、通常、単一の会話のコンテキストでデータを渡す方法を指します。これは、以前のChatMessageやそれらの要約などの形で実現されます。

長期記憶は、会話間で情報を取得および更新する方法を扱います。これにより、チャットモデルは以前の会話で得た知識を新しい会話に活用することができます。

Chains

チェインズとは、複数のプロンプト入力を実行する機能で、複雑な回答を得る際に有用です。例えば、中間的な回答を一度出力して後に、より正確な回答を得たい場合に役立ちます。このような中間的な推論ステップを踏むことで性能向上を図る手法をCOTプロンプティングと呼びます。

チェインズを利用することで、プロンプトの出力を組み合わせることが可能です。具体的な例として、長い文章を要約する際に、文章を5分割してそれぞれに要約のプロンプトを実行し、出力された5つの要約を入力として再度要約のプロンプトを実行することで、長い文章を1つの文章に要約することができます。

チェインズは一般的な概念で、特定の方法で組み合わされた一連のモジュラーコンポーネント(または他のチェーン)に戻ることで、一般的なユースケースを達成します。最も一般的に使用されるタイプのチェーンはLLMChainで、PromptTemplate、Model、およびGuardrailsを組み合わせて、ユーザー入力を取得し、フォーマットし、モデルに渡して応答を取得し、検証して修正します。

Agents

エージェントは、言語モデルを使用して、ユーザー入力に基づいてタスクを実行するための機能です。これは、与えられたツールを使って、モデルが次にどのようなアクションを取るかを判断し、繰り返し実行して観測し、完了するまで処理を行うものです。エージェントは、言語モデルが必要な情報を収集し、適切なツールを使用して検証を行うことができます。

具体的な例として、Google検索ツールとPythonのコードを実行するツールを使って、以下のようなプロンプトを実行することができます。
「私はPythonのエンジニアです。2000年から2023年までの日付を入力したら、その日に対応する曜日を出力する関数のPythonコードを作ってください。そして、その関数の単体テストのデータとコードを作ってください。最後に、そのテストコードをPythonで実行して結果が正しいか検証してください。もし正しい結果が得られれば、その関数のスクリプトを出力してください。もし誤っている場合は、そのスクリプトの誤りを修正して繰り返してください。」

このように、エージェントはGoogle検索ツールとPythonのコード実行ツールを用いてプロンプトを処理します。言語モデルは、Google検索ツールを使って必要な情報を収集し、Pythonの関数を生成した後、Pythonのコード実行ツールを使って検証を行います。

一部のアプリケーションでは、事前定義された呼び出しチェーンだけでなく、ユーザーの入力に依存する未知のチェーンが必要になることがあります。これらのタイプのチェーンを処理するために、エージェントは一連のツールにアクセスできます。ユーザー入力に応じて、エージェントは、これらのツールのどれを呼び出すかを決定できます。このようにして、エージェントは言語モデルと連携して、様々なタスクを効率的に実行することができます。

LangChainの実装例

ここではLangChainを活用した具体例を紹介します。

・膨大な PDF ドキュメントの内容を要約する

・膨大な PDF ドキュメントの内容に対する質問応答

・Google検索と組み合わせて最新情報にも対応したチャットボットを作成する

・専門知識を必要とする質問応答チャットボットの作成

・ドキュメントからQAを自動生成する

・対話型ロールプレイモデルを実装する

まとめ

最後までご覧いただきありがとうございました。