Retriever组件

张开发
2026/4/10 17:53:20 15 分钟阅读

分享文章

Retriever组件
一.定义Retriever 根据用户问题从外部知识库中“找出最相关内容”的组件二.在 RAG 里的位置一个标准 RAG 流程是这样的用户问题 ↓ Retriever检索相关文档 ↓ 相关 chunks上下文 ↓ LLM生成回答 所以Retriever 找资料LLM 用资料回答三.Retriever 到底做了什么从机制上讲它做三件事1. 把问题转成向量embedding用户输入“LangChain 是什么”会被转成一个向量2. 在向量库里找“最像的内容”比如在 vector store 里找cosine similarity 最近的几个 chunk3. 返回 top-k 结果比如最相关的 3 段文本 这些内容会被喂给 LLM四.在 LangChain 里的具体形式在 LangChain 里retriever 是一个统一接口。常见来源1. vectorstore 转换来的Retriever 对 VectorStore 的一层封装查询接口层比如vectorstore.as_retriever() 这是最常见的2. 自定义 retriever你也可以接数据库接搜索 API接知识图谱五. Retriever 可以做的不只是“查相似度”一个好的 retriever不只是 top-k similarity search还可以做1. 过滤filter按 metadata时间、作者等2. rerank重排序先粗查再精排3. query 改写把问题优化后再查4. multi-query一个问题拆成多个问题查 所以更准确的定义是Retriever 一套“检索策略”而不是一个简单函数docsretriever.invoke(什么是Transformer)核心问题拆成两个1️⃣ 是否调用大模型LLM2️⃣ 是否进行语义检索六、检索是否调用大模型LLM✅ 默认不会调用以最常见的情况为例retrievervectorstore.as_retriever()docsretriever.invoke(query)实际发生的是query → embedding → 向量相似度搜索 → 返回文档 这里没有 LLM 参与❗ 什么时候会调用 LLM只有在特定 Retriever中才会调用1MultiQueryRetrieverMultiQueryRetriever.from_llm(...) 流程query → LLM生成多个query → 检索 → 合并结果2ContextualCompressionRetriever检索后 → LLM压缩内容3SelfQueryRetrieverquery → LLM解析结构化查询 → 检索 总结Retriever 类型是否调用 LLMVectorStoreRetriever❌BM25Retriever❌MultiQueryRetriever✅SelfQueryRetriever✅CompressionRetriever✅七、retriever是否进行语义检索✅ 如果是向量检索retrievervectorstore.as_retriever() 是语义检索流程query ↓ embedding向量化 ↓ 向量相似度搜索cosine / dot ↓ 返回 top-k 文档❗ 如果是 BM25BM25Retriever.from_documents(...) ❌ 不是语义检索 ✅ 是关键词检索 对比总结Retriever是否语义检索是否用 embeddingVectorStoreRetriever✅✅BM25Retriever❌❌Hybrid Retriever✅ ❌混合

更多文章