리트리버
리트리버 (Retrievers)
리트리버(Retriever)는 Document Store 안의 모든 문서를 훑어 사용자 쿼리와 잘 맞는 문서를 골라내는 컴포넌트예요. 대부분의 검색 시스템을 이루는 기본 조각이면서, RAG 파이프라인의 검색 부분을 책임지고 있어요. 쿼리와 문서 사이의 유사도를 어떻게 계산하느냐에 따라 키워드 기반(희소)과 임베딩 기반(밀집), 그리곤 이 둘을 결합한 방식으로 나뉘어요.
출처: 공식문서
리트리버는 어떻게 동작하나요?
리트리버는 대부분의 검색 시스템의 기본 컴포넌트예요. 검색 증강 생성(RAG) 파이프라인의 검색 부분에 쓰이고, 문서 검색 파이프라인의 핵심이며, 추출적 질의응답 파이프라인에서는 Reader와 짝을 이뤄요.
쿼리가 주어지면 리트리버는 Document Store의 문서를 훑으면서 각 문서에 쿼리와 얼마나 관련 있는지를 나타내는 점수를 매기고 상위 후보를 돌려줘요. 선택된 문서는 파이프라인의 다음 컴포넌트로 전달되거나 쿼리에 대한 답변으로 반환돼요.
중요한 점은, 밀집 임베딩 기반의 대부분의 리트리버는 각 문서를 쿼리와 직접 비교하는 대신 근사 기법을 써서 거의 같은 결과를 더 나은 성능으로 얻는다는 거예요.
리트리버의 종류
쿼리와 문서 사이의 유사도를 어떻게 계산하느냐에 따라 리트리버는 희소 키워드 기반, 밀집 임베딩 기반, 희소 임베딩 기반으로 나눌 수 있어요. 여러 Document Store는 서로 다른 종류의 리트리버와 함께 쓸 수 있어요.
희소 키워드 기반 리트리버 (Sparse Keyword-Based)
희소 키워드 기반 리트리버는 BM25 알고리즘 또는 유사한 알고리즘을 이용해 문서와 쿼리 사이에 공유된 키워드를 찾아요. 이 알고리즘은 문서와 쿼리 사이의 가중치가 적용된 단어 중복(weighted word overlap)을 계산해요.
주요 특징:
- 단순하지만 효과적이고, 학습이 필요 없으며, 기본 설정만으로도 꽤 잘 동작해요
- 어떤 언어에서도 동작할 수 있어요
- 단어 순서나 문법을 고려하지 않아요
- 어휘에 없는 단어(out-of-vocabulary)를 처리하지 못해요
- 정확한 단어 표현(wording)이 중요한 사용 사례에 좋아요
- 동의어나 의미가 비슷한 단어는 처리하지 못해요
밀집 임베딩 기반 리트리버 (Dense Embedding-Based)
밀집 임베딩 기반 리트리버는 단어의 의미를 담은 벡터 표현인 임베딩으로 동작해요. 밀집 리트리버는 먼저 임베더가 필요해서 문서와 쿼리를 벡터로 바꿔준 뒤, 쿼리와 Document Store의 각 문서 사이의 벡터 유사도를 계산해 가장 관련 있는 문서를 가져와요.
주요 특징:
- 강력하지만 희소 리트리버보다 계산 비용이 더 비싸요
- 레이블이 달린 데이터셋으로 학습돼요
- 언어에 특화되어 있어, 훈련에 쓰인 데이터셋의 언어에서만 동작해요. 다만 다국어 임베딩 모델도 제공돼요.
- 임베딩으로 동작하기 때문에 단어 순서와 문법을 고려해요
- 어휘에 없는 단어를 어느 정도 처리할 수 있어요
희소 임베딩 기반 리트리버 (Sparse Embedding-Based)
이 범주에는 SPLADE 같은 접근법이 포함돼요. 이런 기법들은 특정 임베딩 모델을 사용해 키워드 기반과 밀집 임베딩 리트리버의 장점을 결합해요.
특히 SPLADE는 BERT 같은 언어 모델을 이용해 쿼리에서 여러 용어의 관련성을 가중하고 자동 용어 확장을 수행해서, 어휘 불일치 문제(쿼리와 관련 문서가 자주 용어 겹침이 없다는 문제)를 줄여요.
주요 특징:
- 정확한 키워드 매칭에서는 밀집 임베딩 리트리버보다 나아요
- 의미 매칭에서는 BM25보다 나아요
- BM25보다 느려요
- BM25와 밀집 임베딩에 비해 여전히 실험적이에요 — 일부 Document Store가 일부 모델만 지원해요
필터 리트리버 (Filter Retriever)
FilterRetriever는 모든 Document Store와 함께 쓸 수 있는 특별한 리트리버로, 주어진 필터와 일치하는 모든 문서를 검색해요.
자세한 내용은 이 리트리버의 문서 페이지를 읽어 보세요.
고급 리트리버 기법
리트리버 결합하기
한 파이프라인에서 서로 다른 종류의 리트리버를 사용해 각자의 장점을 살리고 약점을 보완할 수 있어요. 가장 흔한 두 전략은 희소와 밀집 리트리버를 결합하는 것(하이브리드 검색)과, 서로 다른 모델을 쓰는 밀집 리트리버 두 개를 사용하는 것(멀티 임베딩 검색)이에요.
하이브리드 검색 (Hybrid Retrieval)
한 파이프라인에서 희소와 밀집 리트리버를 함께 사용하면 각자의 장점을 살려 다양한 종류의 쿼리와 문서에 더 탄력적으로 대응할 수 있어요. 두 리트리버가 후보 문서를 가져오면 그것들을 결합해 최종 랭킹을 만들고 상위 문서를 결과로 얻어요.
이 접근법의 예시는 DocumentJoiner 문서에서 볼 수 있어요.
메타데이터 필터링
하이브리드 검색 이야기에서 일부 데이터베이스 제공자는 밀집 임베딩 검색에 대한 _메타데이터 필터링_을 뜻하기도 해요. 이는 서로 다른 리트리버를 결합하는 것과는 다르지만, 보통 Haystack 리트리버가 지원해요. 자세한 내용은 메타데이터 필터링 페이지를 확인하세요.
하이브리드 리트리버
일부 Document Store는 데이터베이스 쪽에서 하이브리드 검색을 제공해요. 일반적으로 이런 솔루션은 성능이 좋지만 커스터마이징 옵션(예: 서로 다른 검색 기법의 결과를 병합하는 방법)이 적어요. Haystack에는
QdrantHybridRetriever같은 하이브리드 리트리버가 일부 있어요. 선호하는 Document Store에 하이브리드 리트리버가 없거나 동작을 더 커스터마이징하고 싶다면 하이브리드 검색 파이프라인 튜토리얼을 확인해 보세요.
멀티 리트리버 (Multi-Retriever)
MultiRetriever는 여러 텍스트 리트리버를 하나의 컴포넌트로 묶어 병렬 실행하고 결과를 중복 제거해요. 파이프라인에서 개별 리트리버를 연결하는 것과 달리, MultiRetriever는 모든 검색 전략을 하나의 컴포넌트에 캡슐화하고 active_retrievers 파라미터로 런타임에 특정 리트리버를 켜고 끌 수 있게 해 줘요.
TextEmbeddingRetriever를 사용해 임베딩 기반 리트리버를 감싸면 MultiRetriever 안에서 쓸 수 있어요.
실험적 기능
MultiRetriever는 실험적이라 사전 지원 중단 공지 없이 버전에 따라 변경되거나 제거될 수 있어요.
멀티 쿼리 검색 (Multi-Query Retrieval)
멀티 쿼리 검색은 단일 사용자 쿼리를 의미상 비슷한 여러 쿼리로 확장해 재현율(recall)을 높여요. 각 쿼리 변형은 사용자 의도의 다른 측면을 포착하고, 다른 용어를 쓰는 문서와도 매칭될 수 있어요.
이 접근법은 텍스트 기반과 임베딩 기반 리트리버 모두에서 동작해요:
MultiQueryTextRetriever: 텍스트 기반 리트리버(예: BM25)를 감싸고 여러 쿼리를 병렬 실행해요.MultiQueryEmbeddingRetriever: 임베딩 기반 리트리버를 감싸고 여러 쿼리를 병렬 실행해요.
쿼리 변형을 만들려면 원본 쿼리에서 의미상 비슷한 쿼리를 생성하는 QueryExpander 컴포넌트를 사용해요.
멀티 임베딩 검색 (Multi-Embedding Retrieval)
이 전략에서는 각각 다른 모델을 쓰는 임베딩 기반 리트리버 두 개로 같은 문서를 임베딩해요. 그러면 문서 하나에 여러 임베딩이 생기게 돼요. 멀티모달 검색이 필요할 때도 유용해요.
리트리버와 Document Store
리트리버는 Document Store와 밀접하게 연결돼 있어요. 대부분의 Document Store는 희소 또는 밀집 리트리버 중 하나, 혹은 두 종류를 함께 지원해요. 특정 Document Store가 어떤 리트리버를 지원하는지는 해당 문서의 문서를 확인하세요.
이름 규칙 (Naming Conventions)
Haystack에서 리트리버 이름은 다음으로 이뤄져요:
- Document Store 이름 +
- 검색 방법 +
_Retriever.
실용적인 예시:
ElasticsearchBM25Retriever: BM25는 희소 키워드 기반 검색 기법이고, 이 리트리버는ElasticsearchDocumentStore와 함께 동작해요.ElasticsearchEmbeddingRetriever: 별도 언급이 없으면 Embedding은 Dense Embedding을 뜻하며, 이 리트리버는ElasticsearchDocumentStore와 함께 동작해요.QdrantSparseEmbeddingRetriever: Sparse Embedding이 기법이고, 이 리트리버는QdrantDocumentStore와 함께 동작해요.
이 규칙을 지키려 하지만, 때로는 Document Store에 특화된 기능을 수용하기 위해 유연해야 할 때도 있어요. 예를 들어:
ChromaQueryTextRetriever: 이 리트리버는 Chroma의 쿼리 API를 사용하고 텍스트 입력을 기대해요.ChromaDocumentStore와 함께 동작해요.
FilterPolicy
FilterPolicy는 문서 검색 과정에서 필터가 어떻게 적용되는지를 결정해요. 리트리버 초기화 시 설정된 정적 필터와 런타임에 제공되는 동적 필터 사이의 상호작용을 제어해요. 가능한 값은 다음과 같아요.
- REPLACE (기본값): 런타임 필터가 초기화 필터를 완전히 덮어써요. 특정 쿼리가 필터링 범위를 동적으로 바꿀 수 있게 해 줘요.
- MERGE: 런타임 필터와 초기화 필터를 결합해 검색 결과 범위를 좁혀요.
FilterPolicy는 선택한 리트리버의 init 메서드에서 설정하고, filters는 init과 run 메서드 양쪽에서 모두 설정할 수 있어요.
리트리버 사용하기
파이프라인에서 리트리버를 초기화하고 사용하는 방법은 특정 리트리버의 문서를 참고하세요. Haystack에서 사용할 수 있는 리트리버는 다음과 같아요.
| 컴포넌트 | 설명 |
|---|---|
| AlloyDBEmbeddingRetriever | AlloyDB Document Store와 호환되는 임베딩 기반 리트리버예요. |
| AlloyDBKeywordRetriever | AlloyDB Document Store에서 쿼리와 일치하는 Document를 가져오는 키워드 기반 리트리버예요. |
| AmazonBedrockKnowledgeBaseRetriever | Amazon Bedrock Managed Knowledge Base에서 문서를 검색해요. |
| ArangoEmbeddingRetriever | ArangoDB Document Store와 호환되는 임베딩 기반 리트리버예요. |
| ArcadeDBEmbeddingRetriever | ArcadeDB Document Store와 호환되는 임베딩 기반 리트리버예요. |
| AstraEmbeddingRetriever | AstraDocumentStore와 호환되는 임베딩 기반 리트리버예요. |
| AutoMergingRetriever | 여러 관련 조각이 쿼리와 일치할 때 분할된 청크 대신 완전한 부모 문서를 검색해요. |
| AzureAISearchEmbeddingRetriever | Azure AI Search Document Store와 호환되는 임베딩 리트리버예요. |
| AzureAISearchBM25Retriever | Azure AI Search Document Store에서 쿼리와 일치하는 Document를 가져오는 키워드 기반 리트리버예요. |
| AzureAISearchHybridRetriever | Azure AI Search Document Store와 호환되는, 밀집·희소 임베딩 기반 리트리버예요. |
| ChromaEmbeddingRetriever | Chroma Document Store와 호환되는 임베딩 기반 리트리버예요. |
| ChromaQueryTextRetriever | Chroma 쿼리 API를 사용하는 Chroma Document Store와 호환되는 리트리버예요. |
| CogneeRetriever | CogneeMemoryStore에서 기억을 검색해 시스템 ChatMessage 객체로 반환해요. |
| ElasticsearchEmbeddingRetriever | Elasticsearch Document Store와 호환되는 임베딩 기반 리트리버예요. |
| ElasticsearchBM25Retriever | Elasticsearch Document Store에서 쿼리와 일치하는 Document를 가져오는 키워드 기반 리트리버예요. |
| ElasticsearchHybridRetriever | Elasticsearch Document Store에서 BM25와 임베딩 기반 검색을 결합하는 SuperComponent예요. |
| ElasticsearchSQLRetriever | Elasticsearch Document Store에 대해 원시 Elasticsearch SQL 쿼리를 실행하고 원시 JSON 응답을 반환해요. |
| FAISSEmbeddingRetriever | FAISSDocumentStore와 호환되는 임베딩 기반 리트리버예요. |
| FalkorDBCypherRetriever | FalkorDB Document Store에 대해 임의의 OpenCypher 쿼리를 실행하는 리트리버예요. |
| FalkorDBEmbeddingRetriever | FalkorDB Document Store와 호환되는 임베딩 기반 리트리버예요. |
| GoogleDriveRetriever | Drive API v3 검색 엔드포인트를 통해 Google Drive에서 파일을 검색해요. |
| InMemoryBM25Retriever | InMemoryDocumentStore와 호환되는 키워드 기반 리트리버예요. |
| InMemoryEmbeddingRetriever | InMemoryDocumentStore와 호환되는 임베딩 기반 리트리버예요. |
| FilterRetriever | 특정 필터와 일치하는 Document를 가져오기 위해 모든 Document Store와 함께 쓸 수 있는 특별한 리트리버예요. |
| Mem0MemoryRetriever | 메모리 증강 Agent·파이프라인 워크플로를 위해 Mem0에서 ChatMessage 기억을 검색해요. |
| MultiQueryEmbeddingRetriever | 임베딩 기반 리트리버로 여러 쿼리를 병렬 실행해 문서를 검색해요. |
| MultiQueryTextRetriever | 텍스트 기반 리트리버로 여러 쿼리를 병렬 실행해 문서를 검색해요. |
| MultiRetriever | 여러 텍스트 리트리버를 병렬 실행하고 중복 제거된 결과를 결합해요. 실험적 기능이에요. |
| MongoDBAtlasEmbeddingRetriever | MongoDB Atlas Document Store와 호환되는 임베딩 리트리버예요. |
| MongoDBAtlasFullTextRetriever | MongoDB Atlas Document Store와 호환되는 전체 텍스트 검색 리트리버예요. |
| MSSharePointRetriever | Microsoft Search(Graph) API를 통해 Microsoft SharePoint와 OneDrive에서 콘텐츠를 검색해요. |
| OpenSearchBM25Retriever | OpenSearch Document Store에서 쿼리와 일치하는 Document를 가져오는 키워드 기반 리트리버예요. |
| OpenSearchEmbeddingRetriever | OpenSearch Document Store와 호환되는 임베딩 기반 리트리버예요. |
| OpenSearchHybridRetriever | OpenSearch를 백엔드 Document Store로 사용해 하나의 컴포넌트에서 하이브리드 리트리버를 구현하는 SuperComponent예요. |
| OpenSearchMetadataRetriever | OpenSearch Document Store에 저장된 문서의 메타데이터 필드를 검색·랭킹하고 일치하는 메타데이터 값을 반환해요. |
| OpenSearchSQLRetriever | OpenSearch Document Store에 대해 원시 OpenSearch SQL 쿼리를 실행하고 원시 JSON 응답을 반환해요. |
| OracleEmbeddingRetriever | Oracle Document Store와 호환되는 임베딩 기반 리트리버예요. |
| OracleKeywordRetriever | Oracle Document Store에서 쿼리와 일치하는 Document를 가져오는 키워드 기반 리트리버예요. |
| PgvectorEmbeddingRetriever | Pgvector Document Store와 호환되는 임베딩 기반 리트리버예요. |
| PgvectorKeywordRetriever | Pgvector Document Store에서 쿼리와 일치하는 문서를 가져오는 키워드 기반 리트리버예요. |
| PineconeEmbeddingRetriever | Pinecone Document Store와 호환되는 임베딩 기반 리트리버예요. |
| QdrantEmbeddingRetriever | Qdrant Document Store와 호환되는 임베딩 기반 리트리버예요. |
| QdrantSparseEmbeddingRetriever | Qdrant Document Store와 호환되는 희소 임베딩 기반 리트리버예요. |
| QdrantHybridRetriever | Qdrant Document Store와 호환되는, 밀집·희소 임베딩 기반 리트리버예요. |
| SentenceWindowRetriever | 관련 문장 주변의 이웃 문장을 검색해 전체 맥락을 얻어요. |
| SnowflakeTableRetriever | Snowflake 데이터베이스에 연결해 SQL 쿼리를 실행해요. |
| SolrBM25Retriever | Solr Document Store에서 쿼리와 일치하는 Document를 가져오는 키워드 기반 리트리버예요. |
| SolrEmbeddingRetriever | Solr Document Store와 호환되는 임베딩 기반 리트리버예요. |
| SolrHybridRetriever | Apache Solr를 백엔드 Document Store로 사용해 하나의 컴포넌트에서 하이브리드 리트리버를 구현하는 SuperComponent예요. |
| SQLAlchemyTableRetriever | SQLAlchemy가 지원하는 모든 데이터베이스에 연결해 SQL 쿼리를 실행해요. |
| SupabaseGroongaBM25Retriever | PGroonga 검색을 사용해 SupabaseGroongaDocumentStore에서 문서를 가져오는 전체 텍스트 리트리버예요. |
| SupabasePgvectorEmbeddingRetriever | SupabasePgvectorDocumentStore와 호환되는 임베딩 기반 리트리버예요. |
| SupabasePgvectorKeywordRetriever | SupabasePgvectorDocumentStore에서 쿼리와 일치하는 문서를 가져오는 키워드 기반 리트리버예요. |
| TextEmbeddingRetriever | 텍스트 임베더로 임베딩 기반 리트리버를 감싸 텍스트 쿼리를 받는 단일 컴포넌트로 만들어 줘요. |
| ValkeyEmbeddingRetriever | Valkey Document Store와 호환되는 임베딩 리트리버예요. |
| VespaEmbeddingRetriever | Vespa Document Store와 호환되는 임베딩 기반 리트리버예요. |
| VespaKeywordRetriever | Vespa Document Store에서 쿼리와 일치하는 Document를 가져오는 키워드 기반 리트리버예요. |
| WeaviateBM25Retriever | Weaviate Document Store에서 쿼리와 일치하는 Document를 가져오는 키워드 기반 리트리버예요. |
| WeaviateEmbeddingRetriever | Weaviate Document Store와 호환되는 임베딩 리트리버예요. |
| WeaviateHybridRetriever | Weaviate Document Store에서 BM25 키워드 검색과 벡터 유사도를 결합해 문서를 가져와요. |