Розробка RAG з OpenSearch: векторний пошук та гібрид

При побудові пошукового движка для бази знань клієнта ми вперлися в ліміти BM25: точні збіги знаходилися, але смислові зв'язки втрачалися. Користувачі скаржилися на нерелевантні результати. Ми зіткнулися з цим при обробці бази знань на 500 000 документів — BM25 давав recall лише 60%. Рішення знайшло

Напрямки AI-розробки

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1440
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    997
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1264
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    712
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    1002

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

  1. Аналіз даних — оцінка обсягу, типів документів, вимог до latency.
  2. Проектування індексу — вибір алгоритму k-NN (HNSW для балансу швидкості та точності), розмірність ембеддингів (1024/1536).
  3. Pipeline індексації — парсинг, чанкінг (256-512 токенів), генерація ембеддингів (через Bedrock/Titan або ML Commons).
  4. Гібридний пошук — налаштування weights BM25/k-NN, тестування на датасеті.
  5. Інтеграція з LLM — LangChain або прямий зв'язок з OpenAI/GPT-4.
  6. Тестування — оцінка recall@k, precision, A/B-тест з production-запитами.
  7. Деплой — розгортання на 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-пайплайна під ключ.