RAGFlow · 第 3 章:第四节 实验Similarity Threshold (相似度阈值)
系列导航
- 第 0 章 前言:为什么企业 AI 工程师必须掌握 RAGFlow
- 第 1 章:安装部署与基础配置**——从零跑通第一个 RAG Pipeline
- 第 2 章:RAGFlow RAGFlow 代码介绍
- 第 3 章:攻克企业复杂文档——理解 DeepDoc、Naive、MinerU 与 Docling 的区别
- 第一节 RAGFlow 配置参数全景图与实验结论
- 第二节 实验Chunk Method (解析方法与布局识别)
- 第三节 实验Chunk Token Num & Overlap (切片与重叠)
- 第四节 实验Similarity Threshold (相似度阈值)(本文)
- 第五节 实验Vector/Keyword Weight (混合搜索权重)
- 第六节 MinuerBridge安装配置与运行使用
- 第 4 章:理解 Agentic RAG 核心——定义与低代码实现
- 第 5 章:工作流编排——构建基于图(Graph)的 RAG
- 第 6 章:Deep Research 模板应用——部署自动拆解子问题的深度研究智能体
- 第 7 章:企业级扩展——API 接入与外部工具集成(MCP)
- 第 8 章:评估与复盘——从"玄学"到量化 RAG 性能指标评测
1. 官方定义与通俗理解
官方定义:用于过滤检索结果的最低分数线,通常基于向量相似度(余弦相似度等)。
通俗理解:这是知识库的 “拒载线”。
- 如果你的知识库里都是干货,阈值可以设低一点。
- 如果你的知识库里有很多杂质,或者你发现 AI 经常胡言乱语(幻觉),那就把阈值调高,宁可让它说“不知道”,也别让它“瞎胡说”。
2. 核心架构流转图 (Retrieval Filter)
下面的流程图展示了 RAGFlow 如何在检索过程中应用这个“漏斗”:
3. 关键代码位置证明
在 rag/nlp/search.py 的 retrieval 函数中:
- (Line 394):
req["similarity"] = similarity_threshold将参数传给底层的向量引擎(如 Infinity)。 - (Line 438-439):
post_threshold = 0.0 if vector_similarity_weight <= 0 else similarity_threshold处理了混合搜索下的阈值兼容性。 - (Line 440):
valid_idx = [int(i) for i in sorted_idx if sim_np[i] >= post_threshold]这里是最后的断头台,不达标的块直接被排除出valid_idx。
4. 实验测试方案:如何感受“水线”的高低?
本实验旨在观察阈值如何平衡 “召回率(Recall)” 和 “准确率(Precision)”。
这里使用贴近真实企业业务文档的火电厂知识库。
真实业务里的问题往往不是“完全相关”和“完全无关”的区别,而是:
召回内容都属于同一个业务领域,但有些内容属于运行处置,有些内容属于检修分析。
如果混在一起回答,就会造成职责边界不清。
A. 实验数据源准备
本实验使用一个火电厂业务知识库,知识库中包含两个文档:
- 运行侧文档:
火电厂机组运行规程与异常处置手册 - 检修侧文档:
火电厂设备检修维护与缺陷闭环管理规定
两个文档都包含“凝汽器真空下降”相关内容。
运行侧文档关注:
- 运行人员先检查什么;
- 是否需要降负荷;
- 循环水泵、真空泵、轴封压力、凝汽器水位等运行参数;
- 真空严重下降时禁止继续升负荷。
检修侧文档关注:
- 真空下降的检修原因分析;
- 真空系统漏空气;
- 凝汽器管束污染;
- 低压加热器泄漏;
- 氦检、灌水查漏、听音、肥皂水查漏等方法。
这里的“噪声数据”不是无关垃圾文档,而是 同领域、强相关、但回答场景不同的文档。
B. 参数对比设置
针对同一个问题进行测试:
凝汽器真空下降应该怎么处理?
这个问题故意没有限定:
- 是运行人员处理;
- 还是检修人员处理;
- 是事故初期处置;
- 还是后续查漏消缺。
因此,它可以很好地观察不同阈值下,系统是否会把运行处置和检修分析混在一起。
本次测试设置三组参数:
- 宽松组:
Similarity Threshold = 0.05 - 适中建议组:
Similarity Threshold = 0.30 - 极度严格组:
Similarity Threshold = 0.70
C. 测试结果与预期结论
1. 宽松组:Similarity Threshold = 0.05

