[控场AI]
· 11 分钟阅读· 5,864 字

驯服非确定性AI:Agentic系统加固的实战教训

驯服非确定性AI:Agentic系统加固的实战教训

Agentic AI的可靠运行靠工程化约束架构而非更巧妙的提示词,通过对漂移与幻觉两类失效分别施加硬化与挽具双重控制。

文章以Synthadoc开源维基引擎的内容健康维护工作流为案例,揭示Agentic AI系统的核心失效模式与应对策略。团队原设计的五步工作流在实践中暴露出五类问题:模型重写整个页面、保留错误的重复项、CLI提供者的工具调用泄露、规划笔记混入最终内容、以及默默删改日期等未授权编辑。作者将这些失效精确划分为两类——漂移(模型理解任务但判断失误)与幻觉(模型用自身知识替代任务),并指出二者需要不同的缓解措施。修复方案分为硬化与挽具工程两个层次:硬化控制模型产出什么,包括产物提取、草稿检测、枚举式提示词约束、问题数量阈值;挽具控制模型能影响什么,包括系统页面排除、人工门禁、快照回滚。核心论点是一切控制必须实现在代码中而非提示词中,因为提示词只是行为建议,模型有时会覆盖它。该模式可推广至编码工具、文档自动化、数据管道、财务报告等所有Agentic场景,风险越高对确定性边界保证的需求越强。

构建Agentic AI系统时,最令人头疼的往往不是那些戏剧性的幻觉错误,而是模型在"理解任务"之后,自作主张地"做得更好"。Synthadoc团队在开发内容健康维护工作流时,反复遭遇了这类问题。他们的经历揭示了一个关键原则:要驾驭非确定性的AI机器,靠的不是更巧妙的提示词,而是工程化的约束架构。

问题场景:当维基页面开始"增生"

Synthadoc是一个开源的AI原生维基引擎,其职责是将PDF、网页、转录文本等原始文档,通过LLM合成结构化的Markdown维基页面。随着时间推移,同一主题从多个来源被反复摄入,问题随之而来。

一个关于艾伦·图灵的页面,可能积累出十个## 布莱切利园与密码分析标题和八个## 早年生活与教育标题。页面在隔离状态下看似连贯,但结构上已支离破碎:内容重复、重点矛盾、部分章节因先有标题后补正文而显得单薄。

内容健康扫描器负责检测这些问题。它刻意采用纯Python启发式规则,不依赖LLM——通过确定性正则表达式识别重复章节、空章节、单薄章节、未闭合代码块等结构问题。这部分是可靠的。而接下来的环节——用LLM来修复问题——才是故事真正有趣的地方。

agentic workflow

Agentic AI(智能体式AI)与传统的单次问答式AI调用有本质区别。传统模式中,用户提问、模型回答,交互是一次性的、无状态的;而Agentic系统赋予模型自主规划、调用工具、读取外部资源并在多轮循环中迭代推进任务的能力。Synthadoc的内容健康工作流正是这一范式:LLM不仅生成文本,还要读取页面、理解结构问题、产出修改建议,并最终影响持久化状态。这种自主性带来了能力跃升,也带来了新的失效面——模型不再是"回答者",而是"行动者",它的每一次输出都可能直接改写真实数据。因此,Agentic系统的设计重心从"如何问得更好"转向"如何限制模型能影响什么",这正是本文反复强调的"边界"与"挽具"的由来。

五种失效模式:模型如何"好心办坏事"

团队原本设计了明确的五步工作流:加载页面与问题清单、发送给LLM处理、展示前后对比、等待用户批准、写入前做快照。每个环节都有其目的。然而实际运行结果,暴露了加固措施在多个维度的缺失。

失效一:模型重写了整个页面

首个问题立竿见影。一个关于开源运动的页面有十二个结构问题——三个重复章节和九个单薄章节。但返回的"修复后"内容与原文毫无结构相似性。原始标题## 理查德·斯托曼与GNU (1983)消失了,## 大教堂与集市 (1999)也不见了。取而代之的是## 历史框架与起源这样的全新标题。

内容本身事实合理,但这是用户从未要求、也无法安全批准的东西——原始版本与提议版本之间已失去所有可追溯性。模型实际上是用自己的预训练知识重新写了一个维基页面,把我们提供的页面当作粗略参考。提示词中的"修复"一词,被模型理解为重写的许可。

失效二:保留了错误的重复项

一个计算历史页面中,## 摩尔定律出现了三次。两个是约四十词的简短摘要,第三个是带四条脚注引用的详细段落。初始提示词说"保留首次出现"。模型忠实执行,保留了那个四十词的摘要,丢弃了带引用的版本。

技术上正确,实践中错误。规则精确但缺乏对真实目标的考量。

失效三:CLI提供者的工具调用泄露

Synthadoc支持多种LLM后端,其中之一是基于CLI的智能体工具(如opencode或Claude Code)。当内容健康工作流通过该提供者路由时,响应文本中包含了shell命令输出和内部工具调用痕迹。模型绕过了我们精心构造的上下文,直接读取了磁盘上的实际文件,其内部工具调用泄漏到了即将写入维基的响应文本中。

