Retrievers
원본 보기Retrievers
retriever는 8.14.0에서 _search API에 추가되었고 8.16.0에서 정식 출시된 추상화 계층입니다.
이 문법을 사용하면 단일 _search 호출 안에서 다단계 검색 파이프라인을 구성할 수 있습니다. 여러 번의 Elasticsearch 호출로 복잡한 검색을 구성하거나 서로 다른 쿼리의 결과를 합치기 위해 클라이언트 측 로직을 추가로 구현할 필요가 없어지므로 검색 애플리케이션 로직이 단순해집니다.
이 문서는 retriever 추상화에 대한 전반적인 개요를 제공합니다. 전체 문법 레퍼런스와 구현 개요는 레퍼런스 문서를 참고하세요.
retriever는 여러 종류가 있으며, 각각 서로 다른 검색 작업에 맞춰져 있습니다. 현재 사용할 수 있는 retriever는 다음과 같습니다.
1단계(First-stage) retriever는 초기 후보 문서 집합을 반환합니다.
- Standard retriever. 전통적인 쿼리에서 상위 문서를 반환합니다.
- kNN retriever. knn 검색에서 상위 문서를 반환합니다.
복합(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가 유용한 이유와 일반 쿼리와의 차이점은 다음과 같습니다.
- 단순해진 사용자 경험. retriever는 전체 검색 파이프라인을 단일 API 호출로 구성할 수 있게 해 사용자 경험을 단순화합니다. 전통적인 쿼리 요소는 적절한 retriever로 자동 변환되므로 하위 호환성이 유지됩니다.
- 구조화된 검색. retriever는 검색 작업을 더 구조적으로 정의하는 방법을 제공합니다. 작업의 순서와 로직을 명확히 보여주는 계층 구조인 "retriever 트리"로 검색을 기술할 수 있어, 복잡한 검색도 이해하고 관리하기 쉬워집니다.
- 조합 가능성과 유연성. retriever는 유연한 조합을 가능하게 하여 파이프라인을 구축하고 다양한 검색 전략을 그 파이프라인에 매끄럽게 통합할 수 있습니다. retriever를 사용하면 여러 검색 전략 조합을 손쉽게 테스트할 수 있습니다.
- 복합 연산. retriever는 하위 retriever를 가질 수 있습니다. 이를 통해 한 retriever의 결과가 다른 retriever로 전달되는 복잡한 중첩 검색이 가능하며, 여러 단계나 기준을 포함하는 정교한 쿼리 전략을 지원합니다.
- 1급 개념으로서의 검색. 쿼리가 더 큰 검색 API 호출의 일부인 전통적인 방식과 달리, retriever는 조합하거나 단독으로 사용할 수 있는 독립적인 개체로 설계되었습니다. 덕분에 검색을 구성하는 방식이 더 모듈화되고 유연해집니다.
- 문서 스코어링과 랭킹에 대한 강화된 제어. retriever를 사용하면 문서에 점수를 매기고 필터링하는 방식을 더 명시적으로 제어할 수 있습니다. 예를 들어 최소 점수 임계값을 지정하거나, 스코어링에 영향을 주지 않는 복잡한 필터를 적용하거나, 성능 최적화를 위해
terminate_after같은 파라미터를 사용할 수 있습니다. - 기존 Elasticsearch 기능과의 통합. retriever는 기존
_searchAPI 문법(query,knn등) 대신 사용할 수 있지만, 페이지네이션(search_after)이나 정렬 같은 기능과 매끄럽게 통합되도록 설계되었습니다. 또한 모든 리프 retriever의 조합을 boolean 쿼리의should절로 취급하여 집계 연산과의 호환성도 유지합니다. - 더 명확한 관심사 분리. 복합 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)과 비교해 보세요.
GET example-index/_search
{
"sub_searches":[
{
"query":{
"match":{
"text":"blue shoes sale"
}
}
},
{
"query":{
"sparse_vector": {
"field": "vector.tokens",
"inference_id": "my-elser-endoint",
"query": "What blue shoes are on sale?"
}
}
}
],
"rank":{
"rrf":{
"rank_window_size":50,
"rank_constant":20
}
}
}
더 많은 예제는 retriever 예제를 참고하세요.
알아 두어야 할 주요 용어는 다음과 같습니다.
- Retrieval Pipeline. 상위 히트를 만들어 내는 전체 검색 및 랭킹 로직을 정의합니다.
- Retriever Tree. retriever들이 상호작용하는 방식을 정의하는 계층 구조입니다.
- First-stage Retriever. 초기 후보 문서 집합을 반환합니다.
- Compound Retriever. 하나 이상의 retriever 위에 구축되어 문서 검색 및 랭킹 로직을 강화합니다.
- Combiners. 여러 하위 retriever의 상위 히트를 병합하는 복합 retriever입니다.
- Rerankers. 히트를 재정렬하고 히트 수를 조정할 수도 있는 특수한 복합 retriever로, 1단계 reranker와 2단계 reranker로 구분됩니다.
주요 제약 사항을 포함한 구현 세부 사항은 레퍼런스 문서를 참고하세요.
추가 예제는 Retrievers 예제를 참고하세요.