awesome-everything EN
↑ Обратно к восхождению

Data engineering

Vector search: чтение кода и запросов

Суть Читай реальный pgvector DDL и запросы — предсказывай поведение recall/latency и выбирай фикс с наибольшим рычагом для HNSW-параметров, операторов расстояния и фильтрованного поиска.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 14 min

Баги vector search живут в DDL и в запросе, а не в исключении. Читай SQL, предсказывай recall и latency, которые он даёт, затем выбирай фикс, который senior-инженер делает первым.

Цель

Отработай цикл, который запускаешь в каждом recall-инциденте: читай определение индекса и запрос, предсказывай, где утекает recall или взлетает latency, и берись за фикс с наибольшим рычагом.

Сниппет 1 — HNSW-индекс и ручка по умолчанию

CREATE INDEX ON docs USING hnsw (embedding vector_cosine_ops)
  WITH (m = 16, ef_construction = 64);

-- путь запроса, на каждый запрос
SELECT id, body FROM docs
ORDER BY embedding <=> $1
LIMIT 10;
Викторина

Индекс строится нормально, запросы быстрые, но recall@10 измеряется лишь ~80%. Фикс с наибольшим рычагом?

Сниппет 2 — оператор расстояния vs opclass

-- embedding сохранены от модели, обученной на cosine similarity
CREATE INDEX ON items USING hnsw (embedding vector_l2_ops);

SELECT id FROM items
ORDER BY embedding <=> $1   -- cosine-оператор
LIMIT 10;
Викторина

Запрос медленный и recall плохой. Что здесь не так?

Сниппет 3 — IVFFlat probes

CREATE INDEX ON docs USING ivfflat (embedding vector_cosine_ops)
  WITH (lists = 1000);

-- запрос
SELECT id FROM docs ORDER BY embedding <=> $1 LIMIT 10;
-- ivfflat.probes оставлен по умолчанию
Викторина

При lists = 1000 и probes по умолчанию recall сильно ниже ожиданий. Почему и первый ход?

Сниппет 4 — измерение recall против ground truth

-- точный ground truth (без индекса, брутфорс)
SELECT id FROM docs ORDER BY embedding <=> $1 LIMIT 10;  -- с отключённым индексом

-- ANN-результат
SET hnsw.ef_search = 100;
SELECT id FROM docs ORDER BY embedding <=> $1 LIMIT 10;   -- с HNSW
-- recall@10 = |exact_ids ∩ ann_ids| / 10
Викторина

Коллега считает recall, сверяя среднее расстояние ANN-результата с фиксированным порогом, а не пересечение с точным топ-10. Почему это неверно?

Итог

Каждый recall-инцидент читается в DDL и запросе: ef_search по умолчанию 40 и это рантайм-ручка recall; оператор расстояния запроса должен совпадать с opclass индекса, иначе планировщик падает в полный скан; probes в IVFFlat по умолчанию 1 и сканирует один кластер, пока не поднимешь; а recall@k — это пересечение наборов ID против точного baseline, никогда не порог расстояния. Читай SQL, найди утечку, поверни самую дешёвую ручку первой, затем перемерь recall для подтверждения.

Продолжить восхождение ↑Vector search: поймай тихий провал recall
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources2
expand
  1. 01
  2. 02

Trademarks belong to their respective owners. Editorial reference only.