Разработка RAG с pgvector: векторный поиск в PostgreSQL

Вы работаете с PostgreSQL, и вдруг понадобился семантический поиск по документам. Поднимать отдельную векторную БД — лишние 3–5 дней настройки, ещё один сервис, новые API, мониторинг. pgvector — расширение [PostgreSQL](https://en.wikipedia.org/wiki/PostgreSQL), которое добавляет тип `vector` и опера

Направления AI-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1440
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    997
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1264
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    712
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1002

Вы работаете с 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 — мы поможем спроектировать решение под ваши объёмы данных.