Что такое Hypothetical Document Embeddings (HyDE) и зачем?

Краткий тезис

HyDE (Hypothetical Document Embeddings — это техника улучшения поиска (retrieval) в RAG, которая работает по принципу «сначала придумай ответ, потом ищи документы». Вместо того чтобы искать документы по короткому запросу пользователя, HyDE сначала просит LLM сгенерировать гипотетический ответ (как если бы LLM уже знала ответ), а затем использует embedding этого гипотетического ответа для поиска похожих документов в векторной БД.

Зачем Короткие или queries|неоднозначные запросы пользователя плохо работают с векторным поиском. HyDE расширяет запрос, превращая его в полноценный документ-«образец», который легче сопоставить с реальными документами.

Ключевая идея Вектор реального документа и вектор гипотетического ответа на тот же вопрос находятся ближе друг к другу, чем вектор короткого запроса и вектор документа.


1. Термин: HyDE (Hypothetical Document Embeddings)

Что это Метод, предложенный в статье "Precise Zero-Shot Dense Retrieval without Relevance Labels" (2022). Расшифровывается как «Эмбеддинги гипотетических документов».

Простая аналогия

  • Обычный поиск Вы говорите библиотекарю: «Дай мне книги про кошек». (короткий запрос)
  • HyDE Вы сначала пишете короткий рассказ о кошке, а потом просите библиотекаря найти книги, похожие на этот рассказ. Рассказ даёт больше деталей для поиска.

Термин «Zero-shot retrieval» Поиск в домене, где у вас нет размеченных примеров (какие запросы к каким документам релевантны). HyDE не требует обучения — работает «из коробки» с любой LLM.


2. Проблема, которую решает HyDE

2.1 Проблема коротких запросов

Короткий запрос «iPhone 15»

Что ищет векторный поиск Ближайшие векторы к эмбеддингу фразы «iPhone 15».

Проблема Вектор «iPhone 15» находится где-то в пространстве между «смартфонами Apple», «мобильными телефонами» и «технологиями 2023 года». Много шума, поиск не точный.

Пример неоднозначного запроса «Лев» — это животное, знак зодиака, город, фильм или футбольный клуб? Вектор короткого запроса не различит.

2.2 Проблема лексического разрыва (lexical gap)

Термин «Лексический разрыв» (Lexical Gap Запрос и релевантный документ могут не иметь общих слов.

Запрос пользователяРелевантный документОбщие слова
«Как поменять масло»«Инструкция по замене моторного масла»«масло» (только одно)
«iPhone 15 камера»«Обзор возможностей фотосъёмки Apple iPhone 15»«iPhone 15»

Почему это проблема для векторного поиска Векторное сходство (cosine similarity) тем выше, чем больше семантически близких слов. Если общих слов мало, документ может не найтись.


3. Как работает HyDE (по шагам)

3.1 Архитектура HyDE

[Шаг 1] Запрос пользователя: "Как отремонтировать стиральную машину?"
              │
              ▼
[Шаг 2] LLM генерирует гипотетический ответ (без поиска документов!):
        "Для ремонта стиральной машины необходимо: 
         1. Отключить питание
         2. Слить воду через фильтр
         3. Снять заднюю крышку
         4. Проверить ремень привода
         5. При необходимости заменить подшипники..."
              │
              ▼
[Шаг 3] Вычисляем embedding гипотетического ответа:
        hyde_embedding = embedding_model(hyde_answer)
              │
              ▼
[Шаг 4] Ищем в векторной БД документы, похожие на hyde_embedding
        (а не на embedding исходного запроса)
              │
              ▼
[Шаг 5] Возвращаем найденные документы → передаём в LLM для финального ответа

3.2 Код реализации

from sentence_transformers import SentenceTransformer
from langchain.llms import Ollama

# 1. Инициализация
embedder = SentenceTransformer("BAAI/bge-m3")
llm = Ollama(model="llama3")

# 2. Обычный RAG (baseline)
def normal_rag(query):
    query_emb = embedder.encode(query)
    docs = vector_db.search(query_emb, top_k=5)
    return llm.invoke(f"Context: {docs}\nQuestion: {query}")

# 3. HyDE RAG
def hyde_rag(query):
    # Шаг 1: генерируем гипотетический ответ
    hyde_prompt = f"Напиши подробный ответ на вопрос. Если не знаешь ответа, напиши правдоподобный ответ, который поможет найти информацию.\n\nВопрос: {query}\n\nОтвет:"
    hyde_answer = llm.invoke(hyde_prompt)
    
    # Шаг 2: эмбеддинг гипотетического ответа
    hyde_embedding = embedder.encode(hyde_answer)
    
    # Шаг 3: поиск по hyde_embedding
    docs = vector_db.search(hyde_embedding, top_k=5)
    
    # Шаг 4: финальная генерация (можно тем же LLM или другим)
    return llm.invoke(f"Context: {docs}\nQuestion: {query}")

4. Сравнение: обычный RAG vs HyDE

ХарактеристикаОбычный RAGHyDE
Что ищетсяЭмбеддинг запроса пользователяЭмбеддинг сгенерированного ответа
Длина входного текстаКороткая (5-15 слов)Длинная (100-500 слов)
Качество поиска (recall@kБазовоеНа 10-20% выше для сложных запросов
Дополнительный LLM вызовНетДа (генерация гипотетического ответа)
LatencyНизкая (1 LLM вызов)Высокая (2 LLM вызова)
Риск галлюцинацийНет (LLM только на финале)Есть (гипотетический ответ может быть неверным)
СтоимостьНизкаяВ 2 раза выше

Термин «Recall@k» Доля релевантных документов, найденных в топ-k результатов. HyDE улучшает recall на 10-20% на многих бенчмарках.


5. Когда HyDE работает хорошо?

СценарийПочему хорошоПример
Короткие, неоднозначные запросыГипотетический ответ добавляет контекст"Лев" (животное/знак зодиака/город)
Фактологические вопросыLLM генерирует правдоподобные факты"Столица Франции?" → "Париж находится на реке Сена..."
Запросы, требующие рассужденияГипотетический ответ показывает связи"Как связаны теория струн и чёрные дыры?"
Специфическая терминологияLLM добавляет жаргон/профессионализмы"Починить выхлопную" → "замена глушителя, катализатора..."

Пример улучшения

ЗапросОбычный RAG (top-1)HyDE (top-1)
«Лев»Статья о созвездии ЛьваСтатья о львах (животных)
«Python»Статья о змеяхСтатья о языке программирования Python

6. Когда HyDE НЕ работает (важно знать)

СценарийПочему не работаетПример
Очень конкретные запросы с IDLLM не может угадать точный ID"Заказ №ABC-123-XYZ"
Свежие события (после обучения LLMLLM не знает о них"Новый закон от вчерашнего дня"
LLM галлюцинируетГипотетический ответ неверен → поиск уходит не тудаLLM придумывает несуществующий медицинский диагноз
Запросы на редкие языкиLLM может плохо генерироватьВопрос на суахили
Высокие требования к latencyHyDE добавляет 1 LLM вызов (медленнее в 2 раза)Чат-бот реального времени

Термин «Галлюцинация» в контексте HyDE LLM генерирует правдоподобный, но неверный ответ. Например, на вопрос «Как звали первого президента вымышленной страны N?» LLM может выдумать имя. Поиск по эмбеддингу этого выдуманного ответа приведёт к нерелевантным документам.


7. Варианты HyDE (улучшения)

7.1 HyDE с несколькими гипотетическими ответами

Идея Сгенерировать несколько гипотетических ответов (например, 3), усреднить их эмбеддинги или объединить результаты поиска.

def hyde_ensemble(query, n_answers=3):
    all_docs = []
    for _ in range(n_answers):
        hyde_answer = llm.invoke(f"Ответь на вопрос: {query}")
        hyde_emb = embedder.encode(hyde_answer)
        docs = vector_db.search(hyde_emb, top_k=5)
        all_docs.extend(docs)
    
    # Дедупликация и объединение
    unique_docs = deduplicate(all_docs)
    return unique_docs[:10]

Плюсы Более robust. Минусы Ещё дороже (N LLM вызовов).


7.2 HyDE с температурой (temperature sampling)

Идея Использовать temperature > 0 при генерации гипотетического ответа, чтобы получать разнообразные формулировки.

hyde_answer = llm.invoke(prompt, temperature=0.7)  # выше = разнообразнее

7.3 HyDE без LLM (rule-based)

Идея Для очень простых запросов не вызывать LLM, а использовать эвристики (например, добавить слова «информация о...», «статья про...»).

if len(query.split()) < 3:
    # Короткий запрос → расширяем эвристически
    expanded_query = f"информация о {query} подробное описание"
    query_emb = embedder.encode(expanded_query)
else:
    # Длинный запрос → HyDE
    hyde_answer = llm.invoke(f"Ответь: {query}")
    query_emb = embedder.encode(hyde_answer)

8. Практический кейс (пример для собеседования)

«В проекте поиска по медицинским статьям мы столкнулись с проблемой: врачи задавали короткие запросы вроде «диабет 2 типа лечение». Векторный поиск находил общие статьи, но не всегда лучшие.

Мы внедрили HyDE: LLM сначала генерировал гипотетический ответ с подробным описанием лечения диабета (диета, метформин, инсулин). Поиск по эмбеддингу этого развёрнутого ответа находил гораздо более релевантные статьи.

Recall@10 вырос с 0.72 до 0.85, но latency увеличилась с 0.8 до 1.9 секунд (из-за двух LLM вызовов). Для медицинского поиска это было приемлемо. Для чат-бота с низкой latency мы бы не стали использовать HyDE


9. HyDE vs Query Expansion (классический подход)

ХарактеристикаQuery ExpansionHyDE
Что расширяет запросСинонимы, родственные словаПолноценный гипотетический документ
Как получает расширениеСловарь синонимов, word2vec, LLMLLM (генерация ответа)
Длина расширенного запроса2-3x от исходного10-100x от исходного
Качество для сложных запросовСреднееЛучшее
СтоимостьНизкаяВысокая

Термин «Query Expansion» Классический метод IR, добавляющий к запросу синонимы («автомобиль» → «автомобиль машина авто транспорт»).

Вывод HyDE — это «тяжёлая артиллерия» для сложных запросов, где качество важнее скорости.


10. Пет-проект для закрепления

Задача Сравнить обычный RAG и HyDE на 50 неоднозначных запросах.

Инструменты Python, Qdrant, BGE-m3, Ollama (Llama-3)

Шаги

  1. Собрать 50 запросов, которые могут иметь неоднозначную интерпретацию:
    • «Лев», «Python», «Весна», «Корона» и т.д.
  2. Подготовить коллекцию документов (можно взять Wikipedia)
  3. Реализовать два подхода:
    • Обычный RAG (embedding запроса → поиск → генерация)
    • HyDE (гипотетический ответ → embedding → поиск → генерация)
  4. Для каждого запроса:
    • Вручную оценить, нашли ли оба подхода релевантные документы
    • Замерить latency
  5. Посчитать метрики:
    • MRR@5 (обратный ранг первого релевантного документа)
    • Средняя latency
  6. Сделать вывод: для каких типов запросов HyDE лучше?

Ожидаемый результат HyDE лучше для коротких, неоднозначных, требующих рассуждения запросов. Обычный RAG лучше для конкретных запросов с ID, названиями.


Связь с другими вопросами

ВопросТема
1RAG архитектура (основа)
5Оценка retrieval (MRR, Recall)
10Self-RAG (тоже рефлексия, но другой подход)
17Уменьшение галлюцинаций (HyDE может их усиливать)
86Retrieval не находит (HyDE как решение)
141-150Agentic RAG (агент решает, когда использовать HyDE)

11. Что такое Hypothetical Document Embeddings (HyDE) и зачем|11. Что такое Hypothetical Document Embeddings (HyDE) и зачем|11. Что такое Hypothetical Document Embeddings (HyDE) и зачем|11 полностью разобран. Переходим к вопросу 12, когда будете готовы|Вопрос 11 полностью разобран. Переходим к вопросу 12, когда будете готовы]]


Навигация