既存のLLMプロジェクトをLangChainを使用するように適応する

'既存のLLMプロジェクトにLangChainを適用する'

LangChainを使って、より強力なものにOpenAIの呼び出しをリファクタリングする

JJ Yingさんによる写真

おめでとうございます。自慢できる動作確認済みのLLMのプルーフ・オブ・コンセプトが完成し、世界に披露できる準備が整いました!OpenAIのライブラリを直接利用したか、別の基礎モデルとHuggingFace transformersを使用しているかもしれません。どちらにせよ、一生懸命働いた結果です。次のステップを探しているかもしれません。それはコードのリファクタリング、複数の基礎モデルへの対応の追加、またはエージェントやベクトルデータベースなどのより高度な機能の追加を意味するかもしれません。ここでLangChainが登場します。

LangChainは、LLM(大規模言語モデル)とその上でアプリケーションを開発するためのオープンソースフレームワークです。PythonとJavaScriptの両方のバージョンがあり、複数の基礎モデルとLLMプロバイダーをサポートしています。また、ドキュメントの分割やベクトルデータベースとのやり取りなどの一般的なタスクを処理するためのユーティリティ関数もいくつか提供しています。LangChainはチェックする価値があると確信しましたか?次の記事をご覧ください。これは可能なことを理解するのに最適な出発点となる素晴らしい記事です:

LangChain入門:LLMを利用したアプリケーションの初心者ガイド

Pythonで大規模言語モデルを使って何でも作るためのLangChainチュートリアル

towardsdatascience.com

この記事は、グリーンフィールドの開発ではなく、既存のアプリのリファクタリングに焦点を当てています。LangChainについての基本的な理解が前提となりますが、関連するドキュメントへのリンクもあります。具体的には、私が書いたプロジェクトであるAdventureGPTのリファクタリングについて説明します。AdventureGPTは、1977年のColossal Cave Adventureというテキストベースの冒険ゲームをプレイするための自律エージェントです。そのプロジェクトについて詳しく知りたい場合は、以前の記事をご覧ください:

AdventureGPT:LLMを利用したテキストベースの冒険ゲームのプレイエージェント

betterprogramming.pub

私がリファクタリングに最も興味を持っていたのは、次の領域です:

  1. 直接のOpenAI呼び出しではなく、チェーンの利用
  2. LangChainドキュメント/データの処理のための独自のユーティリティの置き換え

これらの各項目について順番に説明します。

まず、チェーンとは何かから始めましょう。チェーンは、複数のプロンプト操作技術を1つのユニットに組み合わせ、単一の基礎モデル呼び出しの結果を得る方法です。動作するチェーンがあれば、チェーンを組み合わせて使用することで、より複雑なタスクを達成することができます。

LangChainにはいくつかの異なるタイプのチェーンがありますが、ここではLLMChainとConversationChainに焦点を当てます。LLMChainは、プロンプトテンプレートとLangChainがサポートするLLMオブジェクトを組み合わせた最もシンプルなチェーンです。ConversationChainは、チャットボットなどの会話型ワークフローに特化した体験を提供します。ConversationChainの主な特徴の1つは、メモリを含めた過去の会話の一部を簡単にプロンプトに組み込むことができる点です。

プロンプトテンプレートは、LangChainの最も強力な機能の1つであり、プロンプト内に変数を含めることができます。このタスクを手動で完了する場合、f文字列と文字列の連結、そしてカスタムの__repr__メソッドの注意深い使用を組み合わせてデータを基礎モデルのプロンプトに挿入することになります。プロンプトテンプレートを使用すると、変数を中括弧でエスケープして文字列をフォーマットすることができます。これだけです。

作成中のチェーンのタイプによっては、システムやユーザーの入力など、一部の変数がデフォルトで設定されます。これにより、かなりの複雑さが生じる場合もあります。伝統的な会話型のプロンプトでは、システム、AIアシスタント、ユーザーまたは人間からのメッセージがあります。手動でプロンプトを書く場合、それぞれのメッセージに「System」、「Human」、「AI」といったラベルを付けます。LangChainはこれを代わりに処理してくれるため、メッセージをオブジェクトのリストとして指定するChatPromptTemplateメソッドfrom_messagesを使用して、より高い抽象化レベルと自動的な履歴の組み込みとフォーマットを実現できます。

これらのすべての機能は、複雑さと引き換えに提供されます。テキストを単純にプロンプトに適用する代わりに、詳細なドキュメントを読み、既存のコードを特定のユースケースに合わせて拡張する必要があります。たとえば、会話型のプロンプトでは、ユーザーの入力と会話履歴のみが変数として含まれる傾向があります。しかし、私はPlayerAgentというゲームワールドと対話する責任を持つエージェントのプロンプトに追加のゲームコンテキストを含めたかったので、追加の変数をプロンプトに追加したところ、次のエラーが表示されました:

予期しないプロンプト入力変数がありました。プロンプトは['completed_tasks', 'input', 'history', 'objective']を予期していますが、入力として['history']がメモリからの入力として、通常の入力キーとしてinputが渡されました。(type=value_error)

