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







