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







