Retrievers

원본 보기

Retrievers

retriever는 8.14.0에서 _search API에 추가되었고 8.16.0에서 정식 출시된 추상화 계층입니다.

이 문법을 사용하면 단일 _search 호출 안에서 다단계 검색 파이프라인을 구성할 수 있습니다. 여러 번의 Elasticsearch 호출로 복잡한 검색을 구성하거나 서로 다른 쿼리의 결과를 합치기 위해 클라이언트 측 로직을 추가로 구현할 필요가 없어지므로 검색 애플리케이션 로직이 단순해집니다.

Note

이 문서는 retriever 추상화에 대한 전반적인 개요를 제공합니다. 전체 문법 레퍼런스와 구현 개요는 레퍼런스 문서를 참고하세요.

retriever는 여러 종류가 있으며, 각각 서로 다른 검색 작업에 맞춰져 있습니다. 현재 사용할 수 있는 retriever는 다음과 같습니다.

1단계(First-stage) retriever는 초기 후보 문서 집합을 반환합니다.

복합(Compound) retriever는 하위 retriever의 결과를 결합하거나 재정렬합니다.

  • RRF retriever. reciprocal rank fusion(RRF) 알고리즘을 사용해 여러 1단계 retriever의 결과를 결합하고 순위를 매깁니다. 간단한 하이브리드 검색을 위한 multi-field 쿼리 형식을 지원합니다.
  • Linear retriever. 여러 하위 retriever의 상위 결과를 점수의 가중 정규화 합으로 결합합니다. 어휘 필드와 시맨틱 필드에 걸친 자동 하이브리드 검색을 위한 multi-field 쿼리 형식도 지원합니다.
  • Pinned retriever. 지정한 문서를 항상 결과 최상단에 배치하고, 나머지 히트는 보조 retriever가 제공합니다.
  • Rule retriever. 결과를 반환하기 전에 쿼리에 쿼리 규칙을 적용합니다.
  • Rescorer retriever. 하위 retriever가 생성한 결과의 점수를 다시 계산합니다.
  • Text Similarity Re-ranker retriever. 시맨틱 리랭킹을 위해 cross-encoder 모델을 사용해 결과 순위를 다시 매깁니다.
  • Diversify retriever (preview). 하위 retriever의 상위 N개 결과에 Maximum Marginal Relevance(MMR) 다양화를 적용해 결과의 중복을 줄입니다.

retriever가 유용한 이유와 일반 쿼리와의 차이점은 다음과 같습니다.

  1. 단순해진 사용자 경험. retriever는 전체 검색 파이프라인을 단일 API 호출로 구성할 수 있게 해 사용자 경험을 단순화합니다. 전통적인 쿼리 요소는 적절한 retriever로 자동 변환되므로 하위 호환성이 유지됩니다.
  2. 구조화된 검색. retriever는 검색 작업을 더 구조적으로 정의하는 방법을 제공합니다. 작업의 순서와 로직을 명확히 보여주는 계층 구조인 "retriever 트리"로 검색을 기술할 수 있어, 복잡한 검색도 이해하고 관리하기 쉬워집니다.
  3. 조합 가능성과 유연성. retriever는 유연한 조합을 가능하게 하여 파이프라인을 구축하고 다양한 검색 전략을 그 파이프라인에 매끄럽게 통합할 수 있습니다. retriever를 사용하면 여러 검색 전략 조합을 손쉽게 테스트할 수 있습니다.
  4. 복합 연산. retriever는 하위 retriever를 가질 수 있습니다. 이를 통해 한 retriever의 결과가 다른 retriever로 전달되는 복잡한 중첩 검색이 가능하며, 여러 단계나 기준을 포함하는 정교한 쿼리 전략을 지원합니다.
  5. 1급 개념으로서의 검색. 쿼리가 더 큰 검색 API 호출의 일부인 전통적인 방식과 달리, retriever는 조합하거나 단독으로 사용할 수 있는 독립적인 개체로 설계되었습니다. 덕분에 검색을 구성하는 방식이 더 모듈화되고 유연해집니다.
  6. 문서 스코어링과 랭킹에 대한 강화된 제어. retriever를 사용하면 문서에 점수를 매기고 필터링하는 방식을 더 명시적으로 제어할 수 있습니다. 예를 들어 최소 점수 임계값을 지정하거나, 스코어링에 영향을 주지 않는 복잡한 필터를 적용하거나, 성능 최적화를 위해 terminate_after 같은 파라미터를 사용할 수 있습니다.
  7. 기존 Elasticsearch 기능과의 통합. retriever는 기존 _search API 문법(query, knn 등) 대신 사용할 수 있지만, 페이지네이션(search_after)이나 정렬 같은 기능과 매끄럽게 통합되도록 설계되었습니다. 또한 모든 리프 retriever의 조합을 boolean 쿼리의 should 절로 취급하여 집계 연산과의 호환성도 유지합니다.
  8. 더 명확한 관심사 분리. 복합 retriever를 사용할 때는 query 요소만 허용되므로 관심사 분리가 더 명확해지고, 과도하게 중첩되거나 서로 얽힌 설정에서 발생할 수 있는 복잡성을 방지합니다.

다음 예제는 retriever를 사용하면 RRF 랭킹을 위한 쿼리 조합이 얼마나 단순해지는지 보여줍니다.

GET example-index/_search
{
  "retriever": {
    "rrf": {
      "retrievers": [
        {
          "standard": {
            "query": {
              "sparse_vector": {
                "field": "vector.tokens",
                "inference_id": "my-elser-endpoint",
                "query": "What blue shoes are on sale?"
              }
            }
          }
        },
        {
          "standard": {
            "query": {
              "match": {
                "text": "blue shoes sale"
              }
            }
          }
        }
      ]
    }
  }
}
		

이 예제는 서로 다른 검색 전략을 하나의 retriever 파이프라인으로 결합하는 방법을 보여줍니다.

sub_searches를 사용한 RRF 방식(8.16.0부터 deprecated)과 비교해 보세요.

예제 펼치기

더 많은 예제는 retriever 예제를 참고하세요.

알아 두어야 할 주요 용어는 다음과 같습니다.

  • Retrieval Pipeline. 상위 히트를 만들어 내는 전체 검색 및 랭킹 로직을 정의합니다.
  • Retriever Tree. retriever들이 상호작용하는 방식을 정의하는 계층 구조입니다.
  • First-stage Retriever. 초기 후보 문서 집합을 반환합니다.
  • Compound Retriever. 하나 이상의 retriever 위에 구축되어 문서 검색 및 랭킹 로직을 강화합니다.
  • Combiners. 여러 하위 retriever의 상위 히트를 병합하는 복합 retriever입니다.
  • Rerankers. 히트를 재정렬하고 히트 수를 조정할 수도 있는 특수한 복합 retriever로, 1단계 reranker와 2단계 reranker로 구분됩니다.

주요 제약 사항을 포함한 구현 세부 사항은 레퍼런스 문서를 참고하세요.

추가 예제는 Retrievers 예제를 참고하세요.