시맨틱 리랭킹
원본 보기시맨틱 리랭킹
이 개요는 시맨틱 리랭킹의 상위 수준 개념과 활용 사례에 초점을 맞춥니다. Elasticsearch에서 시맨틱 리랭킹을 설정하고 사용하는 전체 구현 세부 사항은 Search API 문서의 레퍼런스 문서를 참조하세요.
리랭커는 이전 단계의 검색 메커니즘에서 나온 결과의 관련성을 개선합니다. 시맨틱 리랭커는 머신러닝 모델을 사용해 쿼리와의 의미적 유사도를 기준으로 검색 결과의 순서를 재정렬합니다.
시맨틱 리랭킹은 비교적 크고 복잡한 머신러닝 모델을 필요로 하며 쿼리에 대응해 실시간으로 동작합니다. 이 기법은 파이프라인의 마지막 단계 중 하나로서 작은 top-k 결과 집합에 적용할 때 적합합니다. 키워드, 시맨틱, 하이브리드 검색 알고리즘 어느 쪽에서든 동일하게 잘 작동하는 강력한 검색 관련성 개선 기법입니다.
다음 섹션에서는 시맨틱 리랭킹의 이점, 활용 사례, 사용되는 모델 유형을 더 자세히 설명합니다. 마지막 섹션에서는 Elasticsearch에서의 시맨틱 리랭킹 구현 방법에 대한 실용적이고 개괄적인 개요와 전체 레퍼런스 문서 링크를 제공합니다.
시맨틱 리랭킹은 다양한 활용 사례를 가능하게 합니다:
렉시컬(BM25) 검색 결과 리랭킹
- 기존의 렉시컬/BM25 검색 파이프라인에 간단한 API 호출을 추가하는 것만으로 즉시 사용 가능한 시맨틱 검색을 구현합니다.
- 재색인 없이 기존 인덱스 위에 시맨틱 검색 기능을 추가하므로 빠른 개선에 적합합니다.
- 복잡한 기존 인덱스를 가진 환경에 이상적입니다.
시맨틱 검색 결과 리랭킹
- 더 강력한 모델을 사용해 ELSER 희소 벡터 임베딩 또는 밀집 벡터 임베딩 기반 시맨틱 리트리버의 결과를 개선합니다.
- reciprocal rank fusion (RRF) 또는 linear 리트리버를 사용한 선형 결합 기반 하이브리드 검색 위에 정제 계층을 추가합니다
일반적인 활용
- 검색 증강 생성(RAG) 활용 사례나 언어 모델(LLM) 입력이 관련된 기타 시나리오에서 문서 관련성을 명시적으로 제어할 수 있게 합니다.
시맨틱 리랭킹의 가치를 살펴봤으니, 이제 이 과정을 구동하는 구체적인 모델과 그 차이점을 알아보겠습니다.
상위 수준에서 보면 시맨틱 리랭킹에는 cross-encoder와 bi-encoder라는 두 가지 모델 유형이 사용됩니다.
이 버전에서 Elasticsearch는 시맨틱 리랭킹에 cross-encoder만 지원합니다.
cross-encoder 모델은 쿼리를 인식한 문서 표현을 생성하기 때문에 더 강력한 올인원 솔루션으로 볼 수 있습니다. 쿼리 텍스트와 문서 텍스트를 하나로 이어 붙인 단일 입력으로 받습니다.
bi-encoder 모델은 문서 텍스트 또는 쿼리 텍스트 중 하나를 입력으로 받습니다. 문서 임베딩과 쿼리 임베딩이 각각 별도로 계산되므로 서로를 인식하지 못합니다.
- 랭킹 점수를 계산하려면 외부 연산이 필요합니다. 일반적으로 쿼리 임베딩과 문서 임베딩 간의 내적 또는 코사인 유사도를 계산하는 방식입니다.
요약하면, cross-encoder는 정확도가 높지만 리소스를 더 많이 사용합니다. bi-encoder는 더 빠르고 비용 효율적이지만 정밀도는 떨어집니다.
향후 버전에서는 Elasticsearch가 bi-encoder도 지원할 예정입니다. cross-encoder와 bi-encoder의 실무적 차이에 대한 보다 상세한 분석이 궁금하다면 다음 섹션을 펼쳐 보세요.
다음은 시맨틱 리랭킹에 cross-encoder와 bi-encoder 중 어느 것을 선택할지 결정할 때 고려할 사항을 정리한 것입니다(전체 목록은 아닙니다):
- cross-encoder 모델은 쿼리 텍스트와 문서 텍스트를 동시에 처리하기 때문에 둘의 관련성을 더 잘 추론할 수 있으며, 그 결과 리랭커로서 bi-encoder보다 효과적입니다.
- cross-encoder 모델은 일반적으로 더 크고 연산 부하가 높아 지연 시간이 길어지고 연산 비용이 증가합니다.
- 오픈소스 cross-encoder는 훨씬 적은 반면, bi-encoder는 크기, 언어 등 다양한 선택지와 트레이드오프를 제공합니다.
- cross-encoder의 효과는 시맨틱 리트리버의 관련성도 개선할 수 있습니다. 예를 들어 어순을 고려하는 능력 덕분에 밀집 또는 희소 임베딩 검색을 개선할 수 있습니다.
- 특정 리트리버(예: 렉시컬/BM25)와 함께 학습된 cross-encoder는 해당 리트리버가 흔히 범하는 오류를 “교정”할 수 있습니다.
- cross-encoder는 쿼리 전반에 걸쳐 일관된 점수를 출력합니다. 덕분에 모든 쿼리에 대해 최소 점수 임계값을 설정해 결과 집합의 관련성을 높게 유지할 수 있습니다. 예를 들어 RAG 워크플로에서 결과를 사용하거나 결과를 LLM에 입력할 때 이 점이 중요합니다. bi-encoder/임베딩 유사도에서 나온 유사도 점수는 쿼리에 종속적이므로 보편적인 컷오프를 설정할 수 없다는 점에 유의하세요.
- bi-encoder는 임베딩을 사용해 리랭킹합니다. 색인 시점에 임베딩을 생성하면 리랭킹 지연 시간을 개선할 수 있습니다. 이 임베딩은 검색용으로 색인하지 않고 리랭킹용으로만 저장할 수 있어 메모리 사용량을 줄일 수 있습니다.
Elasticsearch는 검색 파이프라인에 시맨틱 리랭킹을 추가하는 두 가지 방법을 제공합니다:
text_similarity_reranker리트리버 사용- ES|QL
RERANK명령 사용
두 방법 모두 동일한 기반 inference 엔드포인트와 리랭킹 모델을 사용합니다.
두 방식 모두 rerank 작업용으로 구성된 inference 엔드포인트가 필요합니다. 다음과 같은 선택지가 있습니다:
Elastic Inference Service (EIS)가 구동하는 사전 구성된
.jina-reranker-v3.5엔드포인트를 사용합니다. 권장되는 방식입니다. Jina 리랭커 모델에 대해 자세히 알아보세요.사전 구성된
.rerank-v1-elasticsearch엔드포인트를 통해 Elastic Rerank cross-encoder 모델을 사용하거나, inference API의 Elasticsearch 서비스를 사용해 커스텀 엔드포인트를 생성합니다.Jina AI Rerank inference 엔드포인트를 사용해
rerank엔드포인트를 생성합니다.Cohere Rerank inference 엔드포인트를 사용해
rerank엔드포인트를 생성합니다.Google Vertex AI inference 엔드포인트를 사용해
rerank엔드포인트를 생성합니다.Eland를 사용해 Hugging Face에서 Elasticsearch로 모델을 업로드합니다. Eland로 모델을 로드할 때는
text_similarityNLP 작업 유형을 사용해야 합니다. 그런 다음rerank엔드포인트 유형으로 Elasticsearch 서비스 inference 엔드포인트를 설정합니다.Elasticsearch가 시맨틱 리랭킹에 지원하는 서드파티 텍스트 유사도 모델 목록은 Elastic NLP 모델 레퍼런스를 참조하세요.
리트리버 또는 ES|QL 중 하나를 사용해 시맨틱 리랭킹을 수행할 수 있습니다.
리트리버 문법을 사용하면 단일 _search 호출 안에서 다단계 검색 파이프라인을 선언적으로 구성할 수 있습니다. RRF, linear, pinned 같은 다른 리트리버 단계와 리랭킹을 결합하고 싶을 때 적합합니다.
사전 구성된 rerank 엔드포인트(예: .jina-reranker-v3.5 또는 .rerank-v1-elasticsearch)를 사용하거나 Elasticsearch Inference API로 커스텀 엔드포인트를 생성할 수 있습니다. 그런 다음 검색 요청에 text_similarity_reranker 리트리버를 정의합니다.
POST _search
{
"retriever": {
"text_similarity_reranker": {
"retriever": {
"standard": {
"query": {
"match": {
"text": "How often does the moon hide the sun?"
}
}
}
},
"field": "text",
"inference_id": "elastic-rerank",
"inference_text": "How often does the moon hide the sun?",
"rank_window_size": 100,
"min_score": 0.5
}
}
}
전체 레퍼런스 문서는 text_similarity_reranker 리트리버를 참조하세요.
ES|QL RERANK 명령을 사용하면 파이프 형태의 쿼리에 리랭킹을 하나의 단계로 추가할 수 있습니다. 변환, 집계, COMPLETION을 이용한 텍스트 생성 같은 다른 ES|QL 기능과 리랭킹을 결합하고 싶을 때 적합합니다.
FROM books
| WHERE title : "search query"
| SORT _score DESC
| LIMIT 100
| RERANK "search query" ON title
전체 레퍼런스 문서는 RERANK 명령을 참조하세요.
| 리트리버 | ES|QL | |
|---|---|---|
| 문법 | 선언적 JSON(리트리버 트리) | 파이프 방식 쿼리 언어 |
| 조합성 | 다른 리트리버와 중첩(RRF, linear, pinned, diversify) | 다른 명령과 파이프 연결(FORK, FUSE, COMPLETION, STATS) |
| 다중 필드 리랭킹 | 단일 필드만 가능 | 다중 필드 지원 |
| 적합한 용도 | _search API의 다단계 검색 파이프라인 |
변환이나 생성을 포함하는 엔드투엔드 검색 쿼리 |
| 클라이언트 지원 | 모든 Elasticsearch 클라이언트 | 모든 Elasticsearch 클라이언트 |
많은 cross-encoder 모델의 한계는 긴 문서로 이루어진 코퍼스에서 성능이 좋지 않다는 점입니다.
이는 다수의 모델이 입력을 토큰 윈도우 길이에 맞춰 잘라내기 때문이며, 그 과정에서 문서의 가장 관련성 높은 부분이 리랭커로 전달되기 전에 잘려 나갈 수 있습니다. 사전 구성된 .rerank-v1-elasticsearch 엔드포인트도 이런 방식으로 잘라냅니다.
text_similarity_reranker 리트리버의 chunk_rescorer를 사용하면 리랭커로 전달되는 콘텐츠 양을 명시적으로 제어할 수 있습니다. 이는 긴 문서 문제를 해결할 뿐 아니라 리랭커에 더 적은 토큰을 보내 inference 비용도 조절할 수 있게 합니다.
점수가 매겨진 청크에 대한 리랭킹은 전문가용 기능으로, 잘라내기를 수행하지 않는 모델과 함께 사용하면 관련성에 부정적인 영향을 줄 수 있습니다.
다음 예시는 기본 설정으로 chunk_rescorer를 사용해 청크 크기를 제어하는 시맨틱 리랭커를 보여줍니다.
POST _search
{
"retriever": {
"text_similarity_reranker": {
"retriever": {
"standard": {
"query": {
"match": {
"text": "How often does the moon hide the sun?"
}
}
}
},
"field": "text",
"inference_id": "elastic-rerank",
"inference_text": "How often does the moon hide the sun?",
"chunk_rescorer": {},
"rank_window_size": 100,
"min_score": 0.5
}
}
}
- 문법과 구현 세부 사항은
text_similarity_reranker리트리버 레퍼런스를 참조하세요 - 파이프 방식 쿼리 접근법은 ES|QL
RERANK명령 레퍼런스를 참조하세요 - 리트리버 추상화에 대해 자세히 알아보세요
- 검색 활용 사례에 맞는 쿼리 인터페이스 선택 방법에 대해 자세히 알아보세요
- Elastic Inference API에 대해 자세히 알아보세요
- Elasticsearch에서 Cohere를 사용하는 방법은 Python 노트북을 확인하세요