본문 바로가기
WIKI 기술 지식 베이스

Configuring AI search types

원문 보기 위키 갱신

출처: 문서

본문

AI 검색 타입 구성하기

이 페이지에서는 다양한 AI 검색 워크플로 타입의 예제 구성을 제공해요. 각 예제는 시맨틱 검색이나 하이브리드 검색 같은 특정 사용 사례에 맞게 설정을 조정하는 방법을 보여줘요. 워크플로를 처음부터 끝까지 만들려면 OpenSearch Dashboards에서 AI 검색 워크플로 빌드하기의 단계를 따라가면서, 사용 사례에 맞는 구성을 설정의 알맞은 부분에 적용하세요.

사전 준비: ML 리소스 프로비저닝

시작하기 전에 사용 사례에 따라 필요한 머신러닝(ML) 리소스를 선택하고 프로비저닝하세요. 예를 들어 시맨틱 검색을 구현하려면 OpenSearch 클러스터에 텍스트 임베딩 모델을 구성해야 해요. ML 모델을 로컬에 배포하거나 외부 호스팅 모델에 연결하는 방법에 대한 자세한 내용은 ML 모델 통합하기를 참고하세요.

목차 {: .text-delta } 1. TOC {:toc}

시맨틱 검색

이 예제는 시맨틱 검색을 구성하는 방법을 보여줘요.

ML 리소스

Amazon Bedrock에서 Amazon Titan Text Embedding 모델을 생성하고 배포하세요.

인덱스

인덱스 설정에 index.knn: true가 포함되어 있고, 매핑에 지정된 대로 인덱스에 knn_vector 필드가 포함되어 있는지 확인하세요. 다음과 같아요:

{
  "settings": {
    "index": {
      "knn": true
    }
  },
  "mappings": {
    "properties": {
      "<embedding_field_name>": {
        "type": "knn_vector",
        "dimension": "<embedding_size>"
      }
    }
  }
}

{% include copy.html %}

인제스트 파이프라인

ML 인퍼런스 프로세서 하나를 구성하세요. 입력 텍스트를 inputText 모델 입력 필드에 매핑하세요. 필요에 따라 출력 embedding을 새 문서 필드에 매핑할 수도 있어요.

검색 파이프라인

ML 인퍼런스 검색 요청 프로세서 하나를 구성하세요. 입력 텍스트가 담긴 쿼리 필드를 inputText 모델 입력 필드에 매핑하세요. 필요에 따라 출력 embedding을 새 필드에 매핑할 수도 있어요. 쿼리를 오버라이드해서 knn 쿼리를 포함시키세요. 예를 들면 다음과 같아요:

{
    "_source": {
        "excludes": [
            "<embedding_field>"
        ]
    },
    "query": {
        "knn": {
            "<embedding_field>": {
                "vector": ${embedding},
                "k": 10
            }
        }
    }
}

{% include copy.html %}


하이브리드 검색

하이브리드 검색은 키워드 검색과 벡터 검색을 결합해요. 이 예제는 하이브리드 검색을 구성하는 방법을 보여줘요.

ML 리소스

Amazon Bedrock에서 Amazon Titan Text Embedding 모델을 생성하고 배포하세요.

인덱스

인덱스 설정에 index.knn: true가 포함되어 있고, 매핑에 지정된 대로 인덱스에 knn_vector 필드가 포함되어 있는지 확인하세요. 다음과 같아요:

{
  "settings": {
    "index": {
      "knn": true
    }
  },
  "mappings": {
    "properties": {
      "<embedding_field_name>": {
        "type": "knn_vector",
        "dimension": "<embedding_size>"
      }
    }
  }
}

{% include copy.html %}

인제스트 파이프라인

ML 인퍼런스 프로세서 하나를 구성하세요. 입력 텍스트를 inputText 모델 입력 필드에 매핑하세요. 필요에 따라 출력 embedding을 새 문서 필드에 매핑할 수도 있어요.

검색 파이프라인

ML 인퍼런스 검색 요청 프로세서와 정규화 프로세서를 구성하세요.

ML 인퍼런스 프로세서의 경우, 입력 텍스트가 담긴 쿼리 필드를 inputText 모델 입력 필드에 매핑하세요. 필요에 따라 출력 embedding을 새 필드에 매핑할 수도 있어요. 쿼리를 오버라이드해서 hybrid 쿼리를 포함시키세요. embedding_field, text_field, text_field_input을 반드시 지정하세요:

