十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

程序合成:通往AGI的“完美游乐场”与核心挑战

程序合成:通往AGI的“完美游乐场”与核心挑战 这两年“合成”这两个字在大众语境里有点被带偏了。大家刷到“深度合成”想到的是AI换脸、AI配音、一键生成的文本和视频可在我们做程序语言和人工智能的人眼里“合成”还有一个更古老、更硬核的含义——程序合成Program Synthesis不是让AI生成一段“像样的内容”而是让机器根据你给的意图自动生成一段能被验证、能真正运行、能满足需求的程序代码。这几年大模型写代码的能力突飞猛进圈内对“通用人工智能AGI”的讨论也越来越多。但如果你仔细去看那些讨论会发现大多数人都把注意力放在了“模型能不能聊”“模型能不能画”“模型能不能做题”上反而很少人去认真聊一个真正关键的问题我们拿什么标准来判断一个系统“真的会思考”我的答案很直接——程序合成。它几乎是目前所有AI实验场里最接近“智能”定义、也最适合用来打磨通用能力的一个方向甚至可以说是通往AGI的“完美游乐场”。这篇文章我想把这件事彻底讲透程序合成解决什么问题为什么它对AGI研究这么重要它今天的核心技术路线有哪些已经落地到哪些地方以及“意义感”这个东西如何真正驱动一个人在这个领域持续走下去。不管你是做研究的学生、写业务的工程师还是只是对AI好奇的旁观者这篇文章应该都能给你一个不一样的理解框架。1. 一个被低估的领域为什么值得押上注意力1.1 半个世纪前就有人在机器里“造程序”很多人以为“让程序写程序”是近几年才有的事其实这个想法比互联网的历史都长。上世纪六七十年代“自动编程”Automatic Programming就是人工智能领域的核心议题之一。1969年Waldinger和Lee提出了演绎式程序合成deductive synthesis的基本框架七十年代Manna和Waldinger做了一系列关于“从规范推导程序”的奠基性工作1977年Summers用Lisp做了一个能从输入输出示例中自动归纳出程序的系统。那个年代没有深度神经网络没有大数据人们就是用逻辑、搜索和数学归纳法硬生生地在机器里“造”程序。后来这条线在主流AI浪潮里逐渐边缘化了。符号主义退潮机器学习崛起大家发现“从例子学规律”这条路在大规模数据面前更有效。但有意思的是程序合成始终没有被彻底放弃它藏在编译器优化、芯片设计、数据库查询优化、测试自动生成这些非常务实的角落里一直在慢慢积累。1.2 每次AI浪潮都会重新点燃它到了二十一世纪第二个十年程序合成迎来了两次明显的复兴。第一次是2010年前后微软研究院的Sumit Gulwani团队把“基于输入输出示例的字符串变换合成”做成了Excel里的FlashFill功能普通用户在一个单元格里写下想要的结果系统自动补全整列。这可能是历史上第一次有上亿普通用户每天都在使用程序合成技术。第二次就是现在大语言模型让自然语言到代码的生成变得空前强大Codex、Copilot以及各类AI编程助手本质上都是在大规模数据上做“隐式程序合成”。为什么每次AI浪潮都会重新点燃程序合成因为程序是思想最精确的可执行表达。一段正确的程序意味着机器真正理解了某个逻辑而“理解”恰恰是通用人工智能最核心也最难验证的能力。语言模型可以“看似理解”地跟你聊哲学但一段能跑、能通过测试、能证明满足规范的代码骗不了人。这就是程序合成的魅力它不给模糊的“感觉”只给硬碰硬的结果。2. 程序合成到底在解决什么问题AGI研究为什么会看上它2.1 从“给定程序”到“给定意图”程序合成不是编译。编译器做的事是把人类写好的高级语言翻译成机器能执行的低级语言输入本身已经是完备的逻辑了。程序合成要解决的是更上游的问题用户给出一个意图spec系统自己去找到一段满足这个意图的程序。举个例子用户说“把表格里的姓名列改成‘姓, 名’这种格式”传统做法是程序员写一行正则或写一行Python程序合成要做的是系统自己生成这段Python代码并且能证明它对所有符合描述的情况都成立。这个“意图”可以有很多种形式自然语言描述、输入输出示例、形式化逻辑约束、测试用例或者几者的混合。这个过程和我们人类工程师拿到需求、写代码、跑测试、修bug的思维过程很像只不过把执行主体从人换成了机器。这里就引出了AGI研究真正在意的东西。一个能完成程序合成的系统必须具备至少四种能力理解意图把自然语言或示例转成可操作的约束搜索与规划在巨大的程序空间里找到可行解调试与验证生成结果后发现错误、修正错误抽象与泛化学会一个小任务后能举一反三到同类型的更大任务。你会发现这四件事几乎就是人类智能中“逻辑推理”和“问题解决”的全部核心。所以研究程序合成本质上就是在研究通用智能的底层机制。2.2 和对话、游戏、机器人这些AGI实验场比它赢在哪现在AGI研究有不少公认的“实验场”比如大模型对话、游戏环境AlphaGo、星际争霸、机器人操作等。这些赛道各有价值但程序合成在“实验场”这个定位上有几个很难替代的优势。实验场评估方式环境成本反馈密度自动化难度对话系统人工打分、偏好模型中低一次对话只有一次反馈高主观性强游戏AI游戏分数高需开发仿真环境中中泛化到开放世界难真实机器人任务成功率极高硬件贵且有安全风险低一次试验成本高高难以大规模并行程序合成测试用例、形式化验证极低只需CPU极高每次编译/运行都是反馈低可全自动评估这张表看完应该就明白了程序合成几乎是唯一一个“评估成本极低、反馈信号极密、并行程度极高”的智能实验场。训练AI玩围棋需要维护一套复杂的对弈环境训练机器人要买几台机械臂还得时刻担心它撞坏东西但是生成一段代码错了就编译报错跑挂了就宕机几毫秒失败了换个搜索方向再来。一次实验可以几千个任务并行跑成本几乎为零。这也是为什么我把程序合成称为“完美游乐场”——你在这个环境里可以无限次试错可以快速获得明确反馈而且每个任务都天然带有难度梯度。做研究的人最怕什么怕评价指标模棱两可怕实验周期长到劝退。程序合成恰好把这两个最大的坑都填平了。3. “完美游乐场”的独特之处可验证、无限任务、自动难度曲线3.1 可验证性让“对与错”不再有争议做AI最痛苦的事情之一是“评估”。你做文本生成到底什么样的回答算好萝卜青菜各有所爱你做图像生成到底哪张图更有“艺术感”只能靠人看。这种主观性让研究进展变得很难衡量。但程序合成没有这个烦恼。当有一个明确的规范时合成出的程序正确与否是可以机器判定的跑测试用例通过了就是通过不通过就是不通过更强一点用形式化验证证明它在所有输入上都满足规范那这就是数学意义上的正确。这种二值的、可复现的、无争议的评估机制对一个领域的发展速度影响巨大。可验证性意味着研究的每一步进展都可以被精确衡量而精确衡量是快速迭代的前提。当然这里要澄清一下真实世界中的程序合成任务不一定都有完备的形式化规范很多时候规范本身是模糊的。这个问题我后面会专门讲。但即使只有测试用例这种近似规范它也已经比大多数AI任务客观得多了。3.2 任务空间无限相当于一张永远刷不完的地图游戏作为AGI实验场的另一个问题是“图会刷完”。AlphaGo下围棋棋类规则是固定的Dota的玩法再丰富地图机制也是固定的。系统一旦学会再用同样的任务评估就变成了在测记忆而非测泛化。程序合成的任务空间则是理论无限的。你可以用程序生成器生成无穷无尽的新规范今天合成一个排序算法明天合成一个JSON解析器后天合成一段并发控制逻辑。每一次都是新的挑战系统永远无法通过背答案来刷分。这个特性对“避免过拟合”极其关键——我们说要实现通用智能那么核心就是要测试系统在从未见过的新任务上的表现。程序合成天然就是一套“无限关卡、每关都不重复”的题库。3.3 难度可以自动调节像游戏里精心设计的新手村好的游戏设计一定有一条平滑的难度曲线绝不会让新手一上来就遇到大Boss。程序合成也天然具备这种特性。你可以从最简单的字符串拼接合成开始让系统学会在给定示例下生成一个字符串变换然后慢慢加入循环、条件分支、函数组合再往后加入递归、数据结构操作、性能约束。整个过程和人类程序员的学习路径几乎一致先写顺序语句再学循环再多学函数抽象。更妙的是程序合成系统通常自带“难度信号”——搜索时间、程序长度、验证复杂度都会随着规范难度的提升而自然增长。研究者可以据此自动调整任务难度精准地把系统挑战在“刚好比当前能力高一点点”的水平上。做过机器学习的人都知道“课程学习”curriculum learning对训练效率的提升有多大。程序合成天然支持这种渐进式训练这是很多其他AI领域羡慕却很难真正做到的事情。4. 核心技术路线拆解搜索、归纳、神经引导以及那个绕不开的“规范难题”4.1 路线一基于搜索的合成——把程序空间当迷宫来遍历最经典的程序合成方法是把“找程序”看成“在程序空间里搜索”。系统定义一个程序语法什么样的程序是合法的然后在这个巨大的语法树里枚举、回溯、剪枝。约束求解器SMT/SAT Solver在其中扮演了很关键的角色当搜索遇到“这段程序是否满足规范”的查询时求解器负责给出数学上的结论。这条路线最大的优点是正确性有保证。因为搜索过程是系统化的只要在限定空间内存在满足规范的程序理论上一定能找到。它的瓶颈也很明显程序空间实在太大。假设一个只有十个语法节点的程序其组合可能性就已经天文数字纯靠暴力枚举根本走不了多远。为此研究者想出了大量剪枝技巧类型指导的合成利用类型系统筛掉不合法的中间状态、组件库复用把常用函数封装成合成的基本积木、反例引导的迭代细化CEGIS先用弱约束找一个近似程序再用反例逐步收紧条件。即便如此搜索式合成依然主要局限在规模较小的程序上比如字符串变换、位运算、并发同步协议这类领域。4.2 路线二归纳式程序合成——从例子中揣摩“用户到底想要什么”如果说搜索式合成是从逻辑出发那归纳式合成就是从数据出发。最具代表性的产品是前面提到的FlashFill用户给出几个“输入-输出”对系统自动归纳出能够匹配这些例子的字符串变换程序。这条技术路线特别适合用户自己说不清楚需求、只能举个例子的场景。但“从例子学”有一个哲学层面的困境几个例子永远无法唯一确定一个程序。你给了三个输入输出对能解释它们的程序可能有一千个哪一个才是用户真正想要的归纳式合成靠的是**归纳偏置inductive bias**来解决这个问题——系统内部维护一个“哪种程序更可能被需要”的先验排序从最简短的、最符合人类思维习惯的程序开始尝试。这里的核心工程难点是“排名的质量”如果先验不够好可能要把整个程序空间翻个底朝天才能找到用户心智里的那个程序。现实中的归纳合成系统训练排名所用的数据通常来自于真实用户案例因此它本质上也是数据驱动的只是输出的是可解释、可执行的程序而不是黑盒的预测。4.3 路线三神经引导与大模型生成——用“模糊直觉”驱动“精确搜索”既然纯搜索难以应对大规模空间纯归纳又难以保证正确那么很自然的想法就是用神经网络提供“直觉”告诉搜索器“哪个方向更可能有解”然后继续用精确验证去把关。DeepCoder2017年发表的那篇著名工作就是这条路线的早期代表——它用神经网络预测哪些程序片段更可能在当前任务中出现显著缩小了搜索空间合成效率提升了几个数量级。到了大语言模型时代这个思路发生了某种“维度跃迁”。以GPT、Codex为代表的大模型本质上是在海量代码上训练出了一个极其强大的“先验分布”你给它一段自然语言描述它能直接生成大概率能工作的代码。这个过程并没有彻底跳出程序合成的框架而是把“神经网络打分”从搜索过程的辅助工具变成了主引擎。今天的AI编程助手可以看作**“模糊生成器 精确验证器”的组合**大模型负责生成候选程序编译器、测试用例负责验证哪个候选真的能工作。这也是为什么我坚持认为大模型写代码属于程序合成的范畴——只不过它用强化学习式的“人机交互反馈”替代了一部分形式化验证。不过我在这里必须泼一盆冷水大模型生成代码和传统程序合成有一个根本性的区别那就是可证明性。传统合成方法给出的程序可以在数学上证明满足规范大模型生成出来的代码只能“大概率正确”没有任何形式化保证。这决定了它在很多严肃场景下的天花板——你让大模型写一个内部工具脚本完全没问题但你敢让它写一个航天器控制器的核心逻辑吗4.4 那个绕不开的“规范难题”不管哪条技术路线程序合成都有一个共同的瓶颈规范从哪来所谓规范就是用户需求的形式化表达。很遗憾真实世界的需求大多数是模糊的、隐含的、还在演化的。“我想要一个好看的个人主页”这句话怎么转成机器可验证的规范这就是程序合成被称为“AI领域最后堡垒”的原因之一——需求理解本身就是一个通用智能问题。实用的应对思路通常有三种。第一种是降低信息粒度通过输入输出示例来表达需求用户不需要会写形式化逻辑第二种是交互式细化系统先给出一个候选程序用户说“这里不对改成那样”通过多轮对话慢慢逼近真实意图第三种是规范即注释把测试用例当成规范的标准形态毕竟一段能通过全部测试的程序对于大多数业务场景已经够用了。这三种思路的本质都是“绕开完备形式化规范”用更工程化、更可操作的方式来定义需求。5. 从研究台到现实工作台程序合成已经悄悄落地的地方很多人可能觉得程序合成还很遥远其实它就藏在我们每天用的工具里只是大多数时候我们不知道那是程序合成。最典型的就是Excel的FlashFill。你在表格里输入一个姓名的变换示例例如把“张三”变成“Zhang San”然后下拉填充Excel自动生成整个列的数据。这个功能的背后就是一个归纳式程序合成引擎它在后台枚举了成千上万个字符串变换程序挑出了最符合你示例的那个逻辑。数据库和ETL领域是程序合成的另一个大本营。你在做数据迁移时经常要把A表的字段映射成B表的字段还要做大量复杂的数据格式转换。很多现代数据管道工具内部已经内置了“从示例学转换”的引擎自动帮你把几条规则泛化成覆盖全量数据的可执行脚本。低代码、无代码平台你以为拖动几个组件就能生成应用是预置模板其实很多平台底层是规则引擎加代码生成器本质就是一种受限的程序合成把你拖拽的图形化操作在受限语法空间内“合成为一个可执行配置”。如果一个非程序员能用拖拽的方式构建出一个业务应用那他其实就在无意识地使用程序合成技术。再往深处说芯片设计EDA工具中的逻辑综合把行为级描述自动转换成门级网表这是程序合成在硬件领域的经典形态自动化程序修复Automated Program Repair当你的代码在测试中挂了系统自动搜索可能的补丁并验证这也是一种程序合成应用甚至编译器里的自动并行化优化把串行代码合成为并行版本内核同样是“在程序空间里搜索满足语义约束的更优实现”。而到了今天大模型编程助手已经成为覆盖面最广的程序合成应用。不管你用的是哪家的AI编程工具每天都有上百万次“自然语言/单测-代码”的合成请求在生产环境里真实发生。虽然大家可能没把它叫“程序合成”但它实实在在就是合成本文开头说的那个定义给定意图机器生成可运行的程序。程序合成不是空中楼阁它已经以各种“马甲”走进了生产环境。6. 真实拦路虎为什么我们还没有看到“全自动程序员”6.1 程序空间爆炸搜索式合成依然很“脆”搜索式合成最吸引人的地方是“完备性”但恰恰是完备性让它的复杂度高得吓人。我曾经跑过一个给JSON解析器片段做合成的实验目标只是在十几个候选语法节点里挑出正确组合搜索空间就有十的九次方量级幸好有类型剪枝和CEGIS缩减否则普通机器根本扛不住。为什么现在纯搜索式合成没法普及到大项目因为程序的组合爆炸是本质性的每多引入一个语法特性搜索空间就指数膨胀一次。想让合成器理解循环嵌套循环和理解一串线性语句难度完全不在一个数量级。这条路要想走远核心突破点在于“如何把大程序拆成可以独立合成的小模块再组合起来”——这就引出了下面的可组合性问题。6.2 规范不完备真实需求不是数学命题就算搜索能力再强如果拿到的规范本身就是错的、缺的、含混的合出来的程序也是南辕北辙。这种“规范不完备”的问题在学术评估里可以人为回避先规定好input/output再让系统合成但到了真实业务里需求方往往自己也说不清自己到底要什么。我记得有个做低代码平台的朋友跟我说过他们最花时间的不是底层合成引擎而是帮用户把模糊的需求翻译成可执行的规则。程序合成在真实世界的第一号瓶颈根本不是算法而是需求工程。这甚至不是一个单纯的技术难题它是一个涉及认知、沟通和交互设计的系统问题。未来大概率需要靠更强的交互系统来解决AI不是一次性听懂了就直接生成而是不断提问、生成、反馈、再生成在和用户的对话中慢慢收敛出正确的规范。6.3 可组合性弱合出来的模块很难拼成软件合成一个小工具函数已经不容易但真正的软件工程是几十万行代码的精密协作。目前的程序合成系统大多是“单点合成”——单独合一个排序函数、单独修一个bug补丁、单独算一段转换逻辑。可一旦到了需要合成的模块和已有代码之间进行复杂交互的地步几乎所有系统都会失效。原因在于程序合成每引入一个跨模块的依赖验证的复杂性就暴涨搜索空间也随之失控。这个问题的本质是缺乏真正的“库学习”机制系统并不会从合成的历史结果中抽象出可复用的模式库每次合成都当成全新的问题来解。这也是为什么我认为程序合成下一个十年的核心议题不是更大的模型而是“合成系统的模块化与增量学习”。6.4 评估标准还在“盲人摸象”你把代码生成得好不好怎么量化现在用得最多的几个指标各有漏洞passk指标生成k次至少有一次通过测试的概率会奖励“撞运气”HumanEval和MBPP这类静态评测集容易被污染训练数据里早就见过答案人工评审又贵又主观很难标准化。评估方法论本身的混乱导致不同团队之间的研究进展很难直接比较。这个坑短期内看不到完美解法。我个人比较看好的方向是“自适应动态评测”用程序生成器实时创造新的合成任务让过拟合没有可乘之机。但这条路也还在早期。还有一点不得不提大模型赋能的程序合成带来了新的风险。生成代码的供应链攻击、依赖注入、安全漏洞都是以前“人写代码”时代可控性更强的地方。AI生成的代码一旦进入生产环境必须有配套的验证工具、审计链路和人工复核机制。合成能力的提升正在把“代码安全”这个老问题变成一个全新的、更复杂的课题。7. 意义感带来的行动力为什么我愿意继续投入这个方向聊到最后我想说一点技术之外的东西。这个标题里提到“意义感带来的行动力”我很喜欢这个提法。我见过很多聪明人明明能力很强却在研究方向上反复犹豫今天看大模型热就追大模型明天看机器人热就转机器人结果几年下来什么都没做成。反倒是那些找到了“这件事本身就让我觉得有意义”的人能在一件事上持续投入最终做出真正有价值的成果。我自己在做程序合成相关的工作时最大的感受是这是一个几乎每天都能体验到“创造感”的领域。你写一个合成器给它一个看似不可能的目标——比如“从自然语言描述出发合成一个满足排序功能的函数”。你第一次跑通的时候看着机器自己一步一步构造出一个你从未想过的程序那种感觉和你自己写代码是完全不一样的。你会觉得不是你在编程是你在和一个正在形成的智能对话。它就那么出现了它有清晰的逻辑、有严格的可验证性、还能跑甚至比你最初脑子里的方案更简洁。那一刻你会意识到自己真的站在了“智能创造智能”的起点上。搞科研也好做工程也罢长期投入靠的从来不是打卡式的自律而是意义感拉出来的行动力。如果你觉得一件事本身有意义你不会需要别人逼你你会像玩游戏一样自然而然地投入几千个小时。程序合成这个领域对我来说就有这种魔力。它不是最有流量的方向不是赚钱最快的方向但它在大问题里——它正在探索智能最核心的那个问题人如何把自己的想法精确地传递给机器让机器真正理解和执行。这件事放到十年、二十年后回头看我相信会是推动通用人工智能从“看似智能”走向“真正智能”的关键一役。所以不管你是研究者、工程师还是刚入行的学生如果你也在寻找一个既能做硬核研究、又能产生真实应用价值的方向我真心建议你花点时间深入了解一下程序合成。它不需要你一步到位搞懂所有数学细节你完全可以从一个小而美的合成任务入手写一个从输入输出示例生成字符串变换的程序体会一下“机器自己写代码”的兴奋感。这种兴奋感就是我所说的意义感。而意义感一旦建立起来那个推动你长期行动的力量就再也不用靠外部来给了。它会在你每次看到合成器生成出一个出人意料的好程序时自己点燃。
返回列表