Haystack 中的 Retriever 是一个旨在高效地从大型数据集中获取与用户查询相关的文档或文本段落的组件。它充当问答或语义搜索等任务流程的第一步,将可能数百万的文档缩小到可管理的候选集以进行进一步处理。Haystack 中的 Retriever 通过使用优先考虑速度和相关性的算法,在文档存储(如 Elasticsearch 或 FAISS)中将查询与索引文档进行比较。其主要目标是平衡准确性与计算效率,确保下游组件(如用于答案提取的 Reader)接收到高质量的输入,且延迟不会过高。
Retriever 主要以两种模式运行:稀疏(sparse)和密集(dense)。稀疏型 Retriever,例如 BM25,依赖于关键词匹配和词频统计来对文档进行排序。例如,像“What causes climate change?”(气候变化的原因是什么?)这样的查询会触发 BM25 优先处理包含“气候”、“变化”和“原因”等术语的文档。密集型 Retriever,例如密集段落 Retriever (Dense Passage Retriever, DPR),使用神经网络将查询和文档都转换为向量嵌入(vector embeddings)。这些嵌入捕获语义意义,使得 Retriever 能够找到概念上相关的文档,即使它们不共享确切的关键词。例如,DPR 可能会检索讨论“温室气体排放”(greenhouse gas emissions)的段落,即使查询中没有明确提及这些词。为了利用这两种技术的优势,还支持结合稀疏和密集方法的混合(hybrid)方法。
在实践中,Haystack 的 Retriever API 抽象了这些方法的复杂性。开发人员通过将其链接到预先填充的文档存储(Document Store)并选择算法来配置 Retriever。例如,使用带有 Elasticsearch 的 BM25Retriever
涉及使用 Elasticsearch 的倒排索引对文档进行索引,而 EmbeddingRetriever
需要使用像 Sentence-BERT 这样的模型预先计算文档嵌入(document embeddings)。在搜索过程中,Retriever 处理查询,计算相关性得分(例如,BM25 的词频权重或向量之间的余弦相似度),并返回 top-k 结果。这种模块化设计允许开发人员试验不同的检索策略——例如从 BM25 切换到基于 Transformer 的模型——而无需彻底修改其整个流程,使其能够适应不同的准确性和性能需求。