Вы работаете с PostgreSQL, и вдруг понадобился семантический поиск по документам. Поднимать отдельную векторную БД — лишние 3–5 дней настройки, ещё один сервис, новые API, мониторинг. pgvector — расширение PostgreSQL, которое добавляет тип vector и операции косинусного расстояния прямо в вашу знакомую БД. Мы — команда с 10+ летним опытом в AI/ML и сертифицированные инженеры PostgreSQL. За последние годы внедрили RAG с pgvector для 20+ проектов, от стартапов до enterprise. Гарантируем стабильную работу при нагрузке до 10M векторов. Получите бесплатную консультацию — мы оценим ваш проект за один день.
Почему pgvector, а не отдельная векторная БД?
Если ваши данные уже в PostgreSQL, добавление pgvector не требует нового компонента. Сравните с Pinecone:
| Параметр | pgvector | Pinecone |
|---|---|---|
| Время настройки | 1–2 дня | 3–5 дней |
| Дополнительная инфраструктура | Не требуется | Требуется отдельная БД |
| Latency p99 (1M векторов) | 5–15 мс | 5–10 мс |
| Объём данных | До 10M векторов (с HNSW) | До миллиардов |
| Поддержка SQL | Да | Нет |
pgvector лучше для умеренных объёмов (до 5M векторов) и когда не хочется добавлять новый сервис. Для масштабов >50M векторов или ultra-low latency (p99<2ms) Pinecone может быть оправдан, но для 80% RAG-проектов pgvector — оптимальный выбор. pgvector подтверждает, что расширение поддерживает все необходимые операции для семантического поиска.
Как выбрать модель embedding для pgvector?
pgvector совместим с любой моделью, возвращающей вектор фиксированной размерности. Чаще всего применяют text-embedding-3-small от OpenAI (1536 dim), BERT-based модели (768 dim) или open-source модели из Sentence Transformers. Размерность вектора влияет на производительность: 768-dim вектор требует вдвое меньше памяти, чем 1536-dim, но может иметь более низкую точность. Для большинства RAG-проектов рекомендуем text-embedding-3-small: баланс качества и скорости.
Что делать, если pgvector работает медленно?
Если поиск занимает больше 20 мс, проверьте:
- Используется ли HNSW индекс? IVFFlat медленнее и менее точен.
- Ограничьте количество кандидатов параметром
ef_search(по умолчанию 40, можно уменьшить до 20). - Увеличьте
work_memдля сортировки результатов. - Проверьте, не фильтруете ли вы по неиндексированному столбцу – это замедляет запрос.
При правильной настройке pgvector выдаёт стабильные 5–15 мс на 1M векторов.
Как настроить RAG pipeline с pgvector?
Шаг 1: Установка pgvector
-- Установка расширения CREATE EXTENSION IF NOT EXISTS vector; -- Таблица для документов CREATE TABLE document_chunks ( id BIGSERIAL PRIMARY KEY, content TEXT NOT NULL, source VARCHAR(512), doc_type VARCHAR(64), page_number INTEGER DEFAULT 0, metadata JSONB, embedding vector(1536), -- dimension = модель embedding created_at TIMESTAMP DEFAULT NOW() ); -- HNSW индекс для быстрого поиска CREATE INDEX ON document_chunks USING hnsw (embedding vector_cosine_ops) WITH (m = 16, ef_construction = 64); Шаг 2: Индексация через Python
import psycopg2 from openai import OpenAI import json conn = psycopg2.connect("postgresql://user:pass@localhost:5432/ragdb") openai_client = OpenAI() def index_chunk(text: str, source: str, doc_type: str, metadata: dict): # Получаем embedding response = openai_client.embeddings.create( model="text-embedding-3-small", input=text, ) embedding = response.data[0].embedding with conn.cursor() as cur: cur.execute(""" INSERT INTO document_chunks (content, source, doc_type, metadata, embedding) VALUES (%s, %s, %s, %s, %s) """, (text, source, doc_type, json.dumps(metadata), embedding)) conn.commit() Шаг 3: Векторный поиск с фильтрацией
def search_similar(query: str, doc_type: str = None, limit: int = 5) -> list: query_embedding = openai_client.embeddings.create( model="text-embedding-3-small", input=query, ).data[0].embedding sql = """ SELECT content, source, doc_type, metadata, 1 - (embedding <=> %s::vector) AS similarity FROM document_chunks WHERE ($2::text IS NULL OR doc_type = $2) ORDER BY embedding <=> %s::vector LIMIT %s """ with conn.cursor() as cur: cur.execute(sql, (query_embedding, doc_type, query_embedding, limit)) results = cur.fetchall() return [ {"text": r[0], "source": r[1], "similarity": r[4]} for r in results ] Операторы pgvector:
| Оператор | Функция | Типичное использование |
|---|---|---|
<=> |
Косинусное расстояние | Семантический поиск (RAG) |
<-> |
Евклидово расстояние | Поиск по L2 норме |
<#> |
Отрицательное скалярное произведение | Для моделей с нормализованными векторами |
Советы по настройке производительности pgvector
- Для HNSW индекса выбирайте m=16–32 и ef_construction=64–200. Чем выше ef_construction, тем точнее поиск, но больше время построения.
- Убедитесь, что индекс помещается в shared_buffers. Для 1M векторов размерности 1536 с HNSW (m=32) требуется около 1.5 ГБ RAM.
- Используйте parallel query: PostgreSQL автоматически распараллеливает поиск для больших таблиц.
- Мониторьте cache hit ratio: если ниже 99%, увеличьте shared_buffers.
Что входит в работу?
- Аналитика: оценка объёмов данных, выбор модели embedding, проектирование схемы.
- Настройка pgvector: установка расширения, создание индексов (HNSW/IVFFlat), настройка параметров PostgreSQL для высокой нагрузки.
- Ingestion pipeline: Python-скрипты для разбивки документов, генерации embeddings и записи в таблицу.
- RAG-пайплайн: реализация поиска, ранжирования, формирования промпта для LLM.
- Тестирование: замеры latency (p99), точности (Recall@k), стресс-тест.
- Документация: описание архитектуры, инструкция по эксплуатации, дамп для восстановления.
- Поддержка: 2 недели постинга — помогаем с доработками под ваши сценарии.
Сроки ориентировочно
| Этап | Длительность |
|---|---|
| Настройка pgvector + таблица | 1 день |
| Ingestion pipeline | 2–4 дня |
| RAG-пайплайн | 3–5 дней |
| Тестирование и доработка | 2–3 дня |
| Итого | 1–2 недели |
Стоимость рассчитывается индивидуально — зависит от объёма данных и сложности интеграции. Закажите внедрение RAG с pgvector — мы поможем спроектировать решение под ваши объёмы данных.







