检索 Retrieval
Retriever 只负责「给定查询字符串,返回 Node 列表」,不做 LLM 合成。QueryEngine 内部第一段就是 Retriever。把它单独拿出来,才能做混合检索、当 Agent 工具、或在 Workflow 的某一步里调用。
异步:await retriever.aretrieve(query)。分数含义取决于后端(余弦 / 内积 / 距离),不要跨向量库比较绝对值。
VectorIndexRetriever
与 as_retriever 等价的显式写法:
as_query_engine(similarity_top_k=...) 只是把这个参数传给内部 retriever。调试召回时,先固定 k,打印内容,再接到 synthesizer 上。
后处理:过滤与重排
官方查询文档里的后处理器示例:
生产上常用 reranker(交叉编码器)对 top-k 再排序。具体类名与安装包以当前 Node Postprocessor 文档为准,不要抄过期 import。
元数据过滤
摄入时写入的 metadata 可在查询时过滤(租户、年份、文件类型)。向量库不同,过滤语法略有差异,思想一致:先缩小候选,再算相似度。
字段名必须与摄入时一致。若当前版本的 MetadataFilters 参数有出入,以官方 Vector Store 集成页为准。
提升召回(与 RAG 通识同一套)
本站 RAG 讲这些手段的「为什么」;这里只映射到 API。Agent 自己决定检索词、多跳搜索,就是 Agentic RAG:把 retriever 或 query engine 做成 FunctionAgent 工具(见 查询引擎)。
只检索、自己生成
这条路便于单测(对 retrieve 断言),也便于接到 LangChain 或 CrewAI:它们拿到的是字符串工具结果,不必依赖 LlamaIndex 的 synthesizer。