向量存储检索器invoke()与getRelevantDocuments()的差异及适用场景
向量存储检索器invoke()与getRelevantDocuments()的差异及适用场景
核心差异
- 返回结果形式不同
getRelevantDocuments()直接返回原始文档对象数组,每个对象包含完整的文档内容、元数据(如来源、标签)等信息,是最纯粹的检索结果。invoke()默认返回格式化后的文档内容集合,部分实现会自动把文档内容拼接成字符串,或者标准化为更适合大模型输入的结构,省去手动处理的步骤。
- 接口定位与封装层级不同
getRelevantDocuments()是检索器的基础核心方法,只干一件事:从向量库中召回相关文档,没有额外加工逻辑。invoke()是LangChain统一的组件调用接口,属于上层封装,除了检索,还能集成查询重写、文档过滤等前置/后置逻辑,和LangChain的其他组件(比如大模型、链式流程)兼容性更好。
- 参数扩展性不同
getRelevantDocuments()大多只接受查询字符串,少数实现支持传入topK这类简单配置,扩展空间有限。invoke()可以接受复杂输入(比如包含查询文本、上下文信息、检索策略的对象),还能通过配置参数传递回调函数、检索规则等,适配更复杂的业务需求。
适用场景
- 优先用
getRelevantDocuments()的情况- 需要拿到原始文档数据,自己处理后续逻辑(比如自定义格式化、过滤特定元数据、统计文档信息)时。
- 调试阶段,要查看完整的检索结果细节,排查召回准确性问题时。
- 优先用
invoke()的情况- 构建LangChain链式流程时,要把检索器作为组件嵌入,和大模型、提示词模板无缝衔接(比如RetrievalQA链默认用invoke调用检索器)。
- 需要利用检索器的扩展能力,比如结合查询重写、文档自动过滤等逻辑时。
- 想遵循LangChain统一的组件调用风格,保持代码一致性时。
代码示例对比
const vectorStore = await PineconeStore.fromExistingIndex(embeddings, { pineconeIndex, }); const retriever = vectorStore.asRetriever(); // 获取原始文档对象,可直接访问内容和元数据 const rawDocuments = await retriever.getRelevantDocuments("How to make a cake?"); console.log(rawDocuments[0].pageContent); // 输出文档原文 console.log(rawDocuments[0].metadata); // 输出文档的元数据信息 // 获取格式化后的结果,可直接传入大模型使用 const processedDocuments = await retriever.invoke("How to make a cake?"); console.log(processedDocuments); // 已处理为适合大模型输入的格式
内容的提问来源于stack exchange,提问作者user3357926
相关产品推荐
相关产品推荐

