Разработка RAG с векторной базой данных Weaviate
Weaviate — открытая векторная база данных с GraphQL/REST API, модульной архитектурой и встроенной поддержкой нескольких форматов поиска (векторный, BM25, hybrid). Отличительные особенности: нативные модули интеграции с embedding-провайдерами (OpenAI, Cohere, HuggingFace), GraphQL для сложных запросов и rich schema для метаданных.
Установка и инициализация
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
)
Hybrid поиск:
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)
- Hybrid search, alpha=0.65 (чуть больше вес dense)
Результаты RAGAS:
| Метрика | Только dense | Hybrid (α=0.65) | Hybrid + rerank |
|---|---|---|---|
| Context Precision | 0.71 | 0.82 | 0.89 |
| Context Recall | 0.74 | 0.81 | 0.84 |
| Faithfulness | 0.79 | 0.88 | 0.92 |
Hybrid search дал +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 недель







