HyDE:仮想ドキュメントEmbedding
LLMで「理想的な」偽の回答を生成してEmbeddingし、それを使って検索します。短いクエリのEmbeddingより高い効果が得られます。
「HyDE:仮想ドキュメントEmbedding」はCoddyKit上の無料AI Agentsレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Agents学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Agentsコースには全4レッスンが含まれています。
このレッスンの一部はまだ翻訳されておらず、英語で表示されています。
クエリ埋め込みの問題
ユーザーのクエリは通常短く、取得したいドキュメントとはまったく異なる表現になっています。
- クエリ:「キーボードを直して」
- ドキュメント:「メカニカルキーボードのキーが引っかかる場合は、イソプロピルアルコールでスイッチを清掃できます……」
ベクトル同士の意味的な距離が離れているため、検索でドキュメントを見つけられません。
HyDEの考え方
HyDEはHypothetical Document Embeddings(Gao et al. 2022)の略です。
- クエリに対する架空の「理想的な回答」をLLMに書かせる
- クエリではなく、その架空の回答を埋め込む
- そのベクトルを使って実際のコーパスを検索する
機能する理由
仮想的な回答は、語彙や構造が似ているため、実際のドキュメントに近い形式になります。その埋め込みは実際のドキュメントの埋め込みの近くに位置するため、検索でより確実にドキュメントを見つけられます。
Implementation
def hyde_search(query, k=5):
# Step 1: hallucinate an answer
hypo_answer = llm.invoke(f'Please write a passage to answer the question: {query}').content
# Step 2: embed it
vec = embed(hypo_answer)
# Step 3: retrieve
return vector_db.query(vec, k=k)回答が間違っていても問題ない
HyDEの仮想的な回答は、事実として間違っている可能性がありますが、問題ありません。検索にはその埋め込みだけを使います。その後、取得した実際のドキュメントを使って最終回答を生成します。
Code Example with LangChain
from langchain.chains import HypotheticalDocumentEmbedder
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
embeddings = HypotheticalDocumentEmbedder.from_llm(
ChatOpenAI(),
OpenAIEmbeddings(),
'web_search' # built-in prompt template
)
vector = embeddings.embed_query('How do I fix a sticky keyboard?')コストのトレードオフ
HyDEでは、クエリごとにLLMの呼び出しが1回余分に必要です。次のような場合に有効です。
- クエリの表現がドキュメントの表現と大きく異なる場合
- 検索の再現率がボトルネックになっている場合
- ユーザーが言い換えて質問するような技術文書をコーパスに含む場合
複数サンプルのHyDE
N個の仮想的な回答を生成し、それぞれを埋め込み、各回答について上位K件を取得して、結果を統合します。コストは高くなりますが、難しいクエリに対する再現率が向上します。
hypos = [llm.invoke(...).content for _ in range(3)]
vecs = [embed(h) for h in hypos]
results = set()
for v in vecs:
results.update(vector_db.query(v, k=5))HyDEと再ランキングの組み合わせ
再現率にはHyDE、精度にはクロスエンコーダーを使います。
- HyDEで上位50件を取得する
- クロスエンコーダーで上位5件に再ランキングする
- 上位5件を使ってLLMが回答する
HyDEを使わない場合
- クエリがすでにドキュメントの言葉と一致している場合(FAQなど)
- レイテンシが重要な処理経路
- 単純な検索で十分な非常に小規模なコーパス
コードに対するHyDE
コード検索では、ユーザーが探している関数を仮想的に生成し、それを埋め込んで実際の関数を取得します。
code_hypo = llm.invoke(f'Write the Python function that does: {user_request}').content
results = code_index.search(embed(code_hypo))バリエーション:Step-Backプロンプティング
関連する手法として、まずモデルに、より一般的な質問を導き出させる方法があります(「キーボードを掃除するには?」→「メカニカルキーボードに適用できる一般的な清掃方法は?」)。その質問を埋め込んでから検索します。
HyDEが機能する理由
生のクエリを埋め込むよりも、HyDEのほうが検索性能を高められるのはなぜでしょうか。
まとめ
HyDEでは、回答を仮想的に生成し、その回答を埋め込んで検索します。LLMの呼び出しが1回余分に必要になりますが、難しいクエリ、言い換えられたクエリ、技術的なクエリに対する検索性能が向上します。
よくある質問
「HyDE:仮想ドキュメントEmbedding」レッスンは無料ですか?
はい。「HyDE:仮想ドキュメントEmbedding」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Agentsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Agentsコースには全4レッスンが含まれています。
「HyDE:仮想ドキュメントEmbedding」で何を学びますか?
LLMで「理想的な」偽の回答を生成してEmbeddingし、それを使って検索します。短いクエリのEmbeddingより高い効果が得られます。 ブラウザで直接実行するハンズオンコードでAI Agentsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AI Agentsを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAI Agentsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「HyDE:仮想ドキュメントEmbedding」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAI Agentsレッスンでコードを書いて実行できますか?
はい。すべてのAI Agentsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Cross-Encoderによる再ランキング
- HyDE:仮想ドキュメントEmbedding
- マルチベクトル検索(ColBERT)
- RAG評価(RAGAS、Recall@K)