失效四:规划笔记被当作最终内容

某些运行中,提议内容里混入了### LISP (1958) - actually LISP is more third gen but...和### Introduction paragraph (existing)这样的行。这些是模型的内部规划笔记——未清理的草稿脚手架。在模态框中快速审阅差异的用户,很可能错过这些内容。

失效五:"纠正"日期而重命名标题

收紧提示词后,一次运行仍返回了细微违规。原标题是## 大教堂与集市 (1999),提议内容变成了## 大教堂与集市,年份被删除。模型"知道"这篇文章实际发表于1997年,于是默默"纠正"了它认为的用户错误。这是我们未授权的编辑判断。

LLM幻觉(Hallucination)在技术语境中通常指模型生成看似合理但事实错误的内容。但在Agentic场景下,幻觉的破坏性被放大:模型不只是"说错话",而是"做错事"。本文观察到的失效中,模型会用自己的预训练知识替代用户提供的真实数据——比如默默"纠正"《大教堂与集市》的出版年份、删除它认为过时的标题括号。这类行为的根源在于,语言模型的训练目标是最小化预测误差、产出下一个最可能的token,而非忠实执行指令。"修复"这个动词在模型的概率空间中天然倾向于"重写得更准确",模型无法像传统程序那样在"事实校验"处硬性中断。理解这一点是理解本文全部加固策略的前提:不能期望模型自我约束,只能在其输入输出边界设置外部控制。

失效模式图谱:漂移与幻觉

这些失效可精确归为两类。类别A——漂移:模型理解任务但应用了错误判断。类别B——幻觉:模型用自己的知识替代了任务本身。

区分至关重要。漂移意味着正确的流程在做出错误决策——"保留首次出现"而非"保留最完整版本"。幻觉意味着正确流程被完全替换——用权重生成页面,而非修复我们交给它的页面。两者的缓解措施截然不同。

非确定性(Non-determinism)是LLM输出与普通软件函数的关键区别。给定相同的输入和提示词,模型可能因为采样温度、提供者实现差异、上下文长度、内部推理循环等因素产生不同结果,甚至同一次会话中前后调用行为不一致。Synthadoc团队用"复合非确定性"描述CLI提供者的困境:API提供者是无状态的文本生成端点,行为相对可预测;而CLI智能体工具(如Claude Code)自身就是一个具有规划、工具调用、多步推理的Agentic系统,它的输出又经过一层自主决策。两层非确定性叠加,导致即便是精心构造的提示词也可能被内部推理循环冲刷。这解释了为何系统需要对CLI路径单独设置"六问题上限"——不是模型能力不足,而是控制链路过长,边际不可预测性累积超过了可驾驭的阈值。

双层加固:硬化与挽具工程

修复措施分为两个层次。硬化针对模型产出什么:更严格的提示词、输出解析、提供者特定防护。挽具工程针对模型能影响什么:人工门禁、回滚机制、范围排除。硬化降低坏输出的概率,挽具限制漏网输出的后果。两者缺一不可。

硬化手段

1. 产物提取作为输入边界。 引入_extract_md_from_response()预处理函数,剥离响应中第一个# H1标题之前的所有内容。CLI提供者的工具调用输出总是出现在实际内容之前。将首个H1作为清洁边界,可在不引入噪音的情况下恢复Markdown内容。这是输出接口处的边界强制:将模型的原始响应视为解析器的不可信输入。

2. 草稿检测作为输出后门禁。 添加_is_draft()正则,捕获不完整思考的语言标记:TODO、FIXME、Expand to、Hmm,、Wait,、I'll、Let me等。如有匹配,提议内容被标记,页面自动跳过并在UI中给出明确解释。这是确定性检查,模型无法通过重新措辞来禁用它。

3. 外科手术式提示词约束。 将"修复下面列出的结构问题"替换为显式约束层级。绝对规则包括:精确保留每个现有章节标题(包括括号中的日期年份)、精确保留章节顺序、禁止新增顶层或二级章节、禁止重命名合并拆分或重排任何章节。允许的更改仅有:重复章节保留最完整版本并原样放置,单薄/空章节在现有标题下添加事实性叙述。

将"修复问题"改为"允许的更改"是刻意为之。当权限被枚举而非禁止被列举时,模型无法合理化自己的行为。

4. 问题数量阈值。 即便收紧了提示词,CLI提供者运行中超过六个问题的页面仍会产生幻觉新章节。CLI提供者本身就是一个具有自己推理循环的智能体工具,复合非确定性(我们的模型+其内部模型)会淹没长问题列表。团队对CLI路径设置了六个问题的硬跳过,API提供者则走独立代码路径无此限制。

挽具工程

5. 系统页面排除。 index和dashboard这类页面上的单薄章节被扫描器正确识别,但它们是导航页面而非内容页面。使用现有的SYSTEM_PAGE_SLUGS常量将其排除在修复循环之外,避免重复定义和魔法字符串。

