pgvector
pgvector добавляет в Postgres тип vector и операторы для KNN-поиска. ide99 распознаёт его автоматически и активирует Power Pack: визард создания индекса, KNN-браузер, hybrid search, 2D-карта семантических кластеров.
Когда нужно
Когда в таблицах есть embeddings — для:
- RAG (Retrieval-Augmented Generation)
- Semantic search («найти статьи похожие по смыслу»)
- Recommendation systems
- Anomaly detection
Без pgvector эти задачи обычно делают через Pinecone, Weaviate, Qdrant. С pgvector — всё в той же базе, что и обычные данные.
Активация
CREATE EXTENSION vector;
-- Колонка с эмбеддингами:
ALTER TABLE articles ADD COLUMN embedding vector(1536);
Размерность (1536 для OpenAI ada-002, 768 для BAAI/bge-base) зависит от вашей модели.
Что показывает ide99
В Schema Browser, у каждой таблицы с vector-колонкой появляется панель Vector:
- Index Wizard — выбрать тип индекса и параметры
- KNN Browse — найти похожие на любой запрос
- Hybrid Search — combined полнотекст + vector
- 2D Map — спроецировать многомерные вектора на плоскость через UMAP
Index Wizard
Самое важное. Без индекса <-> оператор делает Seq Scan по всей таблице — не масштабируется.
Открыть: правый клик на vector-колонку → Create vector index.
Форма:
- Index type:
- HNSW — быстрее на запрос, медленнее на вставку, больше памяти. Для read-heavy.
- IVFFlat — медленнее на запрос, быстрее на вставку, меньше памяти. Для write-heavy.
- Distance:
- L2 (
vector_l2_ops) — евклидово расстояние
- Inner product (
vector_ip_ops) — для нормализованных векторов
- Cosine (
vector_cosine_ops) — для косинусной близости (популярно для эмбеддингов)
- Parameters:
- HNSW:
m (default 16), ef_construction (default 64)
- IVFFlat:
lists (рекомендуется sqrt(n_rows))
Визард предлагает дефолты под размер вашей таблицы. Превью SQL:
CREATE INDEX CONCURRENTLY idx_articles_embedding
ON articles USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
CONCURRENTLY означает безопасный для prod (без блокировки таблицы), но дольше — будет видно в Live Ops с прогрессом.
KNN Browse
«Покажи N ближайших к этому вектору».
Интерфейс:
- Источник вектора:
- From row — выбрать строку в таблице (тогда поиск похожих на неё)
- Paste vector — вставить JSON-массив вручную
- Build from text — если у вас есть функция эмбеддинга в БД (
openai_embed(text)-обёртка), укажите её — ide99 вызовет
- Distance — какой оператор использовать
- K — сколько вернуть (default 10)
- Filter — опциональный
WHERE поверх (например, language = 'ru')
Результат — таблица с расстоянием и всеми остальными колонками. Двойной клик — открывает строку.
Hybrid Search
Семантический + полнотекстовый одновременно. Для случаев «найди статьи про машинное обучение, упоминающие BERT»:
SELECT id, title,
0.6 * (1 - (embedding <=> $query_vec)) +
0.4 * ts_rank(to_tsvector('russian', body), to_tsquery('BERT')) AS score
FROM articles
WHERE to_tsvector('russian', body) @@ to_tsquery('BERT')
ORDER BY score DESC
LIMIT 20;
Визард собирает этот запрос: вы указываете text-колонку, vector-колонку, веса (0.6/0.4), ide99 пишет SQL. Полезно: правильные FTS-конфиги (russian, english), tsquery синтаксис — это там, где обычно ошибаются.
2D Map
Спроецировать векторы на плоскость через UMAP — увидеть семантические кластеры глазами.
Открыть: правый клик на vector-колонку → Show 2D map.
ide99 загрузит выборку (1000–10000 строк, настраивается), посчитает UMAP в браузере (umap-js), отрендерит scatter plot. Каждая точка — строка таблицы, hover показывает значения других колонок.
Полезно для:
- Аномалии: одинокая точка вдали от кластеров — outlier
- Дубликаты: плотный кластер однотипных эмбеддингов — кандидат на дедуп
- Качество эмбеддингов: если кластеры размазаны и не выделяются — модель плохо подходит под задачу
Подсказка: когда HNSW, когда IVFFlat
| Ситуация |
Выбор |
| < 100 K строк |
Не нужен индекс — Seq Scan и так быстрый |
| 100K–10M строк, мало вставок |
HNSW |
| 10M+, постоянные вставки/удаления |
IVFFlat |
| Нет лишней памяти |
IVFFlat |
| Нужна максимальная скорость query |
HNSW |
Что дальше