いくつかの調査を行い、同じ問題を説明した既存のGitHubの問題を見つけましたが、明確な解決策はありませんでした。私は冷静になり、ConversationChainクラスのソースコードを見て、予期された変数のみが入力として渡されるように検証するための特定のメソッドがあることに気付きました。元のクラスをサブクラス化して、そのメソッドをオーバーライドする新しいクラスを作成しました。CustomConversationChainクラスを手に入れたら、ConversationalMemoryBufferがユーザー(または私の場合はゲーム)の入力に使用する変数を指定する必要がありました。複数の入力変数があるため、これはinput_keyのインスタンス変数を使用して簡単に行うことができました。これで、すべてがうまく動作しました。

OpenAIの呼び出しをチェーンに変換する作業が終わったら、ドキュメントの取り込み方に取り組む必要がありました。ゲームループの一部として、ウォークスルーテキストへのパスを受け入れ、それをPlayerAgentが完了するゲームタスクに変換する必要がありました。この機能を最初に追加したときは、単純にウォークスルー全体をプロンプトに渡して最善の結果を期待しました。しかし、より洗練されたウォークスルーが見つかるにつれて、OpenAIのChatGPTが許可するコンテキストウィンドウの長さを超えるようになりました。そのため、テキストを500トークンのチャンクに分割し、ウォークスルーをゲームタスクに変換するためにプロンプトを複数回実行しました。

テキストを約500トークンずつチャンクに分割したと言ったとき、これは非常に素朴な方法で行いました。Pythonの文字列のsplitメソッドを使用してテキストをトークン化し(ほとんどのLLMがテキストをトークン化する方法とは異なる非常に大雑把な近似方法)、その後、配列のトークンを再度文字列に変換するためにStringクラスのjoinメソッドを使用しました。これはうまく動作しますが、LangChainはより良い解決策を提供します。

LangChainはテキストをさまざまな方法で分割することができます。ほとんどの人にとって最も関連性のある方法はトークンごとに分割することであり、ドキュメントのフローを保持します。トークンごとにテキストを分割するさまざまな方法については、ここに専用のドキュメントページがあります。トークン化のためにいくつかのNLPライブラリがサポートされていますが、私は最初に説明されたLLMネイティブのソリューションであるtiktokenを選びました。テキストを効果的に分割するためのコードはわずか数行で書けましたし、空白を保持しながらテキストを分割することもできました。

これはLangChainが可能なドキュメントの準備の一部に過ぎません。LangChainはテキストチャンクを適切なテキスト埋め込みに変換し、ベクトルデータベースに格納して後で取得し、プロンプトに含めることもできます。私のプロジェクトの将来において、提供されたウォークスルーの関連するチャンクをPlayerAgentに含める予定です。

LangChainは、LLMとそれらを活用したアプリケーションの開発に対してさまざまな機能とユーティリティ関数を提供する強力なオープンソースフレームワークです。OpenAIライブラリを使用しているか、異なる基礎モデルを使用しているかに関係なく、LangChainは複数の基礎モデルとLLMプロバイダのサポートを提供し、プロジェクトに対して多目的な選択肢となります。

LangChainは、生のプロンプト管理と比較していくらかの複雑さを導入するかもしれませんが、LLMとの対話を簡素化し、多くの利点を提供します。プロセスを標準化し、選択したLLMの潜在能力を最大限に活用するための便利なツールを提供します。

LangChainを実際のプロジェクトでどのように実装できるかに興味がある場合は、AdventureGPTの更新されたコードベースをチェックしてみることができます。このプロジェクトでは、LangChainを使用してアプリのリファクタリングと改善を行っています。

GitHub – oaguy1/AdventureGPT at langchain

GitHubでアカウントを作成してoaguy1/AdventureGPTに貢献してください。

github.com

LangChainは、LLMを使用する開発者にとって貴重なリソースであり、LLMパワードアプリケーションを強化する包括的なフレームワークと幅広い機能を提供しています。LangChainを探索し、LLMプロジェクトの全ポテンシャルを引き出してください!

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

データサイエンス

データセットシフトのフレームワークの整理:例

「最近、モデルの性能低下の原因について話しましたこれは、私たちがモデルをトレーニングして展開した時点と比較して予測品...

機械学習

「40歳以上の方におすすめのクールなAIツール(2023年12月版)」

DeepSwap DeepSwapは、説得力のあるディープフェイクの動画や画像を作成したい人向けのAIベースのツールです。動画、写真、ミ...

機械学習

MIT教授が議会に語る「AIにおいて私たちは転換点にあります」

アレクサンダー・マドリーは、AIツールが企業によってどのように使用されているかについて、厳密な質問を立てるよう立法者に...

コンピュータサイエンス

アルゴリズムは、不妊症の男性の精子を医師よりも速く正確に見つけます

そのツールは即座に精子を識別し、その後、胚培養学者に判断を委ねます判断の内容は、精子が実際に存在しているかどうか、お...

機械学習

人工知能の未来を形作る:進歩と革新のための迅速なエンジニアリングの重要性

ChatGPTはリリース当日から話題になっています。革新的なチャットボットを既に100万人以上のユーザーが利用しています。ChatG...