AI

从算风的到写代码的:为什么 CFD 工程师是天然的 AI Agent 架构师?

Wayne Wei
8 分钟阅读时间
从算风的到写代码的:为什么 CFD 工程师是天然的 AI Agent 架构师?

从 Star-CCM+ 到 VS Code,我花了十年。

2016 年我刚开始做 CFD 的时候,每天盯的是残差曲线——那条蓝色的线在屏幕上一跳一跳,你盯着它看它是否收敛,是否振荡,是否在某个时间步突然发散。一个外流场算例跑 3000 核·时是常态。不收敛就调松弛因子、加密网格、改边界条件。然后重新跑。

2026 年 4 月,我开始学 AI。不是因为我突然对 Transformer 的 self-attention 产生了兴趣,是因为我意识到——我十年积累的对”复杂系统如何收敛”的直觉,可能正好用得上。

到今天刚好两个月。结论是:确实用得上。

不是类比,是同一件事

很多人把 CFD 和 AI Agent 做类比,说”它们很像”。我觉得这低估了这件事。

它们不是像。它们在根上是同一套底层逻辑。

你拆开来看:

CFD 求解器做的事: 给定一个物理场景(边界条件),在一个离散化的空间里(网格),反复计算(迭代),直到结果不再显著变化(收敛)。如果不收敛——调整参数,重新来过。

AI Agent 做的事: 给定一个任务目标(System Prompt),在一个拆解好的任务序列里(ReAct Loop),反复调用工具和 LLM(迭代),直到任务完成(闭环)。如果完不成——调整策略,重试。

这不是类比。这是同一个抽象模式在两个领域的具体化。

我用这个东西做了 Sulix Novel——一个 AI 辅助写作工具——的编排层核心。XState 状态机 + Rust 的 reduce(event) -> Vec<Effect> 模式,本质上就是我在 CFD 里天天写的求解循环。只不过迭代变量从流场变量变成了”用户意图”。

具体一点:三条可平移的直觉

1. 边界条件敏感——我练了十年的 Prompt Engineering

做 CFD 的人都懂一句话:边界条件决定解的存在性。

入口速度设错了,算到天荒地老也收敛不了。壁面粗糙度给错了,分离点位置就是不对。这不是”调参数”的问题——这是你在定义问题的数学空间。

做 Agent 之后我发现,System Prompt 就是 AI 的边界条件。

刚开始写 Prompt 的时候我犯了一个典型的新手错误:什么都往里塞。“你是一个写作助手。你的任务是帮助用户写小说。你要注意语气。你要注意风格。你要注意……”

CFD 直觉告诉我:约束太多,但是方向不明确,空间会过约束到无解。

于是我开始像设边界条件一样写 Prompt:

你是一个小说编辑助手。
- 只回答故事结构和角色弧线相关问题
- 语法检查仅在用户明确要求时做
- 不要替用户写段落,只提修改建议
- 每次输出不超过三个要点

每一条都是一个明确的边界。就像在 CFD 里给每个边界指定 type(velocity inlet / pressure outlet / wall)一样明确。

结果?Agent 的行为从”发散”变成了”收敛”。

2. 迭代收敛直觉——我从调试 Agent 第一天就有的肌肉记忆

CFD 工程师的日常工作:跑一步,看残差,判断是否收敛,不收敛就调参数,再跑一步。

我做 Agent 的第一天,发现调试 Agent 的流程一模一样:调一次 LLM,看输出质量,判断是否完成任务,不满意就改 Prompt 或加 Tool,再试一次。

在 Sulix Novel 里,我写了个 Agent loop 的简陋原型。第一次跑,它把我的小说角色名改错了。第二次,它在对话上下文里迷路了。

CFD 直觉告诉我:不是算法的问题,是收敛判据的问题。我没有给它明确的”什么时候停”的标准。

于是我加了三样本能的收敛判据——和 CFD 残差监控一模一样:

# 这就是 CFD 残差监控换了个皮
class AgentMonitor:
    def __init__(self, max_steps=15):
        self.max_steps = max_steps
        self.history = []

    def log_step(self, step, progress, tool_ok):
        self.history.append((step, progress, tool_ok))
        if step > self.max_steps:    # 最大迭代步数
            raise Timeout("未收敛,强制终止")
        if progress > 0.95:          # 收敛判据
            return True
        return False

CFD 的收敛判据是 residual < 1e-5,Agent 的收敛判据是 task_progress > 0.95。抽象模式一样,只是量纲换了。

3. 调试思路的平行迁移

做 CFD 调试的时候,你不会从头开始检查。你有一个诊断流程:先看残差曲线形状 → 判断是发散还是振荡 → 如果是振荡,看是哪个区域的问题 → 加密那个区域的网格。

做 Agent 调试,我用的是同一套诊断流程:

CFD 诊断Agent 诊断
残差曲线不降 → 网格不够密Agent 循环不结束 → 任务拆解不够细
某个区域持续高残差 → 边界条件有问题某一步 Tool Call 反复失败 → Prompt 约束不够
算例莫名其妙发散 → 检查数值稳定性Agent 突然胡言乱语 → 检查上下文窗口
用了高阶格式但网格密度跟不上 → 方法不匹配给了太多能力但模型不够好 → 能力范围太大

这一条不是理论推出来的——是实际踩坑踩出来的。Sulix Novel 的 Agent 在第一次 Bake-off 测试里花了 420 美元的 Token,正确率只有 70%。CFD 的老同事说”这也太亏了”,我说”我跑了 3000 核·时的仿真算一个案例的时候,也没人说便宜”。

所以我到底在说什么

我不是说 CFD 工程师做 AI 比别人”厉害”。我是说:

十年做同一件事形成的工程直觉,换了领域也不会消失。它只是换了个容器。

那些你以为是”只会用 Star-CCM+“的技能——盯着残差曲线判断收敛、直觉上知道哪个边界条件设错了、能一眼看出结果是数值振荡还是物理不稳定——它们不是 CFD 技能。它们是”理解和调试复杂系统”的通用能力。

AI Agent 也是一个复杂系统。输入→循环→判断→反馈→调整→收敛。这个循环我跑了十年。你告诉我它换了层皮我就不认识了?

所以我给其他工程背景想转 AI 的人的建议是:

不要从 Transformer 论文开始看。从你已经会的东西开始。

找一个你熟悉的物理过程(燃烧、流动、传热)和一个 AI Agent 流程做对比。找到那个”同一件事”的抽象层。然后你会发现不是从零开始,是把旧工具包里的直觉倒进新的容器里。

CFD 求解器和 AI Agent 都是同一个故事的不同版本:如何在有限资源内,让一个系统逼近可接受的解。

只不过以前我盯的是残差曲线,现在我盯的是 Token 消耗。以前我判断”这个算例收敛了吗”,现在我判断”这个 Agent 闭环了吗”。

曲线变了。问题没变。


顺便:学会用了之后,需要自己总结出自己的范式,这样会走得更顺一些。这就是我在做的。