【Prompt切り替え】RouterChainを使って「質問の種類」に合わせて専門家を召喚する
はじめに
「物理の質問も、歴史の質問も、Pythonコードの質問も、全て1つのプロンプトで捌きたい」。そう思うかもしれませんが、プロンプトが巨大化しすぎて精度が落ちていませんか?
LangChainのRouterChainを使えば、ユーザーの質問内容を自動判別し、物理なら「物理学者プロンプト」、歴史なら「歴史学者プロンプト」へと、動的にリクエストを振り分けることができます。
万能プロンプトの限界
Trade-off
「あなたは〇〇の専門家です」という指示は強力ですが、混ぜすぎると人格が崩壊します。役割ごとにChainを分割し、適切なタイミングで切り替えるのがベストプラクティスです。
RouterChainの仕組み
RouterChainは、その名の通り「ルーター」の役割を果たします。
- ユーザーの入力が入ってくる。
- ルーターが「これはどの専門分野かな?」と判断(分類)する。
- 適切な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」について解説します。
コメント
コメントを投稿