【LangChain】HyDEでRAG検索精度を爆上げする:エンジニアにも「仮説思考」が必要だ
はじめに:質問下手なユーザーを救いたい
「全然ヒットしないんだけど!」というクレーム。ログを見てみると、検索ワードは「アレどうやるの?」……いや、分かるわけないだろ!
しかし、ユーザー教育をするより、システム側で賢くなる方が早い。ユーザーの曖昧な質問から、「たぶんこういう答えが欲しいんだろうな」と仮説を立てて検索する。そんな技術が
HyDE です。
基礎知識:HyDE (Hypothetical Document Embeddings) とは
HyDEのアプローチはこうです。
1. ユーザーの質問に対し、LLMがいったん「嘘でもいいから、ありそうな回答(仮説文書)」を生成する。
2.
その「仮説文書」を使って、データベースを検索する。
つまり、「検索クエリと回答は似てないけど、回答と回答は似ているよね」という理屈です。ビジネスでも「とりあえず仮説を立ててから調査する」のが定石ですが、それをAIにやらせるわけです。
実装・設定:LangChainでの実装コード
実装は通常のEmbeddingsをラッパーで包むだけです。
from langchain.chains import HypotheticalDocumentEmbedder
from langchain_openai import OpenAI, OpenAIEmbeddings
# 1. 基礎となるEmbeddings
base_embeddings = OpenAIEmbeddings()
# 2. 仮説生成用のLLM
llm = OpenAI()
# 3. HyDEラッパーに包む
embeddings = HypotheticalDocumentEmbedder.from_llm(
llm,
base_embeddings,
prompt_key="web_search"
)
# 4. 検索実行
result = vectorstore.similarity_search("給与振込の変更方法は?", embedding=embeddings)
これで、裏側では「給与振込口座の変更は、総務部への申請書が必要です…」といった仮想の回答が生成され、それと似た本物の社内規定がヒットするようになります。
応用テクニック:日本語特化の調整
デフォルトのプロンプトは英語なので、日本語の質問には弱いです。必ず日本語のプロンプトテンプレート(「次の質問に対する回答記事を書いてください」等)を渡してHyDEを初期化しましょう。これで精度が段違いに変わります。
トラブルシューティング:幻覚との付き合い方
「嘘の回答で検索して大丈夫?」と不安になりますが、HyDEの目的はあくまで「検索用のベクトルを作ること」です。生成された嘘の内容が表示されるわけではないので安心してください。
ただし、レスポンスが数秒遅くなる点だけは注意が必要です。
まとめ:AIに「気を回してもらう」技術
HyDEは、ユーザーの「言葉足らず」をAIの想像力で補う技術です。「検索精度が悪い」と文句を言われたら、インデックスを再構築する前に、まずHyDEを挟んでみてください。
コメント
コメントを投稿