上周我干了件有点疯的事:把 GPT 接到 DeepO 上,让它自己去解一道宇瞳杯光学设计竞赛的题目。多数人用 GPT 是写周报、改代码、查资料,我却想让大模型直接上手操作专业的光学设计软件,自己生成镜头结构、自己迭代优化、自己盯像差曲线。折腾了整整三天,结果有惊喜也有翻车,但整个过程的收获比单纯交一份设计稿大得多。
这篇文章写给两类人:一是对“智能体操作专业软件”感兴趣的同学,二是做光学设计、想用 AI 提升效率的工程师。我尽量把架构怎么搭、赛题怎么拆、GPT 在哪些环节靠谱、哪些环节离谱,都讲清楚。
1. 为什么选 DeepO 和宇瞳杯来做这个“疯狂实验”
先说背景。宇瞳杯是面向光学设计领域的一个竞赛平台,题目通常以安防监控、车载、消费电子镜头为背景,要求参赛者在限定时间内输出满足规格的设计方案。这类题目最大的特点是约束多、指标硬:一个镜头要在给定靶面、波段、总长、后焦、畸变范围下,同时满足 MTF、相对照度、CRA 等一堆指标。对新手来说光是读懂赛题就要几天,对老手来说又是一个拼手速和耐心的体力活。
DeepO 则是一个支持脚本化操作的光学设计平台。你可能更熟悉 Zemax、CODE V,但 DeepO 在国产软件里有个很关键的优势——它提供了相对完整的 Python 风格接口,可以通过外部程序读取系统状态、修改镜头参数、调用优化器。这就给“让 AI 操作软件”留下了物理入口。
为什么说这个组合是最佳试验田?因为光学设计竞赛题目有三个特征,恰好是 GPT 类大模型能发挥的地方,同时也是最容易暴露问题的地方:
- 目标明确但路径不唯一。赛题不会告诉你“把第二片镜片改成双凹”,它只告诉你“MTF 在 160 lp/mm 处中心视场不低于 0.5”。怎么达成,是工程师自己想办法的事。这种开放式问题,特别适合让大模型基于当前数据不断提出修改建议。
- 反馈是数值化的。每次优化完,系统都会吐出评价函数值、MTF 曲线、畸变数据、点列图。数值本身就是最好的“奖励信号”,根本不需要人类额外解释。
- 流程高度重复。初始结构生成、局部优化、全局搜索、替换材料、微调权重——这些步骤占实际设计时间的 80%。不是每个循环都需要人来决策,AI 完全可以在画好的跑道里来回跑。
简而言之:赛题给了目标,DeepO 给了动手能力,GPT 负责动脑。理想状态下,这套组合可以 24 小时不间断地尝试各种结构,人只需要在关键节点把关。
2. 整体架构:给 GPT 装上一套“光学手”和“光学眼”
要让 GPT 操作 DeepO,核心不只是“能调 API”,而是要让 GPT 形成感知—决策—执行—验证的闭环。我最后搭出来的架构分四层,每层都有它的作用。
2.1 连接层:把自然语言翻译成 DeepO 脚本指令
GPT 不会直接点 DeepO 的按钮,这没问题,我们本来也不需要它点按钮。DeepO 支持脚本调用,所以只要写一个“指令翻译层”,把 GPT 输出的结构化 JSON 转成 DeepO 能执行的 Python 脚本即可。
示意代码如下,实际接口以你装的 DeepO 版本为准:
import deepo sys = deepo.open_design("challenge_01.dlo") # 这个函数调用 GPT 的 API,传入当前系统状态和用户目标 gpt_actions = call_gpt( system_snapshot=sys.export_parameters(), user_target="优化中心视场MTF,同时保持畸变不超过3%" ) # GPT 返回的是结构化动作列表 for action in gpt_actions.actions: if action.type == "modify_curvature": sys.lenses[action.lens_index].set_curvature(action.value) elif action.type == "set_airgap": sys.lenses[action.lens_index].airgap_to_next = action.value elif action.type == "replace_glass": sys.lenses[action.lens_index].glass = action.value sys.optimize(max_iterations=200) sys.export_results("result_round_01.zmx")机器本身不懂“优化一下”是什么意思,但 JSON 动作列表它完全照做。这一步的关键是把动作空间限制住。我一开始让 GPT 自由输出自然语言指令,结果它经常说“尝试改变镜片的形状”这种无法执行的废话。后来我把可执行动作限定为五类:改曲率半径、改透镜厚度、改空气间隔、替换玻璃材料、调整优化权重。一旦约束好动作空间,执行成功率立刻上去。
2.2 数据反馈层:让 GPT“看见”像差数据
GPT 没有眼睛,但它有文本理解能力。所以我们要把系统的数值状态整理成它看得懂的文本摘要。这一步很重要,因为 GPT 不能直接看 MTF 图,它只能看数字。
我每次迭代都会生成一份系统快照,包含这些字段:
| 数据项 | 示例 |
|---|---|
| 当前评价函数值 | MF = 0.0382 |
| 视场 0/0.3/0.5/0.7/1.0 的 RMS 波前差 | 0.031/0.042/0.058/0.079/0.119(单位:波长) |
| 中心/边缘 MTF@160lp/mm | 0.52 / 0.29 |
| 畸变百分比(0-1视场) | -1.2% / -3.8% |
| 光学总长与后焦 | TTL=7.2mm,BFL=5.1mm |
快照生成后,连同“你希望达成的目标”一起发给 GPT,让它输出下一轮动作。这个过程本质上是让大模型在“读实验数据 — 提出假设 — 执行动作”之间循环,跟我自己调镜头时的思路一模一样,区别只是它的反应速度比人快得多。
2.3 循环决策框架:每轮迭代 GPT 到底该做什么
为了让 GPT 不至于乱来,我给它设计了一个四阶段决策框架:
- 诊断:对比当前指标与目标,列出差距最大的三项。比如“MTF 边缘不足”“畸变超标”“总长超标”。
- 归因:基于光学常识推断可能的原因。是镜片光焦度分配不合理?是某个空气间隔导致像面太远?还是用了不合适的玻璃材料?
- 开方:给出具体的参数修改建议,并说明预期效果。比如“将第三片镜片的后表面曲率半径从 3.2 改为 2.8,可增强边缘视场光线偏折,改善边缘 MTF”。
- 执行:输出动作列表交给连接层执行,然后把新数据喂回第一步。
实测下来,这套循环最大的价值不是“每一步都对”,而是每轮都有改进的倾向。GPT 的定向搜索能力比我认为的强很多,哪怕只是简单调权重,也能把评价函数从 0.08 压到 0.04。
3. 从零跑通一道安防定焦镜头赛题的全过程
光讲架构没意思,我直接拿一道模拟宇瞳杯赛题风格的任务走一遍完整流程。题目是我按安防定焦镜头常见规格拟的:
- 焦距:6mm
- F 数:1.6
- 靶面:1/1.8 英寸
- 波段:可见光 + 850nm 红外,需要红外共焦
- MTF 要求:中心视场在 160 lp/mm 处不低于 0.5,0.7 视场不低于 0.3
- 畸变要求:控制在 -3% 以内
- 光学总长不超过 20mm,后焦不小于 5.5mm
3.1 初始结构:GPT 的第一份答卷
赛题设计的第一步通常是找初始结构,可以直接套专利、查镜头库,也可以自己从平板开始凑。我故意没给 GPT 任何现成初始结构,让它从零开始设计。
它给出的第一版方案是这样的:四片式球面镜头,前组正透镜+后组负透镜,整体像一个简化版的双高斯。这个结构从类型上说是合理的,至少比某些新手随便放三片正透镜要靠谱。但问题也很明显:
- 第一片镜片中心厚度 2.8mm,边缘厚度只有 0.12mm,加工厂看了会直接拒单;
- 第二片和第三片之间空气间隔仅 0.04mm,装配公差根本搞不定;
- 红外 850nm 波段处焦点偏移 26μm,红外共焦完全没做到。
看到这个结果我反而放心了,因为它的错误是有逻辑的错误,说明模型理解了基本的光焦度分配原理,只是不了解加工约束和像差平衡的细节。这些恰好是后面迭代中要注入的规则。
3.2 优化迭代:评价函数与约束注入
有了初始结构,接下来进入优化环节。这一步我让 GPT 自己设计评价函数权重。结果它一开始把所有权重都压到畸变上,把畸变压到 0.5% 以内,代价是 MTF 全面崩坏,中心视场连 0.2 都不到。
这里就暴露了一个核心问题:GPT 把“满足指标”理解成了“优化一个数字”,而没意识到光学设计是多目标平衡的艺术。后来我在目标描述里明确加了优先级顺序:
第一优先:所有视场 MTF 不低于 0.35;第二优先:总长不超过 20mm;第三优先:畸变不超过 -3%。只有在满足前三项的前提下,才允许继续优化畸变。
加了这个约束说明后,它给的权重方案就合理多了:MTF 相关操作数占了大约 70% 的权重,总长控制在 15%,畸变 10%,红外共焦偏移量 5%。这个分配虽然还是偏保守,但已经像一个入门光学工程师的水平了。
3.3 参数修改与关键结构的演化过程
优化过程中有一轮修改让我印象很深。迭代到第 6 轮时,MTF 中心和 0.7 视场都达标了,但 1.0 视场(最边缘)的 MTF 依然只有 0.18,明显拖后腿。GPT 在诊断环节输出了一段分析:
“1.0 视场光线入射角过大,导致边缘视场像散和彗差显著增大。建议调整最后一片镜片的光焦度分配:将其后表面曲率半径从 -4.52mm 改为 -3.85mm,同时将前一面空气间隔从 0.55mm 缩小到 0.42mm,以减小边缘光线在最后一面的入射高度。”
这套说辞从专业角度看是自洽的,也确实是最常见的边缘视场优化手段。我让它执行了,结果 1.0 视场 MTF 从 0.18 升到 0.27,虽然还没到目标,但方向是对的。
后续又迭代了十几轮,每一轮改变量都不大,但评价函数在稳步下降。最终结果:
| 指标 | 目标 | 实测 |
|---|---|---|
| 中心 MTF@160lp/mm | ≥0.5 | 0.56 |
| 0.7 视场 MTF | ≥0.3 | 0.41 |
| 1.0 视场 MTF | 尽量提升 | 0.33 |
| 畸变 | ≤-3% | -2.4% |
| 光学总长 | ≤20mm | 18.7mm |
| 红外共焦偏移 | 尽量小 | 22μm |
六项核心指标里五项达标,1.0 视场 MTF 虽然没有达到 0.35 的理想值,但 0.33 对 F/1.6 的安防镜头来说已经勉强可用。整个过程大概跑了 40 轮自动迭代,用时四个小时,期间我总共手工干预了三次。
4. 实测中暴露的五个致命短板
说完了高光时刻,必须聊聊翻车现场。GPT 操作 DeepO 这件事,如果只看最终结果,容易高估它的能力。我在实测中踩了五个大坑,每一个都值得单独拿出来分析。
4.1 短板一:没有物理直觉,不知道自己在“调什么”
GPT 很擅长把数字往目标方向挪,但它完全不知道镜片长什么样。有一次它为了压低某个视场的 RMS,把第二片镜片的曲率半径从 12mm 直接改成 1.2mm。数值上评价函数确实降了,但镜头结构变成了一个极度弯曲的半球形镜片,这在实际设计中没有任何可行性。
我后来总结:大模型对“光学像差”有概念,但对“物理可实现性”没有概念。它看不到镜片的实际形状,不理解边缘厚度太薄会崩边,也不知道曲率太陡会导致高阶像差爆炸。要让它避开这些坑,只能靠外部规则硬约束,不能指望它自觉。
4.2 短板二:单位与量纲混乱
这个坑出现得相当低级。DeepO 内部长度单位是毫米,但 GPT 在处理玻璃材料折射率的时候会把波长单位和长度单位搞混。有一轮它建议用折射率为 1.92 的“高折射率聚碳酸酯材料”,但实际上聚碳酸酯的折射率只有 1.585 左右,折射率 1.92 的材料即便存在,色散特性也完全不适合用在安防镜头里。
同样的问题也出现在波长处理上。它对 850nm 红外波段的理解是“比可见光波长更长,所以焦点更靠后”,方向判断没问题,但要它给出具体的轴向色差补偿量时,它经常把 20μm 写成 0.02mm 再写成 2μm,数值差了一个数量级。这类低级错误在反复提示后有所缓解,但每隔几轮还会犯一次。
4.3 短板三:编造玻璃材料
这是最让我头疼的问题。光学设计软件里的玻璃库是封闭的,材料折射率、阿贝数、透过率都是严格定义的。但 GPT 会根据自己训练数据里的碎片化知识编造“看起来合理”的材料参数。
它曾建议用一个折射率 1.74、阿贝数 32 的“超低色散镧系玻璃”作为第二片镜片材料,理由是能有效校正色差。问题是这个材料在 DeepO 玻璃库里根本不存在,执行层直接报错。我又试过一次让它自己在材料库里选,结果它“幻觉”出的材料名和真实材料名对不上号。
解决方案只有一个:把材料选择范围预先限定好,在系统提示词里写死“材料只能从以下列表中选取”,然后把可用材料列表附上。一旦不给它自由发挥的空间,这类问题就基本杜绝了。
4.4 短板四:优化策略单一致死
光学设计的优化器本身有局部最优解的问题,GPT 也不能免俗。前期它喜欢把所有参数都交给优化器跑,后期它开始频繁使用“全局搜索”,但它的全局搜索策略并不是真正在全局探索,而是在当前方案附近小幅扰动。
有一次我感觉它已经在一个明显的局部最优解里卡死了——第 12 轮到第 30 轮,评价函数几乎没动,MTF 曲线也没有明显变化。换作人类工程师,这时候应该考虑加点非球面、换一种玻璃组合,甚至彻底推翻初始结构重新来。但 GPT 只会继续微调曲率半径,根本不会考虑结构层面的重大调整。
我的应对办法是人工干预:暂停自动迭代,在提示词里直接给它一个结构修改指令,比如“把第三片镜片改成非球面,保留现有曲率半径作为初始值”。注入这个新方向后,优化立刻重新开始下降。
4.5 短板五:对“竞赛规则”的理解太机械
宇瞳杯的赛题不只是光学指标,还有提交物格式、设计说明书要求、材料数量限制等软性规则。GPT 对硬指标很敏感,对软性约束经常视而不见。
比如赛题明确要求“全系统不得使用超过 4 片球面镜片”,它在第 5 轮迭代时建议增加一片额外的补偿镜片来改善边缘视场 MTF,直接违反规则。虽然改动后被我叫停,但这个行为说明它并没有真正把竞赛规则内化成约束条件,它只是在“满足文本里写得最醒目的几个数字”。
这块没有太好的自动化办法,只能靠人在任务描述里反复强调,或者在规则校验层做硬拦截。
5. 安全网设计:哪些环节必须人工把关
经过三天实测,我的结论是:让 GPT 全自动操作 DeepO 在当前阶段不现实,但把人放在“决策链顶端”、GPT 当高级操作员,这个模式已经能大幅提升效率。关键是要把安全网设计明白,让 AI 在跑道上飞,但跑道边界要由人来画。
5.1 参数合法性校验:把物理约束写成自动检查清单
我在执行层加了一道合法性校验,每一轮 GPT 输出动作后,脚本先检查这六项,全部通过才允许执行:
- 所有曲率半径的绝对值不小于 0.5mm,否则镜片形状极度弯曲,无法加工;
- 每片镜片中心厚度不小于 0.3mm,边缘厚度不小于 0.15mm;
- 相邻镜片空气间隔不小于 0.1mm,给装配留公差空间;
- 光学总长不得超出赛题上限的 110%,防止结构在优化中失控;
- 玻璃材料必须存在于当前玻璃库列表;
- 后焦不小于指定值,防止照到像面之前就聚焦。
这套校验逻辑本身对任何光学设计流程都有用,不关 GPT 的事,但它对 AI 操作场景尤其重要。因为人操作时有视觉反馈,看到镜片变成畸形会直接意识到不对,AI 没有这个直觉。
5.2 人工介入的临界点判定
什么情况下必须停下来自动化流程?我总结了三类信号:
- 评价函数连续 10 轮不下降。这种时候靠微调曲率半径已经没戏了,需要人来换一种优化策略或者改结构形式。
- GPT 连续两次修改同一个参数但方向相反。比如先增大第一片镜片的光焦度,又马上减小它,说明模型在同一个地方犹豫,这时候要么是目标矛盾,要么是初始结构本身就有问题。
- 出现违反物理常识的数值。比如某片镜片折射率 1.92、某空气间隔 0.03mm,这种数值一旦出现,直接判死刑,不需要看后续解释。
5.3 推荐的人机协作姿态
最后说点我个人偏见的结论。测试了一轮之后,现在我认可的工作模式是:人类定策略,AI 做战术。
- 人类:拆解赛题、写约束条件、定优化方向、选择初始结构形式、在关键节点干预参数突变。
- AI:负责具体的循环迭代、参数微调、结果对比、过程记录,以及生成设计说明书的初稿。
这个姿态的好处是,AI 的高强度重复劳动和“多思路并行搜索”能力被充分利用了,而它最薄弱的“全局判断”和“物理常识”部分,恰好由人类来补。说到底,大模型操作专业软件这件事,最有价值的不是替代工程师,而是让工程师从“守着优化器发呆”的日常里解放出来,把时间花在真正需要判断力的地方。
如果你也想在自己的领域做类似的尝试,我的建议很简单:找到一个反馈数值化、操作可脚本化、规则边界清晰的软件,把 AI 的动作空间压到最小,然后让它在边界内跑。别指望它成为专家,但你可以指望它成为一个不知疲倦、且能听懂你指令的高级实习生。