Semantic search using the OpenAI embedding model

Cloud_ Ghost·2025년 9월 8일

opensearch

목록 보기
10/23

https://docs.opensearch.org/latest/tutorials/vector-search/semantic-search/semantic-search-openai/

OpenAI 임베딩 모델을 사용한 시맨틱 검색

이 튜토리얼에서는 OpenAI 임베딩 모델을 사용하여 Amazon OpenSearch Service에서 시맨틱 검색을 구현하는 방법을 보여줍니다. 자세한 내용은 시맨틱 검색 문서를 참조하세요.

Python을 사용하는 경우, opensearch-py-ml 클라이언트 CLI를 사용하여 OpenAI 커넥터를 생성하고 모델을 테스트할 수 있습니다. CLI는 많은 구성 단계를 자동화하여 설정을 더 빠르게 하고 오류 가능성을 줄입니다. CLI 사용에 대한 자세한 내용은 CLI 문서를 참조하세요.

Amazon OpenSearch Service 대신 자체 관리형 OpenSearch를 사용하는 경우, 블루프린트를 사용하여 OpenAI 모델에 대한 커넥터를 생성하세요.

또는 AIConnectorHelper 노트북을 사용하여 임베딩 모델을 설정할 수 있습니다.

your_로 시작하는 플레이스홀더를 본인의 값으로 교체하세요.

전제 조건: OpenSearch 클러스터 생성

Amazon OpenSearch Service 콘솔로 이동하여 OpenSearch 도메인을 생성합니다.

도메인 Amazon Resource Name (ARN)을 기록해 두세요. 다음 단계에서 사용합니다.

단계 1: AWS Secrets Manager에 API 키 저장

AWS Secrets Manager에 OpenAI API 키를 저장합니다:

  1. AWS Secrets Manager를 엽니다.
  2. Store a new secret을 선택합니다.
  3. Other type of secret을 선택합니다.
  4. my_openai_key를 키로 하고 OpenAI API 키를 값으로 하는 키-값 쌍을 생성합니다.
  5. 시크릿 이름을 my_test_openai_secret으로 지정합니다.

시크릿 ARN을 기록해 두세요. 다음 단계에서 사용합니다.

단계 2: IAM 역할 생성

단계 1에서 생성한 시크릿을 사용하려면 시크릿에 대한 읽기 권한이 있는 AWS Identity and Access Management (IAM) 역할을 생성해야 합니다. 이 IAM 역할은 커넥터에서 구성되며 커넥터가 시크릿을 읽을 수 있도록 합니다.

IAM 콘솔로 이동하여 my_openai_secret_role이라는 새 IAM 역할을 생성하고 다음 신뢰 정책과 권한을 추가합니다:

사용자 정의 신뢰 정책:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "es.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

권한:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "secretsmanager:GetSecretValue",
                "secretsmanager:DescribeSecret"
            ],
            "Effect": "Allow",
            "Resource": "your_secret_arn_created_in_step1"
        }
    ]
}

역할 ARN을 기록해 두세요. 다음 단계에서 사용합니다.

단계 3: Amazon OpenSearch Service에서 IAM 역할 구성

Amazon OpenSearch Service에서 IAM 역할을 구성하는 단계를 따릅니다.

단계 3.1: 커넥터 요청 서명을 위한 IAM 역할 생성

Create Connector API 요청 서명을 위한 새 IAM 역할을 생성합니다.

다음 신뢰 정책과 권한으로 my_create_openai_connector_role이라는 IAM 역할을 생성합니다:

사용자 정의 신뢰 정책:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "your_iam_user_arn"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

단계 4.1에서 your_iam_user_arn IAM 사용자를 사용하여 역할을 assume합니다.

권한:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "your_iam_role_arn_created_in_step2"
        },
        {
            "Effect": "Allow",
            "Action": "es:ESHttpPost",
            "Resource": "your_opensearch_domain_arn_created"
        }
    ]
}

이 역할 ARN을 기록해 두세요. 다음 단계에서 사용합니다.

단계 3.2: 백엔드 역할 매핑

백엔드 역할을 매핑하는 단계를 따릅니다:

  1. OpenSearch Dashboards에 로그인하고 상단 메뉴에서 Security를 선택합니다.
  2. Roles를 선택한 다음 ml_full_access 역할을 선택합니다.
  3. ml_full_access 역할 세부 정보 페이지에서 Mapped users를 선택한 다음 Manage mapping을 선택합니다.
  4. 다음 이미지와 같이 Backend roles 필드에 단계 3.1에서 생성한 IAM 역할 ARN을 입력합니다. [백엔드 역할 매핑 이미지]
  5. Map을 선택합니다.

이제 IAM 역할이 OpenSearch 클러스터에 성공적으로 구성되었습니다.

단계 4: 커넥터 생성

OpenAI 모델용 커넥터를 생성하는 단계를 따릅니다. 커넥터 생성에 대한 자세한 내용은 커넥터 문서를 참조하세요.

단계 4.1: 임시 자격 증명 가져오기

단계 3.1에서 지정한 IAM 사용자의 자격 증명을 사용하여 역할을 assume합니다:

aws sts assume-role --role-arn your_iam_role_arn_created_in_step3.1 --role-session-name your_session_name

응답에서 임시 자격 증명을 복사하고 ~/.aws/credentials에 구성합니다:

[default]
AWS_ACCESS_KEY_ID=your_access_key_of_role_created_in_step3.1
AWS_SECRET_ACCESS_KEY=your_secret_key_of_role_created_in_step3.1
AWS_SESSION_TOKEN=your_session_token_of_role_created_in_step3.1

단계 4.2: 커넥터 생성

~/.aws/credentials에 구성된 임시 자격 증명으로 다음 Python 코드를 실행합니다:

