Розробка RAG з векторною базою даних Pinecone
Зазначимо: коли ваша корпоративна база знань розростається до сотень тисяч документів, звичайний повнотекстовий пошук перестає справлятися: релевантні документи тонуть у шумі, а синонімічні терміни не враховуються. RAG (Retrieval-Augmented Generation) з векторною базою даних — єдиний спосіб зберегти швидкий доступ до потрібної інформації. Ми розробляємо RAG-пайплайни з Pinecone під ключ: від вибору моделі ембеддингів до моніторингу в продакшені. Оцінка проекту — протягом дня: надішліть опис даних та сценаріїв використання. Отримайте консультацію за вашим сценарієм — ми оцінимо дані за 1 день.
Чому Pinecone Serverless?
Serverless-режим позбавляє від управління кластером: ви не резервуєте pod'и, не налаштовуєте автоскейлінг. Платите тільки за операції запису, читання та зберігання — ідеально для проектів зі змінним навантаженням. Pinecone підтримує гібридний пошук (dense + sparse через BM25), що критично для доменів з високою точністю термінів (юриспруденція, медицина). Ми використовуємо BM25Encoder для побудови sparse-векторів без додаткової інфраструктури. Типова економія на інфраструктурі становить від 20% до 40% порівняно з self-hosted рішеннями.
Як ми ініціалізуємо індекс
from pinecone import Pinecone, ServerlessSpec
from openai import OpenAI
pc = Pinecone(api_key="...")
# Створення serverless індексу
pc.create_index(
name="corporate-knowledge-base",
dimension=3072, # text-embedding-3-large
metric="cosine",
spec=ServerlessSpec(
cloud="aws",
region="us-east-1"
)
)
index = pc.Index("corporate-knowledge-base")
Індексація документів з метаданими
from langchain_openai import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
import hashlib
embeddings_model = OpenAIEmbeddings(model="text-embedding-3-large")
def index_documents(documents: list, batch_size: int = 100):
splitter = RecursiveCharacterTextSplitter(chunk_size=512, chunk_overlap=64)
chunks = splitter.split_documents(documents)
for i in range(0, len(chunks), batch_size):
batch = chunks[i:i + batch_size]
texts = [c.page_content for c in batch]
vectors = embeddings_model.embed_documents(texts)
records = []
for chunk, vector in zip(batch, vectors):
doc_id = hashlib.md5(chunk.page_content.encode()).hexdigest()
records.append({
"id": doc_id,
"values": vector,
"metadata": {
"text": chunk.page_content,
"source": chunk.metadata.get("source", ""),
"page": chunk.metadata.get("page", 0),
"doc_type": chunk.metadata.get("doc_type", "general"),
"date": chunk.metadata.get("date", ""),
}
})
index.upsert(vectors=records)
print(f"Indexed batch {i//batch_size + 1}: {len(records)} chunks")
Запит з фільтрацією за метаданими
def rag_query(
query: str,
doc_type_filter: str = None,
top_k: int = 5
) -> dict:
query_vector = embeddings_model.embed_query(query)
filter_dict = {}
if doc_type_filter:
filter_dict["doc_type"] = {"$eq": doc_type_filter}
results = index.query(
vector=query_vector,
top_k=top_k,
include_metadata=True,
filter=filter_dict if filter_dict else None
)
context_chunks = []
for match in results["matches"]:
context_chunks.append({
"text": match["metadata"]["text"],
"source": match["metadata"]["source"],
"score": match["score"]
})
return context_chunks
Як реалізувати Hybrid Search
Pinecone підтримує гібридний пошук через вбудований BM25. Ми навчаємо BM25 на корпусі документів і використовуємо sparse-вектори в запитах. Згідно з Pinecone Hybrid Search Guide, для цього застосовується pinecone_text.sparse.BM25Encoder.
from pinecone_text.sparse import BM25Encoder
bm25 = BM25Encoder()
bm25.fit(all_texts)
def hybrid_query(query: str, alpha: float = 0.5, top_k: int = 5) -> list:
"""
alpha=1.0: тільки dense
alpha=0.0: тільки sparse (BM25)
alpha=0.5: рівна вага обох
"""
dense_vector = embeddings_model.embed_query(query)
sparse_vector = bm25.encode_queries(query)
results = index.query(
vector=dense_vector,
sparse_vector=sparse_vector,
top_k=top_k,
include_metadata=True,
alpha=alpha,
)
return results["matches"]
Гібридний пошук дає приріст recall на 15–30% порівняно з pure dense для доменів з високою термінологічною точністю.
Кейс з нашої практики: корпоративна база знань рітейлера
Масштаб: 45 000 SKU з описами, 3 200 сторінок регламентів, 800 FAQ-записів. Сумарно ~180 000 векторів. Наш клієнт — мережа роздрібної торгівлі з 5+ років досвіду автоматизації.
Конфігурація: Pinecone Serverless (aws/us-east-1), dimension=1536 (text-embedding-3-small для економії), metric=cosine.
Паттерн використання: 15 000 запитів/день, пікове навантаження 200 RPS в години розпродажів.
Результати:
- Latency P95 для retrieval: 180 мс
- Latency P95 для повного RAG відповіді: 2.1 с (включаючи GPT-4o-mini)
- Context recall (знайшли потрібний документ): 0.87
- Answer accuracy (LLM-judge): 0.83
Оптимізації:
- Namespace separation: товари/регламенти/FAQ в окремих namespace — дозволяє фільтрувати без overhead
- Metadata-only queries: для низки запитів достатньо фільтра за метаданими без векторного пошуку
- Cache популярних запитів: Redis кеш для топ-500 частих питань (~30% hit rate)
Порівняння Pinecone з альтернативами
| Критерій | Pinecone | Weaviate | Chroma |
|---|---|---|---|
| Тип managed | Повністю | SaaS/self-hosted | Self-hosted |
| Гібридний пошук | Вбудований BM25 | Вбудований BM25 | Через зовнішні бібліотеки |
| Serverless | Так | Ні | Ні |
| Фільтрація метаданих | Так (всі типи) | Так | Обмежена |
| Відносна вартість | Низька | Середня | Безкоштовно (self-host) + інфра |
Pinecone кращий за Weaviate в сценаріях зі змінним навантаженням завдяки serverless, а Chroma програє за функціоналом фільтрації.
Як оцінити якість retrieval?
Для об'єктивної оцінки retrieval використовуємо метрики precision@k, recall@k та NDCG. На тестовій вибірці з 500 запитів з розміченими релевантними документами ми автоматично обчислюємо ці показники. Оптимальні значення precision@5 >= 0.85 та recall@10 >= 0.9. Додатково застосовуємо LLM-as-judge: GPT-4o оцінює, наскільки контекст достатній для відповіді. Це дозволяє виявити проблеми з чанкінгом або помилки ембеддингів.
Чек-лист перед запуском RAG у продакшен
- Перевірте coverage метаданих: чи всі документи містять doc_type, source, date. - Задайте alpha для гібридного пошуку на валідаційній вибірці. - Встановіть budget guardrails: ліміт на токени виклику LLM та кількість retrieval-результатів. - Налаштуйте моніторинг: latency p99 retrieval, HTTP error rate, drift ембеддингів. - Проведіть навантажувальне тестування: target 80% від пікового навантаження.Що входить в роботу
- Аудит даних: аналіз джерел, визначення стратегії чанкінгу та метаданих.
- Проектування схеми індексу: вибір розмірності, метрики, конфігурація serverless.
- Розробка пайплайну індексації: batch processing, deduplication, збагачення метаданих.
- RAG-пайплайн: інтеграція з LLM (GPT-4o, Claude, LLaMA), промпт-інжиніринг, захист від halluciation.
- Тестування та моніторинг: precision/recall, latency p99, LLM-as-judge.
- Документація та навчання: model card, інструкція для розробників, передача доступу.
- Супровід: гарантія 3 місяці, SLA на інциденти.
Строки орієнтовно
| Етап | Тривалість |
|---|---|
| Налаштування Pinecone + ingestion pipeline | 3–5 днів |
| RAG-пайплайн з оцінкою якості | 1–2 тижні |
| Оптимізація під продакшен | 1–2 тижні |
| Разом | 2–5 тижнів |
Вартість розраховується індивідуально на основі обсягу даних, кількості джерел та складності інтеграцій. Зв'яжіться з нами для оцінки вашого проекту — обговоримо деталі та підготуємо комерційну пропозицію протягом дня.







