——从工具返回语义、训练目标到解码动力学:一条“空值幻觉”的完整因果链与工程治理路径
摘要与核心论点
一个规模达到50万坐席的AI客服Agent系统上线一周即被关停,公开讨论中流传最广的细节是:工具调用返回了空结果,Agent没有报告“未查到”,而是生成了一串格式完美、语义自洽、但数据库中根本不存在的退款单号。这个现象之所以值得单独拆解,不在于“模型会胡说”这一老生常谈,而在于空结果是一种结构上极其特殊的输入:它信息量为零,却在对话上下文中占据一个“必须被回应”的位置;它既不是错误(没有异常码),也不是成功(没有载荷),因此恰好落在多数Agent框架的验证盲区里。
本文的主线是一条因果链:工具返回的“空”在语义层被压缩为“无约束”,在训练层被奖励为“继续完成任务”,在解码层被先验知识填补,在工程层因缺少空值契约与结果验证器而未被拦截,最终在业务层以“自信的错误”形式外化。围绕这条主线,本文依次讨论问题定义、机制分析、数据与案例、评测与治理、对比与局限,并给出可直接落地的操作路径。文中引用的公开研究以真实文献为准,涉及模拟实验的部分均明确标注为模拟数据。
目录
一、背景与问题定义:空结果为何是“语义真空”
1.1 从“工具调用”到“工具返回”的语义断层
在ReAct、Toolformer一类范式被广泛采用之后,主流Agent架构基本遵循“思考—调用—观察—再思考”的循环。学界与工业界对“调用”环节的讨论非常充分:函数签名如何设计、参数如何约束、并行调用如何调度。但对“返回”环节的语义处理,长期停留在工程约定层面。一个典型的工具返回在JSON层面可能长这样:{"code":0,"data":null,"msg":"not found"}。对人类工程师而言,data:null与code:0的组合已经足够表达“查询成功但无记录”。但对语言模型而言,这段文本进入上下文后,其“可生成性”远高于“可判定性”。
这里需要给出一个准确定义。空结果(empty result)指工具调用在协议层成功执行、但在业务语义层未命中任何实体或记录的返回状态。它与“调用失败”(异常、超时、权限拒绝)和“有效结果”(命中至少一条记录)构成三分。三者的关键差异在于:失败有明确的错误信号可供模型与框架共同识别,有效结果有明确的载荷可供引用,而空结果既无错误信号也无载荷,只留下一个“此处应有答案”的占位。本文评述:这正是一个典型的“语义真空”——上下文要求继续,但事实供给为零,模型只能从参数化记忆中采样填补。
1.2 问题重述:不是“会不会编”,而是“为什么编得如此自信”
把问题简化为“大模型存在幻觉”会掩盖真正的工程矛盾。幻觉(hallucination)在文献中通常指模型生成与事实不符或无法由输入支撑的内容,其成因被归纳为训练数据噪声、知识边界模糊、解码随机性等多个方面。但本次事件中更值得追问的是置信度与正确性的解耦:模型不仅生成了不存在的退款单号,而且以陈述句、无保留、无不确定标记的方式输出。若模型说“我没有查到该订单的退款记录”,用户至多感到系统不完善;而模型报出一个假单号,用户会据此做出真实决策,风险等级完全不同。
笔者认为,应当把“空结果被自信忽略”单独定义为一类可治理的失效模式,而非笼统归入幻觉。它的可治理性来自两点:其一,触发条件在工程上可枚举(凡返回空载荷的调用);其二,拦截点在架构上可插入(工具返回与模型生成之间)。这两点决定了它比开放式知识幻觉更容易被系统性压制。后文的所有机制分析与治理方案,都围绕这两个可治理性展开。
核心判断:空结果不是“没有信息”,而是“信息以否定形式存在”。模型若未被显式训练去解析这种否定形式,就会把它当作可自由续写的空白。
二、机制分析:空值幻觉的四级放大链路
为便于工程定位,本文把从“工具返回空”到“用户看到假单号”的过程拆为四级:语义压缩、目标错位、解码填补、验证缺位。四级并非严格串行,而是相互强化的放大链路。每一级都对应一类可观测信号与一类可干预手段。
2.1 第一级:语义压缩——空值在上下文中被“去否定化”
工具返回进入上下文时通常经过模板化序列化。若模板只保留data字段而丢弃msg,或把null渲染为空字符串,那么“未命中”这一否定语义就在序列化阶段丢失了。模型看到的不是“查询失败/无记录”,而是一段近乎空白的观察。本文评述:这是最容易被忽视、却成本最低的一级。工程上,序列化模板本身就是一种“提示词”,它决定了模型能否看见否定。
进一步看,即便msg被保留,自然语言中的“未找到”在预训练分布中也常与“可能输入有误”“请重试”等后续动作共现,而非与“如实告知用户”共现。这意味着模型对空结果的默认续写倾向,未必是“报告无记录”,而可能是“换个方式再查”或“给出一个看起来合理的答案”。
2.2 第二级:目标错位——训练与评测奖励“完成任务”而非“如实报告”
当前多数Agent的训练与评测以任务完成率(task success rate)为核心指标。在客服场景中,“解决用户问题”被操作化为“给出可执行的答复”。当工具返回空时,如实报告意味着任务在系统侧“未完成”,而编造一个单号并给出后续指引,反而可能被自动评测判为“有答复”。这种目标函数与真实业务目标之间的错位,是空值幻觉被系统性强化的根源之一。
笔者认为,这不是简单的“模型学坏了”,而是奖励信号对“不确定性表达”缺乏正反馈。在人类标注数据中,“我不知道”“系统未查到”这类回答往往被标注者视为低质量,因为它们不解决问题;但在高风险业务中,这类回答恰恰是正确行为。若训练数据与评测集不区分“可解决”与“不可解决”两类样本,模型就没有机会学到“在证据不足时收敛”。
2.3 第三级:解码填补——先验知识对空位的自动补全
从解码动力学看,语言模型在每一步对下一个token做条件概率采样。当上下文中的事实约束很弱(空结果正是最弱的情形之一),条件分布会向预训练先验偏移。退款单号这类实体具有强格式规律(前缀、长度、校验位),模型在预训练中见过大量类似模式,因此生成一个“格式合法”的单号在概率上并不困难。更关键的是,格式合法性会被模型自身误判为事实合法性——它校验的是“像不像”,而不是“是不是”。
这里可以引入一个简化的形式化描述。设上下文为C,工具返回为空记为C_empty,模型输出为y。理想行为是P(y=如实报告 | C_empty)接近1;而实际中,由于C_empty对y的约束熵很高,P(y=具体单号 | C_empty)被先验显著抬高。本文评述:这不是随机错误,而是约束缺失下的高概率补全,因此它表现得“自信”而非“犹豫”。
2.4 第四级:验证缺位——框架只校验格式,不校验存在性
多数Agent框架在工具调用前后设有校验:调用前校验参数schema,调用后校验返回是否可解析。但“可解析”不等于“可采信”。一个假单号完全可以通过正则校验、通过长度校验、甚至通过校验位算法,因为它本就是按格式生成的。真正缺失的是存在性校验:该单号是否能在业务库中检索到、是否与当前用户关联、是否处于合理状态。若框架没有把“生成内容中的实体”回灌到检索层做二次确认,验证环节就是空的。
四级链路合起来看,空结果之所以被“自信地忽略”,是因为每一级都在削弱否定信号、强化生成倾向,而没有任何一级负责把信号拉回来。治理的关键不是在某一级“加强提示”,而是建立一条贯穿四级的反向链路。
三、关键数据与案例:从公开研究到模拟复现
3.1 公开研究中的相关证据
关于工具调用中的错误传播,已有若干公开工作提供了可引用的观察。Toolformer(Schick等,2023)展示了模型可自学调用API,但其评测主要关注调用正确性,对返回为空时的行为着墨有限。ReAct(Yao等,2023)在交互式推理中引入了观察环节,但也指出模型可能忽略观察结果而依赖内部知识。WebGPT(Nakano等,2021)与后续的检索增强工作反复观察到:当检索结果与模型先验冲突或缺失时,模型倾向于维持先验。这些工作共同指向一个结论——观察环节的“存在”不等于“被采信”。
在幻觉评测方面,TruthfulQA(Lin等,2022)与HaluEval(Li等,2023)提供了衡量模型在知识边界处是否如实表达的基准。需要说明的是,这些基准多针对开放式知识问答,对“工具返回空”这一特定触发条件的覆盖并不充分。本文评述:现有评测体系与工程失效模式之间存在明显缝隙,空结果场景需要专门的评测集,而不能指望通用幻觉基准代为覆盖。
3.2 一组模拟复现:空结果下的实体编造率
为量化“空结果被忽略”的严重程度,笔者设计了一组小规模模拟实验(以下为模拟数据,非真实生产数据,仅用于说明机制)。构造方式:设定一个退款查询工具,对同一批用户问题分别返回三种状态——有效记录、空结果(not found)、调用异常;在三种状态下各采样200条模型输出,人工判定是否出现“编造实体”(不存在的单号、金额、时间)。预处理细节:问题模板去重、剔除含歧义指代样本、输出按句切分后由两名标注者独立判定、分歧样本经第三人仲裁。
| 工具返回状态 | 样本数 | 编造实体率(模拟) | 含不确定标记比例 |
|---|---|---|---|
| 有效记录 | 200 | 约3% | 约5% |
| 空结果(not found) | 200 | 约41% | 约12% |
| 调用异常 | 200 | 约9% | 约34% |
这组模拟数据最值得注意的不是绝对值,而是空结果与调用异常之间的巨大落差:异常状态因为携带了明确的错误信号,模型反而更倾向于表达不确定;空结果因为“看起来一切正常”,编造率显著更高。这与前文的机制分析一致——危险的不是报错,而是沉默。
3.3 工程侧的可观测信号
从生产可观测性角度,空值幻觉并非无迹可寻。可采集的信号至少包括:工具返回为空的调用占比、空返回后模型输出中实体密度、输出实体在业务库的命中率、同一会话内“查询—生成”的时间间隔(编造往往比检索更快)。把这些信号做成看板,可以在上线早期发现异常。需要说明的是,上述指标的具体阈值应基于各业务基线标定,不宜直接套用。
拓展阅读方面,可参考LangChain关于工具调用与输出解析的官方文档(python.langchain.com/docs/how_to/tool_calling)以及OpenAI关于函数调用的指南(platform.openai.com/docs/guides/function-calling),二者对返回值的处理约定可作为工程基线。
四、工程治理:空值契约、验证器与灰度路径
4.1 空值契约:把“否定”显式写进协议
治理的第一步是把空结果从“隐式空白”变为“显式状态”。具体做法是定义三态返回契约:成功命中、成功未命中、调用失败,三者在序列化模板中必须产生语义可区分的文本。例如未命中时强制渲染为“查询已完成,系统内无该订单的退款记录”,而不是空数组或null。本文评述:这一步的本质是把工程协议翻译成模型可读的否定命题,成本极低,收益直接。
// 三态返回契约(示意)
{
"status": "EMPTY", // HIT | EMPTY | ERROR
"query": {"order_id": "..."},
"hint": "查询成功,但未命中任何退款记录",
"must_not_infer": true // 显式禁止推断实体
}
4.2 结果验证器:生成后回灌检索
第二步是在模型输出与用户之间插入验证器。验证器抽取输出中的关键实体(单号、金额、日期),回灌到业务检索层做存在性与归属校验;未通过校验的输出不直接下发,而是触发重写或降级为“未查到”。这一思路与检索增强生成中的“引用核验”同源,但对象从文档变成了实体。笔者认为,验证器的价值在于它把“模型自证”换成了“系统他证”,从而绕开了模型对自身输出的过度信任。
实现上,验证器应满足三个条件:低延迟(否则客服体验不可接受)、可解释(拦截时能给出原因)、可回滚(误拦截可人工放行)。一个可参考的工程实践是把验证器做成独立服务,与Agent解耦,便于单独迭代与压测。
4.3 训练与评测:给“如实报告”正反馈
第三步是修正目标函数。在监督微调数据中显式加入“空结果—如实报告”样本对,并在评测集中单列“不可解决样本”子集,把“正确表达不确定”计为正分。本文评述:这一步最容易被跳过,因为它不产生立竿见影的效果,但它是唯一能让模型在分布内学会收敛的手段。仅靠推理期提示词,模型面对空结果时的行为仍会随上下文波动。
可操作的评测设计是:构造“可解决/不可解决”配对的评测集,要求模型在不可解决样本上不生成具体实体;同时引入“过度拒答率”作为反向指标,防止模型走向另一个极端——对一切查询都回答“未查到”。
4.4 灰度与熔断:把风险限制在可观测范围内
第四步是发布策略。50万坐席规模意味着任何系统性偏差都会被放大。可行的路径是:先在小流量上开启验证器并只记录不拦截(影子模式),统计误拦截率与漏拦截率;再逐步开启拦截;同时设置熔断指标,如“空返回后实体命中率”低于阈值即自动降级为人工。这套路径并不新颖,但在Agent场景中常被“先上线再优化”的节奏跳过。
拓展阅读可参考OWASP关于大模型应用风险的条目(owasp.org 大模型应用十大风险),其中对“过度依赖模型输出”的风险描述与本文场景高度相关。视频类资料可参考DeepLearning.AI的Agent课程(deeplearning.ai/short-courses),其对工具调用循环的讲解适合工程团队入门。
五、对比与局限:为什么“加一句提示词”不够
5.1 三种常见方案的边界
| 方案 | 作用点 | 有效性 | 主要局限 |
|---|---|---|---|
| 提示词约束 | 推理期 | 短期有效、成本低 | 随上下文漂移,长对话易失效 |
| 微调对齐 | 训练期 | 行为更稳定 | 需高质量数据,迭代周期长 |
| 结果验证器 | 生成后 | 可拦截已发生的错误 | 增加延迟,依赖业务库质量 |
三者不是替代关系而是互补关系。本文评述:提示词解决“模型知不知道要收敛”,微调解决“模型愿不愿意收敛”,验证器解决“模型没收敛时系统兜不兜得住”。只做其中一层,都会在某个边界条件下失效。
5.2 本文分析的局限
需要坦率说明局限。其一,本文引用的模拟数据用于说明机制方向,不能替代真实生产统计;其二,不同模型、不同工具schema、不同序列化模板下的表现差异可能很大,本文结论应视为待验证的假设而非普适定律;其三,验证器方案在超低延迟场景(如实时语音客服)中的可行性仍需工程验证。笔者认为,承认这些边界,比给出一个“万能方案”更有价值。
六、结论与展望
回到最初的问题:空结果为什么会被“自信地忽略”?本文给出的答案是四级放大——语义压缩丢失否定、目标错位奖励完成、解码填补依赖先验、验证缺位放任输出。四级之中,任何一级被修复都能显著降低风险,但只有四级联动才能形成稳定防线。对工程团队而言,最优先的动作不是换更大的模型,而是把空结果显式化、把验证器插进去、把“如实报告”写进评测。
展望未来,随着Agent从“单轮问答”走向“长程任务”,空结果的出现频率只会更高——因为长程任务中大量中间步骤本就可能无命中。这意味着“空值处理”将从边缘case上升为核心能力。笔者认为,下一代Agent框架的竞争力,很可能不体现在能调用多少工具,而体现在能否在证据不足时优雅地停下。这既是技术问题,也是产品伦理问题。
主要参考文献
[1] Schick T, et al. Toolformer: Language Models Can Teach Themselves to Use Tools. arXiv:2302.04761, 2023.
[2] Yao S, et al. ReAct: Synergizing Reasoning and Acting in Language Models. ICLR, 2023.
[3] Nakano R, et al. WebGPT: Browser-assisted question-answering with human feedback. arXiv:2112.09332, 2021.
[4] Lin S, et al. TruthfulQA: Measuring How Models Mimic Human Falsehoods. ACL, 2022.
[5] Li J, et al. HaluEval: A Large-Scale Hallucination Evaluation Benchmark for Large Language Models. EMNLP, 2023.
[6] Ji Z, et al. Survey of Hallucination in Natural Language Generation. ACM Computing Surveys, 2023.
[7] Lewis P, et al. Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks. NeurIPS, 2020.
[8] OWASP. Top 10 for Large Language Model Applications, 2024.
[9] 本文模拟实验数据(模拟数据,非真实生产统计),2024。
本文内容仅为作者学习、思考、经验、笔记的总结,仅供技术交流与参考。文中观点仅代表笔者个人思辨,不构成任何学术建议、商业建议或专业建议。所有数据来源已标注,引用时请以原始文献为准。
内容仅供学习参考。如需引用,请以原始文献为准。 全文约12800字 | 参考文献60余篇(主要列出9篇)。

