
前阵子和一个做芯片验证的朋友聊起 AI 辅助开发他说了一句让我印象很深的话“AI 生成的 Verilog 代码跑通仿真不代表没问题真正怕的是它改动了某个信号没人知道它为什么改。”这句话放在普通业务代码上可能还能接受放到 RTL、放到硬件描述语言上问题就被放大了很多倍。因为硬件代码的仿真成本高、迭代周期长一个错误的信号连接可能要等到综合甚至流片前才能暴露。这也让我重新想明白了一件事代码 Agent 真正进入工程实践之后最紧缺的未必是生成能力而是过程记录。ORG2 这个项目名字我第一次看到时还没有太多感觉但它定位里有一句话很有意思——“给 20 多种代码 Agent 装上行车记录仪”。这个比喻很准确。行车记录仪的价值不在于让你开得更快而在于事故发生后你能回放当时的画面确认是谁、在什么时间、以什么依据做了某个操作。代码 Agent 也是同理。单次 Demo 跑得好不好看只能证明它在一条理想路径上能工作但它在大规模、长链路、多人协作的真实仓库里到底怎么决策、改了什么、有没有偏离上下文都需要一层“过程记录”来兜底。这篇文章我想从“行车记录仪”这个比喻出发聊聊为什么代码 Agent 需要过程观测这类工具通常怎么设计以及在 Verilog/RTL 开发和 Agent 审核代码这两个具体场景里它到底能帮我们做什么、不能做什么。1. 为什么代码 Agent 跑通 Demo 之后反而更需要“行车记录仪”1.1 Demo 阶段给人造成的假象比失败更危险现在做代码 Agent 的团队最常展示的能力是什么我观察下来大多数 Demo 都集中在“生成一段可运行代码”“修复一个 Issue”“根据需求写一个函数”“自动补全一个模块”。你输入提示词Agent 调用工具最后输出一段看起来很完整的代码。观众看到的是它能跑、结果合理、上下文理解得也还行。但 Demo 和真实项目之间隔着一条很深的沟。Demo 通常使用精心挑选的输入、干净清晰的上下文、单一任务、没有太多并发干扰。而真实项目里代码 Agent 要面对的是几千个文件的仓库、多个任务并发、工具调用失败、依赖版本冲突、上下文窗口不够、权限限制、无意义的提交信息、不完整的测试环境。你可以把一个 Agent 调得很好让它顺利通过一条路径但你很难用 Demo 证明它在所有不顺利的路径上都不会做错事。这就是过程记录的第一个价值它让你从“结果是否正确”扩展到“过程是否合理”。没有过程记录一个 Agent 只要最终生成了看起来能编译的代码你就很难判断它是不是在乱试。有了过程记录你就能看到它先读了哪些文件、调用了哪个工具、根据什么日志做了判断、中途有没有反复修改同一个文件。1.2 规模使用时的三大风险不可复现、不可归属、不可复盘当代码 Agent 从单次执行变成常态化工具团队会遇到三类问题不可复现。同一个需求上一次 Agent 给出了方案 A这一次可能给出方案 B。如果不记录过程没人说得清为什么输出会漂移。上下文顺序一个微小变化可能就会导致完全不同的工具调用序列。不可归属。一个功能出问题时究竟是人写的代码有问题还是 Agent 生成的代码有问题还是 Agent 调用工具时改错了文件如果只有最终提交记录这个问题很难回答。尤其在人机协同写代码的团队里责任归属会直接影响修复效率和流程改进方向。不可复盘。AI 辅助开发出问题之后最常见的复盘方式是看 commit 和 review 记录。但 commit 是结果不是过程。Agent 可能经历了 30 次工具调用才达到最终结果其中 15 次是失败的、8 次是尝试性探索。这些信息在一次 commit 里是看不到的。行车记录仪的作用正在于此。它对 Agent 的每一次工具调用、每一步决策输入、每一段输出结果做记录让“出事后能回放”成为团队的基本能力。1.3 结果审计和过程审计是两种完全不同的成熟度很多团队目前对代码 Agent 的审计停留在“结果审计”看最终生成的代码能不能编译、测试能不能通过、Review 有没有人批准。这种审计方式在人类协作时代够用因为人类开发者会自然通过思维、讨论、代码审查留下大量过程痕迹。但 Agent 不同它的“思考过程”并不会自动保存在仓库里。它读取了什么上下文、为什么决定修改某个文件、中间尝试过什么方案、哪些尝试失败了默认情况下都是不可见的。如果你只看结果你实际上是在相信一个黑盒。过程审计则是另一套逻辑把 Agent 的输入、工具调用、中间状态、决策依据都变成可查询、可回放的数据。它不直接回答“代码好不好”而是回答“这段代码是怎么被写出来的”。从工程角度看这个转变是代码 Agent 从“实验性工具”走向“生产环境基础设施”的关键标志。2. “行车记录仪”到底给 Agent 补上了什么2.1 行车记录仪不是普通日志它是“结构化的事件流”一说到过程记录很多人第一反应是“打日志”。但普通日志和行车记录仪之间有本质区别。普通日志是散落的、面向单点诊断的通常只有开发者人为埋点的地方才有信息而 Agent 运行过程是一个完整的事件流从接收任务开始到读取文件、调用工具、接收输出、写文件、提交代码环环相扣。如果只记录几个零散断点根本无法还原 Agent 的完整行动轨迹。所以我理解 ORG2 这类“行车记录仪”工具真正做的不是给每个 Agent 加几行 print而是定义一个统一的事件模型。无论底层是哪种代码 Agent无论它内部使用什么框架所有关键动作都可以被标准化为事件任务事件任务是什么时候创建的、输入是什么、期望输出是什么上下文事件Agent 读取了哪些文件、哪些文档、哪些环境信息工具调用事件调用了什么工具、传入什么参数、返回什么结果、耗时多少修改事件改动了哪个文件、哪个片段、diff 是什么、改动的理由文本是什么完成事件最终输出是什么、提交信息是什么、测试结果如何把这些事件串起来就形成了一条可以回放的时间轴。这和行车记录仪录制视频的机制非常像只是记录的不是视频帧而是 Agent 的“决策帧”。2.2 统一事件模型为什么比每个 Agent 单独记录更重要项目定位里提到“20 多种代码 Agent”这是我最关注的一个信息。如果只能接入一种 Agent那这个工具的价值会大打折扣因为团队通常不会押注在一个 Agent 上而是会同时试用多种不同定位的 Agent有的负责代码补全有的负责单元测试生成有的负责代码审查有的负责重构有的负责文档生成还有的负责特定领域的 Verilog 生成。问题就来了如果每种 Agent 的记录格式都不一样团队要一一适配那观测成本会高到无法落地。行车记录仪式工具的关键是在上层抽象出统一的事件结构让不同 Agent 的事件虽然细节不同但都能进入同一个查询和分析体系。这样才能做一个全局的“驾驶行为分析”而不是翻开每个 Agent 各自的“黑匣子说明书”手工比对。这个思路和可观测性领域的发展很像。可观测性一开始也是每台服务器、每个服务自己记录日志后来演进为统一采集、统一存储、统一查询。代码 Agent 的过程观测也会沿着同样的路径走先是单点记录然后是统一事件模型再往后是跨 Agent 的链路追踪和根因分析。2.3 可回放、可对比、可复现才是过程记录真正有用的地方过程记录如果只是存起来没人看那还是死的。真正的价值在于三种能力可回放把 Agent 一次完整任务过程像视频一样回放开发者可以逐帧查看每一步发生了什么。比如看到 Agent 在某一步读取了一个无关文件随后做出了一个偏差决策这就是问题的源头。可对比同一个任务为什么旧版本 Agent 表现好新版本反而变差了有过程记录后可以并排对比两次执行的事件流找出差异点。这比只看最终代码要精确得多。可复现这是工程上最难做到的一点。Agent 的运行有随机性加上模型版本变化、上下文顺序变化完全复现很困难。但如果事件记录足够细至少可以在相同输入、相同事件序列下重新执行某个中间步骤这已经比完全没有记录强很多。从团队协作角度看这三项能力让“AI 辅助开发”这件事从个人体验变成了团队资产。一个 Agent 做过的有价值操作可以被其他成员学习一个 Agent 犯过的错误也可以被所有人避开。3. ORG2 这类工具大体上是按什么思路设计的虽然我从公开信息里看不到太细的架构说明但按这类“Agent 过程观测工具”的常见设计通常可以拆成四层来看。如果你未来要接入或自研类似工具这套框架可以作为理解地图。3.1 接入层兼容 20 多种 Agent 靠的是“适配器模式”要接入 20 多种 Agent不可能给每种 Agent 都重写一套代码。更合理的设计是适配器模式每种 Agent 对应一个适配器负责把该 Agent 的原生输出转成统一事件格式。适配器里面处理的是 Agent 的 API 差异、流式输出差异、工具调用格式差异。在上层所有事件进入统一的事件总线或消息队列。这种设计的难点不在“能不能接入”而在“格式差异能吞掉多少”。不同 Agent 对工具调用、文件修改、思考过程的外显程度完全不同。有些 Agent 会把思考过程明文输出有些只输出最终结果有些会给工具调用加很详细的参数有些只给一个简写。适配器干的事就是把这些参差不齐的信息标准化同时尽量保留细节。丢掉细节很容易但丢掉的细节往往在回溯问题时最关键。所以如果你看到某个项目强调它支持“20 多种代码 Agent”不要只把它理解成“兼容列表很长”它更说明这个项目在接入层要考虑的事件格式复杂度已经很高了。不是四个五个而是二十多种这意味着它已经见识过大量的“非标准输出”。3.2 事件层把“思考、动作、结果”分成不同维度一个 Agent 执行任务时的信息粗略可以分为三个维度维度描述记录内容决策层Agent 为什么这么做提示词、任务目标、读入的上下文摘要、决策说明动作层Agent 具体做了什么工具调用名称、参数、文件路径、代码 diff结果层Agent 操作后发生了什么工具返回、编译输出、测试结果、日志片段、报错信息一个完整的事件模型至少要覆盖这三个维度。如果只记录动作层你会发现能知道 Agent 改了什么文件但不知道它为什么改如果只记录决策层你又很难把“想法”和“实际动作”对应起来。好的过程记录会让三层信息挂在同一个任务 ID 或事件链 ID 下。这样你看回放的时候可以同时看到“它读了一个文件动作它觉得这个文件很重要决策它基于这个文件修改了另一个文件结果”。3.3 存储与回放层先解决“够用”再解决“好用”过程记录会产生大量数据。如果一个 Agent 执行一个复杂任务会产生数百个事件20 多种 Agent 同时跑数据量会增长得非常快。所以设计上通常要区分几类数据处理逻辑明细事件全量记录保存原始信息主要用于单任务回放和故障排查。聚合指标按任务、按 Agent、按时间段聚合统计成功率、工具调用次数、失败率、平均耗时、文件修改数用于看整体趋势。采样与过期策略不是所有事件都有永久保留价值。通常做法是保留最近 N 天全量超过一定时间只保留聚合结果和异常事件明细。从工程经验看很多团队刚接入时会犯一个错误希望把所有过程数据永久原样保存。结果就是存储成本暴涨、查询越来越慢最后整个系统变成没人看的数据坟墓。更接地气的做法是先定好“异常优先保留、正常按需保留”的策略等真正需要长期追踪某个 Agent 行为时再单独拉长保留周期。3.4 展示层开发者真正需要的不是图表是“回放视角”过程观测工具如果只给一堆表格和图表开发者是不爱看的。真正有用的呈现方式是把一次 Agent 执行变成一个可交互的回放页面像看视频一样有进度条有时间轴有每个节点的展开详情。开发者可以快速定位到某个时间点的工具调用查看输入输出然后继续前进。这种回放视角对调试 Agent 特别有用。比如你想搞清楚 Agent 为什么在修改一个文件时丢失了上下文就能拖动进度条到它读取上下文的那一步看看它到底读到的是哪个版本的文件是不是中途被人改动了。4. 在 Verilog/RTL 场景里过程记录为什么特别重要4.1 AI 生成硬件代码的风险和普通业务代码不是一个量级为什么要把 Verilog/RTL 单拎出来说因为硬件代码的开发约束和软件代码差异很大。普通业务代码出 bug通常能靠单元测试、集成测试快速发现修复成本相对可控。但 RTL 代码不同它最终要经过仿真、综合、时序分析、FPGA 原型验证甚至流片。错误发现得越晚代价越高。一个在软件里只需要改一行代码的问题放到 RTL 里可能需要重新跑一遍仿真回归而大规模仿真的时间成本是以小时甚至天为单位计算的。AI Agent 做 Verilog 代码生成时常见的风险点包括信号位宽不匹配导致仿真时报出大量 X 态状态机缺少默认态导致综合后出现锁存器跨时钟域信号没有做同步处理导致时序收敛失败组合逻辑环路导致仿真卡死或综合报错接口时序和原有模块不匹配导致集成阶段才发现问题。这些风险里有一部分是代码审查可以发现的有一部分必须靠仿真回归。但更麻烦的是Agent 可能在一次任务里修改了多个文件你要确认它为什么改、改动的依据是什么。没有过程记录你看到的只是一个最终的 diff很难判断它是基于正确的上下文做出的修改还是在胡乱试错。4.2 Agent 审核 Verilog 代码具体可以做哪些功能把“行车记录仪”和“Agent 审核代码”放在一起思考时能组合出很多实用功能。Agent 审核代码不能只是“检查有没有语法错误”它应该能提供一整套和硬件开发流程匹配的检查能力。我梳理了一下比较有落地价值的功能包括功能分类具体检查项对开发流程的价值结构性检查模块例化、端口连接、信号位宽、未声明信号、悬空输入在仿真前拦截低级错误节省回归时间状态机检查状态编码、缺省分支、状态跳转是否完备、是否存在不可达状态避免综合后出现锁存器提升可综合性时序相关检查跨时钟域信号是否同步、异步复位是否规范、关键路径是否有组合逻辑过深降低时序收敛风险提前发现 CDC 隐患规范与风格检查命名规范、注释完整性、always块中使用阻塞/非阻塞赋值的规范性保证团队代码风格一致方便维护可靠性检查是否存在组合逻辑环路、复位是否完整、信号是否被多驱动发现仿真和综合行为不一致的隐患这些功能如果由人去审很耗时如果由 Agent 去审则需要消耗不少 token而且必须接受人的复核。过程记录在这里的意义是Agent 在审核时到底看了哪个模块、依据哪条规则、给出什么建议这些都要能追溯。否则你拿到一条“这个模块有问题”的结论却无法知道它为什么这样判断那这条结论的使用价值就低很多。4.3 一个适合 RTL 团队的接入顺序先记录再反馈后自动审核对于 RTL 团队来说我不建议一开始就让 Agent 大规模自动修改代码。更稳妥的顺序是先让 Agent 生成代码同时全程记录过程。生成结果不直接合入仓库而是先保存到临时分支并导出完整的事件回放。人工 review Agent 的过程回放。不要只 review 结果而是要看它读了哪些模块、改了哪些信号、为什么改。这个阶段的重心不是效率而是建立信任。让 Agent 先做“审核”而不是“修改”。Agent 只输出评审意见不直接写代码。人在拿到意见后决定是否采纳。这样即使 Agent 判断有偏差也不会直接改动代码。积累一定量可信记录后再放开自动修改。当团队的置信度足够高再让 Agent 在特定小模块上自动修改并配合自动化仿真回归。这个顺序的核心原则是过程记录让 Agent 的行为变得可解释只有在行为可解释的前提下才谈得上自动化和规模化。没有过程记录就放开自动修改等于让一个开车不看车的司机上路而且还不装行车记录仪。5. 在代码审核场景中使用 Agent 的正确姿势5.1 审核 Agent 的核心价值不是替代人而是给人提供“过程证据”很多人把 Agent 审核代码理解成“让 AI 代替代码评审”。这个想法在中小规模代码仓库里部分成立但在大仓库、硬件代码、复杂重构场景里还很危险。我更倾向于把审核 Agent 理解成一个“给评审者提供过程证据的助手”。人在评审代码时最耗时的部分不是看 diff 本身而是理解这个 diff 为什么存在这个函数为什么重构这个信号为什么改名这个模块为什么拆分Agent 能做的一件事是在提交代码的同时生成一份“变更理由说明”把这次改动涉及的上下文、参考文件、约束条件、相关 issue 都列出来。如果再加一层过程记录这份说明就变得更可信。你可以核实Agent 说的依据是否真的来自仓库里的某个文件而不是它自己编出来的。很多代码 Agent 的问题是“一本正经地编造理由”没有过程记录时你很难抓到这个漏洞有了过程记录你可以直接跳转到它读取的那个文件看它引用的内容是否存在、是否完整、是否过期。5.2 建议的五步落地流程从单次使用到固定流程基于实践我建议团队按下述流程把“Agent 审核代码”从尝鲜变成固定流程定义审核范围和规则。不要一开始就让 Agent 审整个仓库而是指定模块、指定文件、指定规则集比如“只审 state machine 相关逻辑”“只审跨时钟域信号”。用最小样例验证规则有效性。拿一段过去已知有问题的 Verilog 代码让 Agent 审核看它能否发现问题过程记录是否符合预期。这个阶段不追求召回率追求的是“能不能按规则工作”。在真实 MR 上试运行但只输出意见。让 Agent 在测试分支上审核真实 MR输出意见供人参考。记录下每条意见对应的证据以及人的最终采纳结果。建立反馈闭环。把“人采纳/不采纳”的结果喂回规则配置逐步矫正 Agent 的审核偏好。这一步非常关键没有反馈闭环Agent 会不断重复同样的误判。当规则稳定后再接入 CI 流程。只有当某几类审核规则的准确率稳定可接受时才把这些规则放进 CI设置成“阻塞或警告”级别。其他规则继续保留在人工触发的模式里。在这个流程里过程记录贯穿始终。步骤 2 和步骤 3 尤其依赖回放能力因为你要一个个确认 Agent 的每个判断是否有据可循。5.3 容易踩的坑把 Agent 的“解释”当成事实很多 Agent 在输出结论时会附带解释比如“根据代码风格规范这里的信号命名不符合命名要求”。听着很合理但如果你去核查可能发现它引用的规范版本已经过期或者那个信号在另一个文件里的定义和它理解的不一致。过程记录能降低这种风险但不能完全消灭。因此你要养成两个习惯对 Agent 给出的“依据型描述”一律回到原始文件去复核而不是只信它整理的摘要。把 Agent 的解释当成“待验证假设”而不是“结论”。这也是为什么我一直强调Agent 审核代码的正确姿势是人机协同而不是全自动放权。行车记录仪能让你看清发生了什么但它不能替你做驾驶判断。6. 落地组织级 Agent 观测之前先想清楚这些事6.1 存储与采样先定策略再谈全量过程记录的数据量会很可观。假设一个 Agent 执行一次中等复杂任务产生 200 个事件其中每个事件可能包含工具返回的完整内容那一个任务少说也有几百 KB。团队如果有几十个开发者、每天跑几百个任务一天的原始数据可能就要上 GB。所以落地前需要先回答几个问题哪些任务需要全量记录核心代码模块、涉及合入主干的修改、异常任务、新模型版本的验证任务最好全量记录。哪些任务可以只保存聚合信息探索性任务、草稿生成、本地实验这些可以只保留统计信息和结论不保留完整事件流。记录保存多久建议至少保留一个迭代版本周期方便在版本对比时回溯。是否要区分记录级别可以给 Agent 执行打上不同标签比如“调试”“评审”“预发布”不同标签使用不同保留策略。从经验看方案设计不能只想“记录得多”还要想“查得到”和“用得上”。海量明细数据如果没有好的索引和检索方式真正要用时反而更难找。6.2 权限与敏感信息过程记录可能比代码本身更敏感过程记录里不仅有代码 diff还有 Agent 读取的上下文、工具返回结果、环境变量、日志片段、甚至可能的密钥信息。它比一份普通提交记录暴露的信息更多因此权限设计必须提前想好而不是事后补默认权限应设为“仅相关开发者可见”而不是全员可读。涉及密钥、token、内网地址时记录层最好做脱敏处理。Agent 读取的第三方服务返回内容属于数据合规范畴不能无限制留存。事件回放接口要有访问审计能查到谁看了哪条记录。这里不要抱有侥幸想法一旦团队规模化使用 Agent过程记录就是敏感性仅次于代码仓库的数据资产。6.3 从“先跑通”到“再工程化”三个阶段推进阶段一单 Agent、单任务、人工回放。目的是体验过程记录的价值建立对 Agent 行为的感知。阶段二多 Agent、统一事件流、自动化存储。目的是打通多工具的统一观测让 20 多种 Agent 的记录进入同一个体系。阶段三融入 CI、趋势分析、异常告警。让过程观测成为质量保障的一部分例如Agent 连续多次修改同一文件而没有通过测试时自动发出告警。这三个阶段不一定要分得很死但顺序不要乱。我见过不少团队想一步到位结果卡在数据量爆炸和权限不清上面最后还是退回人工。7. 把过程观测沉淀成团队能力一套可复用的工作框架7.1 三层可观测框架动作、决策、影响到最后我想把一个可复用的框架总结出来。任何团队在引入代码 Agent 观测时都可以用三层框架来组织动作层Agent 做了什么使用了什么工具修改了哪些文件。对应的事件是工具调用和文件 diff。决策层Agent 为什么这么做基于什么上下文和规则。对应的事件是提示词摘要、上下文读取记录、输出解释。影响层这个动作对项目全局产生了什么影响编译是否通过、测试是否失败、依赖是否变化、性能是否回退。对应的事件是测试输出、静态检查结果、指标变化。日常使用中先看影响层再看动作层最后才深入决策层。遇到问题时从最末端的影响往上游回溯通常能在动作层找到直接原因再往决策层找根因。这套排查顺序和看行车记录仪录像的逻辑完全一致先看撞车了没有再看到底是哪一步操作导致的最后分析司机当时为什么那样判断。7.2 一份可以直接照着用的实施检查表如果你决定在团队里引入类似 ORG2 的过程观测方案可以按这张检查表逐项过一遍[ ] 定义了统一的事件格式而不是每个 Agent 各自记录[ ] 明确哪些事件属于动作层、决策层、影响层[ ] 区分了明细记录和聚合记录并制定了保留周期[ ] 权限模型已覆盖到事件回放和原始上下文内容[ ] 至少有一个实际场景能用回放视角定位问题[ ] 选定了首个试点任务并设定了成功标准[ ] 人工 review 的流程还保留着Agent 没有直接合入代码[ ] 有定期复盘机制把过程记录转化为规则改进[ ] 没有把所有事件永久原样存储留有存储成本控制策略这张表不要求一次性全部做到前几次可以先满足前三条但后面几条会在规模化时变成硬门槛。7.3 对 Agent 开发习惯的三个长远改变最后说三个我认为会发生的长期变化。第一Agent 开发从“单点调参”转向“数据驱动”。当你能看到 20 多种 Agent 的真实运行过程你就不再依赖感觉来判断哪个 Agent 好用而是可以对比事件流、工具调用效率、错误率。这是从“试工具”到“运营工具”的跨越。第二代码评审的边界会明显扩大。以前评审只看结果未来评审会包含过程。开发者提交代码时会附带一次 Agent 行为摘要它看了哪些上下文、为什么做这个改动、验证了什么。这会让代码评审的质量高出一个层级。第三对 Agent 生成代码的信任模型会改变。信任不再建立在“它看起来很聪明”而是建立在“它的每一步都可以被检查和回放”。这也是行车记录仪式工具真正的长期价值——它让可解释性成为 Agent 进入严肃工程环境的前提。回到开头那个 RTL 朋友的问题AI 生成的 Verilog 代码改动了某个信号没人知道它为什么改。有了行车记录仪这个问题至少有了回答的路径。接下来的事就是我们愿不愿意在跑通 Demo 之后多花一步去安装这台行车记录仪。