Что такое 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
| Характеристика | Обычный RAG | HyDE |
|---|---|---|
| Что ищется | Эмбеддинг запроса пользователя | Эмбеддинг сгенерированного ответа |
| Длина входного текста | Короткая (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 НЕ работает (важно знать)
| Сценарий | Почему не работает | Пример |
|---|---|---|
| Очень конкретные запросы с ID | LLM не может угадать точный ID | "Заказ №ABC-123-XYZ" |
| Свежие события (после обучения LLM | LLM не знает о них | "Новый закон от вчерашнего дня" |
| LLM галлюцинирует | Гипотетический ответ неверен → поиск уходит не туда | LLM придумывает несуществующий медицинский диагноз |
| Запросы на редкие языки | LLM может плохо генерировать | Вопрос на суахили |
| Высокие требования к latency | HyDE добавляет 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 Expansion | HyDE |
|---|---|---|
| Что расширяет запрос | Синонимы, родственные слова | Полноценный гипотетический документ |
| Как получает расширение | Словарь синонимов, word2vec, LLM | LLM (генерация ответа) |
| Длина расширенного запроса | 2-3x от исходного | 10-100x от исходного |
| Качество для сложных запросов | Среднее | Лучшее |
| Стоимость | Низкая | Высокая |
Термин «Query Expansion» Классический метод IR, добавляющий к запросу синонимы («автомобиль» → «автомобиль машина авто транспорт»).
Вывод HyDE — это «тяжёлая артиллерия» для сложных запросов, где качество важнее скорости.
10. Пет-проект для закрепления
Задача Сравнить обычный RAG и HyDE на 50 неоднозначных запросах.
Инструменты Python, Qdrant, BGE-m3, Ollama (Llama-3)
Шаги
- Собрать 50 запросов, которые могут иметь неоднозначную интерпретацию:
- «Лев», «Python», «Весна», «Корона» и т.д.
- Подготовить коллекцию документов (можно взять Wikipedia)
- Реализовать два подхода:
- Для каждого запроса:
- Вручную оценить, нашли ли оба подхода релевантные документы
- Замерить latency
- Посчитать метрики:
- Сделать вывод: для каких типов запросов HyDE лучше?
Ожидаемый результат HyDE лучше для коротких, неоднозначных, требующих рассуждения запросов. Обычный RAG лучше для конкретных запросов с ID, названиями.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 1 | RAG архитектура (основа) |
| 5 | Оценка retrieval (MRR, Recall) |
| 10 | Self-RAG (тоже рефлексия, но другой подход) |
| 17 | Уменьшение галлюцинаций (HyDE может их усиливать) |
| 86 | Retrieval не находит (HyDE как решение) |
| 141-150 | Agentic RAG (агент решает, когда использовать HyDE) |
11. Что такое Hypothetical Document Embeddings (HyDE) и зачем|11. Что такое Hypothetical Document Embeddings (HyDE) и зачем|11. Что такое Hypothetical Document Embeddings (HyDE) и зачем|11 полностью разобран. Переходим к вопросу 12, когда будете готовы|Вопрос 11 полностью разобран. Переходим к вопросу 12, когда будете готовы]]
Навигация
- Предыдущий: 10
- Следующий: 12
- Индекс: 00. Индекс разборов