При побудові пошукового движка для бази знань клієнта ми вперлися в ліміти 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-пайплайна під ключ.







