開発者がFSMベースのフレームワークを構築し、LLMチャットボットをスクリプトに確実かつ低コストで従わせる
開発者が、有限状態機械と言語モデルを組み合わせて、LLMベースのチャットボットに事前定義された対話スクリプトを厳密に守らせるカスタムのオープンソースライブラリの構築について説明しています。高価なマルチコールエージェントアーキテクチャに頼る代わりに、このプロジェクト(tg-statemachine-bot)は会話をYAMLファイルで定義されたステージに分割し、現在のステージに関連する指示のみをモデルに供給して、コンテキストを小さく保ち、動作を予測可能にします。
著者は業務用チャットボットに取り組む中で、大規模言語モデルが長く詳細なスクリプトを確実に従うのが難しいことを見出した。その理由は、広いコンテキストウィンドウによって、長い指示にわたって構造を見失ってしまうからである。また、タスクをステップに分割する既存のエージェントベースの解決策は、モデル呼び出しの回数を増やし、各対話のコストを押し上げることも判明した。この問題を低コストで解決するため、著者はオープンソースのライブラリを構築した。このライブラリでは、有限状態機械(FSM)が対話全体のグラフを管理し、どのステージの指示をLLMに渡すかを各時点で制御する。これにより、モデルはスクリプト全体ではなく、現在のステージに関連する指示のみを常に見ることになる。アーキテクチャは3つのモジュールで構成される。対話グラフとユーザー状態を追跡するFSMモジュール、変更履歴付きで対話変数を保存するvars_memoryモジュール、そしてLLMへの呼び出しを調整するconversation_coreモジュールである。各ターンで、モデルは4つの固定フィールドからなる契約(ユーザーへのメッセージ、遷移シグナル、構造化されたステージ結果、ステージ要約)で応答する必要がある。この契約に違反した場合(不正なJSON、存在しない遷移シグナル、結果の欠落など)、システムは自動的に修正のためのフォローアップ要求を送信する。ステージ遷移間の会話の連続性は、OpenAIのResponses APIのprevious_response_idチェーンを使用して維持され、これによりキャッシュ読み取りの低価格設定を通じてコストも削減される。対話スクリプト全体はYAMLファイルに記述され、詳細なステージ指示は別ファイルに保持されるため、基盤となるエンジンは変更なしでさまざまなチャットボットドメインに再利用できる。YAMLを手作業で編集する複雑さを管理するため、著者はYAMLをdraw.ioダイアグラムに変換して人間がレビューしやすくするスクリプトと、テスト会話をチャット形式でシステムログを展開可能にして検査できるログビューアツール(ローカルデバッグ時にリアルタイム更新を含む)を構築した。デモンストレーションとして、リポジトリには、ソロ開発者がプロジェクト要件を明確にするのを支援する「アナリストボット」の例が含まれている。著者によると、このボットはユーザーメッセージごとに約1.03回のLLM呼び出ししか必要とせず、それでもスクリプトに確実に従い構造化情報を収集できるが、デモボットのプロンプトエンジニアリングは洗練されていないままである。
出典: Habr — хаб NLP —
原文
