引言:代码审查没有死去,它只是终于被AI盯上了
代码审查这事儿,在软件工程圈子里是个老生常谈的话题。从最早两个人围着显示器逐行过代码,到后来GitHub Pull Request上打评论、@人、等approve,再到CI流水线里塞进SonarQube、ESLint这类静态检查工具——代码审查的形式一直在变,但底层逻辑几十年没变过:靠人,靠经验,靠时间。
问题恰恰就出在这里。靠人的地方,经验有高有低,时间永远不够用;靠规则的地方,只能抓“已知的错误模式”,稍微绕一点、坏一点的问题统统漏掉。我见过太多这样的场景:一段PR改了800行,两个reviewer花了一下午,最后只在缩进和命名上打转,真正引入的性能隐患、边界逻辑漏洞、上下文不一致,谁也没发现。这不是人笨,是代码审查这件事本身早就超出了“人肉可及”的范畴。
直到LLM出现,才有人开始认真思考:能不能让AI来干这事儿?于是2023到2024年冒出了一大批“AI代码审查工具”,大部分长一个样:把diff扔给GPT,让大模型“看看有什么问题”,然后输出一堆长篇大论。听着挺美,用起来全是坑——一会儿胡扯,一会儿漏报,一会儿在无关紧要的地方啰嗦半天。团队试了几次之后,一句“算了,还是人工审吧”就把项目打回原形。
问题到底出在哪儿?我拆过好几个这类项目之后发现,根子在于大家把“用AI”和“用AI做工程”这两件事混为一谈了。LLM适合做判断、做归纳、做解释,但它不适合做精确的定位、可靠的过滤、可重复的检查。而代码审查恰恰既需要“精确”,又需要“判断”——单纯的LLM方案撑不起这个复杂度。
直到我看到了open-code-review这个项目,才第一次对“AI代码审查的工程化”有了一个清晰的参照系。它的核心思路很直接:不要把整个审查任务都丢给LLM,而是把任务先拆成一条由确定性规则、静态分析、流程编排组成的流水线,在流水线的关键节点引入LLM Agent做语义判断和上下文推理,两边各干各擅长的事。这个“确定性流水线 + LLM Agent”的混合架构,我研究了一段时间,也拿它做基准在团队里搭了一套内部的审查服务,踩了不少坑,也积累了不少经验。
这篇文章,我就从open-code-review这个项目出发,把这个混合架构从头拆到尾:为什么纯LLM方案不靠谱、确定性流水线到底解决什么问题、LLM Agent在流水线里应该站在哪个位置、以及落地到真实研发流程里你会撞见的坑和绕坑方法。适合正在选型AI代码审查工具的团队,也适合对“LLM工程化”这件事感兴趣的开发者和架构师。
1. AI代码审查的演化路径:为什么“把diff扔给LLM”远远不够
先说个可能不太好听的事实:市面上绝大多数“AI代码审查”工具,本质上就是“一个调用了大模型API的diff阅读器”。开发者把PR的diff拿过来,拼上一个预设的prompt,发给GPT-4或Claude,再把模型的回答原样贴回PR评论区。第一眼看上去确实“智能”——能讨论代码风格,能指出潜在bug,能给出修改建议。但你只要用一个1000行以上的真实PR试一次,就会发现事情远没有那么简单。
我举个实际例子。假设一个PR改了某个支付服务的订单状态流转逻辑,完整diff有1400行,跨了8个文件。你把diff直接喂给GPT-4,模型通常会给出这样的回复:前面几行“很认真地”夸奖了代码结构,中间列出一堆风马牛不相及的“建议”,比如“第302行的魔法数字建议提取为常量”——这种建议本质上是从训练数据里学来的“模板反应”,根本不了解这个项目的上下文;真正致命的状态机边界漏洞,它很可能提都没提。为什么?因为大模型的上下文窗口虽然大,但你喂给它的是一大坨没有结构的文本,它根本分不清哪些是新增代码、哪些是上下文代码、哪些是无关的格式调整,注意力被稀释得干干净净。
再退一步说,即便LLM准确指出了问题,你怎么保证它“每次都”能指出来?LLM的输出天生就有随机性。同一个diff,同一套prompt,同一批参数,上午跑和下午跑,结果可能差出一大截。而代码审查恰恰是一项需要“确定性”的活动——某一个规则该触发就触发,某一个风险该上报就上报。你可以容忍一次“误报”,但绝不能容忍一次“漏报”被所有人当成“审过了”。
更深层的问题在于:LLM对“代码变更”这件事的理解,是语义层面的、概率层面的,但它缺少对“结构化事实”的精确感知。比如这个函数的大小复杂度是多少、这段新代码覆盖了哪些已有的测试分支、这个API的调用链上是否出现了循环依赖——这些在静态分析领域早就有确定性工具能给出精确答案,非要让LLM靠“读diff猜”去做,效率和准确率都低得离谱。
所以2024年之后,业界的共识逐渐清晰起来:AI代码审查要走向工程化,就必须把“审查”从一个“大模型问答任务”重新定义为一个“由多种工具协作完成的软件工程流水线任务”。这也是open-code-review这类项目出现的背景。它没有试图让LLM干所有事,而是先把审查流程拆解成“找差异、算指标、扫模式、判风险”等不同环节,每个环节选用最合适的工具,LLM只是这个大流程里的一个“组件”,而不是全部。
为了让你更直观地理解,我做了一张对比表,把“纯LLM方案”和“混合架构方案”在几个核心维度上的差异摆出来:
| 维度 | 纯LLM方案 | 确定性流水线 + LLM Agent |
|---|---|---|
| 变更定位 | 模型从diff文本里“猜”哪些是新增 | 流水线基于AST和diff算法精确区分增删改 |
| 规则类检查 | 靠模型记忆常见错误模式 | 静态分析引擎按预设规则精确命中 |
| 语义判断 | 上下文零散,判断结果波动大 | Agent只聚焦局部,上下文经过裁剪与定向注入 |
| 可重复性 | 同一输入多次运行结果可能不同 | 确定性环节输出100%可复现 |
| 漏报风险 | 高,尤其是复杂跨文件变更 | 低,先经过确定性扫描兜底,再由Agent补盲 |
| 成本控制 | 每次全量diff喂给模型,费用随diff线性膨胀 | 通过分级过滤,只有疑似风险片段才调用LLM |
这张表基本解释了“工程化”三个字的分量。确定性是地基,语义判断是上层建筑,两者缺一不可。接下来我分别拆这两层。
2. 确定性流水线:从“粗暴看diff”到“结构化找风险”
open-code-review这个项目的第一层,就是一条非常传统的、冷静的、甚至有点“无聊”的流水线——它做的是那些LLM不擅长但机器极其擅长的事情。这一层才是整套系统的骨架。
2.1 变更结构化:用AST和Diff算法建立“精确坐标系”
纯文本diff有一个天然缺陷:它对“代码的语义单元”一无所知。在Git的diff输出里,一个函数的修改可能被切碎成好几块hunk,散落在整个diff的不同位置;一个文件中新增的代码,落在某个函数体内部还是外部,文本层面完全看不出来。LLM要理解这些,只能靠“猜”。
确定性流水线的第一步,就是把这个文本层面的diff,映射成语法层面的变更。具体做法是:对改动前后的代码分别解析生成AST(抽象语法树),然后对比两棵树,精确计算每个语法节点的新增、删除、修改、移动。这样一来,“第302行多了一个魔法数字”这个文本层面的描述,就可以被转换为“在PaymentStatus这个类的transition方法中新增了一个case分支,其条件表达式引用了未定义常量”这种结构化事实。
有了AST级别的变更数据,后续的规则引擎、指标计算、LLM上下文注入就都有了精确的坐标系。比如检查“是否有未使用的import”这件事,在AST层面只是查一个节点集合的差集,确定性100%,零成本,完全不需要动用大模型。这听起来像是小事,但恰恰是这些“小事的确定性”,把LLM从琐碎的噪音里解放了出来。
2.2 规则引擎与静态分析:把组织经验沉淀成“硬编码知识”
有了结构化的变更信息之后,就可以跑规则了。这一层在技术实现上并不新鲜——市面上有大量现成的静态分析工具可以作为基础,SonarQube、CodeQL、Semgrep、ESLint、golangci-lint,等等。open-code-review的思路是:不是为了替代这些工具,而是把它们作为流水线的一个环节“编排”进来,在diff的约束下触发,聚焦在“本次变更涉及的范围”内运行。
我在自己团队的实践里,体会最深的是“围绕diff运行”这件事的价值。全量扫描一个大型仓库,往往要跑很久,而且会产生海量的、与本次变更无关的历史问题噪音。但按diff范围运行,几分钟之内就能拿到一份高度聚焦的“新增问题列表”。这一点对开发体验是决定性的——审查工具一旦让开发者觉得“烦、慢、不相关”,这个工具就离被卸载不远了。
规则引擎的另一个优势是可配置、可演进。每个团队对“什么算严重问题”的定义都不同,规则引擎允许你用配置文件把这些偏好显式地表达出来。这相当于把组织内多年沉淀的代码审查经验,编码成一套任何人、任何时刻都能复现执行的标准。这部分价值很难量化,但用过的团队都会懂。
2.3 质量门槛与变更分级:不让每行代码都“惊动”大模型
LLM调用是有成本的,不只是钱,还有延迟。如果每个PR、每一行改动都要经过Agent完整审查,那审查速度一定跟不上开发速度——这本身就是一种失败。所以open-code-review的流水线里做了一个很务实的设计:变更分级(triage)。
规则引擎跑完一轮之后,系统对每个文件、每个规则命中项做严重度分级。比如:
- 阻断级:变更引入了确定的语法错误、未定义引用、明显的安全漏洞(如SQL拼接),直接打回;
- 高风险:跨越了模块边界、修改了被多处引用的核心函数、增加了循环复杂度到某个阈值,需要Agent重点审查;
- 常规级:局部改动、低风险文件,交给规则引擎和轻量级检查即可,不消耗LLM。
这个分级机制让LLM的资源被用在刀刃上。我后来在我们的系统里统计过,开启分级之后,真正需要调用LLM的反馈约占全部审查项的30%左右,但漏掉的高风险场景基本没有,成本曲线直接被压平了一大截。这就是“确定性流水线”的工程价值——它不是取代LLM,而是用最低成本过滤掉80%的噪音,保证LLM只处理真正需要判断力的问题。
3. LLM Agent层:从“一个模型”到“一组分工明确的Agent”
如果说确定性流水线是整个系统的骨架,那LLM Agent层就是血肉和判断力所在。但open-code-review对LLM的使用方式,和“把diff扔给GPT”这种粗暴做法有个根本性的区别:它把LLM封装成多个各司其职的Agent,每个Agent只审查特定类型的问题,拥有自己的上下文、自己的prompt、自己的输出Schema,并且在触发条件上受流水线严格约束。
3.1 Agent的组织方式:风格、安全、性能、逻辑,分开审
在open-code-review的设计里,Agent不是一个大而全的“代码审查员”,而是一个按需调度的“专家小组”。大致分为几类:
风格与可维护性Agent。负责命名、注释、函数长度、代码重复度等偏主观、偏品味的问题。这类判断在传统上非常依赖人的阅读习惯,但经过结构化变更信息的辅助,Agent可以针对具体的函数体提问,而不是面对一坨无头无尾的文本。这个Agent的定位是“搭把手”,它给出的建议通常是参考性的,不阻断合并。
安全与漏洞Agent。负责查找注入、越权、敏感数据泄露、危险函数调用模式等安全问题。它会结合流水线层给它的结构化信号——比如“这个改动没有权限校验”“这里直接拼接了外部输入”——并把这些信号与代码上下文拼接成提问。安全类问题判定难度高,误报也多,所以在设计上它对“疑似问题”会显式标注置信度,低置信度的建议一律不上报。这个Agent是四类里“最贵”的,因为安全问题通常需要更长的推理链。
性能与并发Agent。负责分析变更引入了哪些潜在的性能瓶颈、死锁风险、资源泄漏等问题。它需要一些额外的上下文注入:比如在流水线阶段被识别出的热点路径上的函数、涉及锁和并发原语的文件,会被单独标记出来,作为这个Agent的输入。
逻辑与边界Agent。这个最重要,处理的是传统静态分析工具完全无能为力的问题——跨函数的逻辑正确性、状态流转的边界条件、异常处理的缺失、与上下游接口的契约是否被破坏。这类审查需要较强的推理能力,也是大模型区别于传统工具的核心价值所在。但它必须被喂给足够精确的上下文,否则就会瞎猜。open-code-review的做法是:流水线层把“变更影响到的函数调用链、关联的数据结构定义、相关的测试文件摘要”结构化抽取出来,注入到这个Agent的上下文中,让它只对“这一个问题”做深度推理。
3.2 上下文工程:决定LLM审查质量的生死线
做过LLM应用的人都知道那句老话:“垃圾进,垃圾出”。在代码审查这个场景下,这句话的杀伤力被放大到了极致——因为代码审查的输入不仅“大”,而且“结构复杂”。直接把整个diff发给Agent,和把大量无关上下文塞给它,效果都是灾难性的。
open-code-review在上下文工程上的做法给了我很大启发。它的核心原则可以概括成一句话:每次只给Agent一个“任务相关的切片”。具体来说,不是问“这段diff有没有问题”,而是问“这个函数的状态流转逻辑是否有边界漏洞”,然后精确地构造一个上下文包:函数本身的完整代码、它调用的两个外部接口的签名、相关的测试用例中覆盖状态流转的那部分、流水线识别出的风险信号列表。这个包可能只有几百行,但信息密度极高。
我实操的时候对比过两种方式:一种是把完整diff丢给Agent自由发挥,另一种是按上面的方式“切片后”定向提问。前者耗时更长、回答更发散、动不动在风格问题上长篇大论;后者响应更快、命中率更高、且在“即使给出的建议不完全正确,至少决策边界清晰”这一点上表现稳定。
另外一个被很多人忽略的细节是输出协议化。open-code-review要求Agent的输出不是自然语言散文,而是结构化的JSON:{问题类型, 严重级别, 涉及文件行号, 问题描述, 修改建议, 置信度}。这看起来只是一个格式偏好,但它实际上解决了一个大问题——让LLM的输出可以被后续的流水线处理:按严重级别排序、接入CI门禁、指派给对应的开发者。没有这一步,LLM的审查结果就只能停留在“人肉阅读”阶段,根本无法工程化。
3.3 Agent之间的协作机制:不共享上下文,只共享结论
多Agent架构最容易踩的坑就是“上下文打架”:两个Agent各自推理,然后输出矛盾的建议;或者更糟糕,Agent A的结论被塞进Agent B的上下文,形成“错误的引用链”,错误被层层放大。
open-code-review在这一点上做得很克制:各Agent之间不做上下文共享,只把最终的结论汇聚到一个统一的结果集里。每个Agent的输入都是流水线层提供的独立结构化数据,而不是其他Agent的输出。好处是显而易见的——隔离了推理链上的错误传播,而且每个Agent都能并行执行,审查总耗时不会随Agent数量线性增长。
在团队落地的时候,我调整过这个协作模型,加上了一个“复核Agent”的环节:对于被“安全Agent”和“逻辑Agent”同时标记为高风险的问题,会触发一个独立的复核Agent,用不同的prompt模板重新审视一遍。这增加了一点成本和延迟,但对重大问题的检测率提升非常明显。如果你在一个对稳定性要求很高的团队,这个策略值得考虑。
4. 混合架构的编排艺术:两个世界如何无缝衔接
流水线和Agent各自的能力聊完了,接下来是这个架构最微妙的部分:两者是怎么编排到一起的。open-code-review在这一点上提供了一个很干净的参考模型,我把它叫做“漏斗式审查流”。
4.1 一次完整的审查流是怎样的
用一个具体的例子来走一遍完整流程。假设开发者在分支上提交了一个涉及后端服务配置和核心逻辑的PR,总共改了7个文件、600行代码。
第一步,流水线先把仓库拉下来,对PR的源分支和目标分支分别解析AST,计算精确的语法级diff。这个阶段输出的是一份结构化的变更清单:哪些函数被修改了、哪些文件新增了、哪些依赖出现了增减调用。
第二步,规则引擎在变更范围内跑一系列确定性检查。假设检查出一个阻断级问题——某个配置文件里引入了硬编码的密钥,这个规则命中直接进入“阻断”状态,整次审查流程提前终止,PR被标记为“需修改”,连LLM都不需要调用。这种场景在真实开发里非常常见,因为硬编码、凭据泄露这种事,规则引擎能做到100%识别,没有任何讨论余地。
第三步,如果规则引擎没有命中阻断级问题,流水线会对剩余变更做风险分级,把“高风险文件”和“需要语义判断的问题”提取成结构化片段,同时为每个片段组装上下文包,然后分发给对应的Agent。四个Agent并行运行,各自独立审查自己负责的那部分。
第四步,所有Agent的结果被汇聚到统一schema中,按严重度排序、去重,生成一份结构化的审查报告。这份报告随后被写入PR评论区,同时以机器可读的格式推送给CI系统作为门禁判断依据。
整个流程走下来,大部分普通PR在几分钟内就可以得到结果。而一条关键的细节是:LLM Agent只参与第三步中被明确标记为高风险的子集,其余代码完全由确定性流水线兜底。
4.2 双通道反馈:保证“机器审完,人还能再审”
有人可能会担心:AI审查这么激进,会不会把人的判断力完全替代掉?这种担心是合理的,但open-code-review的设计思路恰恰相反——它不希望AI成为一个“黑箱评审官”,而是希望AI成为一个“放大器”和“过滤器”。开发者和reviewer看到的审查报告不是“AI说了算”的最终结论,而是“AI为人类准备好了的决策素材”。
在实践中,我团队最终形成的流程是这样的:AI审查报告自动产出之后,所有标记为“建议”级别的问题由提交者自行处理,不必惊动reviewer;“高风险”级别标记的问题必须由至少一位人类维护者复核确认之后才算有效。这套机制把AI的优势(速度、覆盖面)和人的优势(判断力、权威性)结合了起来,团队接受度非常高。
这个“双通道”体系还有一个附带好处:时间长了之后,团队里会逐渐积累一批“被AI反复正确标记”的历史问题类型,这些就可以沉淀回规则引擎的规则集里,形成一个良性循环——AI越用越聪明,但“聪明”的表现恰恰是越来越多的判断被固化成确定性规则,越来越少依赖LLM的随机推理。
4.3 与CI流水线的集成方式:门禁、旁路与灰度策略
混合架构在CI/CD里的部署模式,也是一门学问。直接把这个系统当成硬门禁(block merge)的团队,通常第一天就会被误报惹毛;完全当成旁路展示(只发评论不拦截)的团队,又很快会发现开发者根本不会点开看。open-code-review的做法是“既不是全有也不是全无”,而是把审查结果按级别映射到门禁策略上:
- 阻断级问题:直接阻止合并,这条没有商量余地;
- 高风险问题:允许合并,但必须在PR页面显式确认“已知晓并处理”之后才能通过;
- 建议级问题:不影响合并,只作为开发者的参考信息留存在PR记录里。
落地的时候,我强烈建议团队在引入初期先跑“旁路模式”一两周,积累一批本地数据来校正Agent的prompt和阈值,再做门禁切换。直接上硬门禁,十有八九会翻车,因为Agent的误报率在你调优之前是不确定的,用它卡任何人的合并都会引发抵触情绪。
5. 踩坑实录:在真实团队里落地这套架构的七条教训
项目源码看十遍,都不如自己跑一遍踩的坑来的深刻。这一章把这套混合架构真实落地时最常撞见的问题整理成一份速查表,每条都是我或我的同行团队实际经历过的,希望你不用再踩一遍。
| 症状 | 根因 | 排查方向 | 有效解法 |
|---|---|---|---|
| Agent在同一问题上反复横跳,有时报有时不报 | prompt中缺少确定性的问题定义和判定标准,模型在“自由发挥” | 检查Agent prompt是否给出了明确的候选类别和判定条件 | 给每个Agent配备“判定规则清单+示例场景”,把任务从“发现问题”重构为“对给定场景做分类” |
| 大型PR耗时过长,超过CI超时阈值 | 多个Agent串行执行,上下游等待,或上下文组装耗时 | 查看各Agent耗时分布,定位卡点 | 将无依赖的Agent改为并行调用,或对超大PR做“分文件切片后并行”处理 |
| 漏报率高,尤其是跨文件逻辑错误 | Agent上下文中没有包含足够的跨文件调用链信息 | 检查上下文包是否只包含单个文件内容 | 在流水线层增加“变更影响分析”环节,将涉及函数的上游调用方、下游实现一并注入 |
| 误报集中在风格类问题,开发者觉得“AI在教我做事” | 风格类Agent的prompt缺少项目规范定义,模型用“大众最佳实践”套 | 检查是否有按项目级定制的风格规则 | 将团队代码规范转成结构化规则注入prompt,或直接禁用风格Agent某些类别 |
| 审查结果无法与工单、缺陷追踪系统联动 | 输出是自然语言段落而非结构化数据 | 检查Agent输出是否没有做Schema约束 | 强制使用JSON Schema输出,建立问题编号与工单的映射关系 |
| 低频问题规则覆盖不足,每年固定重复出几次同类生产事故 | 全依赖LLM语义判断,没有把已知事故沉淀为确定性规则 | 检查规则库中是否包含对历史故障的“回归测试类规则” | 每发生一次线上事故,就在规则引擎里补一条对应检测规则,形成“事故-规则”闭环 |
| LLM审查成本随使用量激增,月底对账单很刺激 | 分级策略失效,大量低风险变更也走了Agent | 检查分级阈值是否因为误调而放宽,或低风险文件类型也被Agent处理 | 收紧分级逻辑,明确“文件改动幅度/敏感模块/调用影响面”三个条件联合决定是否调用Agent |
这七条基本能覆盖90%团队在落地混合架构时会遇到的问题。最后一条“成本问题”值得单独展开一下:LLM资源的消耗速度是线性膨胀的,因为只要代码在写,PR就在产生。如果你的系统对每个PR都调用一次Agent,哪怕每次成本只有几毛钱,一个月下来也是一笔不小的开支。控制成本的关键不在“少用”,而在“精准用”——每一个被送入Agent的请求,都要有明确的、非他不可的理由。这个思路放在整个混合架构里,就是整个设计的灵魂。
6. 从样板项目到生产系统:落地这套架构的行动清单
源码看懂了、架构理解了、坑也了解了,真正落地的时候,还是需要一份可以照着走的行动清单。以下是我在团队里实际推动这件事时总结出的路径,每一步都有明确的产出和检查点。
第一步,选型。不建议从零写整套系统。可以先在open-code-review的基础上做内部分支改造,把它适配到自己的代码平台(GitHub / GitLab / Gitea)和CI系统上。这一步的验收标准是:一个测试PR走完“diff计算→规则扫描→Agent审查→生成报告”的完整流程。
第二步,做“规则优先,LLM兜底”的最小配置。先只用规则引擎和静态分析跑一遍存量仓库的历史PR,看看命中率和误报率基线,同时手动标记一批“高风险问题样本”,作为之后Agent prompt调优的评估集。这一步不需要LLM,纯粹校验确定性流水线部分。
第三步,接入第一个Agent,且只接“逻辑与边界”这一类。用上一步手工标记的样本来调优prompt和上下文组装策略,目标是让Agent样本集命中率达到70%以上。这个阶段可以接受一定误报,但要把输出格式完全定死,为后续门禁做准备。
第四步,逐步补齐安全、性能、风格Agent,同时把分级策略打开。这个阶段可以开始跑“审查报告 + 人工复核”的双通道模式,收集团队反馈,继续调阈值。目标是把误报率压到10%以下,让团队形成“AI报告值得看”的习惯。
第五步,才轮到门禁。把阻断级问题接入合并保护,逐步收紧,最终形成“阻断级自动拦截、高风险人工确认、建议级可忽略”的完整策略。
这套路径最核心的一条原则是:每个阶段都要有明确的人类确认环节。AI代码审查的本质不是替代人,而是让人花在“真正需要人的判断力”上的时间变多,花在“机械琐碎”上的时间变少。这五个步骤走下来,我最大的感受是:AI的能力只有在纪律严明的流程约束下才会有价值,工程化三个字最终沉淀下来的是流程、是确定性、是数据闭环,而LLM只是这个闭环里最聪明但也最需要被管住的那个组件。
我自己在实际部署中还有一个小诀窍:先让系统“闭嘴”两周,只记录分析不输出任何评论。你以为这是浪费时间?恰恰相反,这给你提供了一个绝佳的校准数据池——把所有PR真实“人工审查结论”与“系统离线预测结论”对比,摸清系统的误报漏报底数,再带着这份数据去做prompt调优和规则补充,效果远比上线后再慢慢磨要好得多。这个步骤很傻,但谁用谁知道。
如果你正在纠结要不要给团队引入AI代码审查,我的建议很简单:别期待它能替你思考,但一定要让它帮你把思考之前那些琐碎的活全干完。混合架构落到实处,真正的价值不是“AI替代了人”,而是“人终于可以把精力花在AI替代不了的地方”。