学习笔记 · Obsidian

检索器:查询改写、时效与重排

LangChainTypeScript

结论

  • Retriever 的契约是 string → Document[],只负责返回文档,不要求能存储;Vector Store 可以转成 Retriever,但搜索服务、知识库和算法型检索器也能直接实现该接口。
  • HyDE、自查询、时间权重和 reranker 分别解决查询表达、结构化过滤、时间偏好和排序精度,不能用一个旋钮替代另一个。
  • /retrievers 与 /retrievers/index 是同正文别名;本组总计覆盖 10 个 retriever 路由和 2 个 compressor 路由。

检索器类型

类型集成核心语义
托管知识库Bedrock Knowledge Bases、Amazon Kendra由云服务负责索引/搜索,LangChain 统一结果
Web 搜索Exa、Perplexity实时网页检索并返回 Document
站点文档Sourcey读取 search-index.json 与 llms-full.txt
查询改写HyDE先生成假设答案,再 embedding 该文档检索
结构化自查询SAP HANA SelfQueryLLM 把自然语言转语义 query + metadata filter
时间感知TimeWeighted相似度加基于最近访问时间的衰减分数
二阶段重排Cohere、Mixedbread对候选文档按 query 重新排序/压缩

托管检索

  • AmazonKnowledgeBaseRetriever 面向 Bedrock 的端到端 RAG ingestion/index,向量后端可由 AWS 管理。所谓 self-host 只表示运行在自己的 AWS 账户,不能搬到其他云或本地。
  • AmazonKendraRetriever 查询 Kendra 的企业搜索索引,可覆盖文档、FAQ、知识库和网站。两者都应优先使用 IAM role/workload identity;访问范围由 AWS 资源策略决定,不由 prompt 决定。
  • ExaRetriever 使用 EXASEARCH_API_KEY,返回 Web Document;PerplexitySearchRetriever 支持结果数、国家、域名、时效和日期过滤,metadata 含 title、url、date、lastUpdated。

Web 结果必须保留 URL 和采集时间,按不可信证据处理;实时检索失败时明确降级,不应把模型旧知识伪装成已检索结果。

HyDE

HyDE 用 LLM 针对问题生成一篇“假设答案”,再把它 embedding 后与真实语料比较。它适合原始短查询与文档表达差异大时,但有额外模型成本并可能被生成偏差带离主题。

  • LLM 与 embedding model 都是必需依赖;自定义 prompt 只能有 {question} 输入。
  • 评估时应与原始 query embedding、multi-query 和 query expansion 对照。
  • 假设文档只作检索中间物,不当作事实或引用来源。

SAP HANA SelfQuery

SelfQueryRetriever 结合字段描述、内容描述、LLM 和 HanaTranslator,把“Which person is not active?” 之类问题转成向量查询与 metadata filter。为性能,文档示例把常用 metadata 建为 HANA 附加字段。

风险在于 LLM 生成结构化谓词:字段和操作符必须白名单,租户/权限 filter 必须由服务端强制合并,不能让模型覆盖。

TimeWeighted

文档给出的分数形式为:

(1 - decayRate) ^ hoursPassed + vectorRelevance

hoursPassed 是自上次访问以来的时间,不是自创建以来;频繁访问的对象会保持“新鲜”。decayRate 越低记忆越久,越高越偏向新近访问;精确为 0 或 1 时会退化,使时间不再有效。

该 retriever 需要维护访问 metadata,因此文档必须通过 retriever 的 addDocuments() 添加,而不是直接写底层 vector store。并发访问时要避免丢失 last-accessed 更新,并评估“热门内容越来越热门”的反馈回路。

Sourcey

SourceyRetriever 无 API key,从已发布站点读取 search-index.json,优先使用 llms-full.txt;缺失时回退抓取命中 HTML。站点应配置 canonical siteUrl,保证 metadata.source 可引用。索引与页面发布应原子切换,避免 search index 指向尚未部署的内容。

Cohere 与 Mixedbread 重排

  • CohereRerank.rerank() 返回输入文档 index 和 relevance score;compressDocuments() 返回 top-N Document,并把 score 写入 metadata。还可注入 CohereClient 连接 Azure、Bedrock 或独立 endpoint。
  • MixedbreadAIReranker.compressDocuments() 根据 query 返回重排后的文档;凭据可来自 MXBAI_API_KEY 或构造参数。

重排通常放在宽召回后:

query → first-stage retrieval (fetchK) → 权限过滤 → rerank → topN → prompt

先做权限过滤,避免把无权文档发给第三方 reranker。对候选数、正文长度、批量和超时设限;reranker 故障时可降级到首阶段排序,但必须打上降级指标。

评估与观测

  1. Retriever 评估 recall@k、MRR/nDCG、过滤正确率、时效和来源覆盖。
  2. Reranker 同时评估 top-N 增益、延迟、成本和候选截断损失。
  3. 记录 query strategy、filter、fetchK、topN、provider/model version 与降级状态。
  4. 为无结果、低分、超时和权限过滤后为空分别建指标,不把它们都归类为“RAG 没答案”。