Полный набор приёмов улучшения поиска и как их комбинировать. Продолжение урока 0002 (база) и 0003 (Contextual Retrieval).
Пять независимых мест, где можно улучшить поиск:
| Рычаг | Что меняет | Чинит |
|---|---|---|
| 1. Chunking | Границы и размер чанков | recall (мысль разрезана) |
| 2. Embedding-модель | Как кодируется смысл | recall (перефразы) |
| 3. BM25 / hybrid | Точные строки | recall (идентификаторы) |
| 4. Query rewrite / expansion | Как выглядит запрос | recall (местоимения, домен) |
| 5. Reranking | Порядок после поиска | precision (мусор в top-k) |
Проблема: пользовательский запрос часто плох для поиска: «а какая там комиссия, если перевести в другой банк?» — местоимения, разговорная речь, нет доменных терминов.
Rewrite: LLM переписывает запрос для поиска: → «comisión transferencia interbancaria SPEI». Отдельный дешёвый вызов перед ретривером.
Query expansion: один запрос превращается в несколько вариантов, ищется каждый, результаты объединяются (multi-query). Ловит разные формулировки.
Правило: rewrite/expansion включают ТОЛЬКО если eval доказал выигрыш (урок 0002). Каждый вызов — латентность и стоимость.
Идея: вместо поиска по запросу — сгенерировать гипотетический «идеальный ответ» на запрос и искать ПО НЕМУ. Ответ ближе по эмбеддингам к реальным документам, чем вопрос.[55]
Пример: запрос «какие документы нужны для кредита?» → LLM генерирует «Для получения кредита необходимы: паспорт, справка о доходах…» → этот текст эмбеддится и ищется.
Подводный камень: гипотетический документ может содержать выдумки. Эмбеддинг-бутленек фильтрует часть, но не всё.[55] Плюс — латентность на каждый запрос.
Когда: когда запрос и документы написаны по-разному (вопрос разговорный, документы формальные). Проверяется только A/B на golden set.
Источник: HyDE paper.
Проблема: гибридный поиск вернул top-20, среди них мусор. Модель получит всё и запутается.
Решение: маленькая отдельная модель-реранкер (Cohere Rerank, Voyage reranker) пересортировывает top-20 по релевантности к запросу, оставляет top-5.
Цифры из Contextual Retrieval: rerank добавил −67% → −67%+ (5.7% → 1.9% с contextual + rerank).[26]
Почему это работает: реранкер — кросс-энкодер: видит запрос И документ ВМЕСТЕ (в отличие от би-энкодера эмбеддингов, который кодирует по отдельности). Это дороже на один запрос, но точнее. Поэтому реранкят только top-20, не весь корпус.
Trade-off: чем больше кандидатов реранкится, тем лучше recall, но выше латентность. Экспериментируй (Anthropic прямо советуют).[26]
Фраза: «Сначала дешёвые рычаги: chunking, hybrid, rewrite. Rerank — когда precision страдает. Embedding-модель меняю последней — это переиндексация. Каждый шаг проверяю на golden set».
Rerank чинит проблему?
HyDE ищет по чему?
Эмбеддинг меняют в последнюю очередь, потому что?