6. 人工门禁作为结构性要求。 每个提议的修复必须通过前后对比审查。这不是功能,而是架构保证:没有自动流程可以在未经明确同意的情况下破坏维基内容。确认卡片显示页面slug、问题摘要、原始内容前2000字符、提议内容前2000字符,以及批准/跳过按钮和五分钟超时自动拒绝。代码块的可滚动性是必须解决的UX问题——理论上存在但实际不可用的门禁,不算门禁。

7. 快照与回滚作为安全网。 在写入任何已批准的修复前,snapshot_if_changed()会取原始内容的版本化副本。如果批准的结果事后发现有问题,用户可以按名称请求回滚。这不是从系统故障中恢复,而是一等公民的工作流功能,承认模型可能产生在审查中未被发现的微妙错误。

防御性编程(Defensive Programming)是本文加固思想的工程学根源。在传统软件中,这一原则意味着不要信任任何外部输入——用户输入、网络响应、第三方API返回值都应在使用前验证。Synthadoc将其迁移到LLM输出上:模型的响应被当作"不可信输入"对待,由解析器、正则门禁、结构校验层层过滤后才进入写入路径。_extract_md_from_response()剥离首个H1之前的内容,_is_draft()检测草稿语言,都是典型的输入净化手段。更深一层,"枚举允许而非枚举禁止"对应安全工程中的最小权限原则(Principle of Least Privilege):与其告诉模型不要做哪些事(禁止列表可以无限长,且模型会合理化例外),不如只告诉它能做哪些事(动作空间收窄到可枚举)。这套思路使Agentic系统的安全模型从"信任但验证"转为"默认不信任、逐层放行"。

核心原则:架构而非文字

所有修复遵循一致模式:每项控制——无论是硬化模型输出还是约束其周围的挽具——都在代码中实现,而非在文字中。

系统提示中的"不要幻觉"只是行为建议。模型会考虑它,权衡其他压力,有时会覆盖它。这不是缺陷,这就是语言模型的工作方式。Token预测过程没有"这将是幻觉"的硬停止。

团队构建的控制矩阵如下:硬化层包括_extract_md_from_response()(运行于原始响应字节)、_is_draft()正则(确定性匹配,不在模型循环中)、允许更改提示词(收窄动作空间)、问题数量上限(硬编码门禁,模型根本看不到页面);挽具层包括系统页面排除(常量slug查找,不在提示词中)、前后对比人工门禁(无写入路径可绕过)、快照/回滚(在应用修复前写入)。

这些控制形成层次。逃避提示词约束的修复会被草稿检测器或人工门禁捕获。通过人工门禁的修复可以被回滚。没有单一层次足够,但层次叠加起来就足够了。

超越维基维护的普适意义

错误更新维基页面是可恢复的错误。但观察到的失效模式——模型用自己的知识替代任务、内部工具调用泄露到输出、默默"纠正"它认为错误的数据——并非领域特定。

同样的模式出现在:Agentic编码工具重构用户未要求触碰的代码;文档自动化系统"改进"超出批准范围的法律条款;数据管道中LLM用世界知识而非提供的模式规范化值;财务报告生成器外推源数据中不存在的数字。

在每种情况下,未加固的Agentic行为的后果随领域风险而放大。个人维基中的幻觉章节可恢复,财务披露中的幻觉数字则不可。

加固的论点不是模型不好。而是模型是非确定性的,而生产系统需要在AI输出与持久状态交汇的边界处提供确定性保证。

可落地的实践清单

如果你正在构建读取和修改持久数据的Agentic系统,考虑以下最低要求:

边界强制。 在每次交接时将模型输出视为不可信输入。解析它、验证它、在到达下一步前剥离不属于此的内容。

确定性输出后门禁。 添加在模型响应后运行、不受模型行为影响的验证逻辑。草稿检测、模式验证、输出格式检查。这些是确定性的,模型无法绕过。

枚举权限优于枚举禁止。 在提示词中告诉模型允许做什么,而不仅仅是要避免什么。允许动作的范围比开放式任务加例外列表更容易推理。

承认提供者异质性。 并非所有"模型"配置行为相同。基于CLI的智能体提供者和无状态API完成端点具有根本不同的行为属性。相应地设计加固层,或约束哪些提供者可以触及哪些操作。

人工门禁作为结构性要求。 对于任何修改持久状态的工作流,人工审查步骤不是UX装饰,而是控制手段。让它可用。如果审查UI无法显示完整差异,门禁就没有按预期运作。

可逆性作为一等设计约束。 快照和回滚应从开始就设计进去,而非在第一次生产事故后追加。假设模型有时会产生通过审查的微妙错误结果,并相应设计恢复路径。

结语

Synthadoc的内容健康维护工作流经历了多次迭代才表现可预测。每次迭代都针对特定失效模式,而非重新措辞提示词。最终团队信任这个工作流——不是因为模型完美,而是因为系统被设计来捕获和遏制错误。

非确定性机器可以被驾驭。但驾驭靠的是工程,不是提示词。

#Agentic AI#AI系统加固#非确定性AI#LLM工程化#AI工作流#提示词约束#人工门禁#AI安全架构
分享:

相关推荐