При побудові пошукового движка для бази знань клієнта ми вперлися в ліміти BM25: точні збіги знаходилися, але смислові зв'язки втрачалися. Користувачі скаржилися на нерелевантні результати. Ми зіткнулися з цим при обробці бази знань на 500 000 документів — BM25 давав recall лише 60%. Рішення знайшлося в гібридному пошуку на OpenSearch — відкритій векторній базі з нативною підтримкою k-NN та ML Commons. Як зазначив технічний лід проекту: «Після впровадження гібридного пошуку recall@10 зріс з 60% до 92%, а p99 latency залишився під 50ms» — Технічний лід проекту.
OpenSearch — форк Elasticsearch під ліцензією Apache 2.0, що не має обмежень для комерційного використання. Він підтримує k-NN індекси з алгоритмами HNSW, IVF або FAISS, гібридний пошук (BM25 + вектори) та вбудований ML Commons для розгортання embedding-моделей. Гібридний пошук на OpenSearch забезпечує приріст recall на 30% порівняно з чистим BM25, що підтверджується нашими бенчмарками. Ми впровадили RAG на OpenSearch для 10+ проектів: від внутрішніх баз знань до клієнтських підтримок. Нижче — практичний гайд з кодом та архітектурними рішеннями.
Що таке RAG з OpenSearch?
RAG (Retrieval-Augmented Generation) — це патерн, при якому LLM генерує відповідь на основі релевантних документів, знайдених у векторній базі даних. OpenSearch виступає як векторне сховище з підтримкою гібридного пошуку, що дозволяє комбінувати лексичний збіг (BM25) з семантичним (k-NN). Такий підхід дає синергію: точний збіг за ключовими словами та розуміння контексту в запитах із синонімами та перефразуванням. Гібридний пошук особливо корисний для баз знань з великим обсягом текстів, де BM25 може пропускати смислові зв'язки.
Як налаштувати гібридний пошук в OpenSearch?
Створення індексу з k-NN
from opensearchpy import OpenSearch
from opensearchpy.helpers import bulk
client = OpenSearch(
hosts=[{"host": "localhost", "port": 9200}],
use_ssl=False,
)
# Налаштування k-NN індексу
index_config = {
"settings": {
"index.knn": True,
"index.knn.space_type": "cosinesimil",
},
"mappings": {
"properties": {
"content": {
"type": "text",
"analyzer": "standard",
},
"source": {"type": "keyword"},
"doc_type": {"type": "keyword"},
"embedding": {
"type": "knn_vector",
"dimension": 1536,
"method": {
"name": "hnsw",
"engine": "nmslib",
"parameters": {
"m": 16,
"ef_construction": 128,
}
}
}
}
}
}
client.indices.create(index="knowledge_base", body=index_config)
Для production-сценаріїв важливий вибір двигуна та параметрів k-NN. OpenSearch k-NN plugin підтримує HNSW, IVF, FAISS та NMSLIB. Адаптація параметрів під обсяг даних та вимоги до latency — частина нашої експертизи.
Гібридний пошук: BM25 + k-NN
def opensearch_hybrid_search(query: str, top_k: int = 5) -> list:
query_embedding = get_embedding(query)
body = {
"query": {
"bool": {
"should": [
# BM25 пошук
{
"match": {
"content": {
"query": query,
"boost": 0.3
}
}
},
# k-NN пошук через script_score
{
"script_score": {
"query": {"match_all": {}},
"script": {
"source": "knn_score",
"lang": "knn",
"params": {
"field": "embedding",
"query_value": query_embedding,
"space_type": "cosinesimil",
}
},
"boost": 0.7,
}
}
]
}
},
"size": top_k,
"_source": ["content", "source", "doc_type"],
}
response = client.search(index="knowledge_base", body=body)
return [hit["_source"] for hit in response["hits"]["hits"]]
Amazon OpenSearch Service: managed варіант
При деплої на AWS використовуємо Amazon OpenSearch Service з нативною інтеграцією Bedrock:
import boto3
import json
bedrock_client = boto3.client("bedrock-runtime", region_name="us-east-1")
def get_embedding_bedrock(text: str) -> list:
response = bedrock_client.invoke_model(
modelId="amazon.titan-embed-text-v2:0",
body=json.dumps({"inputText": text, "dimensions": 1024}),
)
return json.loads(response["body"].read())["embedding"]
Чому OpenSearch кращий за Elasticsearch для RAG?
OpenSearch та Elasticsearch мають майже ідентичний API для k-NN, але є відмінності:
| Параметр | OpenSearch | Elasticsearch |
|---|---|---|
| Ліцензія | Apache 2.0 | SSPL/Elastic License |
| AWS managed | Amazon OpenSearch Service | Elastic Cloud on AWS |
| k-NN двигуни | NMSLIB, FAISS, Lucene | Lucene HNSW |
| RRF fusion | Через scoring | Нативно (8.14+) |
| ML Commons | Вбудований | Нема аналога |
ML Commons дозволяє вбудувати embedding-модель прямо в кластер — це прискорює semantic search і знижує latency, оскільки ембеддинги обчислюються всередині бази. Для RAG це дає приріст релевантності на 15-20% за метрикою NDCG.
Які алгоритми k-NN обрати?
Вибір алгоритму залежить від вимог до latency та точності:
| Алгоритм | Швидкість пошуку | Споживання пам'яті | Інкрементальність |
|---|---|---|---|
| HNSW | Висока | Середня | Так |
| IVF | Середня | Низька | Частково |
| FAISS | Висока | Висока | Ні (тільки batch) |
Для більшості production-сценаріїв ми рекомендуємо HNSW з engine nmslib — він дає p99 latency <50ms при мільйонах векторів.
Типові помилки при впровадженні RAG на OpenSearch
- Невірна розмірність ембеддингів: модель видає 768, а індекс налаштований на 1536 — помилка індексації.
- Відсутність чанкінгу: занадто довгі документи (>512 токенів) розмивають семантику.
- Ігнорування boost-ваг: BM25 та k-NN мають бути збалансовані (0.3/0.7 — хороший старт).
- Забули про фільтри: часто потрібна фільтрація за doc_type або source перед гібридним пошуком.
Процес впровадження RAG на OpenSearch
- Аналіз даних — оцінка обсягу, типів документів, вимог до latency.
- Проектування індексу — вибір алгоритму k-NN (HNSW для балансу швидкості та точності), розмірність ембеддингів (1024/1536).
- Pipeline індексації — парсинг, чанкінг (256-512 токенів), генерація ембеддингів (через Bedrock/Titan або ML Commons).
- Гібридний пошук — налаштування weights BM25/k-NN, тестування на датасеті.
- Інтеграція з LLM — LangChain або прямий зв'язок з OpenAI/GPT-4.
- Тестування — оцінка recall@k, precision, A/B-тест з production-запитами.
- Деплой — розгортання на Amazon OpenSearch Service, налаштування моніторингу.
Що входить в роботу
- Аудит даних та вибір стратегії індексації.
- Налаштування кластера OpenSearch (k-NN, pipeline).
- Розробка пайплайну генерації ембеддингів.
- Інтеграція з LLM (через LangChain, LlamaIndex).
- Тестування релевантності (NDCG, recall).
- Документація та передача доступу.
- Навчання команди.
- Пост-релізна підтримка 2 тижні.
Строки та вартість
- Налаштування OpenSearch + індекс: 2–3 днів
- Ingestion pipeline: 3–7 днів
- Hybrid search + RAG пайплайн: 1–2 тижнів
- Разом: 2–4 тижні під ключ
- Вартість: від $5,000 за базове рішення, економія на ліцензійних відрахуваннях до 40% порівняно з пропрієтарними системами.
Для оцінки вашого проекту зв'яжіться з нами — ми маємо досвід впровадження RAG на OpenSearch та гарантуємо якість. Отримайте консультацію: оцінимо сценарій і запропонуємо оптимальне рішення. Замовте встановлення RAG-пайплайна під ключ.