测试现象:
系统能够召回运行侧内容,例如:
- 检查循环水泵运行状态;
- 检查循环水入口压力;
- 检查凝汽器循环水进出口温差;
- 检查真空泵运行状态;
- 检查轴封供汽压力;
- 检查凝汽器水位和热井水位;
- 必要时降低机组负荷;
- 严禁在真空严重下降时继续升负荷。
但同时也召回了检修侧内容,例如: - 真空系统漏空气;
- 凝汽器管束污染;
- 低压加热器泄漏;
- 氦检;
- 灌水查漏;
- 听音;
- 肥皂水查漏。
结论:0.05 能保证召回,但召回范围偏宽,容易把运行处置和检修分析混在一起。
这说明低阈值并不一定导致完全错误,但会增加弱相关内容进入上下文的概率。
2. 适中建议组:Similarity Threshold = 0.30

测试现象:
系统仍然能够召回运行侧核心内容,包括循环水泵、真空泵、轴封压力、凝汽器水位、低压缸排汽温度、降负荷等处置要求。
同时,系统也保留了部分检修侧原因分析,例如:
- 循环水流量不足;
- 真空系统漏空气;
- 凝汽器水位过高;
- 真空泵效率下降;
- 低压加热器泄漏;
- 凝汽器管束污染。
但是相比0.05,它没有继续展开氦检、灌水查漏、听音、肥皂水查漏等具体检修方法。
结论:0.30 能够保留主要相关内容,同时减少部分弱相关检修细节。
对于当前这组火电厂知识库来说,0.30 比 0.05 更收敛,也比 0.70 更稳定,可以作为较合适的初始基准值。
3. 极度严格组:Similarity Threshold = 0.70

测试现象:
系统返回:
没有找到
结论:
知识库中明明存在相关内容,但由于阈值设置过高,相关 chunk 没有通过过滤,最终导致系统无法召回答案。
这说明 Similarity Threshold 不是越高越好。
阈值过高会降低召回率,甚至出现:
文档中有答案,但系统说没找到。
D. 综合结论
本次测试结果可以总结为:
| 阈值 | 现象 | 结论 |
|---|---|---|
0.05 |
能召回较多内容,但运行处置和检修分析混在一起 | 召回充分,但边界偏宽 |
0.30 |
能召回核心内容,并减少部分检修细节 | 当前测试中较均衡 |
0.70 |
直接返回“没有找到” | 阈值过高,漏召回 |
因此,对于当前企业文档测试知识库:
Similarity Threshold = 0.30
是一个更合理的初始基准值。
5. 总结建议
Similarity Threshold 没有绝对通用的行业标准。
它会受到以下因素影响:
- embedding 模型;
- chunk size;
- chunk overlap;
- 是否启用混合检索;
- 是否启用 rerank;
- Top N 设置;
- 文档内容是否同质化;
- 用户问题是否明确;
- 业务是否允许误答。
因此,不建议直接套用固定值,而应该基于真实知识库和真实问题做小样本验证。
结合本次测试,可以采用下面的调参策略: - 初期调试:可以先设为
0.05左右,用来观察系统到底召回了哪些内容。 - 常规起点:建议从
0.20 - 0.30开始测试。 - 专业知识库:例如运行规程、检修规程、安全制度、API 文档,可以尝试
0.40 - 0.50。 - 不建议直接设置过高:例如
0.70,除非已经确认不会造成漏召回。
对于本次企业知识库,推荐初始值为:
Similarity Threshold = 0.30
后续可以按下面规则微调:
- 如果回答经常混入检修查漏、拆检、堵管等非当前场景内容,可以提高到
0.40 - 0.50。 - 如果经常出现“文档里有答案,但系统没找到”,应降低到
0.20 - 0.30。 - 如果只是调试召回范围,可以临时使用
0.05。 - 不建议盲目使用
0.70,因为它可能直接过滤掉真实相关内容。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)