Інтеграція Weaviate для векторного сховища AI в мобільних додатках
Weaviate — це open-source векторна база даних з GraphQL та REST API, вбудованими модулями для автоматичного створення вбудовувань та семантичного пошуку. На відміну від Pinecone, він підтримує self-hosting, багатші схеми об'єктів та нативний гібридний пошук з коробки.
Ключові відмінності від інших векторних БД
У Weaviate дані зберігаються як об'єкти з типами (класами) — ближче до бази документів, ніж до чистого векторного сховища. Кожен об'єкт має схему, властивості та вектор.
# Створення класу у Weaviate
client.schema.create_class({
"class": "Document",
"vectorizer": "text2vec-openai", # автовбудовування при записі
"moduleConfig": {
"text2vec-openai": {
"model": "text-embedding-3-small",
"dimensions": 1536
}
},
"properties": [
{"name": "content", "dataType": ["text"]},
{"name": "source", "dataType": ["text"]},
{"name": "userId", "dataType": ["text"]},
{"name": "language", "dataType": ["text"]}
]
})
Модуль text2vec-openai означає, що Weaviate автоматично створює вбудовування при добавленні об'єкта. Не потрібно окремо викликати Embeddings API перед upsert. Зручно, але потрібно передавати ключ OpenAI у конфіг Weaviate.
Гібридний пошук: BM25 + векторний пошук в одному запиті
Головна перевага Weaviate — нативний гібридний пошук. Об'єднує пошук за ключовими словами (BM25) та семантичний пошук через параметр alpha:
{
Get {
Document(
hybrid: {
query: "скидання пароля",
alpha: 0.75 # 0 = тільки BM25, 1 = тільки векторний
}
where: {
path: ["userId"]
operator: Equal
valueText: "user_42"
}
limit: 5
) {
content
source
_additional { score explainScore }
}
}
}
alpha: 0.75 — 75% ваги для векторного пошуку, 25% для BM25. Оптимальне значення залежить від корпусу, але 0.7–0.8 добре працює для більшості випадків.
Це те, що у pgvector потрібно реалізовувати самостійно через об'єднання двох запитів. У Weaviate — один виклик.
Self-hosted Weaviate для приватних даних
Якщо дані не можуть йти в хмару — Weaviate розгортається в Docker:
# docker-compose.yml
services:
weaviate:
image: semitechnologies/weaviate:1.24.0
ports:
- "8080:8080"
environment:
QUERY_DEFAULTS_LIMIT: 25
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
DEFAULT_VECTORIZER_MODULE: 'none' # вбудовування створюємо самі
CLUSTER_HOSTNAME: 'node1'
volumes:
- weaviate_data:/var/lib/weaviate
При self-hosting вбудовування генеруються на вашому бекенді (локальна модель або API) та явно передаються при добавленні об'єкта.
Мобільний клієнт та багатотенантність
Weaviate 1.20+ підтримує нативну багатотенантність через tenants. Це продуктивніше, ніж фільтрація за userId:
# Створюємо тенанта (один раз при реєстрації користувача)
client.schema.add_class_tenants("Document", [{"name": f"user_{user_id}"}])
# Добавляємо об'єкт у тенант користувача
client.data_object.create(
data_object={"content": chunk, "source": filename},
class_name="Document",
tenant=f"user_{user_id}",
vector=embedding # якщо vectorizer = none
)
# Пошук у тенанті користувача
result = client.query.get("Document", ["content", "source"]) \
.with_hybrid(query=user_query, alpha=0.75) \
.with_tenant(f"user_{user_id}") \
.with_limit(5) \
.do()
При включеній багатотенантності кожен тенант зберігається в окремому шарді — пошук не сповільнюється при зростанні кількості користувачів.
Клієнти та бекенд
Weaviate надає офіційні клієнти для Python, TypeScript, Java, Go. На мобільному додатку — тільки HTTP-запити до вашого бекенду, не напрямо до Weaviate (з тих же причин безпеки, що й з Pinecone).
Бекенд на Node.js/TypeScript:
import weaviate, { WeaviateClient } from 'weaviate-ts-client';
const client: WeaviateClient = weaviate.client({
scheme: 'http',
host: 'localhost:8080',
});
// Пошук — викликається з REST-endpoint'а для мобільного клієнта
async function search(query: string, userId: string) {
return client.graphql.get()
.withClassName('Document')
.withHybrid({ query, alpha: 0.75 })
.withTenant(`user_${userId}`)
.withLimit(5)
.withFields('content source _additional { score }')
.do();
}
Етапи та термін
Розгортання Weaviate (хмара або self-hosted) → створення схеми з правильними типами → настройка багатотенантності → ingestion pipeline → бекенд API для пошуку → мобільний UI результатів → тестування навантаження → моніторинг.
Інтеграція Weaviate на існуючому бекенді — 2–3 тижні. З нуля, self-hosted, з мобільним клієнтом та UI — 4–6 тижнів.







