Розроблення RAG з векторною базою даних OpenSearch
OpenSearch — форк Elasticsearch від AWS, який розвивається як незалежний проект з відкритим кодом під 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)
Гібридний пошук в 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: керований варіант
При розгортанні на 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 керування | Amazon OpenSearch Service | Elastic Cloud on AWS |
| k-NN двигуни | NMSLIB, FAISS, Lucene | Lucene HNSW |
| RRF fusіон | Через scoring | Нативно (8.14+) |
| ML Commons | Вбудовано | Немає аналога |
OpenSearch ML Commons дозволяє інтегрувати моделі embedding прямо в кластер:
# Реєстрація та розгортання моделі embedding в OpenSearch
# Дозволяє семантичний пошук без зовнішнього 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 пайплайн: 3–7 днів
- Гібридний пошук + RAG пайплайн: 1–2 тижні
- Всього: 2–4 тижні