{
    "_source": {
        "excludes": [
            "<embedding_field>"
        ]
    },
    "query": {
        "hybrid": {
            "queries": [
                {
                    "match": {
                        "<text_field>": {
                            "query": "<text_field_input>"
                        }
                    }
                },
                {
                    "knn": {
                        "<embedding_field>": {
                            "vector": ${embedding},
                            "k": 10
                        }
                    }
                }
            ]
        }
    }
}

{% include copy.html %}

정규화 프로세서의 경우, 각 서브쿼리에 대한 가중치를 설정하세요. 자세한 내용은 하이브리드 검색 정규화 프로세서 예제를 참고하세요.


기본 RAG (문서 요약)

이 예제는 기본적인 검색 증강 생성(RAG)을 구성하는 방법을 보여줘요.

다음 예제는 Claude v1 messages API용으로 간소화한 커넥터 블루프린트를 보여줘요. 커넥터 블루프린트와 모델 인터페이스는 시간이 지나면서 바뀔 수 있지만, 이 예제는 복잡한 API 상호작용을 단일 prompt 필드 입력으로 추상화하는 방법을 보여줘요.

샘플 입력은 다음과 같을 수 있어요. 여기서 플레이스홀더는 동적으로 가져온 결과를 나타내요:

{
  "prompt": "Human: You are a professional data analyst. You are given a list of document results. You will analyze the data and generate a human-readable summary of the results. If you don't know the answer, just say I don't know.\n\n Results: ${parameters.results.toString()}\n\n Human: Please summarize the results.\n\n Assistant:"
}

ML 리소스

Amazon Bedrock에서 Anthropic Claude 3 Sonnet 모델을 생성하고 배포하세요.

검색 파이프라인

다음 단계에 따라 ML 인퍼런스 검색 응답 프로세서를 구성하세요:

  1. prompt 입력 필드의 변환 타입으로 Template을 선택하세요.
  2. Configure를 선택해서 템플릿 구성을 여세요.
  3. 설정을 간편하게 하려면 프리셋 템플릿을 선택하세요.
  4. 리뷰 목록을 추출하는 입력 변수를 만드세요(예: review).
  5. 변수를 복사해서 템플릿에 붙여넣어 프롬프트에 주입하세요.
  6. Run preview를 선택해서 변환된 프롬프트가 샘플 동적 데이터를 올바르게 반영하는지 확인하세요.
  7. Save를 선택해서 변경 사항을 적용하고 종료하세요.

멀티모달 검색

멀티모달 검색은 텍스트와 이미지로 검색해요. 이 예제는 멀티모달 검색을 구성하는 방법을 보여줘요.

ML 리소스

Amazon Bedrock에서 Amazon Titan Multimodal Embedding 모델을 생성하고 배포하세요.

인덱스

인덱스 설정에 index.knn: true가 포함되어 있고, 매핑에 지정된 대로 인덱스에 knn_vector 필드(생성된 임베딩을 저장하기 위함)와 binary 필드(이미지 바이너리를 저장하기 위함)가 포함되어 있는지 확인하세요. 다음과 같아요:

{
    "settings": {
        "index": {
            "knn": true
        }
    },
    "mappings": {
        "properties": {
            "image_base64": {
                "type": "binary"
            },
            "image_embedding": {
                "type": "knn_vector",
                "dimension": <dimension>
            }
        }
    }
}

{% include copy.html %}

인제스트 파이프라인

ML 인퍼런스 프로세서 하나를 구성하세요. 입력 텍스트 필드와 입력 이미지 필드를 각각 inputText 및 inputImage 모델 입력 필드에 매핑하세요. 텍스트와 이미지 입력이 둘 다 필요하다면 둘 다 매핑되어야 해요. 또는 임베딩 생성에 입력 하나로 충분하다면 텍스트나 이미지 중 하나만 매핑해도 돼요.

필요에 따라 출력 embedding을 새 문서 필드에 매핑할 수도 있어요.

검색 파이프라인

ML 인퍼런스 검색 요청 프로세서 하나를 구성하세요. 쿼리의 입력 텍스트 필드와 입력 이미지 필드를 각각 inputText 및 inputImage 모델 입력 필드에 매핑하세요. 텍스트와 이미지 입력이 둘 다 필요하다면 둘 다 매핑되어야 해요. 또는 임베딩 생성에 입력 하나로 충분하다면 텍스트나 이미지 중 하나만 매핑해도 돼요.

