Продвинутый RAG: query rewriting, multi-query, HyDE

Обзор техник, которые улучшают RAG, меняя не базу, а сам запрос перед поиском.

Базовый RAG ищет по исходному вопросу. Продвинутые техники сначала преобразуют запрос, чтобы он лучше попадал в релевантные чанки.

Query rewriting (переписывание запроса)

Запросы пользователей бывают кривыми: разговорными, с опечатками, неполными, с местоимениями вместо тем. LLM переписывает вопрос в чёткую форму перед поиском.

Было:  "а сколько у вас на это времени?"  (после разговора о возврате)
Стало: "В течение скольких дней возможен возврат товара?"

Особенно важно в диалоге: переписывание разрешает местоимения и подтягивает контекст беседы в самостоятельный запрос.

Multi-query (несколько формулировок)

Одна формулировка может не дотянуться до нужных чанков. Идея: сгенерировать LLM несколько перефразировок вопроса, искать по каждой и объединить результаты. Это повышает шанс зацепить релевантное.

variants = [
    "как вернуть товар",
    "условия возврата покупки",
    "сколько дней на возврат",
]

# у каждого варианта свои «найденные» id (имитация поиска)
hits = {
    "как вернуть товар":        {"c1", "c3"},
    "условия возврата покупки":  {"c3", "c4"},
    "сколько дней на возврат":   {"c2", "c3"},
}

union = set()
for v in variants:
    union |= hits[v]
print("Объединённый набор чанков:", sorted(union))

Вывод:

Объединённый набор чанков: ['c1', 'c2', 'c3', 'c4']

Каждая формулировка нашла что-то своё; объединение покрывает больше релевантного, чем любой запрос по отдельности. Чанк c3 всплыл во всех — явный признак высокой релевантности.

HyDE (Hypothetical Document Embeddings)

Тонкая идея: короткий вопрос и длинный документ-ответ «выглядят» по-разному, и их векторы не всегда близки. HyDE сначала просит LLM придумать гипотетический ответ на вопрос, а затем ищет по эмбеддингу этого выдуманного ответа — он по форме ближе к настоящим документам.

Вопрос:            "Чем отличается HNSW от IVF?"
Гипотетический
ответ (от LLM):    "HNSW строит навигируемый граф... IVF делит на кластеры..."
Ищем по эмбеддингу гипотетического ответа -> находим реальные документы
                                              про HNSW и IVF

Парадокс: даже если выдуманный ответ фактически неточен, он содержит правильные термины и стиль, поэтому ведёт к нужным документам лучше короткого вопроса.

Когда что применять

ТехникаРешает
Query rewritingкривые/диалоговые запросы, местоимения
Multi-queryодна формулировка не покрывает тему
HyDEразрыв «короткий вопрос ↔ длинный документ»

Итог

  • Продвинутый RAG улучшает извлечение, преобразуя запрос.
  • Rewriting чистит запрос, multi-query расширяет покрытие, HyDE сближает вопрос с документами.
  • Цена — дополнительные вызовы LLM перед поиском.
Проверьте себя
1. Что делает query rewriting?
AПереписывает документы в базе
BПреобразует кривой/диалоговый вопрос в чёткий запрос перед поиском
CМеняет модель эмбеддингов
DУдаляет чанки
2. В чём идея multi-query?
AЗадать вопрос много раз одной модели
BСгенерировать несколько перефразировок, искать по каждой и объединить результаты
CУдвоить размер базы
DУменьшить k до 1
3. Как работает HyDE?
AШифрует запрос
BГенерирует гипотетический ответ и ищет по его эмбеддингу, ближе к реальным документам
CУдаляет стоп-слова
DПереобучает модель
Поддержать проект