GUIでプロンプト比較評価ができる「ChainForge」を試す
ここで紹介されていた
GitHubレポジトリ
⛓️🛠️ ChainForge
LLMに対するプロンプトを徹底的にテストするためのオープンソースビジュアルプログラミング環境
refered from https://github.com/ianarawjo/ChainForgeChainForgeは、LLMの応答を分析・評価するためのデータフロープロンプトエンジニアリング環境です。個別のLLMと対話するだけではない、プロンプト、チャット応答、応答品質の探索を素早く行いたい初期段階での利用に適しています。ChainForgeを使うと、次のことが可能です:
- 複数のLLMに一度にクエリを送信し、プロンプトのアイデアやバリエーションを素早く効果的にテストできます。
- プロンプトの組み合わせ、モデル、モデル設定にまたがる応答品質を比較し、ユースケースに最適なプロンプトとモデルを選択できます。
- 評価指標(スコアリング関数)を設定し、プロンプト、プロンプトパラメータ、モデル、モデル設定にまたがる結果をすぐに可視化できます。
- テンプレートパラメータやチャットモデルにまたがって複数の会話を同時に保持できます。プロンプトだけでなく、後続のチャットメッセージもテンプレート化し、会話の各ターンで出力を確認・評価できます。
詳しくはドキュメントをご覧ください。 ChainForgeには、OpenAI evalsのベンチマークから生成された188の例を含む、可能性を示す多数の評価フローの例が付属しています。
これはChainForgeのオープンベータ版です。 OpenAI、HuggingFace、Anthropic、Google PaLM2、Azure OpenAIエンドポイント、DalaiがホストするAlpacaやLlamaモデルに対応しています。モデルや個別のモデル設定を変更することが可能で、可視化ノードは数値およびブール評価指標をサポートしています。ぜひお試しいただき、フィードバックをお寄せください! :)
サポートされているプロバイダ
- OpenAI
- Anthropic
- Google (Gemini, PaLM2)
- HuggingFace(インフェレンスおよびエンドポイント)
- Ollama(ローカルホストモデル)
- Microsoft Azure OpenAIエンドポイント
- AlephAlpha
- Amazon Bedrockのオンデマンド推論経由での基盤モデル(Anthropic Claude 3を含む)
- その他のプロバイダについてもカスタムプロバイダスクリプトにより対応可能です!
機能
ChainForgeの主な目的は、プロンプトとモデルの比較および評価の促進です。基本機能は以下の通りです:
- プロンプトの組み合わせ: プロンプトテンプレートを設定し、入力変数のバリエーションを提供します。ChainForgeは選択したすべてのLLMに対して入力プロンプトのすべての組み合わせをプロンプトとして送信し、プロンプト品質の理解を深めます。また、任意の深さでプロンプトテンプレートを連鎖させることも可能です(例:テンプレートを比較するため)。
- チャットターン: プロンプトを超えてフォローアップのチャットメッセージもテンプレート化できます。ユーザーのクエリの表現方法がLLMの出力にどのように影響するかをテストしたり、複数のチャットモデル(または異なる設定で同じチャットモデル)を使って後続の応答の品質を比較できます。
- モデル設定: サポートされているモデルの設定を変更し、設定ごとに比較できます。例えば、複数のChatGPTモデルにシステムメッセージの影響を測定し、設定を変更した各モデルにニックネームを付けてChainForgeにクエリを送信させることが可能です。
- 評価ノード: LLMの応答をチェーンして、ある望ましい動作をテストできます。基本的にはPythonスクリプトベースで、近い将来、一般的なユースケース向けにあらかじめ設定された評価ノード(例:名前認識)を追加する予定です。さらに、LLMの応答をプロンプトテンプレートにチェーンして、広範な評価を行う前に安価に出力を評価することもできます。
- 可視化ノード: グループ化された箱ひげ図(数値指標用)やヒストグラム(ブール指標用)などのプロットで評価結果を可視化できます。現在、数値とブール指標のみをサポートしていますが、将来的にはより多くのプロットオプションと制御機能の提供を目指しています。
これらの機能により、簡単に以下が可能となります:
- プロンプトとプロンプトパラメータ間の比較: 評価目標指標(例:コードエラーレートの最小化)を最大化する最適なプロンプトセットを選択することができます。また、プロンプトテンプレートのパラメータを変更して、応答の品質への影響を確認できます。
- モデル間の比較: すべてのプロンプトについて、モデルや異なるモデル設定における応答を比較できます。
一部のユーザーはChainForgeを使って、大量のパラメータ化されたクエリをLLMに送信し、スコアを付け、結果をスプレッドシート(Excel
xlsx
)に出力することも望んでいます。これを行うには、プロンプトノードの出力にインスペクトノードを追加し、Export Data
をクリックしてください。詳しい情報はドキュメントをご覧ください。
公式サイト
ドキュメント
インストール
ChainForgeを利用するには以下の3つがある
- パブリックなWebサイトを使用する(https://chainforge.ai/play/)
- ただし機能は限定的
- Pythonパッケージ
- Docker
今回はDockerで行う。Pythonのコード実行とかもできるようなので、その意味でもDockerのほうが安全ではないかということで。
レポジトリをクローン
git clone https://github.com/ianarawjo/ChainForge && cd ChainForge
Dockerイメージをビルド
docker build -t chainforge .
でコンテナを起動したいところだが、プロプライエタリなLLMプロバイダーにアクセスするにはAPIキーが必要になる。コンテナ起動後にのGUIからAPIキーを設定はできるのだが、永続的に保存する仕組みがどうやら用意されていない、つまりコンテナを起動し直すとAPIキーを再度設定する必要が出てきてしまう。そこで、.env
を作成しておいて、起動時に環境変数として渡すようにする。
今回はOpenAIとAnthropicのAPIキーをセットすることとする。設定可能なAPIキーは多分このあたり。
OPENAI_API_KEY=XXXXXXXXXX
ANTHROPIC_API_KEY=XXXXXXXXXX
コンテナ起動。--env-file .env
でAPIキーを読み込ませるようにしている。--rm
はとりあえずお試しということで。
docker run --rm -p 8000:8000 --env-file .env chainforge
8000番ポートで起動する
Serving Flask server on 0.0.0.0 on port 8000...
* Serving Flask app 'chainforge.flask_app'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:8000
* Running on http://172.17.0.3:8000
ブラウザでアクセス
ChainForgeが起動した。この画面でフローを作っていくことになる。
デフォルトで用意されているフローで少し使い方を確認していく。
まず、真ん中のPrompt Nodeに最初から入っているモデルを2つとも削除。
モデルを追加。今回はOpenAI gpt-4o-miniを追加した。
プロンプトも書き換える。
次に左のTextField Nodeの設定。Prompt Nodeのプロンプトを見るとわかるように、TextField Nodeで指定されたものがPrompt Nodeのプロンプト変数 {book}
に入るということになる。
このままでもいいのだけども、ここも日本語に書き換える。直接書き換えてもいいのだけど、この項目もLLMに生成させることができる。右上のピンクのアイコンをクリックして、以下のように設定して「Replace」をクリック。
こんな感じで置き換わる。なお、”Extend"タブを選択した場合は既存のTextField Nodeのリストに追加される形となる。
では、Prompt Nodeの右上の実行ボタンをクリックする。TextField Nodeの出力に合わせて、少しプロンプトも変えた。
右のInspect Nodeに結果が出力される(著作権に関連して出力されていないようだけども)
マトリックス的に比較することもできる。
LLMを追加してみる。Claudeの場合はモデルがここでは表示されない。
追加されたClaudeの右の設定アイコンをクリック。
モデルをHaikuに変更して一番下のSubmitで更新。
少しプロンプトを修正して、再度実行してみる。
プロンプト変数・LLMごとに出力結果が網羅的に確認ができている。
左上の「Add Node+」からフローに追加できるノードを選択できる。
評価用のノードや可視化ノードが用意されているので、これを使うとプロンプト評価をいい感じに行えそう。また、JavaScript/Pythonのコードを実行できるようなノードもあるね。
各ノードの使い方はドキュメントにまとまっている。
また、右上のExample Flowsから、サンプルのフローを読み出すことができる。
サンプルは基本的なものは6つだけなのだが、OpenAI Evalsを使用した評価の例は多く用意されている様子。
基本的なサンプルから「Compare length of responses across LLMs」を読み込んでみた。
複数のプロンプト変数・複数のLLMを使って回答を生成、それを結果として出力すると同時に、JavaScriptで出力文字数を取得、最後にそれを可視化するという例になっている。なるほど、興味深い。
サンプル見るだけでも色々参考になりそうな感じ。
なお、公式のチュートリアルは以下にYouTube動画が用意してある。
こちらは複数のプロンプトテンプレートを使って出力結果を比較するというものになっていて、いかにもプロンプトエンジニアリングっぽい例となっているので、これも参考に。
まとめ
LLMの評価ツール・評価プラットフォームはすでに多数あると思うが、それらに比べると恐らく機能的には少ないのではないかと思う。
ただ、GitHubのREADMEにもあるように、
個別のLLMと対話するだけではない、プロンプト、チャット応答、応答品質の探索を素早く行いたい初期段階での利用に適しています。
という点でユースケースは異なると思うし、シンプルかつ直感的に試行錯誤がしやすい環境となっていると思う。個人的には可視化が用意されていて、コードを使った評価器と組み合わせたりできる点が特に面白く感じた。
既存の評価ツール・評価プラットフォームは理解して使いこなすまでの学習コストがそこそこ必要になると思うが、これなら学習コストかなり低めに始めれそう。今回試したのはほんの触りの部分だけなので、用意されているノードをいろいろ触ってみたいと思う。