AWS 기술 블로그

Amazon OpenSearch Service의 AI/ML 커넥터로 Neural 검색 강화

OpenSearch 2.9에서 Amazon OpenSearch Service의 Neural 검색 기능이 출시되며, AI/ML 모델과 통합하여 시맨틱 검색 및 다양한 검색 기능을 손쉽게 강화할 수 있습니다. OpenSearch Service는 2020년에 k-NN(k-최근접 이웃) 기능을 도입한 이래 어휘 검색과 벡터 검색을 모두 지원해 왔지만, 시맨틱 검색을 구성하려면 머신 러닝(ML) 모델을 통합하여 색인 및 검색할 수 있는 프레임워크를 구축해야 했습니다. Neural 검색 기능은 색인 및 검색 중에 텍스트에서 벡터로의 변환을 용이하게 해줍니다. 검색 중에 Neural 검색을 사용하면 검색 쿼리가 벡터화되고 k-NN이 말뭉치에서 가장 가까운 벡터를 반환하는 데 사용됩니다.

Neural 검색을 사용하려면 ML 모델을 설정해야 합니다. AWS AI/ML 서비스(예: Amazon SageMaker 또는 Amazon Bedrock) 또는 타사 대체 서비스에 대한 AI/ML 커넥터를 구성하는 것이 좋습니다. OpenSearch Service 버전 2.9부터 AI/ML 커넥터는 신경 검색과 통합되어 데이터 코퍼스 및 검색 쿼리를 벡터 임베딩으로 변환하는 작업을 단순화 및 자동화함으로써 벡터화 및 검색의 복잡성을 상당 부분 제거해 줍니다.

이 게시글에서는 OpenSearch Service 콘솔을 통해 외부 모델에 대한 AI/ML 커넥터를 구성하는 방법을 보여드립니다.

솔루션 개요

특히, 이 게시글에서는 SageMaker에서 모델에 연결하는 방법을 안내합니다. 그런 다음, ML 모델 연결을 통해 지원되는 사용 사례의 예로 커넥터를 사용하여 OpenSearch Service에서 시맨틱 검색을 구성하는 방법을 안내합니다. Amazon Bedrock과 SageMaker 통합은 현재 OpenSearch Service 콘솔 UI에서 지원되며, UI에서 지원되는 자사 및 타사 통합 목록은 계속 늘어날 예정입니다.

UI를 통해 지원되지 않는 모델의 경우, 사용 가능한 API와 ML 블루프린트를 사용하여 설정할 수 있습니다. 자세한 내용은 OpenSearch 모델 소개를 참조하세요. 각 커넥터에 대한 블루프린트는 ML Commons GitHub 리포지토리에서 찾을 수 있습니다.

사전 준비 사항

OpenSearch Service 콘솔을 통해 모델을 연결하기 전에, OpenSearch Service 도메인을 생성합니다. 다음 동영상에 표시된 대로 OpenSearch 대시보드의 보안 플러그인을 사용하여 ml_full_access 역할의 백엔드 역할로 LambdaInvokeOpenSearchMLCommonsRole이라는 이름으로 AWS Identity and Access Management (IAM) 역할을 매핑합니다. OpenSearch Service 통합 워크플로우는 기본적으로 LambdaInvokeOpenSearchMLCommonsRole IAM 역할을 사용하여 OpenSearch Service 도메인과 SageMaker에 배포된 모델 간의 커넥터를 생성하도록 미리 채워져 있습니다. OpenSearch Service 콘솔 통합에서 사용자 지정 IAM 역할을 사용하는 경우, 템플릿을 배포하기 전에 사용자 지정 역할이 ml_full_access 권한이 있는 백엔드 역할로 매핑되어 있는지 확인하세요.

AWS CloudFormation을 사용하여 모델 배포하기

다음 동영상은 OpenSearch Service 콘솔을 사용하여 몇 분 안에 Amazon SageMaker에 모델을 배포하고 AI/ML 커넥터를 통해 모델 ID를 생성하는 단계를 보여줍니다. 첫 번째 단계는 사용 가능한 통합 목록으로 라우팅되는 OpenSearch Service AWS 콘솔의 탐색 창에서 통합(Integrations)을 선택하는 것입니다. 연동은 UI를 통해 설정되며, 필요한 입력을 묻는 메시지가 표시됩니다.

