第一百〇四章 替代方案
三条要求,他拆成三个任务。
第一,历史记录:整理已通过 Claude API 处理的 G1 内容清单,含时间、输入摘要。
第二,替代方案:G1 改用豆包,G2/G3 的处理方案待定,看信安对商业软件代码的要求。
第三,流程文档:补一份 AI 辅助注释工具的数据流说明,给信安审批。
他把任务发给麦景行和乔木,然后去找了一件被搁下来的事:豆包处理 G1 代码的能力到底怎么样。
麦景行整理历史记录用了半天。
「一共七次,」他发过来,「都是手打的代码片段,最短八十字,最长三百一十字。分析的都是 G1 第一个函数 `proc_spv_h` 的局部逻辑,还没有处理第二个函数。」
「时间戳都有吗?」
「Claude Code 有会话日志,时间戳可以提。输入内容的摘要我来写,我记得每次发了什么。」
「好,你整理一份清单,我发给乔木做成正式文件。」
当天下午,信安那边回来了一条追问:「已提交的七次调用记录,内容涉及泉华工业控制代码,请确认是否包含设备安全关键参数。」

他预料到会有这个问题,回复已经起草好了。
「已提交的七次调用,均为宏展开后的函数名称和调用结构,不含实际设备参数数值(阈值、时间窗、传感器量程等)。代码中的宏常量在展开前为泉华内部定义,未在输入中提供实际值,只提供了宏名称。以下逐条附上清单中每次输入的内容摘要,请核实。」
摘要附了七条。每条标注:宏名/函数名/调用关系分析,无参数值。
信安沉默了两个小时。然后回来两个字:「确认。」
乔木看到信安的追问时给他发了一条:「你提交清单的速度和格式,像是提前准备了一套应对审查的思路,而不是临时凑材料。」
他没有特别解释。合同谈的时候他就知道,工业代码的数据合规迟早会被问,信安审查会问什么问题,他当时就推过一遍。不是聪明,是提前想到了。
乔木那边很快。
「法务这边可以出一份《AI工具使用记录声明》,包含时间戳、输入摘要、工具名称、数据处理节点,加上供应商的官方条款截图。格式我按泉华信安上次给的格式要求做。」
「附件的形式还是并入主合同?」
「附件。建议同时写明:本记录声明自出具之日起对此前使用情况负责,此后工作流调整已执行境内替代方案(见附:替代方案说明),供信安存档审计使用。这样前后都交代清楚。」
「行,你出。」

替代方案这一块,陆衍自己来判断。
G1 代码是 1994 年的工控 C 语言,含传感器控制逻辑,安全关键条目在里面。这类代码理论上对数据流向的要求最高,境内处理是合理的。
G2 是 Java,写的是设备管理层的业务逻辑,不包含直接操控硬件的安全逻辑。G3 是 Python,功能封装层,更偏工具性。
这两种代码,信安要求是否也必须境内处理,他没有结论,需要问泉华。
他起草了一条发给方晓晨的信安联系人:
「关于 AI 辅助工具替代方案,我们的初步判断:G1 工控安全关键代码,建议全部改用境内模型(豆包)处理,替换即刻生效;G2/G3 功能封装层,请信安确认是否适用同一要求,还是可以继续使用 Claude API。我们会根据确认结果调整工作流,并在工具使用说明中注明各模块使用的具体模型。」
第二天,泉华信安回来了:G1 和 G2 都要求境内处理;G3 的 Python 代码,信安评估后认为不含泉华核心工艺逻辑,Claude API 可以继续使用。
「G2 也要境内,」麦景行发消息,「G2 的那三个模块,我之前还没来得及用 Claude 分析,现在直接用豆包就行。」
「G3 那边先继续推,G1 和 G2 全切豆包。豆包处理 G1 宏展开的速度你估一下。」
十几秒的沉默。「比 Claude 慢。秒回变成四五秒,复杂一点的要等十来秒。」

「多一分钟还是多半天?」
「多一两个小时吧,整体下来。」
「在范围内,G1 要三周,多两个小时可以吸收。」
当天下午,乔木把《AI工具使用记录声明》初稿发过来了。
他看了一遍,措辞准确,清单完整。他在末尾加了一段话,是他自己写的:
「本记录声明反映的是评估阶段的实际工具使用情况。云帆团队理解工业控制软件的数据安全要求,此次调整将成为后续同类项目的工具使用规范基准。」
加这段,是为了让信安看到:云帆在主动建立工具规范,这次调整是起点。
周四,乔木把声明发给泉华信安,附上替代方案说明。
周五上午,信安回复:记录清单确认,替代方案批准,Claude 对 G3 的使用可以继续,G1/G2 改豆包处理自本文件签发之日起生效。
他把通知转发给麦景行:「可以继续了,G1/G2 切豆包。」
麦景行的回复来得很快,附了一张截图。

是豆包对 G1 第二个函数的分析结果。他已经用新工作流处理了第一批。结论和之前 Claude 推断的方向一致,触发条件和保持逻辑的推断吻合,置信度豆包标了「中高」。
「速度怎么样?」
「第一批四个片段,加上等待,二十二分钟。Claude 当时是七分钟。但有个地方要说一下——」
麦景行停了一下。「第一个函数里有段代码,Claude 当时标注是'条件检查残段,疑为历史遗留占位符,可能无实际功能'。豆包重新跑了一遍,结论不一样:它认为这段在特定条件下是一个错误回调入口,不是占位符。」
陆衍盯着这条消息。
「两个结论对立的原因你有没有看?」
「Claude 推断时是基于宏名称推逻辑,那段代码宏嵌套比较深,它没有完全展开。豆包拿到的是我已经展开过一层的版本,所以能看到里面有一个 `ERR_HANDLER` 调用,Claude 没看到。」
「也就是说,两个结论都是基于不同输入的,不是模型能力的差异。」
「可以这么理解。但现在问题是:这个 `ERR_HANDLER`,我查了宏定义列表,这个宏没有在五个验证模块里找到定义。它定义在哪里,还需要往外再查一层。」
验证模块里有一个错误回调入口,但宏定义在范围外。不在合同里的代码,牵着在合同里的逻辑。