Data engineering
Vector search: поймай тихий провал recall
Читать про тихий recall — не то же, что поймать его. Построй небольшой pgvector-поиск, измерь его recall против точного baseline, затем смотри, как число двигается, пока крутишь ef_search, чинишь селективный фильтр и прикручиваешь hybrid search — с доказательством на каждом шаге.
Преврати ментальную модель юнита в воспроизводимый инженерный цикл: построй vector search, измерь recall@k против ground truth, вскрой тихие провалы и почини их верным рычагом, доказывая каждое изменение before/after recall.
Построй pgvector-семантический поиск по реальному корпусу документов, затем докажи измеренным recall@10, что умеешь обнаруживать и чинить тихие провалы — низкий ef_search, post-filtered селективные фильтры и отсутствие точного совпадения — ни разу не полагаясь на число строк или latency как сигнал о проблеме.
- Таблица before/after recall@10 и p99 latency при дефолтном ef_search vs настроенном значении, измеренная против точного baseline, не оценочная.
- Свидетельство, что recall фильтрованного запроса обвалился под post-filtering и был восстановлен iterative scan, с зафиксированной ценой по latency.
- Короткий список запросов с точными токенами, где hybrid RRF бьёт чистый vector search по recall@10, с числами.
- Абзац-резюме, заявляющий recall-SLO, выбранный ef_search и почему recall@k против точного baseline — а не latency или число строк — это метрика, на которую вешаешь алерт.
- Добавь on-call runbook: как обнаружить тихий провал recall, команда harness для recall@k, рычаги ef_search / probes / iterative_scan и чеклист верификации.
- Сравни HNSW против IVFFlat на том же корпусе: измерь дрейф recall после вставки ещё 20% строк без reindex, показав, что центроиды IVF устаревают, пока HNSW держится.
- Добавь IVF-PQ (или внешнее хранилище вроде Qdrant/Faiss) и измерь потерю recall от квантизации, затем восстанови её шагом rerank в полной точности на топ-кандидатах.
- Подключи CI-гейт, который гоняет harness recall@10 на канарейке и валит сборку, если recall падает более чем на 2 пункта относительно main.
Это цикл, который запустишь в каждом реальном инциденте vector search: построй индекс с согласованной метрикой, измерь recall@k против точного baseline, вскрой тихие провалы (дефолтный ef_search, post-filtered селективные фильтры, отсутствие точного совпадения) и почини каждый верным рычагом — покрути ef_search, включи iterative scan, добавь hybrid RRF — проверяя каждое изменение измеренным recall, никогда числом строк или latency. Сделав это однажды на реальном корпусе, превращаешь production-версию в мышечную память.