Розробка RAG з векторною базою даних OpenSearch

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Розробка RAG з векторною базою даних OpenSearch
Середній
від 1 тижня до 3 місяців
Часті запитання

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

Етапи розробки AI-рішення

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

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

Розроблення 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 тижні