import boto3
import requests 
from requests_aws4auth import AWS4Auth

host = 'your_amazon_opensearch_domain_endpoint_created'
region = 'your_amazon_opensearch_domain_region'
service = 'es'

credentials = boto3.Session().get_credentials()
awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)

path = '/_plugins/_ml/connectors/_create'
url = host + path

payload = {
  "name": "OpenAI embedding model connector",
  "description": "Connector for OpenAI embedding model",
  "version": "1.0",
  "protocol": "http",
  "credential": {
    "secretArn": "your_secret_arn_created_in_step1",
    "roleArn": "your_iam_role_arn_created_in_step2"
  },
  "parameters": {
    "model": "text-embedding-ada-002"
  },
  "actions": [
    {
      "action_type": "predict",
      "method": "POST",
      "url": "https://api.openai.com/v1/embeddings",
      "headers": {
        "Authorization": "Bearer ${credential.secretArn.my_openai_key}"
      },
      "request_body": "{ \"input\": ${parameters.input}, \"model\": \"${parameters.model}\" }",
      "pre_process_function": "connector.pre_process.openai.embedding",
      "post_process_function": "connector.post_process.openai.embedding"
    }
  ]
}

headers = {"Content-Type": "application/json"}

r = requests.post(url, auth=awsauth, json=payload, headers=headers)
print(r.text)

스크립트는 커넥터 ID를 출력합니다:

{"connector_id":"OBUSRI0BTaDH9c7tUxfU"}

다음 단계에서 사용할 커넥터 ID를 기록해 두세요.

단계 5: 모델 생성 및 테스트

OpenSearch Dashboards에 로그인하고 DevTools 콘솔을 열어 다음 요청을 실행하여 모델을 생성하고 테스트합니다.

모델 그룹 생성:

POST /_plugins/_ml/model_groups/_register
{
    "name": "OpenAI_embedding_model",
    "description": "Test model group for OpenAI embedding model"
}

응답에는 모델 그룹 ID가 포함됩니다:

{
  "model_group_id": "ORUSRI0BTaDH9c7t9heA",
  "status": "CREATED"
}

모델 등록:

POST /_plugins/_ml/models/_register
{
  "name": "OpenAI embedding model",
  "function_name": "remote",
  "description": "test embedding model",
  "model_group_id": "ORUSRI0BTaDH9c7t9heA",
  "connector_id": "OBUSRI0BTaDH9c7tUxfU"
}

응답에는 모델 ID가 포함됩니다:

{
  "task_id": "OhUTRI0BTaDH9c7tLhcv",
  "status": "CREATED",
  "model_id": "OxUTRI0BTaDH9c7tLhdE"
}

모델 배포:

POST /_plugins/_ml/models/OxUTRI0BTaDH9c7tLhdE/_deploy

응답에는 배포 작업의 태스크 ID가 포함됩니다:

{
  "task_id": "PkoTRI0BOhavBOmfkCmF",
  "task_type": "DEPLOY_MODEL",
  "status": "COMPLETED"
}

모델 테스트:

POST /_plugins/_ml/models/OxUTRI0BTaDH9c7tLhdE/_predict
{
  "parameters": {
    "input": ["hello world", "how are you"]
  }
}

응답에는 모델이 생성한 임베딩이 포함됩니다:

{
  "inference_results": [
    {
      "output": [
        {
          "name": "sentence_embedding",
          "data_type": "FLOAT32",
          "shape": [
            1536
          ],
          "data": [
            -0.014907048,
            0.0013432145,
            -0.01851529,
            ...
          ]
        },
        {
          "name": "sentence_embedding",
          "data_type": "FLOAT32",
          "shape": [
            1536
          ],
          "data": [
            -0.014011521,
            -0.0067330617,
            -0.011700075,
            ...
          ]
        }
      ],
      "status_code": 200
    }
  ]
}

단계 6: 시맨틱 검색 구성

시맨틱 검색을 구성하는 단계를 따릅니다.

단계 6.1: 수집 파이프라인 생성

먼저 모델을 사용하여 입력 텍스트에서 임베딩을 생성하는 수집 파이프라인을 생성합니다:

PUT /_ingest/pipeline/my_openai_embedding_pipeline
{
    "description": "text embedding pipeline",
    "processors": [
        {
            "text_embedding": {
                "model_id": "your_embedding_model_id_created_in_step5",
                "field_map": {
                    "text": "text_knn"
                }
            }
        }
    ]
}

단계 6.2: 벡터 인덱스 생성

다음으로 입력 텍스트와 생성된 임베딩을 저장하기 위한 벡터 인덱스를 생성합니다:

PUT my_index
{
  "settings": {
    "index": {
      "knn.space_type": "cosinesimil",
      "default_pipeline": "my_openai_embedding_pipeline",
      "knn": "true"
    }
  },
  "mappings": {
    "properties": {
      "text_knn": {
        "type": "knn_vector",
        "dimension": 1536
      }
    }
  }
}

단계 6.3: 데이터 수집

인덱스에 샘플 문서를 수집합니다:

POST /my_index/_doc/1000001
{
    "text": "hello world."
}

단계 6.4: 인덱스 검색

벡터 검색을 실행하여 벡터 인덱스에서 문서를 검색합니다:

POST /my_index/_search
{
  "query": {
    "neural": {
      "text_knn": {
        "query_text": "hello",
        "model_id": "your_embedding_model_id_created_in_step5",
        "k": 100
      }
    }
  },
  "size": "1",
  "_source": ["text"]
}

이제 OpenAI 임베딩 모델을 사용한 시맨틱 검색이 성공적으로 구성되었습니다!

profile
행복합시다~

0개의 댓글