HyDE: гипотетические эмбеддинги документов
Сгенерируйте с помощью LLM вымышленный «идеальный» ответ, создайте для него эмбеддинг и выполняйте поиск по нему — это эффективнее эмбеддингов коротких запросов.
«HyDE: гипотетические эмбеддинги документов» — бесплатный урок AI Agents на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Agents, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Agents содержит 4 уроков всего.
Части этого урока еще не переведены и отображаются на английском.
Проблема эмбеддингов запросов
Запросы пользователей обычно короткие и совсем не похожи на документы, которые нужно найти.
- Запрос: «почините мою клавиатуру»
- Документ: «Если клавиши механической клавиатуры заедают, можно очистить переключатели изопропиловым спиртом...»
Векторы семантически удалены друг от друга, поэтому поиск не находит документ.
Идея HyDE
HyDE = эмбеддинги гипотетического документа (Gao и др., 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 может содержать фактические ошибки — это нормально. Мы используем его только для построения эмбеддинга и поиска. Затем найденные документы REAL используются для создания окончательного ответа.
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 для каждого запроса. Это оправданно, когда:
- Формулировка запроса сильно отличается от формулировок в документах
- Полнота поиска является узким местом
- В наборе документов есть технические тексты, которые пользователь пересказывает своими словами
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 лучших
- LLM формирует ответ на основе пяти лучших
Когда НЕ следует использовать HyDE
- Запросы уже соответствуют языку документов, например в разделе часто задаваемых вопросов
- Пути, критичные к задержке
- Очень небольшие наборы документов, где достаточно обычного поиска
HyDE для кода
Для поиска по коду: сгенерируйте вымышленную функцию, которую ищет пользователь, создайте её эмбеддинг и найдите настоящие функции.
code_hypo = llm.invoke(f'Write the Python function that does: {user_request}').content
results = code_index.search(embed(code_hypo))Варианты: пошаговое обобщение запроса
Связанный метод: сначала попросите модель вывести более общий вопрос («Как очистить клавиатуры?» → «Какой общий способ очистки подходит для механических клавиатур?»), создайте для него эмбеддинг, а затем выполните поиск.
Почему HyDE работает
Почему HyDE выполняет поиск лучше, чем построение эмбеддинга исходного запроса?
Повторение
HyDE: сгенерируйте вымышленный ответ, создайте его эмбеддинг THAT и выполните поиск. Метод требует одного дополнительного обращения к LLM, но улучшает поиск для сложных, перефразированных и технических запросов.
Часто задаваемые вопросы
Урок «HyDE: гипотетические эмбеддинги документов» бесплатный?
Да — полный текст урока «HyDE: гипотетические эмбеддинги документов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Agents, подпишись на CoddyKit PRO. Курс AI Agents содержит 4 уроков всего.
Чему я научусь в уроке «HyDE: гипотетические эмбеддинги документов»?
Сгенерируйте с помощью LLM вымышленный «идеальный» ответ, создайте для него эмбеддинг и выполняйте поиск по нему — это эффективнее эмбеддингов коротких запросов. Ты практикуешь AI Agents с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать AI Agents?
Предыдущий опыт не требуется. AI Agents на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «HyDE: гипотетические эмбеддинги документов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке AI Agents?
Да. Каждый урок AI Agents включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Переранжирование с помощью кросс-энкодеров
- HyDE: гипотетические эмбеддинги документов
- Многовекторный поиск (ColBERT)
- Оценка RAG (RAGAS, Recall@K)