Розробка RAG з векторною базою даних ChromaDB
ChromaDB — відкрита векторна база даних, орієнтована на простоту використання. Не вимагає зовнішніх залежностей для локального запуску, підтримує in-memory та persistent режими. ChromaDB — стандартний вибір для прототипування RAG-систем та невеликих production-деплоїв (до кількох мільйонів документів).
Запуск та підключення
import chromadb
from chromadb.utils import embedding_functions
# In-memory (для розробки та тестів)
client = chromadb.EphemeralClient()
# Persistent (файлове сховище)
client = chromadb.PersistentClient(path="./chroma_db")
# HTTP-сервер (production)
client = chromadb.HttpClient(host="localhost", port=8000)
Створення колекції та індексація
from chromadb.utils.embedding_functions import OpenAIEmbeddingFunction
embedding_fn = OpenAIEmbeddingFunction(
api_key="...",
model_name="text-embedding-3-small"
)
collection = client.get_or_create_collection(
name="knowledge_base",
embedding_function=embedding_fn,
metadata={"hnsw:space": "cosine"} # Метрика подібності
)
# Додавання документів
collection.add(
documents=["Текст чанка 1", "Текст чанка 2", ...],
metadatas=[
{"source": "contract.pdf", "page": 1, "doc_type": "contract"},
{"source": "faq.md", "page": 0, "doc_type": "faq"},
],
ids=["chunk_001", "chunk_002", ...]
)
RAG-запит
from openai import OpenAI
openai_client = OpenAI()
def rag_answer(question: str, n_results: int = 4) -> str:
# Пошук релевантних чанків
results = collection.query(
query_texts=[question],
n_results=n_results,
where={"doc_type": {"$in": ["contract", "regulation"]}}, # Фільтр
)
context = "\n\n".join(results["documents"][0])
# Генерація відповіді
response = openai_client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "Відповідай лише на основі контексту."},
{"role": "user", "content": f"Контекст:\n{context}\n\nЗапитання: {question}"}
],
temperature=0,
)
return response.choices[0].message.content
answer = rag_answer("Який строк дії договору?")
Строки
- Прототип RAG з ChromaDB: 2–5 днів
- Production-версія з моніторингом: 2–3 тижні