쿼리를 오버라이드해서 임베딩 출력을 포함하는 knn 쿼리를 담도록 하세요:

{
    "_source": {
        "excludes": [
            "<embedding_field>"
        ]
    },
    "query": {
        "knn": {
            "<embedding_field>": {
                "vector": ${embedding},
                "k": 10
            }
        }
    }
}

{% include copy.html %}


개체명 인식

이 예제는 개체명 인식(NER)을 구성하는 방법을 보여줘요.

ML 리소스

Amazon Comprehend Entity Detection 모델을 생성하고 배포하세요.

인제스트 파이프라인

ML 인퍼런스 프로세서 하나를 구성하세요. 입력 텍스트 필드를 text 모델 입력 필드에 매핑하세요. 식별된 개체를 각 문서와 함께 저장하려면 출력(개체 배열)을 변환해서 entities_found 필드에 저장하세요. 다음 output_map 구성을 참고하세요:

"output_map": [
    {
        "entities_found": "$.response.Entities[*].Type"
    }
],

{% include copy.html %}

이 구성은 추출된 개체를 entities_found 필드에 매핑해서 각 문서와 함께 저장되도록 해요.


언어 감지 및 분류

다음 예제는 언어 감지 및 분류를 구성하는 방법을 보여줘요.

ML 리소스

Amazon Comprehend Language Detection 모델을 생성하고 배포하세요.

인제스트 파이프라인

ML 인퍼런스 프로세서 하나를 구성하세요. 입력 텍스트 필드를 text 모델 입력 필드에 매핑하세요. 각 문서에서 감지된 가장 관련성 높거나 가장 가능성 높은 언어를 저장하려면 출력(언어 배열)을 변환해서 detected_dominant_language 필드에 저장하세요. 다음 output_map 구성을 참고하세요:

"output_map": [
    {
              "detected_dominant_language": "response.Languages[0].LanguageCode"
    }
],

{% include copy.html %}


결과 리랭킹

리랭킹은 사용하는 모델의 기능에 따라 다양한 방식으로 구현할 수 있어요. 일반적으로 모델은 최소 두 가지 입력, 즉 원본 쿼리와 관련성 점수를 매길 데이터가 필요해요. 일부 모델은 배칭을 지원해서 한 번의 인퍼런스 호출로 여러 결과를 처리할 수 있고, 다른 모델은 각 결과마다 개별적으로 점수를 매겨야 해요.

OpenSearch에서는 이 때문에 두 가지 일반적인 리랭킹 패턴이 생겨요:

  1. 배칭 활성화

    1. 모든 검색 결과를 수집해요.
    2. 배치로 묶은 결과를 하나의 ML 프로세서에 전달해서 점수를 매겨요.
    3. 상위 n개의 랭킹 결과를 반환해요.
  2. 배칭 비활성화

    1. 모든 검색 결과를 수집해요.
    2. 각 결과를 ML 프로세서에 전달해서 새 관련성 점수를 매겨요.
    3. 업데이트된 점수가 담긴 모든 결과를 rerank 프로세서에 보내서 정렬해요.
    4. 상위 n개의 랭킹 결과를 반환해요.

다음 예제는 rerank 프로세서를 부각하기 위해 **패턴 2(배칭 비활성화)**를 보여줘요. 다만 이 예제에서 사용하는 Cohere Rerank 모델은 배칭을 지원하기 때문에, 이 모델로 패턴 1을 구현할 수도 있다는 점에 유의하세요.

ML 리소스

Cohere Rerank 모델을 생성하고 배포하세요.

검색 파이프라인

ML 인퍼런스 검색 응답 프로세서를 구성하고, 그 뒤에 rerank 검색 응답 프로세서를 구성하세요. 배칭을 비활성화한 상태로 리랭킹하려면 ML 프로세서로 검색된 결과의 새 관련성 점수를 만든 다음, reranker를 적용해서 그에 맞게 정렬하세요.

다음 ML 프로세서 구성을 사용하세요:

  1. 비교에 사용할 데이터가 담긴 문서 필드를 모델의 documents 필드에 매핑하세요.
  2. 원본 쿼리를 모델의 query 필드에 매핑하세요.
  3. JSONPath를 사용해서 쿼리 JSON에 접근하되, _request.query를 접두사로 붙이세요.

