让大语言模型先生成一个“假设的完美答案”,然后用这个答案去检索文档,而不是直接用问题去搜索。这在跨语种或语义鸿沟大时非常有效。
1. 预处理层:查询理解与增强
核心痛点:用户问题往往模糊、缺乏关键词,直接拿去检索效果很差。
查询改写:使用大语言模型将用户的口语化问题,改写为更适合检索的陈述句。
除去无关噪声,并补全省略的主语。
查询扩展:
针对关键词匹配,生成同义词。
假设性文档嵌入:让大语言模型先生成一个“假设的完美答案”,然后用这个答案去检索文档。这在跨语种或语义鸿沟大时非常有效。
复杂问题拆解:
对于“A和B有什么区别并如何配置”这类复杂问题,可拆解为“A的特征”、“B的特征”、“A与B配置方法”三个子查询并行检索。
2. 召回层:多路混合召回
核心痛点:语义检索懂意思但不懂专有名词;关键词检索懂精确匹配但不懂语义。必须两手抓。
建议采用“3路并行召回”策略:
稀疏检索:
技术:BM25 或 SPLADE。
作用:保证专有名词、型号、ID、报错代码的精确命中。
稠密检索:
技术:Embedding 模型。
作用:捕捉语义相似度,解决“措辞不同但意思一样”的问题。
结构化过滤:
作用:在检索前先用SQL/DSL语句过滤时间范围、文档类型、权限等,大幅减少干扰噪声。
融合策略:
不要用简单的加权求和,推荐使用RRF倒数排名融合算法。它能平滑地合并来自不同源的排名结果。
3. 精排层:重排序 —— 提分的关键
核心痛点:召回回来的Top 100文档中,相关度可能是乱序的,且向量相似度不等于逻辑相关性。
这是提升精度最立竿见影的一步:使用交叉编码器模型。
原理:双编码器是分别计算查询和文档的向量;交叉编码器是把查询和文档拼在一起扔进模型算分,能感知微小的逻辑差异。
选型:推荐使用BGE-Reranker-v2或Cohere Rerank。
策略:从召回层拿Top 50-100个结果,用重排模型重新打分,只取Top 5-10给大语言模型。
ColBERT:如果你对延迟敏感,交叉编码器可能太慢。ColBERT是一种保留了令牌级交互的架构,比交叉编码器快,比纯向量准,是很好的折中方案。
4. 索引结构优化:父子索引
核心痛点:切片切太小,丢失上下文;切太大,语义被稀释,检索不准。
解决方案:小到大策略
索引时:将文档切成很小的块进行向量化存储,这样匹配非常精准。
召回时:匹配到小块后,不要直接返回这个小块,而是映射回它所属的父文档块或其前后窗口。
结果:检索用的是最精准的“针”,给大语言模型看的是包含完整上下文的“草垛”。
架构总结图示
图片

实施建议
基础版:BM25 + 向量检索 + RRF 融合。
进阶版:加入重排模型。这是性价比最高的一步,加上它通常能解决大部分“找得出来但排在后面”的问题。
高级版:引入假设性文档嵌入和查询改写环节,解决用户提问质量差的问题。
专家版:重构索引,使用父子文档索引。
如果你的场景涉及大量专业术语,BM25的权重应该调高;如果是日常闲聊或通用问答,向量检索的权重应调高。
