Building on AWS

14. OpenSearch 기반 Neural Search와 Hybrid Search

Window to the world 2025. 1. 16. 17:29
반응형

 

머신 러닝(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 SearchSemantic 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

반응형