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

Ви працюєте з PostgreSQL, і раптом знадобився семантичний пошук за документами. Підіймати окрему векторну БД — зайві 3–5 днів налаштування, ще один сервіс, нові API, моніторинг. pgvector — розширення <cite>[PostgreSQL](https://en.wikipedia.org/wiki/PostgreSQL)</cite>, яке додає тип `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. За останні 5 років впровадили RAG з pgvector для 20+ проєктів, від стартапів до enterprise. Гарантуємо стабільну роботу при навантаженні до 10M векторів. Отримайте безкоштовну консультацію — ми оцінимо ваш проєкт за один день. Вартість впровадження RAG з pgvector зазвичай становить від $3000 до $8000 в залежності від обсягу даних та складності.

Чому pgvector, а не окрема векторна БД?

Якщо ваші дані вже в PostgreSQL, додавання pgvector не вимагає нового компонента. Порівняйте з Pinecone (pgvector у 3 рази дешевший в експлуатації):

Параметр 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 — ми допоможемо спроектувати рішення під ваші обсяги даних.