시맨틱 검색

원본 보기

시맨틱 검색

Elasticsearch에서 시맨틱 검색이 어떻게 동작하는지 감을 잡고 싶다면 이 빠른 시작 가이드가 도움이 됩니다. 시맨틱 검색을 위한 가장 간단한 관리형 경로인 semantic_text 워크플로를 사용합니다. 먼저 인덱스를 만들고 데이터를 두 가지 형태로 저장합니다. 키워드 매칭을 위한 일반 텍스트와 semantic_text에 저장되는 시맨틱 표현입니다(벡터 임베딩은 내부적으로 벡터 검색을 사용해 자동으로 생성되고 비교됩니다). 그다음 키워드 검색과 해당 임베딩에 대한 시맨틱 검색을 결합하고 결과를 병합하는 하이브리드 쿼리를 실행합니다.

참고

이 빠른 시작 가이드는 semantic_text 필드 타입을 사용한 시맨틱 검색하이브리드 검색을 보여줍니다. 키워드 기반 전문 검색과 시맨틱 검색을 결합하므로 정확한 용어와 의미를 모두 매칭할 수 있습니다. 시맨틱 검색은 벡터 검색에 기반합니다. 텍스트가 임베딩으로 변환되어 벡터 공간에서 유사도로 매칭됩니다.

예를 들어 문서에 "annual leave policy"라는 문구가 있다면, "annual leave"로 키워드 검색하면 용어가 일치하므로 해당 문서가 반환됩니다. 하지만 "vacation rules"로 검색하면 그 정확한 단어가 문서에 없기 때문에 같은 문서가 반환되지 않을 수 있습니다.

시맨틱 검색과 벡터 검색을 사용하면 "vacation rules" 같은 쿼리로도 "annual leave policy" 문서를 반환할 수 있습니다. 정확한 용어가 아니라 의미를 기준으로 매칭하기 때문입니다.

하이브리드 검색을 사용하면 같은 쿼리로 키워드 매치와 시맨틱 매치를 모두 반환할 수 있습니다. 정확한 단어 매칭과 의미 기반 벡터 검색을 결합해 결과가 계속 유용하게 유지됩니다.

실행 중인 Elasticsearch 클러스터가 필요합니다. 이 가이드를 가장 빠르게 따라 하려면 무료 서버리스 체험이 포함된 서버리스 프로젝트를 생성하세요.

  1. 인덱스 매핑 생성

    인덱스 매핑을 정의합니다. 매핑은 인덱스의 필드와 데이터 타입을 지정하며, 여기에는 전문 검색용 일반 텍스트 필드와 벡터 임베딩 및 벡터 검색을 통해 시맨틱 검색을 구동하는 semantic_text 필드가 포함됩니다.

    				PUT semantic-embeddings
    					{
      "mappings": {
        "properties": {
          "semantic_text": {
            "type": "semantic_text"
          },
          "content": {
            "type": "text",
            "copy_to": "semantic_text"
          }
        }
      }
    }
    		
    1. 시맨틱 검색을 위한 semantic_text 필드 타입의 semantic_text 필드입니다. 벡터 임베딩은 내부적으로 기본 추론 엔드포인트벡터 검색을 사용해 자동으로 생성되고 저장됩니다.
    2. 일반 텍스트를 저장하는 text 필드 타입의 content 필드입니다. 이 필드는 키워드 검색에 사용됩니다.
    3. content에 색인된 값은 semantic_text로 복사되어 벡터 임베딩으로 변환되며, 기본 추론 엔드포인트에 의해 벡터 검색용으로 저장됩니다.
    응답 예시
  2. 문서 색인

    bulk API로 문서를 색인합니다. content 필드에 내용만 제공하면 됩니다. copy_to 매핑이 텍스트를 semantic_text로 복사하고 벡터 임베딩을 자동으로 생성하므로, 같은 문서에 대해 content에는 키워드 검색을, semantic_text에는 시맨틱 검색을 실행할 수 있습니다.

    				POST _bulk
    					{ "index": { "_index": "semantic-embeddings" } }
    { "content": "After running, cool down with light cardio for a few minutes to lower your heart rate and reduce muscle soreness." }
    { "index": { "_index": "semantic-embeddings" } }
    { "content": "Marathon plans stress weekly mileage; carb loading before a race does not replace recovery between hard sessions." }
    { "index": { "_index": "semantic-embeddings" } }
    { "content": "Tune cluster performance by monitoring thread pools and refresh interval." }
    		
    응답 예시