다음 input_map 구성을 참고하세요:

"input_map": [
   {
      "documents": "description",
      "query": "$._request.query.term.value"
   }
],

{% include copy.html %}

필요에 따라 모델 출력에서 다시 점수를 매긴 결과를 새 필드에 저장할 수도 있어요. 또한 다음과 같이 관련성 점수만 추출해서 저장할 수도 있어요:

"input_map": [
   {
      "new_score": "results[0].relevance_score"
   }
],

{% include copy.html %}

다음 rerank 프로세서 구성을 사용하세요. target_field에서 모델 점수 필드를 선택하세요(이 예제에서는 new_score).


커스텀 CLIP 모델을 사용한 멀티모달 검색 (텍스트 또는 이미지)

다음 예제는 Amazon SageMaker에서 호스팅되는 커스텀 CLIP 모델을 사용해요. 이 모델은 텍스트나 이미지 URL을 입력으로 동적으로 받아서 벡터 임베딩을 반환해요.

ML 리소스

Custom CLIP Multimodal 모델을 생성하고 배포하세요.

인덱스

인덱스 설정에 index.knn: true가 포함되어 있고, 매핑에 지정된 대로 인덱스에 knn_vector 필드가 포함되어 있는지 확인하세요. 다음과 같아요:

{
  "settings": {
    "index": {
      "knn": true
    }
  },
  "mappings": {
    "properties": {
      "<embedding_field_name>": {
        "type": "knn_vector",
        "dimension": "<embedding_size>"
      }
    }
  }
}

{% include copy.html %}

인제스트 파이프라인

ML 인퍼런스 프로세서 하나를 구성하세요. 인덱스에 어떤 타입의 데이터를 수집하고 저장하는지에 따라 이미지 필드를 image_url 모델 입력 필드에 매핑하거나 텍스트 필드를 text 모델 입력 필드에 매핑하세요. 예를 들어 텍스트나 이미지 입력을 기반으로 관련 이미지를 반환하는 애플리케이션을 만든다면 이미지를 저장해야 하므로 이미지 필드를 image_url 필드에 매핑해야 해요.

검색 파이프라인

ML 인퍼런스 검색 요청 프로세서 하나를 구성하세요. 쿼리의 입력 이미지 필드나 입력 텍스트 필드를 각각 image_url 또는 text 모델 입력 필드에 매핑하세요. CLIP 모델은 둘 중 하나를 유연하게 처리하므로, 사용 사례에 가장 잘 맞는 옵션을 선택하세요.

쿼리를 오버라이드해서 임베딩 출력을 포함하는 knn 쿼리를 담도록 하세요:

{
    "_source": {
        "excludes": [
            "<embedding_field>"
        ]
    },
    "query": {
        "knn": {
            "<embedding_field>": {
                "vector": ${embedding},
                "k": 10
            }
        }
    }
}

{% include copy.html %}


Neural sparse 검색

이 예제는 Neural sparse 검색을 구성하는 방법을 보여줘요.

ML 리소스

Neural sparse 인코딩 모델을 생성하고 배포하세요.

인덱스

인덱스 매핑에 rank_features 필드가 포함되어 있는지 확인하세요:

"<embedding_field_name>": {
    "type": "rank_features"
}

{% include copy.html %}

수집 파이프라인

ML inference 프로세서 하나를 구성하세요. 입력 텍스트를 text_doc 모델 입력 필드에 매핑하세요. 선택적으로, 출력 response를 새 문서 필드에 매핑할 수도 있어요. 필요한 경우 JSONPath 표현식을 사용해 응답을 변환하세요.

검색 파이프라인

ML inference search request 프로세서 하나를 구성하세요. 입력 텍스트가 담긴 쿼리 필드를 text_doc 모델 입력 필드에 매핑하세요. 선택적으로, 출력 response를 새 필드에 매핑할 수도 있어요. 필요한 경우 JSONPath 표현식을 사용해 응답을 변환하세요. Neural sparse 쿼리를 포함하세요:

{
    "_source": {
        "excludes": [
            "<embedding_field>"
        ]
    },
    "query": {
        "neural_sparse": {
            "<embedding_field>": {
                "query_tokens": ${response},
            }
        }
    }
}

{% include copy.html %}

더 알아보기 (Learn more)