통합을 설정하려면 OpenSearch Service 도메인 엔드포인트를 제공하고 모델 연결을 고유하게 식별하는 모델 이름만 제공하면 됩니다. 기본적으로 템플릿은 Hugging Face sentence-transformers 모델(djl://ai.djl.huggingface.pytorch/sentence-transformers/all-MiniLM-L6-v2)을 배포합니다.

스택 생성을 선택하면 AWS CloudFormation 콘솔로 이동합니다. CloudFormation 템플릿은 다음 그림의 아키텍처를 배포합니다.

CloudFormation 스택은 Amazon Simple Storage Service(Amazon S3) 에서 모델을 배포하고 커넥터를 생성하며 출력에 모델 ID를 생성하는 AWS Lambda 애플리케이션을 생성합니다. 그런 다음 이 모델 ID를 사용하여 시맨틱 인덱스를 만들 수 있습니다.

기본 all-MiniLM-L6-v2 모델이 목적에 맞지 않는 경우, 모델 아티팩트를 액세스 가능한 S3 개체로 제공하여 선택한 모델 호스트(SageMaker 또는 Amazon Bedrock)에 원하는 임베딩 모델을 배포할 수 있습니다. 또는 다음 사전 학습된 언어 모델 중 하나를 선택하여 SageMaker에 배포할 수 있습니다. 엔드포인트 및 모델 설정에 대한 지침은 사용 가능한 Amazon SageMaker 이미지를 참조하세요.

SageMaker는 모든 사용 사례에 대해 고성능의 저비용 ML을 구현할 수 있는 광범위한 도구 세트를 통합하여 모델 모니터링, 서버리스 호스팅, 지속적인 학습 및 배포를 위한 워크플로 자동화와 같은 주요 이점을 제공하는 완전 관리형 서비스입니다. SageMaker를 사용하면 임베딩 모델의 배포및 호스팅을 관리하고, 이를 사용해 OpenSearch Service에서 시맨틱 검색 쿼리를 강화할 수 있습니다. 커넥터가 만들어지면 SageMaker가 모델을 호스팅하고 OpenSearch Service는 SageMaker의 추론 결과를 기반으로 검색 쿼리를 수행하는데 사용됩니다.

OpenSearch 대시보드를 통해 배포된 모델 보기

CloudFormation 템플릿이 OpenSearch Service 도메인에 모델을 성공적으로 배포했는지 확인하고 모델 ID를 가져오려면, OpenSearch 대시보드 개발 도구를 통해 ML Commons REST GET API를 사용하면 됩니다.

이제 GET _plugins REST API에서 모델 상태도 볼 수 있는 추가 API를 제공합니다. 다음 명령을 사용하면 원격 모델의 상태를 확인할 수 있습니다.

GET _plugins/_ml/models/<modelid>

다음 그림에서 볼 수 있듯이, 응답의 DEPLOYED 상태는 모델이 OpenSearch Service 클러스터에 성공적으로 배포되었음을 나타냅니다.

또는 OpenSearch 대시보드의 Machine Learning(머신 러닝) 페이지를 사용하여 OpenSearch 서비스 도메인에 배포된 모델을 볼 수 있습니다.

이 페이지에는 배포된 모든 모델의 모델 정보 및 상태가 나열됩니다.

모델 ID를 사용하여 neural-pipeline을 생성하기

모델 상태가 개발 도구에서 DEPLOYED 또는 OpenSearch 대시보드에서 녹색 및 응답 중으로 표시되면, 모델 ID를 사용하여 neural ingest pipeline을 구축할 수 있습니다. 다음 수집 파이프라인은 도메인의 OpenSearch 대시보드 개발 도구에서 실행됩니다. 모델 ID를 도메인에 배포된 모델에 대해 생성된 고유 ID로 바꾸어야 합니다.

PUT _ingest/pipeline/neural-pipeline
{
  "description": "Semantic Search for retail product catalog ",
  "processors" : [
    {
      "text_embedding": {
        "model_id": "sfG4zosBIsICJFsINo3X",
        "field_map": {
           "description": "desc_v",
           "name": "name_v"
        }
      }
    }
  ]
}


neural-pipeline을 기본 파이프라인으로 사용하여 시맨틱 검색 인덱스를 생성하기

이제 이전 단계에서 생성한 새 neural-pipeline을 사용하도록 구성된 기본 파이프라인으로 인덱스 매핑을 정의할 수 있습니다. 벡터 필드가 knn_vector로 선언되어 있고 차원이 SageMaker에 배포된 모델에 적합한지 확인합니다. 기본 구성을 그대로 유지하여 SageMaker에 전체 MiniLM-L6-v2 모델을 배포한 경우 다음 설정을 그대로 유지하고 개발 도구에서 명령을 실행합니다.

PUT semantic_demostore
{
  "settings": {
    "index.knn": true,  
    "default_pipeline": "neural-pipeline",
    "number_of_shards": 1,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "desc_v": {
        "type": "knn_vector",
        "dimension": 384,
        "method": {
          "name": "hnsw",
          "engine": "nmslib",
          "space_type": "cosinesimil"
        }
      },
      "name_v": {
        "type": "knn_vector",
        "dimension": 384,
        "method": {
          "name": "hnsw",
          "engine": "nmslib",
          "space_type": "cosinesimil"
        }
      },
      "description": {
        "type": "text" 
      },
      "name": {
        "type": "text" 
      } 
    }
  }
}

