Реализация HyDE (Hypothetical Document Embeddings) для RAG

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1Все 1566 услуг
Реализация HyDE (Hypothetical Document Embeddings) для RAG
Средний
от 1 дня до 3 дней
Часто задаваемые вопросы

Направления AI-разработки

Этапы разработки AI-решения

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1284
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    901
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1119
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    853

Реализация HyDE (Hypothetical Document Embeddings) для RAG

HyDE — техника улучшения retrieval, предложенная Gao et al. (2022). Вместо того чтобы искать документы по embedding запроса напрямую, LLM генерирует гипотетический ответ на вопрос, а поиск выполняется по embedding этого ответа. Гипотетический ответ находится в пространстве «документов», а не «вопросов», поэтому его embedding лучше совпадает с реальными документами.

Почему работает HyDE

Асимметрия embedding пространства: вопросы и ответы — разные дистрибуции в пространстве векторов. Embedding вопроса «какой срок давности по трудовым спорам» попадает в область запросов, а не документов с ответами. HyDE генерирует текст, похожий на документ из корпуса.

Обычный RAG:
Запрос → Embedding(запрос) → поиск → документы

HyDE:
Запрос → LLM → Гипотетический_ответ → Embedding(ответа) → поиск → документы

Реализация HyDE

from langchain.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
from langchain_community.vectorstores import Qdrant

llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.3)
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
vectorstore = Qdrant.from_existing_collection(
    embeddings=embeddings,
    collection_name="legal_docs",
    url="http://localhost:6333",
)

# Промпт для генерации гипотетического документа
HYDE_PROMPT = ChatPromptTemplate.from_template("""Напиши короткий отрывок документа (150-250 слов),
который полностью отвечает на следующий вопрос.
Пиши как фрагмент официального документа, без вводных фраз типа "Согласно документу".

Вопрос: {question}

Гипотетический документ:""")

def hyde_retriever(question: str, top_k: int = 5) -> list:
    # Генерируем гипотетический документ
    hypothetical_doc = llm.invoke(
        HYDE_PROMPT.format_messages(question=question)
    ).content

    # Ищем по embedding гипотетического документа
    docs = vectorstore.similarity_search(hypothetical_doc, k=top_k)
    return docs

# Пример
question = "Каков срок исковой давности по трудовым спорам о невыплате зарплаты?"
docs = hyde_retriever(question)

HyDE vs стандартный retrieval: сравнение

Вопрос: «Каков порядок расторжения договора аренды в одностороннем порядке?»

Стандартный retrieval embedding будет близок к другим вопросам с похожей формулировкой.

HyDE генерирует: «Согласно статье 619 ГК РФ, арендодатель вправе требовать досрочного расторжения договора в случае: использования имущества с существенным нарушением условий договора; существенного ухудшения имущества; невнесения арендной платы более двух раз подряд; непроведения капитального ремонта в установленные сроки. До расторжения арендодатель обязан направить письменное предупреждение с разумным сроком на устранение нарушений...»

Этот текст семантически близок к реальным юридическим документам в корпусе.

Практические результаты

Датасет: 8500 юридических документов. Тестовый набор: 300 вопросов.

Метод MRR@5 NDCG@5 Latency
Standard RAG 0.68 0.65 180мс
HyDE 0.77 0.74 580мс
Multi-Query 0.81 0.78 650мс
HyDE + Reranker 0.84 0.81 820мс

HyDE даёт +13% к MRR. Особенно эффективен для фактических вопросов с ожидаемым длинным ответом.

Ограничения HyDE

Когда HyDE не помогает: запросы на поиск точных номеров, дат, имён. Гипотетический документ будет содержать выдуманные числа, которые ухудшат retrieval точных фактов.

Latency: дополнительный вызов LLM добавляет 300–500мс к общей latency.

Hallucinations в HyDE-документе: модель может выдумать факты в гипотетическом ответе, что уведёт embedding в неправильном направлении. Критично для узких технических доменов с малым числом документов.

Комбинированный подход: HyDE + стандартный запрос

def combined_hyde_retriever(question: str, top_k: int = 5) -> list:
    """Объединяет результаты HyDE и стандартного поиска"""

    # Параллельно
    hypothetical = llm.invoke(HYDE_PROMPT.format_messages(question=question)).content
    hyde_docs = vectorstore.similarity_search(hypothetical, k=top_k)
    standard_docs = vectorstore.similarity_search(question, k=top_k)

    # Дедупликация
    seen = set()
    combined = []
    for doc in hyde_docs + standard_docs:
        key = hash(doc.page_content[:100])
        if key not in seen:
            seen.add(key)
            combined.append(doc)

    return combined[:top_k * 2]  # Передаём в reranker больший набор

Сроки

  • Реализация HyDE retriever: 1–2 дня
  • Подбор промпта для гипотетического документа: 2–3 дня
  • Тестирование на датасете vs baseline: 2–3 дня
  • Итого: 1 неделя