这是一篇翻译文章,供大家参考!原文是:https://towardsdatascience.com/googles-alphaevolve-getting-started-with-evolutionary-coding-agents/
副标题:更高级别的代码改进器和用于新颖发现的LLM框架?
引言
AlphaEvolve 是谷歌 DeepMind 推出的一款前景广阔的新型编码智能体。让我们来看看它是什么,以及为何它能引起如此大的反响。谷歌论文的大部分内容都声称,AlphaEvolve 通过不断改进代码,直至以一种极佳的方式解决问题,从而促进了新颖的研究。
值得注意的是,作者报告称 AlphaEvolve 已经取得了此类研究突破。在本文中,我们将介绍一些基础背景知识,然后深入探讨谷歌 DeepMind 的论文,最后看看如何运行 OpenEvolve——一个开源的演示项目,它实现了 AlphaEvolve 论文的核心思想。读完本文,您将准备好进行自己的实验!
我们还将简要讨论其可能带来的影响。然而,您不会得到一个关于“它到底有多好”的绝对论断。应用这个工具仍然是劳动密集型且成本高昂的,特别是对于复杂问题。
事实上,很难确定这一突破的程度,它建立在以往研究的基础之上。最重要的引用是谷歌 DeepMind 在2023年发表的另一篇论文。谷歌在这里无疑暗示了其在研究应用方面的巨大潜力。
而且他们似乎正试图扩大研究应用:他们声称,AlphaEvolve 已经在其实验室中产生了众多新颖的研究成果。现在,其他研究人员需要复现这些结果并将其置于具体的背景中,还需要创建更多证据来证明其价值。这并非易事,而且同样需要时间。
首批应用 AlphaEvolve 算法的开源尝试在几天内就已出现。其中之一是 OpenEvolve,它以一种清晰易懂的方式实现了该解决方案。这有助于其他人评估类似的方法并确定其优势。
但让我们从头说起。这一切究竟是关于什么的?
背景知识:编码智能体与进化算法
如果您正在阅读本文,那么您可能已经听说过编码智能体。
它们通常应用大语言模型(LLM)以惊人的速度自动生成计算机程序。聊天机器人生成的不是文本,而是 Python 代码或其他东西。通过在每次尝试后确认生成程序的输出,编码智能体可以自动生成并改进可操作的计算机程序。
一些人认为这是 LLM 能力的一次强大进化。故事是这样的:最初,LLM 只是在虚构和构思文本以及其他模态的输出,比如图像。然后出现了可以按照待办事项列表工作、持续运行甚至管理自己记忆的智能体。
通过结构化的 JSON 输出和工具调用,这被进一步扩展,使智能体能够访问额外的服务。最后,开发出了能够以可复现的方式创建和执行算法的编码智能体。从某种意义上说,这使得 LLM 可以通过扩展其能力来“作弊”,将计算机早已拥有的能力也囊括进来。
要创建一个可靠的 LLM 系统,还有更多工作要做,这一点我们将在未来的文章中讨论。然而,对于 AlphaEvolve 来说,可靠性不是首要关注点。它的任务范围有限,并且结果必须是清晰可衡量的(下文将详细介绍)。
不管怎样,我们说的是编码智能体。有很多种。要实现您自己的,可以从 smolagents、swarms 或 Letta 等框架开始。
如果您只是想在编码智能体的支持下开始编码,流行的工具有集成在 VS Code 中的 GitHub CoPilot,以及 Aider 和 Cursor。这些工具通过实时地从您的代码库中向 LLM 提供正确的上下文,来内部协调 LLM 聊天机器人的交互。由于这些工具基于无状态的 LLM 接口生成半自主的功能,它们被称为“智能体化的(agentic)”。
“真是蠢到家了,竟然没想到这一点!”
谷歌现在声称基于编码智能体取得了一种突破。这是什么新鲜大事吗?
嗯,不完全是。他们应用了一些非常古老的东西。让我们回到1809年:查尔斯·达尔文诞生。
他的著作《物种起源》概述了自然选择导致生物进化的证据,这让生物学家托马斯·亨利·赫胥黎发出了上述感叹。
当然,除了生物进化,还有其他形式的进化。打个比方,当“适者生存”导致某个特定结果时,你基本上都可以声称这是一种进化。
爱情、星辰——凡是你能想到的。在计算机科学中,进化算法(其中遗传算法是最常见的一类)遵循一种简单的方法。首先,随机生成n个配置。
然后,检查是否有任何配置满足你的需求(评估它们的“适应度”)。如果满足,就停止。如果不满足,就选择一个或多个父配置——理想情况下是适应度很高的——通过混合父辈来创建一个新配置(这是可选的,称为“交叉”;单个父辈也可以),可以随机添加一些突变,然后移除一些之前的配置——最好是适应度低的——然后重新开始。
这里有三点需要注意:
- 适应度函数的必要性
意味着成功是可衡量的。AlphaEvolve 不会自己做科学研究,为你发现任何东西。它致力于一个明确定义的目标,对于这个目标你可能已经有了一个解决方案,只是不是最好的。 为什么不把目标设为“变得超级富有”?一个简短的警告:进化算法很慢。它们需要大量的种群规模和许多代才能偶然达到局部最优解。 而且它们不一定能找到全局最优解。这就是你我最终走到今天这一步的原因,对吧?如果目标太宽泛,初始种群太原始,那就准备好让它运行几百万年,结果还不明朗。
为什么要引入突变?在进化算法中,它们有助于克服过早陷入局部最优解的缺陷。没有随机性,算法可能会很快找到一个糟糕的解决方案,并陷入一条无法通过进一步进化来改进的路径,仅仅因为可能的父配置种群不足以创造出更好的个体。
这激发了 AlphaEvolve 的一个核心设计目标:混合强弱不同的 LLM,并将精英父配置与更普通的配置混合在一起。这种多样性使得迭代更快(思想探索),同时仍为创新留出空间。
背景知识:如何实现一个基础进化算法的示例
为了练手或对进化算法有个基本感觉,这里有一个例子:
Pythonimport randomPOP, GEN, MUT = 20, 100, 0.5f = lambda x: -x**2 + 5# 创建一个均匀分布的初始种群pop = [random.uniform(-5, 5) for _ in range(POP)]for g in range(GEN):# 按适应度排序pop.sort(key=f, reverse=True)best = pop[0]print(f"gen #{g}: best x={best}, fitness={f(best)}")# 淘汰适应度最差的50%pop = pop[:POP//2]# 将个体数量翻倍并引入突变pop = [p + random.gauss(0, MUT) for p in pop for _ in (0, 1)]best = max(pop, key=f)print(f"best x={best}, fitness=", f(best))
目标是通过让 x 尽可能接近 0 来最大化适应度函数 -x²+5。系统初始化的随机“种群”在每一代中都会被修改。适应度较弱的一半被淘汰,另一半通过加上一个高斯值(随机突变)来产生“后代”。
注意:在给定的例子中,淘汰一半种群和引入“后代”的步骤可以省略。如果每个个体都发生突变,结果会是一样的。然而,在其他实现中,比如遗传算法中混合两个父辈产生后代,淘汰步骤是必需的。
由于程序是随机的,每次执行输出都会不同,但会类似于:
gen #0: best x=0.014297341502906846 fitness=4.999795586025949gen #1: best x=-0.1304768836196552 fitness=4.982975782840903gen #2: best x=-0.06166058197494284 fitness=4.996197972630512[...]best x=0.013335836440791615, fitness=4.999822155466425
我想,这已经很接近零了。很简单,是吧?
你可能也注意到了进化过程的两个特点:
结果是随机的,但适应度最高的候选者会趋于收敛。 进化不一定能找到最优解,即使是一个显而易见的。
当 LLM 加入后,事情变得更加激动人心。LLM 可以智能地引导进化的方向。就像你我一样,它会发现 x 必须是零。
工作原理:认识 AlphaEvolve
AlphaEvolve 是一个编码智能体,它使用智能的提示生成、进化算法来优化提供的上下文,以及两个强大的基础 LLM。主模型快速生成许多想法,而更强的次要 LLM 则提高质量水平。该算法的运作与使用哪个 LLM 模型无关,但更强大的模型会产生更好的结果。
在 AlphaEvolve 中,LLM 的进化意味着它的上下文在每次推理中都会适应。本质上,LLM 会被提供关于过去成功和不成功代码尝试的信息,而这个程序列表会通过进化算法在每次迭代中得到优化。上下文还提供关于程序适应度结果的反馈,指出它们的优缺点。
人类针对特定问题的指令也可以被添加进来(LLM 研究员和人类研究员在某种程度上组成一个团队,互相帮助)。最后,上下文还包括元提示,即来自 LLM 的自我管理的指令。这些元提示以与适应度最高的代码结果相同的方式进化。
所实现的进化算法可能很关键。它结合了一种称为 MAP-Elites 的策略和基于岛屿的种群模型,如传统的遗传算法。基于岛屿的种群模型允许子种群分开进化。
另一方面,MAP-Elites 是一种智能搜索策略,它选择在多个维度上都表现出色的适应度最高的候选者。通过结合这些方法,探索和利用得到了混合。精英以一定的比率被选中,并为基因库增加多样性。
适应度被确定为一个多维的值向量,每个值都应被最大化。似乎没有使用加权,即所有值同等重要。作者驳斥了当单个指标更重要时这可能成为问题的担忧,他们认为好的代码通常会改善多个指标的结果。
适应度评估分两个阶段进行(“评估级联”):首先,进行快速测试以过滤掉明显差的候选解决方案。只有在第二阶段,可能需要更多执行时间,才会进行全面评估。其目标是通过快速考虑许多想法,并且不在坏想法上浪费不必要的资源,来最大化吞吐量。
整个方法很容易并行化,这也助于提高吞吐量。作者的构想很大:他们提到,即使是单次测试需要数百计算小时的问题评估,在这种设置下也是可能的。坏的候选者被尽早丢弃,许多长时间运行的测试在数据中心同时进行。
LLM 的输出是它希望被替换的代码序列列表。这意味着 LLM 不必复现整个程序,而是可以触发对特定行的修改。这大概使得 AlphaEvolve 能更有效地处理更大的代码库。
为了实现这一点,LLM 在其系统提示中被指示使用以下 diff 输出格式:
<<<<<<< SEARCHsearch text=======replace text>>>>>>> REPLACE
论文的主要发现
论文的大部分内容讨论了 AlphaEvolve 已经产生的相关研究进展。研究问题被表达为带有明确评估器函数的代码。这对于数学、计算机科学及相关领域的问题通常是可行的。
具体来说,作者描述了 AlphaEvolve 产生的以下研究成果:
他们报告 AlphaEvolve 发现了(稍快一点的)矩阵乘法算法。他们提到这需要经过15个独立的、值得注意的改进的非平凡更改。 他们用它来寻找不同数学问题中的搜索算法。 他们借助 AlphaEvolve 改进了数据中心的调度。 他们让 AlphaEvolve 优化了一个 Verilog 硬件电路设计。 优化编译器生成代码的尝试产生了一些结果,速度提升了15-32%。
作者建议,这可以被系统地用于优化代码性能。请注意,这些结果的重要性仍在讨论中。 除了 AlphaEvolve 直接产生的即时研究成果外,作者的消融研究也很有见地。
在消融研究中,研究人员通过系统地移除系统的某些部分,来确定哪些部分对结果贡献最大(见论文第18页,图8)。我们了解到:
LLM 的自我引导元提示贡献不大。 主模型与次模型的混合略微改善了结果。 提示中由人类编写的上下文对结果贡献相当大。 最后,产生传递给 LLM 的进化上下文的进化算法起到了决定性作用。
结果表明,AlphaEvolve 的进化方面对于成功解决问题至关重要。这表明,进化的提示优化可以极大地提升 LLM 的能力。
OpenEvolve: 设置
是时候开始用 OpenEvolve 做你自己的实验了。设置很简单。
首先,决定是否要使用 Docker。Docker 可能会增加一个额外的安全层,因为编码智能体可能带来安全风险(见下文)。要本地安装,只需克隆 Git 仓库,创建一个虚拟环境,并安装依赖:
Bashgit clone https://github.com/codelion/openevolve.gitcd openevolvepython3 -m venv .venvsource .venv/bin/activatepip install -e .
然后你可以在该目录中运行智能体,使用示例中的“问题”:
Bashpython3 openevolve-run.py \examples/function_minimization/initial_program.py \examples/function_minimization/evaluator.py \--config examples/function_minimization/config.yaml \--iterations 5
要使用更安全的 Docker 方法,输入以下命令序列:1
Bashgit clone https://github.com/codelion/openevolve.gitcd openevolvemake docker-builddocker run --rm -v $(pwd):/app \openevolve \examples/function_minimization/initial_program.py \examples/function_minimization/evaluator.py \--config examples/function_minimization/config.yaml \--iterations 5
OpenEvolve: 实现一个问题
要创建一个新问题,请将示例程序复制到一个新文件夹中。
Bashcp -r examples/function_minimization/ examples/your_problem/
智能体将优化初始程序,并产生最好的程序作为其输出。根据你投入的迭代次数,结果可能会越来越好,但没有确定的逻辑来决定理想的停止点。
通常,你要么耗尽“计算预算”,要么等到结果似乎达到平台期。智能体将一个初始程序和一个评估程序作为输入,并根据给定的配置,产生初始程序的新进化版本。对于每个进化版本,评估器会执行当前的程序进化并返回指标给智能体,智能体的目标是最大化这些指标。
一旦达到配置的迭代次数,找到的最佳程序将被写入一个文件。
让我们从一个非常基础的例子开始。在你的 initial_program.py
中,定义你的函数,然后用 # EVOLVE-BLOCK-START
和 # EVOLVE-BLOCK-END
注释标记你希望智能体能够修改的部分。
代码不一定需要做任何事情;它可以简单地返回一个有效的常量值。然而,如果代码已经代表了一个你希望优化的基本解决方案,那么在进化过程中你会更快地看到结果。
initial_program.py
将由 evaluator.py
执行,所以你可以定义任何函数名和逻辑。两者只需相互匹配。假设这是你的初始程序:
Python# EVOLVE-BLOCK-STARTdef my_function(x):return 1# EVOLVE-BLOCK-END
接下来,实现评估函数。
还记得之前的级联评估吗?有两个评估函数:evaluate_stage1(program_path)
进行基本试验,看程序是否能正常运行并且基本看起来没问题:执行、测量时间、检查异常和有效的返回类型等。
在第二阶段,evaluate(program_path)
函数应该对提供的程序进行全面评估。
结论与展望
结果来得很慢,所以将它们与替代方案进行比较并非易事。然而,理论上,你可以用代码直接或间接地描述任何问题。那么非代码用例或我们缺乏适当指标的情况呢?
也许适应度函数可以基于另一个 LLM 的评估返回一个指标,例如,对文本质量的评估。一个由 LLM 评审员组成的集成系统可以进行评估和打分。事实证明,AlphaEvolve 的作者也暗示了这种可能性。
他们写道:
虽然 AlphaEvolve 确实允许由 LLM 提供对想法的评估,但这不是我们优化的设置。然而,同期的工作表明这是可能的。
论文中讨论的另一个展望是使用 AlphaEvolve 来改进基础 LLM 本身。不过,这并不意味着超高速进化。论文提到“用于改进下一版 AlphaEvolve 的反馈循环周期约为数月”。
关于编码智能体,我想知道哪些基准测试会有帮助,以及 AlphaEvolve 在其中会表现如何。SWE-Bench 就是这样一个基准。我们能用哪种方式测试它吗?
最后,OpenEvolve 的前景如何?希望它能继续下去。其作者已表示,复现部分 AlphaEvolve 的结果是一个目标。更重要的是:进化编码智能体有多大潜力,我们如何能最大化这些工具的影响并实现更广泛的可及性?我们能以某种方式扩大我们喂给它们的问题数量吗?
感谢阅读!





