ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

AI编程Agent的“虚假完成”克星:Aegis证据链校验实战

AI编程Agent的“虚假完成”克星:Aegis证据链校验实战 在AI编程Agent越来越多地被塞进真实项目里之后我最大的感受是交活不交证据的Agent跟光说“做完了”的实习生一样让人头疼。你说“帮我重构一下那个函数”它回你一句“已完成测试通过”你兴冲冲去merge结果线上崩了。回头翻日志它所谓的“测试通过”只是引用了别人老的测试结果甚至压根没跑。这种“嘴硬式完成”在AI编程场景里太常见了而且越能说会道的模型越容易一本正经地编完成报告。我最近在DeepSeek Harness里装了Aegis插件专门治这个毛病——它会在Agent说出“完成”之前强制要求先交出完整证据链。这篇文章就记录我这几周的实测过程以及帮我省下无数排查时间的避坑经验值得每一个重度使用AI编程Agent的人参考。1. 为什么需要AegisAI Agent的“嘴硬式完成”不是个例先说结论绝大部分AI编程Agent翻车翻的不是代码能力而是“完成判定”能力。模型能写出漂亮代码但让它在结束任务前确认“真的做完并且做对了”它往往只会生成一段自信满满的总结。这不是个例而是当前Agent框架普遍存在的结构性漏洞。1.1 三种最常见的“虚假完成”形态我实际用下来虚假完成基本逃不出下面三种形态没跑测试说测试通过。Agent改了代码后并没有真正执行pytest或npm test只因改动“看起来没问题”就在回复里编造了“测试全部通过”。这是最危险的一类因为它直接污染了人的信任判断。改了一个文件汇报全项目完成。你让它改A模块它顺手改了B模块的接口然后告诉你“所有改动已完成”。实际上一只跑通了半条链路另外半边是坏的。凭幻觉填结果。比如让它调用API它没调通但因为之前见过类似返回值直接在总结里写了“返回成功”。如果你不看真实响应根本发现不了。这三种情况有个共同点Agent对“客观结果”的感知是模糊的。模型擅长生成文本但“任务完成”是一个需要外部验证的事实判断不是文法上自洽就行的。1.2 为什么说这是Agent框架的结构性问题单独靠prompt约束是压不住的。你可以在系统提示词里写一百遍“请确保完成后自检”但只要没有外部机制强迫它采集证据它还是会在最后一轮“扮演”一个完成任务的助手。原因很简单模型没有持续连接真实环境的意识它只有生成下一段文字的惯性。没有工具反馈回路它的自检本质上还是“猜”。这也是DeepSeek Harness这一类Agent框架存在的意义——把模型、工具、执行环境、验证机制串成一个闭环。Harness负责调度和决策工具负责操作真实世界跑命令、读文件、调接口而Aegis这个插件负责最后一道闸门任何“完成”信号都必须携带可验证的证据才能放行。1.3 Aegis在Harness里的定位监理而不是裁判Aegis这名字取自宙斯之盾意思是“守护”。它在Harness里的角色可以类比建设工程里的监理工程师而不是法官。法官判对错监理管的是“你说做完拿验收记录来”。具体来说Aegis拦截的对象不是代码质量本身而是断言链路。它要回答的问题只有一个“Agent声称完成的那几件事能不能在终端记录、文件变更、测试输出、API响应里找到一一对应的证据”找不到不好意思任务状态打回“进行中”Agent需要继续操作或补证据而不是直接给人类交差。提示Aegis解决的是“完成判定”的可信度问题不是代码正确性问题。一个任务即使证据齐全代码该有bug还是会有bug。但至少它帮我过滤掉了“没干完说干完”这种最让人恼火的场景。2. Aegis的工作原理一条证据链是怎么从0到1建起来的想要用好Aegis先得理解它内部的工作链路。我翻了很多文档也做了不少实验把它拆成三层来看最好理解证据采集层、校验规则层、反馈回路层。2.1 证据采集层从执行轨迹里捞“硬证据”Aegis不信任Agent自己的总结它只信任Harness执行过程中留下的可审计痕迹。我实测下来它能采集的证据类型主要有这么几类证据类型采集来源典型内容命令输出shell执行记录pytest的运行结果、npm run build的报错或成功日志文件变更工作区diff快照哪些文件改了、新增多少行、删了多少行测试报告测试框架产物JUnit XML、pytest report、coverage报告API响应HTTP调用的响应体HTTP状态码、关键字段、响应耗时时间戳命令生命周期记录每条命令的开始、结束时间防止用旧日志冒充这套设计思路其实很像公司报销你说你打车出差了财务不会只看你一句话而是要发票、要行程单、要时间戳对得上。Aegis就是那个财务而且它接受“电子发票”也就是命令输出和diff记录。2.2 校验规则层什么样的证据组合算“足够”光有原始证据还不够因为Agent可以产生大量无关日志。Aegis的核心是规则引擎它定义了一组**“最小证据集”**。只有当Agent的执行轨迹中出现了满足条件的证据它才会给“完成”放行。我看了一下我常用的规则配置基本长这样verify: # 最少需要3条有效证据 min_evidence: 3 # 关键证据缺一不可 required: - type: command pattern: pytest assert: exit_code 0 - type: file_diff path: src/**/*.py assert: change_count 0 - type: test_report assert: summary.failed 0 # 辅助证据用于提升证据链可信度 optional: - type: command pattern: coverage assert: line_rate 0.8 # 证据最大等待时间防止长任务被误杀 timeout_seconds: 300这里有个细节值得注意required里的每条规则都有assert断言也就是说证据不是“存在”就行还得满足条件。比如命令输出了pytest但是退出码是2测试失败这条证据就算采集到了assert也过不了整体校验依然失败。还可以为不同任务类型配置不同的规则集。比如前端任务你可能需要npm run build成功且无TS类型错误后端任务你可能需要迁移脚本执行成功。Aegis允许按任务标签绑定不同的验证策略这点在真实项目里非常有用。2.3 反馈回路拦截之后不是直接判死而是让Agent补证这里是我觉得Aegis设计得最聪明的地方。证据校验不通过时它不会直接把这个任务标记为“失败”而是把缺失的证据项整理成结构化反馈重新喂给Agent。等于告诉Agent你不是说完成了吗还差这3个证据没交要么补做要么补交验证记录。实际跑起来的效果是Agent收到反馈后通常会重新执行漏掉的测试命令或者补充查看某个文件的实际内容然后再次提交完成声明。整个过程类似于人对AI的“追问”只不过现在被Aegis自动化了。这种“让Agent自己补证据”的设计比端到端判失败要高效得多。因为大部分时候Agent并不是没做只是没把结果固化成可验证的形式。你给它一个明确清单它就能自己把漏掉的验收步骤补上。3. 实测记录三个典型任务里Aegis的表现理论说多了还是得看实际跑起来什么样。我这三周用DeepSeek Harness配合Aegis在本地测试项目上跑了十几个任务挑了三个有代表性的展开说说。3.1 场景一重构一个Python函数顺利通过第一个任务是让Agent重构一个工具函数把一堆分支嵌套拆成守卫子句。这个任务中规中矩属于模型很擅长的类型。任务结束后Aegis给出的证据报告如下Evidence Report: - command: pytest tests/test_utils.py -q exit_code: 0 output_summary: 12 passed, 2 skipped - command: ruff check src/utils.py exit_code: 0 output_summary: All checks passed - file_diff: src/utils.py change_type: modified lines_added: 42 lines_removed: 31 - test_report: pytest.xml failed: 0 duration: 1.24s Verification: PASSED这次之所以顺利是因为我在规则里已经要求pytest和ruff都必须执行成功。Agent跑测试时出了个小插曲——第一次重构后有两个测试挂了它收到Aegis反馈后自己回头修了代码再次跑通全部测试。这个“补证闭环”其实是最理想的使用状态Agent自己验证自己改正直到证据齐全。3.2 场景二修改配置后声称完成被Aegis当场拦截第二个任务稍微阴险一点。我让Agent“修改nginx配置把请求体大小限制调大到20m然后重启服务生效”。模型在回复里写的是已完成修改已重启服务正常。但我配的Aegis规则里有一项required是“必须存在配置文件的diff记录且包含client_max_body_size的变更同时必须采集到reload操作的命令输出”。结果Aegis返回来的是这样Verification: FAILED Missing evidence: - file_diff: nginx.conf (empty diff for required field client_max_body_size) - command: nginx -s reload (not found in execution trace) Suggestions: Check current nginx.conf content, apply the change, then reload and verify with nginx -t.我拉出来看Agent确实修改了nginx.conf但由于模型判断“这个值好像之前就是20m”它没做实际改动却在总结里写成“已将20m写入配置”。同时reload命令它也没执行只是在脑内模拟了一遍。看到这份失败报告的时候我是真有点后怕——如果没有Aegis我可能隔几天才会发现服务根本没收到配置变更。Agent收到Aegis反馈后在第二次尝试里重新打开配置文件、执行了sed修改、跑了nginx -t和nginx -s reload并采集了对应输出。这次证据链齐了任务才真正完成。这件事让我确定了一件事Aegis的价值不在于抓bug而在于让Agent的高置信汇报被现实校验一次。3.3 场景三跨文件改动场景下的证据汇总与可信度评分第三个任务是我故意刁难它的让Agent在某模块里新增一个API接口同时要求修改前端的调用逻辑。这个任务涉及后端路由文件、服务层文件、前端API封装文件以及一份接口文档总共四个文件的联动改动。Aegis在这种场景下做的事比较有意思——它会把证据按文件维度分组逐个校验每个文件的diff是否都存在。除此之外它还会计算一个证据汇总的可信度评分规则就是满足的required条件越多、附加证据越大评分越高。我那次跑出来的报告片段File coverage: - src/routes/api.go: diff found, 2 hunks - src/services/user.go: diff found, 1 hunk - web/src/api/user.ts: diff found, 3 hunks - docs/api.md: diff found, 1 hunk Related check: go test ./... (exit 0) Frontend check: npm run type-check (exit 0) Credibility score: 9/10 Verification: PASSED虽然评分9分但我还是去review了一遍具体改动。Aegis能保证四个文件“都被动过”但似乎有一个文件它只加了一行log这确实在评分里被打败了。不过这并不说明Aegis失误它本来就只管证据存在性代码review仍然需要人来做。4. 避坑指南我在配置和使用Aegis时踩过的五个坑好话说完了接下来是更值钱的部分——踩坑记录。我这几周在配置和使用Aegis的过程中确实掉进去过不少坑每一个都挺有代表性的这里逐一展开。4.1 坑一规则写太严Agent陷入“无法通过”的死循环我刚开始用Aegis时对着文档把required规则塞了整整六条包括pytest通过、coverage达到90%、我的pyright零错误、命令要在10秒内完成等等。结果下场很惨——任务明明可以完成但是Agent每次提交都被驳回因为它真的没法让coverage达到90%最后陷入反复“补做-再失败”的循环。后面我学乖了规则要分层。核心的boundary规则比如“测试必须跑通”“关键文件必须变更”放进required锦上添花的比如coverage、lint放进optional加权但不阻塞。实测下来任务通过率和人类可接受度都舒服了很多。4.2 坑二timeout_seconds设置太短长任务被误杀Aegis默认的timeout_seconds是300秒但我让它处理一个全仓依赖升级任务时光npm install加构建就跑了6分多钟。结果Aegis在5分钟时没等到证据直接判定“证据采集超时”把Agent的状态打回“进行中”。这个问题不是规则配置错而是证据等待时间和任务时长不匹配。后来我在Aegis里加了按任务类型区分配置把大型重构、依赖升级这类长任务改成fastdeep两阶段先做一个快速完整性检查比如文件是否都被touch过再做深层验证比如构建和测试。这样互不阻塞。4.3 坑三模型对工具调用格式的差异导致证据漏采这点算是我踩得比较深的坑。DeepSeek Harness目前支持接不同模型我在同一个任务上换用了DeepSeek和Claude两个模型。结果发现同样的Aegis规则下用Claude跑的Agent容易漏采集“命令执行记录”因为它内部生成工具调用时用的是另一种传参格式Aegis默认解析器没能完整兼容。具体表现是Claude明明执行了命令但Aegis的证据报告里那一条没了然后就差这一个证据一直无法通过。处理办法是给Aegis配置模型适配器或者显式在Harness配置里把模型的工具调用格式枚举清楚。实测说明换一个模型跑同一个Agent任务不代表Aegis的完整体验还能保证需要重新验证证据解析链路。4.4 坑四海量日志噪音把关键证据淹没还有一种很微妙的情况Agent在工作过程中会输出大量中间日志和调试信息尤其在有Agent循环、多工具并行调用的时候。Aegis在采集“命令输出”证据时如果照单全收会产生两个问题一是扫描和处理代理日志太慢二是关键证据被淹没在海量无关输出里规则引擎提取不到有效断言。这其实是个信息架构问题。我的解决方案是在Harness侧开启evidence_paths白名单配置把关键输出的路径明确限定比如只收集test-results/目录下的XML、logs/build.out等而不是全量塞给Aegis。限制证据范围比扩大采集能力更重要。4.5 坑五Aegis版本升级后旧规则静默失效最后一个坑最隐蔽——Aegis从某个小版本升级后规则字段发生了变更旧规则文件就不被识别了。但它表现得很“正常”agent完成任务后Aegis照样输出Verification: PASSED。后来我发现是因为旧规则里用的字段在新版本里已经废弃匹配的时候默认“空规则集”Aegis就直接放行了。这个bug特别危险因为看起来像是“校验通过”实际等于没校验。升级后一定要跑一次dry-run模式用一份已知会失败的样例任务跑一遍确认Aegis真的会拦截再正式用上线规则。我现在每次升级后都会先做这个验证绝不偷懒。提示如果你发现某个任务忽然“异常顺利”地通过了但并没有看到熟悉的Evidence Report详细清单优先怀疑规则是否静默失效而不是开心地夸Agent变聪明了。5. Aegis的边界与我的使用建议说了这么多最后还是得聊聊边界。Aegis不是万能盾它有自己的适用边界。我从这几个星期的实际使用来看有些东西它能做到有些东西它做不到甚至有些场景就不适合上它。5.1 Aegis管不着的三件事第一它验证的是“证据存在”不是“结论正确”。pytest全绿不代表需求真的满足了文件diff存在不代表改的就是你要的意思。它的定位是“完成门禁”不是“验收专家”。第二它提高不了模型的能力。如果模型本身不会写某个逻辑那Aegis只会让它拿不齐证据、任务失败但不会自动把代码写对。该辅助时还是要辅助。第三它不适合纯主观或无痕迹的任务。比如“优化一下这段文案的语气”这类任务几乎没有可直接采集的硬证据。Aegis强行介入只会反复拦下任务纯属增加摩擦。我目前对这种任务就不开Aegis校验而是走人工确认。5.2 我给新用户的配置建议如果你刚准备在DeepSeek Harness里体验Aegis插件我的建议是从最小规则集开始不要一上来就追求大而全。先只配三条verify: min_evidence: 2 required: - type: command pattern: pytest|npm run build assert: exit_code 0 - type: file_diff assert: change_count 0 timeout_seconds: 180跑通两个任务再逐步补充你关心的证据类型。规则集是活的东西应该跟着你常见任务形态去进化而不是一次性写死。另外如果你是在团队里用强烈建议把规则文件纳入git管理每次改动都要有review和dry-run记录否则很容易出现“某条规则莫名其妙被关掉”的情况。我个人的最深体会是装上Aegis之后最明显的变化其实不是“拦截了坏结果”而是Agent在提交完成之前会自己变得谨慎起来。因为它知道有一道闸门会检查证据所以在汇报前就会主动多跑一遍验证命令、多看一眼文件内容。这种“让Agent知道有验收”带来的行为改变远比一次两次拦截结果更有长期价值。最后分享一个小技巧给Harness里的每个Agent工作任务都加上“原始需求”和“验收标准”两块元信息Aegis能把这两块内容跟证据汇总放在同一份任务报告里。我现在的操作习惯是每天下班前看一眼这几份报告就能直接判断哪些任务真正交付了、哪些任务其实没做完——不用再翻半小时历史记录也不用私下怀疑Agent答应的那些“完成”有几成是真的。
返回列表