머신 러닝(ML)의 검색 관련성 향상이 다양한 비즈니스 사용 사례에 기반한 ML 검색 애플리케이션의 발전을 이끌었습니다. 이에 따라 OpenSearch는 이러한 ML 발전에 적응하며 사용자들이 ML 검색 시스템을 쉽게 구축할 수 있도록 다양한 기능을 출시했습니다.
- Dense 및 Sparse 검색 지원: OpenSearch Service는 비즈니스 및 기술적 요구사항을 충족하기 위해 Dense 검색과 Sparse 검색을 모두 지원합니다.
- Hybrid 검색: Hybrid 검색 쿼리(lexical 및 semantic 검색 하위 쿼리 포함) 결과의 점수를 결합하고 정규화하기 위한 정규화 프로세서를 제공합니다.
- ML 모델 통합: OpenSearch Service는 ML 기반 검색 분야에서 지속적으로 발전하고 있으며, OpenSearch 클러스터 외부에서 호스팅되는 ML 모델 및 애플리케이션과의 다양한 통합을 지원합니다.
- 신경 검색(Neural Search): 신경 쿼리는 쿼리 텍스트를 벡터 임베딩으로 변환하고, 벡터 검색을 통해 쿼리와 문서 임베딩을 비교하여 가장 가까운 결과를 반환합니다. OpenSearch AI/ML 커넥터는 SageMaker, Bedrock, OpenAI 등 타사 ML 플랫폼에 호스팅된 임베딩 모델 및 LLM과 통합됩니다.
본 게시글에서는 OpenSearch의 AI/ML 커넥터와 다양한 검색 기능(Dense, Sparse, Hybrid)을 통해 외부 ML 플랫폼(SageMaker, Bedrock 등)과 통합하여 ML 기반 검색 시스템을 구축하고 확장할 수 있는 방안을 설명하고자 합니다.
1. OpenSearch AI/ML 커넥터 (Bedrock 임베딩 모델) 호출
오픈서치(OpenSearch)에 이미 AWS Bedrock LLM모델을 호출하기 위한 AI/ML 커넥터가 생성되어 있는 상태입니다.
커넥터를 다시 생성할 필요 없이, Dev Tools에서 제공된 쿼리를 실행하여 커넥터 ID만 조회하면 됩니다. 이 커넥터 ID는 이후 단계에서 모델 호출이나 설정에 사용됩니다.
POST /_plugins/_ml/connectors/_search
{
"size": 1,
"query": {
"match": {"name": "BEDROCK_TEXT: EMBEDDING"}
}
}
2. 임베딩 모델 등록 & 배포
텍스트 임베딩 모델을 OpenSearch Service에 등록하고 배포합니다. 확인된 model_id는 추후 semantic search 실행과 ingest pipeline 생성에 사용됩니다.
POST _plugins/_ml/models/_register?deploy=true
{
"name": "Bedrock Text Embedding",
"function_name": "remote",
"description": "Bedrock Text Embedding embeddings model",
"connector_id": "<connector_id>"
}
3. Ingest Pipeline 생성
인제스트 파이프라인을 생성하여 데이터 수집 시 텍스트를 벡터 임베딩으로 변환하도록 설정합니다.
먼저, 아래 코드를 통해 임베딩 프로세서를 추가합니다.
- product_description 필드를 텍스트 임베딩 프로세서를 통해 처리하고, 이를 벡터 필드인 product_description_vector에 저장합니다.
- 이후 모든 데이터 수집 시, 이 파이프라인이 자동으로 호출되어 벡터 임베딩을 생성합니다.
PUT _ingest/pipeline/ml_ingest_pipeline
{
"description": "text embedding ingest pipeline",
"processors": [
{
"text_embedding": {
"model_id": "<model_id>",
"field_map": {
"product_description": "product_description_vector"
}
}
}
]
}
이후 아래 코드를 실행하여 생성된 임베딩을 확인합니다.
POST _ingest/pipeline/ml_ingest_pipeline/_simulate?verbose
{
"docs": [
{
"_source": {
"product_description": "black jacket for men"
}
}
]
}
생성된 인제스트 파이프라인이 데이터 수집 시 자동으로 벡터 임베딩을 생성하여 텍스트 필드와 함께 저장합니다.
product_description_vector 필드에 생성된 임베딩을 사용해 시맨틱 검색을 수행할 수 있습니다.
4. k-nn 인덱스 재생성
기존 인덱스를 삭제하고 k-NN 검색을 위한 새로운 k-NN 인덱스를 생성합니다. 이 인덱스는 벡터 임베딩을 저장하고 검색을 수행하는 데 사용됩니다.
# 기존 Lexical Search 인덱스 삭제
DELETE demostore-search-index
# 새로운 k-NN 인덱스 생성
PUT demostore-search-index
{
"settings": {
"index.knn": true,
"default_pipeline": "ml_ingest_pipeline"
},
"mappings": {
"_source": {
"excludes": [
"product_image"
]
},
"properties": {
"image_url": {
"type": "text"
},
"product_description": {
"type": "text"
},
"product_description_vector": {
"type": "knn_vector",
"dimension": 1536,
"method": {
"engine": "faiss",
"space_type": "l2",
"name": "hnsw",
"parameters": {}
}
}
}
}
}
5. Semantic Search 실행
시맨틱 검색은 쿼리와 벡터 임베딩 간의 유사성을 기반으로 더 관련성 높은 검색 결과를 제공합니다. 필터링을 추가하면 특정 조건(예: "남성용 제품")을 기준으로 검색 결과를 세부적으로 조정할 수 있습니다.
GET demostore-search-index/_search
{
"query": {
"neural": {
"product_description_vector": {
"query_text": "silver bracelets for men",
"model_id": "<model_id>",
"k": 5
}
}
}
}
필요 시 필터링을 적용하여 검색 범위를 좁힐 수 있습니다. 아래는 gender_affinity.keyword 필드를 활용하여 남성용 제품만 포함하는 검색 쿼리입니다.
GET demostore-search-index/_search
{
"query": {
"neural": {
"product_description_vector": {
"query_text": "silver bracelets for men",
"model_id": "<model_id>",
"k": 5,
"filter": {
"term": {
"gender_affinity.keyword": "Male"
}
}
}
}
}
}
6. Bedrock 활용 Hybrid Search 구성
하이브리드 검색은 다양한 검색 기능(예: Lexical Search와 Semantic Search)을 단일 검색 쿼리로 결합하여 검색 결과의 품질을 향상시키는 기술입니다.
- Lexical Search: 키워드 중심의 정확한 검색
- Semantic Search: 문맥과 의미를 기반으로 관련성 높은 결과 제공
- Hybrid Search: 두 가지 검색 방식을 결합하여 각 방식의 장점을 극대화
하이브리드 검색 쿼리의 점수를 정규화하고 결합하는 검색 파이프라인을 생성합니다.
- 정규화 방식: min_max (최소-최대 값을 사용해 점수를 스케일링)
- 결합 방식: arithmetic_mean (산술 평균으로 각 하위 쿼리에 동일 가중치 부여)
PUT _search/pipeline/ml_search_pipeline
{
"description": "Post processor for hybrid search",
"phase_results_processors": [
{
"normalization-processor": {
"normalization": {
"technique": "min_max"
},
"combination": {
"technique": "arithmetic_mean",
"parameters": {
"weights": [
0.5,
0.5
]
}
}
}
}
]
}
7. Hybrid Query 생성
Lexical 검색과 Neural 검색을 결합하여 검색 결과의 관련성을 향상시킵니다. 1단계에서 생성한 검색 파이프라인(ml_search_pipeline)은 각 하위 쿼리에 동일한 가중치(50%)를 부여합니다.
GET demostore-search-index/_search?search_pipeline=ml_search_pipeline
{
"_source": {
"exclude": [
"product_description_vector",
"product_multimodal_vector",
"product_image"
]
},
"query": {
"hybrid": {
"queries": [
{
"match": {
"description": {
"query": "silver bracelets for men"
}
}
},
{
"neural": {
"product_description_vector": {
"query_text": "silver bracelets for men",
"model_id": "<model_id>",
"k": 5
}
}
}
]
}
},
"size": 5
}
8. Hybrid Search 결과 확인
Lexical 검색과 Semantic 검색 또는 Multimodal 검색을 결합하여 다양한 하이브리드 검색 방식을 실험합니다.
각 서브쿼리의 가중치를 조정하여 검색 결과가 어떻게 달라지는지 분석합니다.
Written in September 30, 2024
by Sang Hyun Jo
'Building on AWS' 카테고리의 다른 글
13. 전통적 머신러닝(ML)과 생성형 AI 결합 (0) | 2025.01.16 |
---|---|
12. 생성형 AI와 현대적 데이터 아키텍처 통합 및 SQL·API 쿼리 프롬프트 활용 (0) | 2025.01.16 |