答非所问通常不是模型理解能力差,而是检索阶段送进模型的片段里没有答案句,或者答案句正好被切成了半句。建议的处理顺序是:先在工作流绑定的那个知识库里用命中测试复现一次,分清楚是检索没召回,还是召回了但生成没用好;然后按分段长度、分段标识符、召回条数、相似度阈值的顺序排查,每次只改一个参数,用同一组问题前后对比。
同一问题、同一文档集下,如果命中测试里正确片段根本没出现,优先调分段与召回条数;如果正确片段排在前几条、回答仍然偏,应先看提示词和上下文拼接方式,不要继续加大召回条数。改动前把召回片段原文和分数留存下来,作为前后比对的基准。边界是:分段和召回只能改善“检索是否命中”,无法弥补文档本身没写这个信息。
在命中测试里复现一次答非所问
先找到入口:知识库详情页一般有「召回测试」或「命中测试」,输入问题就能看到本次召回的片段、相似度分数和来源文档。复现时要把变量固定住——同一个问题原文、同一个文档集、同一种检索模式、同一组 top_k 与阈值,不要在复现过程中顺手改文档或换问法。
记录召回片段原文的方式很简单:把每个片段的正文、分数、所属文档名和分段序号复制到一张表里,或者直接截图保存。判断分工也很直接:命中测试里正确片段出现了,问题多半在生成环节(提示词、上下文拼接、变量没传进去);正确片段始终不出现,就是检索环节,继续往下看分段和召回参数。
检查文档分段长度和分段标识符
这几个参数在知识库的「设置 → 分段设置」里,重新分段通常也在这里或单个文档的操作菜单中触发。需要看的字段是:分段长度(chunk size)、分段标识符(separator)、分段重叠(overlap)。如果召回片段的结尾是半句话、下一段开头正好接上,基本可以判断是分段把答案句切断了。
下面是一组按固定长度切分和按标题切分的前后对比,只作示意,实际片段以你页面上的召回结果为准:
# 改动前:按固定长度切
片段 3:……退款申请需在收货后 30 天内提交,超过该
片段 4:期限系统会自动关闭申请入口。另外……
# 改动后:分段标识符设为标题行
片段 3:## 退款时限
……退款申请需在收货后 30 天内提交,超过该期限系统会自动关闭申请入口。
按标题切分的好处是语义块完整,代价是片段长度不均。如果答案本身很短、散落在长段落里,可以适当缩小分段长度并保留一点重叠,让答案句不被边界截断。
提高召回条数和调整相似度阈值再测一次
分段调整完之后,再回到召回测试,把召回条数(top_k)从默认值往上调,比如从 3 调到 5 或 8,看正确片段是否进入结果;如果进了但分数偏低,再考虑下调相似度阈值,让边缘相关片段也能被带进来。检索模式如果支持向量、全文和混合,可以在同一问题下分别试一次,观察哪种模式能把关键词型和语义型问题都覆盖到。
关键是每次只改一个参数,并在表格里留一行记录,改动前后的召回片段原文都保留:
日期/序号 | 改动项 | 原值 → 新值 | 召回片段摘要 | 是否命中正确内容
1 | top_k | 3 → 5 | 片段 3、7 含答案句 | 命中
2 | 阈值 | 0.5 → 0.35 | 片段 2、3、7 | 命中,但多 1 条无关
把检索参数落到工作流节点并核对运行日志
知识库页面的命中测试只验证检索本身,工作流里实际用的是「知识库检索」节点,两处参数可能不一致。建议以页面实际字段为准,把节点配置对齐,下面只是一个通用骨架,字段名需要按你的版本替换:
# 通用接入骨架,字段名以页面实际为准
knowledge_retrieval:
dataset_ids: ["<知识库ID>"]
query_variable_selector: ["start", "query"]
retrieval_mode: "hybrid" # 或 semantic / keyword
top_k: 5
score_threshold: 0.35
score_threshold_enabled: true
运行一次工作流后,到运行历史里点开检索节点,核对三件事:输入的 query 是不是用户原问题、绑定的知识库是否和命中测试里一致、输出里的片段列表与分数是否和页面命中测试吻合。如果日志里召回的片段和页面测试差很多,先查节点是否绑了另一个知识库、变量是否为空,再查分段是否在调整后已重新生效。
用固定问题集做回归比对
改完参数只测一条问题,很容易只是碰巧答对。建议整理五到十条固定问题,覆盖不同类型,例如:定义类(某个概念是什么)、条件类(什么情况下触发)、时限或数字类、操作步骤类、对比类、例外情况类,以及一条知识库里根本没有答案的问题,用来验证模型是否会承认不知道。
每次调整参数后,把同一组问题重跑一遍,按下面的表记录:
问题 | 命中片段/文档 | 是否覆盖要点 | 是否引入无关片段 | 备注
Q1 定义类 | 文档A 片段3 | 是 | 否 | 改动前未命中
Q2 条件类 | 文档B 片段7 | 是 | 是 | top_k 调大后带入
Q3 无答案 | 无 | — | 是 | 回答应为不知道
比对时看两个信号:命中位置是否前移、要点覆盖是否变全。如果命中位置没变而回答变好,说明改动影响的是生成环节,检索参数不用继续加;如果无关片段明显增多,就把 top_k 或阈值回调一档。这样一轮一轮缩小范围,比一次改一堆参数更容易判断到底哪一步起了作用。