スキップしてメイン コンテンツに移動

【Prompt切り替え】RouterChainを使って「質問の種類」に合わせて専門家を召喚する

【Prompt切り替え】RouterChainを使って「質問の種類」に合わせて専門家を召喚する

はじめに

「物理の質問も、歴史の質問も、Pythonコードの質問も、全て1つのプロンプトで捌きたい」。そう思うかもしれませんが、プロンプトが巨大化しすぎて精度が落ちていませんか?

LangChainのRouterChainを使えば、ユーザーの質問内容を自動判別し、物理なら「物理学者プロンプト」、歴史なら「歴史学者プロンプト」へと、動的にリクエストを振り分けることができます。

万能プロンプトの限界

Trade-off

「あなたは〇〇の専門家です」という指示は強力ですが、混ぜすぎると人格が崩壊します。役割ごとにChainを分割し、適切なタイミングで切り替えるのがベストプラクティスです。

RouterChainの仕組み

RouterChainは、その名の通り「ルーター」の役割を果たします。

  1. ユーザーの入力が入ってくる。
  2. ルーターが「これはどの専門分野かな?」と判断(分類)する。
  3. 適切なDestination Chain(宛先チェーン)に入力を転送する。

MultiPromptChainの実装

最も簡単な実装例です。

from langchain.chains.router import MultiPromptChain
from langchain.llms import OpenAI

prompt_infos = [
    {"name": "physics", "description": "物理の質問に答える", "prompt_template": "あなたは物理学者です..."},
    {"name": "math", "description": "数学の質問に答える", "prompt_template": "あなたは数学者です..."}
]

chain = MultiPromptChain.from_prompts(llm, prompt_infos)
chain.run("ブラックホールって何?") # -> 物理学者が答える

LLMRouterとEmbeddingRouter

振り分け方法には2種類あります。

  • LLMRouter: 小型LLMに「どっち行き?」と聞く方法。精度は高いが少し遅い。
  • EmbeddingRouter: 質問文をベクトル化し、類似度で判定する方法。爆速だが、微妙なニュアンスの判定が苦手。

まとめ

RouterChainを使えば、単一のAIの中に「複数の人格」を同居させ、状況に応じて使い分ける高度なチャットボットが構築できます。

次回は、構造化データの王者「SQLデータベース」に対して、自然言語でクエリを投げる「SQLDatabase Chain」について解説します。

このブログ記事はAIを利用して自動生成されました。

コメント