Search API를 사용해 하이브리드 검색을 실행합니다.

JSON 본문은 하이브리드 쿼리입니다. RRF(reciprocal rank fusion) retriever가 두 개의 match 쿼리를 실행하는데, 하나는 키워드 매칭을 위해 content에 대해, 다른 하나는 시맨틱 검색을 위해 semantic_text에 대해 실행되며(내부적으로 벡터 검색을 사용), 결과를 병합합니다.

참고

RRF retriever는 RRF 공식을 기반으로 상위 문서를 반환합니다. 이를 통해 키워드 기반 전문 쿼리와 (벡터 검색을 통한) 시맨틱 검색의 결과를 하나의 순위 목록으로 결합하는 하이브리드 검색이 가능해집니다.

				GET semantic-embeddings/_search
					{
  "retriever": {
    "rrf": {
      "retrievers": [
        {
          "standard": {
            "query": {
              "match": {
                "content": "muscle soreness after jogging"
              }
            }
          }
        },
        {
          "standard": {
            "query": {
              "match": {
                "semantic_text": "muscle soreness after jogging"
              }
            }
          }
        }
      ]
    }
  }
}
		
  1. match 쿼리가 키워드 매칭용 일반 텍스트를 저장하는 content 필드에 대해 실행됩니다.
  2. match 쿼리벡터 검색을 사용하는 시맨틱 검색을 위해 semantic_text 필드에 대해 실행됩니다(쿼리와 문서 벡터는 자동으로 저장되고 비교됩니다).

문서가 두 쿼리 중 어느 하나에서라도 높은 순위를 차지하면 결합된 목록에 나타날 수 있습니다.

응답 예시

  • semantic_text로 시맨틱 검색하기 - semantic_text 필드 타입으로 시맨틱 검색과 벡터 검색을 설정하는 방법에 대한 전체 튜토리얼을 따라 해 보세요.
  • inference API로 시맨틱 검색하기 - 서드파티 임베딩 서비스(예: Cohere, Hugging Face, OpenAI)와 함께 inference API를 사용해 벡터 임베딩 기반 시맨틱 검색을 실행합니다.
  • semantic_text로 하이브리드 검색하기 - semantic_text에 대한 시맨틱 검색과 text 필드에 대한 전문 검색을 결합한 뒤 RRF로 결과를 병합합니다. 벡터 임베딩은 자동으로 생성되고 비교됩니다.
  • ELSER로 시맨틱 검색하기 - 희소 벡터 검색과 시맨틱 검색에 ELSER 모델을 사용합니다.
  • 밀집 및 희소 벡터 인제스트 파이프라인 - Elasticsearch에 배포한 NLP 모델로 벡터 검색을 처음부터 끝까지 구현합니다. 밀집 또는 희소를 선택하고, 모델을 배포하고, 인제스트 파이프라인을 구축한 뒤 semantic_text에 의존하지 않고 쿼리합니다.

  • 텍스트 시맨틱 검색 - 의미 기반 텍스트 검색을 위한 세 가지 워크플로(semantic_text, inference API, 클러스터 내 배포 모델)를 비교하고 복잡도가 어떻게 다른지 확인합니다.
  • 멀티모달 검색 - Jina 멀티모달 임베딩으로 텍스트, 이미지, 오디오, 비디오, 문서를 아우르는 검색을 수행합니다.
  • 벡터 검색 - 관리형 시맨틱 워크플로 이상의 제어가 필요할 때 dense_vectorsparse_vector 필드, 관련 쿼리, 수동 벡터 구현을 직접 다룹니다.
  • 랭킹과 리랭킹 - 다단계 파이프라인을 구성합니다. 초기 BM25, 벡터 또는 하이브리드 검색 후 더 작은 후보 집합에 대해 더 강력한 모델로 리랭킹합니다.
  • 검색 쿼리 작성하기 - 고전적인 쿼리, 분석형 파이프, 조합 가능한 검색 파이프라인 중 무엇이 필요한지에 따라 Search API에서 Query DSL, ES|QL 또는 retriever를 선택합니다.

전문 검색, 벡터 검색, 하이브리드 검색 등 더 많은 옵션에 대해 알아보려면 Search approaches로 이동하세요. 벡터 검색 활용 사례 요약은 Vector search use cases를 참고하세요.