Разработка RAG с векторной базой данных OpenSearch
OpenSearch — форк Elasticsearch от AWS, развивающийся как независимый open-source проект под Apache 2.0. Поддерживает k-NN поиск через плагин knn-plugin с алгоритмами HNSW, IVF и FAISS. Если инфраструктура построена на AWS (Amazon OpenSearch Service), это приоритетный выбор для RAG.
Создание индекса с 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", # или "faiss"
"parameters": {
"m": 16,
"ef_construction": 128,
}
}
}
}
}
}
client.indices.create(index="knowledge_base", body=index_config)
Hybrid Search в OpenSearch
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
# Amazon OpenSearch Serverless
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"]
Сравнение с Elasticsearch
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 | Встроен | Нет аналога |
OpenSearch ML Commons позволяет встроить embedding-модель прямо в кластер:
# Регистрация и деплой embedding модели внутри OpenSearch
# Позволяет делать semantic search без внешнего embedding API
body = {
"name": "huggingface/sentence-transformers/paraphrase-multilingual-mpnet-base-v2",
"version": "1.0.1",
"model_format": "TORCH_SCRIPT",
}
client.transport.perform_request("POST", "/_plugins/_ml/models/_register", body=body)
Сроки
- Настройка OpenSearch + индекс: 2–3 дня
- Ingestion pipeline: 3–7 дней
- Hybrid search + RAG пайплайн: 1–2 недели
- Итого: 2–4 недели







