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

【LangChain】HyDEでRAG検索精度を爆上げする:エンジニアにも「仮説思考」が必要だ

【LangChain】HyDEでRAG検索精度を爆上げする:エンジニアにも「仮説思考」が必要だ

はじめに:質問下手なユーザーを救いたい

「このシステム、全然ヒットしないんだけど!」
社内QAチャットボットを導入した翌日、営業担当からクレームが入りました。ログを見てみると、検索ワードは「アレどうやるの?」……いや、アレじゃ分からんよ!と思わずツッコミを入れてしまいました。

しかし、ユーザー教育をするより、システム側で賢くなる方が早いのが世の常です。ユーザーの曖昧な質問から、「たぶんこういう答えが欲しいんだろうな」と仮説を立てて検索する。そんな人間臭いことをやってのける技術が HyDE (Hypothetical Document Embeddings) です。

基礎知識:HyDE (Hypothetical Document Embeddings) とは

通常、RAGは「ユーザーの質問」と「ドキュメント」の類似度を計算します。しかし、質問文は短く、ドキュメントは長いため、ベクトル空間での距離が遠くなりがちです。

HyDEのアプローチはこうです。
1. ユーザーの質問に対し、LLMがいったん「嘘でもいいから、ありそうな回答(仮説文書)」を生成する。
2. その「仮説文書」を使って、データベースを検索する。

つまり、「検索クエリと回答は似てないけど、回答と回答は似ているよね」という理屈です。ビジネスでも「とりあえず仮説を立ててから調査する」のが定石ですが、それをAIにやらせるわけです。

実装・設定:LangChainでの実装コード

概念は難しそうですが、実装はLangChainのチェーンをつなぐだけです。

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. あとは普段どおりRetriever検索に使うだけ
result = vectorstore.similarity_search("給与振込の変更方法は?", embedding=embeddings)

これだけで、裏側では「給与振込口座の変更は、総務部への申請書が必要です…」といった仮想の回答が生成され、それと似た本物の社内規定ドキュメントがヒットするようになります。

応用テクニック:日本語特化の調整

デフォルトのプロンプトは英語なので、日本語環境ではカスタマイズ必須です。「以下の質問に対する回答記事を書いてください」といった指示を与えることで、より精度の高い仮説文書が生成されます。

Check: HyDEはLLM呼び出しが1回増えるため、レスポンスが数秒遅くなります。チャットボットのようなリアルタイム性が求められる場面では、このラグが許容できるかユーザー部門と握っておく必要があります。

トラブルシューティング:幻覚(ハルシネーション)との付き合い方

「嘘の回答で検索して大丈夫?」と不安になりますよね。大丈夫です。HyDEの目的はあくまで「検索用のベクトルを作ること」であり、生成された嘘の内容をユーザーに見せるわけではありません。

ただし、生成された仮説があまりにも見当違い(例:料理のレシピを聞いたら、プログラムコードが出力された)だと、検索精度も落ちます。仮説生成に使うLLMのTemperature設定などは試行錯誤が必要です。

まとめ:AIに「気を回してもらう」技術

HyDEは、ユーザーの「言葉足らず」をAIの想像力で補う技術です。これにより、キーワードが一致しなくても、文脈や意図が合致するドキュメントを見つけ出せるようになります。

「検索精度が悪い」と文句を言われたら、インデックスを再構築する前に、まずHyDEを挟んでみてください。魔法のように解決することがありますよ。

この記事はAI技術を活用して作成されましたが、内容は慎重に確認されています。

コメント