샘플 문서를 수집하여 벡터 생성

이 데모에서는 샘플 리테일 데모스토어 제품 카탈로그semantic_demostore를 인덱스에 색인합니다. 아래의 코드에서 username, password, 도메인 엔드포인트 정보를 각자 환경에 맞게 변경하고 셈플 데이터를 OpenSearch Service로 색인합니다.

curl -XPOST -u 'username:password' 'https://domain-end-point/_bulk' --data-binary @semantic_demostore.json -H 'Content-Type: application/json

semantic_demostore 인덱스 유효성 검사

이제 데이터셋을 OpenSearch Service 도메인에 수집했으므로, 간단한 검색 쿼리를 통해 모든 필드를 가져오는 데 필요한 벡터가 생성되었는지 확인합니다. knn_vectors로 정의된 필드에 필수 벡터가 있는지 확인합니다.

Compare Search Results(검색 결과 비교) 도구를 활용하여 Neural 검색과 Lexical 검색 결과 비교

OpenSearch 대시보드의 Compare Search Results 도구는 프로덕션 워크로드에 사용할 수 있습니다. Compare Search Results 페이지로 이동하여 이전에 생성된 모델 ID를 사용하도록 구성된 어휘 검색과 신경망 검색 간의 쿼리 결과를 비교할 수 있습니다.

자원 정리

이 게시물의 지침에 따라 CloudFormation 스택을 삭제하여 생성한 리소스를 삭제할 수 있습니다. 이렇게 하면 SageMaker에 배포된 모델이 포함된 Lambda 리소스와 S3 버킷이 삭제됩니다. 다음 단계를 완료합니다:

  1. AWS CloudFormation 콘솔에서 스택 세부 정보 페이지로 이동합니다.
  2. Delete(삭제)를 선택합니다.

3. Delete(삭제)를 선택하여 확인합니다.

AWS CloudFormation 콘솔에서 스택 삭제 진행 상황을 모니터링할 수 있습니다.

CloudFormation 스택을 삭제해도 SageMaker 도메인에 배포된 모델과 생성된 AI/ML 커넥터는 삭제되지 않는다는 점에 유의하세요. 이는 이러한 모델과 커넥터가 도메인 내에서 여러 인덱스와 연결될 수 있기 때문입니다. 모델과 연결된 커넥터를 삭제하기 위해선 다음 스크린샷에 표시된 것과 같이 Model REST API를 사용해야 합니다.

먼저, OpenSearch Service 도메인 메모리에서 모델을 배포 해제합니다.

POST /_plugins/_ml/models/<model_id>/_undeploy

그런 다음 모델 인덱스에서 모델을 삭제할 수 있습니다.

DELETE /_plugins/_ml/models/<model_id>

마지막으로 커넥터 인덱스에서 커넥터를 삭제합니다.

DELETE /_plugins/_ml/connectors/<connector_id>

결론

이 게시물에서는 SageMaker에서 모델을 배포하고, OpenSearch Service 콘솔을 사용하여 AI/ML 커넥터를 생성하고, neural 검색 인덱스를 구축하는 방법을 배웠습니다. OpenSearch Service에서 AI/ML 커넥터를 구성하는 기능은 외부 모델과의 통합을 기본으로 하여 벡터 하이드레이션 프로세스를 간소화합니다. neural-ingest-pipeline과 neural 검색을 사용해 몇 분 안에 neural 검색 인덱스를 생성할 수 있으며, 수집 및 검색 중에 모델 ID를 사용해 벡터 임베딩을 즉시 생성할 수 있습니다.

이러한 AI/ML 커넥터에 대해 자세히 알아보려면 Amazon OpenSearch Service AI 커넥터, 시맨틱 검색을 위한 AWS CloudFormation 통합 템플릿타사 ML 플랫폼용 커넥터 만들기를 참조하세요.

Sewoong Kim

Sewoong Kim

김세웅 Cloud Architect는 AWS Professional Services 팀의 일원으로서 컨테이너와 서버리스를 중심으로 AWS 기반 서비스를 구성하는 고객들에게 최적화된 아키텍처를 제공하고, GenAI Application Architect를 보다 고도화 하기 위한 여러 기술적인 도움을 드리고 있습니다.