Розробка RAG з векторною базою даних Weaviate
Weaviate — відкрита векторна база даних з GraphQL/REST API, модульною архітектурою та вбудованою підтримкою кількох форматів пошуку (векторний, BM25, гібридний). Відмінні особливості: нативні модулі інтеграції з embedding-провайдерами (OpenAI, Cohere, HuggingFace), GraphQL для складних запитів та багата схема для метаданих.
Встановлення та ініціалізація
import weaviate
import weaviate.classes as wvc
from weaviate.classes.config import Configure, Property, DataType
# Підключення до локального Weaviate
client = weaviate.connect_to_local(
host="localhost",
port=8080,
grpc_port=50051,
)
# Або до Weaviate Cloud
client = weaviate.connect_to_wcs(
cluster_url="https://your-cluster.weaviate.network",
auth_credentials=weaviate.auth.AuthApiKey("..."),
)
Створення схеми колекції
client.collections.create(
name="KnowledgeBase",
vectorizer_config=Configure.Vectorizer.text2vec_openai(
model="text-embedding-3-large",
dimensions=3072,
),
generative_config=Configure.Generative.openai(model="gpt-4o"),
properties=[
Property(name="content", data_type=DataType.TEXT),
Property(name="source", data_type=DataType.TEXT),
Property(name="doc_type", data_type=DataType.TEXT),
Property(name="page_number", data_type=DataType.INT),
Property(name="date", data_type=DataType.DATE),
Property(name="department", data_type=DataType.TEXT),
],
)
Weaviate автоматично векторизує текст через вказаний модуль — не потрібно вручну викликати embedding API під час індексації.
Індексація документів
collection = client.collections.get("KnowledgeBase")
# Батчева завантаження
with collection.batch.dynamic() as batch:
for chunk in document_chunks:
batch.add_object(
properties={
"content": chunk.page_content,
"source": chunk.metadata["source"],
"doc_type": chunk.metadata.get("doc_type", "general"),
"page_number": chunk.metadata.get("page", 0),
"department": chunk.metadata.get("department", ""),
}
)
Типи пошуку у Weaviate
Векторний пошук (near_text):
results = collection.query.near_text(
query="процедура узгодження договору",
limit=5,
return_metadata=wvc.query.MetadataQuery(score=True, distance=True),
filters=wvc.query.Filter.by_property("doc_type").equal("contract"),
)
BM25 пошук:
results = collection.query.bm25(
query="узгодження договору оренди",
limit=5,
query_properties=["content"], # Поля для BM25
)
Гібридний пошук:
results = collection.query.hybrid(
query="процедура узгодження",
alpha=0.75, # 0=BM25, 1=vector
limit=5,
fusion_type=wvc.query.HybridFusion.RELATIVE_SCORE, # або RANKED
)
Генеративний пошук (RAG через Weaviate)
Weaviate може виконувати RAG безпосередньо через Generative модуль:
# Вбудована RAG — retrieval + generation в одному запиті
response = collection.generate.near_text(
query="Який порядок узгодження закупки?",
limit=3,
single_prompt="На основі наступного документа відповідь на запитання: {content}\n\nЗапитання: Який порядок узгодження закупки?",
grouped_task="Підсумуй ключові кроки процедури узгодження закупки на основі наданих документів.",
)
print(response.generated) # Відповідь LLM
Практичний кейс: RAG для юридичної фірми
Завдання: помічник для юристів з українського законодавства — пошук у НПА, судовій практиці, внутрішніх методиках.
Обсяг: 28 000 документів (~4.2M чанків при розмірі 300 токенів).
Конфігурація Weaviate:
- Self-hosted на k8s (3 реплики)
- text2vec-openai (text-embedding-3-large, dimension=3072)
- Гібридний пошук, alpha=0.65 (трохи більше вага dense)
Результати RAGAS:
| Метрика | Лише dense | Гібридний (α=0.65) | Гібридний + rerank |
|---|---|---|---|
| Context Precision | 0.71 | 0.82 | 0.89 |
| Context Recall | 0.74 | 0.81 | 0.84 |
| Faithfulness | 0.79 | 0.88 | 0.92 |
Гібридний пошук дав +12% до precision порівняно з чистим dense, особливо для запитів з точними термінами (номери статей, специфічні юридичні конструкції, які embedding моделі погано розрізняють).
Мультитенантність у Weaviate
Для SaaS-продуктів або ізоляції даних між клієнтами:
# Створення колекції з multitenancy
client.collections.create(
name="ClientDocs",
multi_tenancy_config=Configure.multi_tenancy(enabled=True),
...
)
# Створення tenant
collection = client.collections.get("ClientDocs")
collection.tenants.create([wvc.tenants.Tenant(name="client_001")])
# Запит у контексті конкретного tenant
tenant_collection = collection.with_tenant("client_001")
results = tenant_collection.query.hybrid(query="...", limit=5)
Строки
- Налаштування Weaviate + схема: 2–3 дні
- Ingestion pipeline: 3–7 днів
- RAG-пайплайн з оцінкою: 1–2 тижні
- Мультитенантність та production: 1–2 тижні
- Всього: 2–5 тижнів







