AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


从Prompt Engineering到Flow Engineering
发布日期:2024-05-08 04:50:44 浏览次数: 1718


在今天的软件开发领域,自动化代码生成已经成为了一个热门话题。随着大型语言模型(LLMs)的出现,我们现在能够生成复杂的代码,解决从简单脚本到竞赛级别的编程问题。但是,代码生成并不是一件简单的事情。它不仅要求生成的代码在语法上正确,还要求代码能够理解问题的细节,找到问题的边界情况,并且注意到问题规范中的众多小细节。这就是为什么我们需要AlphaCodium。

一、AlphaCodium简介

AlphaCodium是一个由CodiumAI提出的新方法,它是一个基于测试的、多阶段的、面向代码的迭代流程,旨在提高LLMs在代码问题上的表现。AlphaCodium流程包括两个主要阶段:预处理阶段和代码迭代阶段。在预处理阶段,我们会用自然语言对问题进行深入思考。而在代码迭代阶段,我们会生成、运行和修复代码,直到找到正确的解决方案。

 AlphaCodium的核心在于它的流程工程。与传统的prompt engineering不同,AlphaCodium的流程工程更加注重于代码生成任务的特定需求。它使用了一系列的设计概念和最佳实践,如YAML格式的结构化输出、通过项目符号分析进行语义推理、生成模块化代码、软决策与双重验证、鼓励探索和使用测试锚点等 。

  • YAML结构化输出 - 通过YAML格式输出,可以更简单清晰地获取复杂回答,这有助于表示逻辑和有条理的思考过程.

  • 通过子弹点分析进行语义推理 - 子弹点格式的输出鼓励模型深入理解问题,并将输出划分为逻辑上的各个部分.

  • 生成模块化代码 - 要求模型将生成的代码划分为具有有意义名称和功能的小型子函数,从而减少错误,并提高迭代修复阶段的成功率.

  • 软决策与双重验证 - 当模型在生成测试时,可能会产生错误的测试。双重验证的过程中,模型会被要求重新生成输出,必要时进行纠正 .


AlphaCodium提出的工作流程不仅提高了各种开源和闭源模型的结果,而且在计算预算显著较少的情况下超越了文献中的先前工作。在测试一个具有挑战性的代码生成数据集CodeContests时,AlphaCodium表现出色,并在验证集上极大提高了模型的准确率 .

在一个名为CodeContests的挑战性代码生成数据集上测试了AlphaCodium。这个数据集包含了来自Codeforces等平台的竞赛级编程问题。AlphaCodium流程在这个数据集上显著提高了各种闭源和开源模型的结果。例如,在验证集上,GPT-4的准确率(pass@5)从19%提高到了44% .


二、原理

direct prompt模型往往难以正确解决代码问题。

增加对public tests的迭代可以稳定和改进解决方案,但仍然存在 "盲点",因为公共测试本身并不全面。

全面实施 AlphaCodium 流程(包括预处理阶段以及对公共测试和其他人工智能生成的测试进行迭代)后,情况得到了进一步改善。这种更全面的方法提高了准确率和求解率



AlphaCodium是一种专门针对代码生成问题的流程,其核心目标是改善现有的大型语言模型(LLMs)在处理代码生成任务时的表现。它的工作原理分为两个主要阶段,以及引入了一系列专门针对编程任务的设计概念和最佳实践。以下是对这一流程详细的介绍。

2.1 预处理阶段

 在这个阶段,AlphaCodium对问题进行深入的自然语言分析。这就像是一个程序员在编码前会先理解问题并思考如何解决一样。此步骤涉及:

  • 问题反思(Problem Reflection)

使用子弹点的方式来准确描述问题,包括明确目标、输入、输出、规则、约束,以及问题描述中其他相关的细节。这有助于确保对问题有深入理解,并且为后续步骤奠定基础.

  • 公共测试推理(Public Tests Reasoning)

对于公共测试集中的每一项输入和预期输出,分析为什么特定的输入会产生特定的输出。这一过程能够帮助模型加深对问题逻辑的理解,确保解决方案考虑到了各种可能情况.

  • 生成可能的解决方案(Generate Possible Solutions)

在充分理解问题之后,模型会生成2-3种可能的解决方案。这些解决方案将以YAML格式的结构化输出的形式呈现。这不仅有助于清晰展示每种解决方案的优点和可能存在的问题,而且能够为选择或生成初始代码解决方案提供参考  .

  • 排名解决方案(Rank Solutions)

针对前一步生成的可能解决方案,进行评估和排序,选择一个最佳解决方案。评估标准包括解决方案的正确性、简洁性和稳健性,并且不一定是最高效的算法实现.

  • 生成附加的AI测试(Generate Additional AI Tests)

从泛化性能的角度出发,生成额外的AI测试来处理公共测试集未覆盖的情况,如大量输入和边界情况。通过这些额外的AI测试,能够进一步验证解决方案的有效性和健壮性.

2.2 代码迭代阶段

 在代码生成和测试的迭代过程中,AlphaCodium不断生成、运行和修正代码,直到代码能够通过所有测试。这个阶段包括以下步骤:

  • 初步代码解决方案(Initial Code Solution) - 在确定一个潜在的解决方案后,生成相应的代码,并在选择的公共测试和AI测试上运行

  • 在公共测试上迭代(Iterate on Public Tests) - 从基础代码出发,迭代运行它在公共测试上。如果代码在某个特定测试中失败,尝试修正它.

  • 在AI生成的测试上迭代(Iterate on AI-generated Tests)- 继续在AI生成的测试上进行运行-修复迭代,使用测试锚点来避免错误修复 


三、代码效果展示

目前AlphaCodium已经有对应的开源项目:

https://github.com/Codium-ai/AlphaCodium

由于这个项目的readme写的内容不是我想要的直接优化GPT的代码生成,而且目前这个项目也还没和Azure OpenAI对接,因此查看源码中的核心逻辑:

将alpha_codium/settings/code_contests_prompts_baseline.toml的内容作为meta prompt放到Azure OpenAI中。

首先声明,并不是没有alpha_codium这些prompt,GPT就无法正确生成代码,alpha_codium的核心是通过一大堆py来实现完整的流程,包括生成代码,选择代码之类的。

prompt:请写一个python执行的程序,我可以直接执行,生成一个圣诞树,闪星星。

生成的代码:

import time  import os  
def generate_tree(height): tree = [] for i in range(height): tree.append((' ' * (height - i - 1)) + ('*' * (2 * i + 1))) return tree
def generate_star(tree_height): return ' ' * (tree_height - 1) + '*'
def print_tree(tree, star): os.system('cls' if os.name == 'nt' else 'clear') print(star) for row in tree: print(row)
def blink_star(tree, tree_height, blink_times): star_on = generate_star(tree_height) star_off = ' ' * tree_height for _ in range(blink_times): print_tree(tree, star_on) time.sleep(0.5) print_tree(tree, star_off) time.sleep(0.5) print_tree(tree, star_on)
if __name__ == "__main__": tree_height = int(input("Enter the height of the Christmas tree: ")) blink_times = int(input("Enter the number of times the star should blink: ")) tree = generate_tree(tree_height) blink_star(tree, tree_height, blink_times)

生成的代码在vs code中执行,会提升输入圣诞树的高度和星星闪的次数:

可以看到星星按照指定次数闪:

code_contests_prompts_choose_best_solution.toml,在Azure openai中验证这个代码。


我给了两段冒泡程序,第一段效率高一些,第二段低,一起给GPT:

输入:

两段代码,第一段:def bubble_sort_optimized(arr):      n = len(arr)      for i in range(n):          # 提前退出冒泡循环的标志位          swapped = False          # 从第一个元素到`n-i-1`,最后的i个已经排好序了          for j in range(0, n-i-1):              # 交换如果发现元素是逆序的              if arr[j] > arr[j+1]:                  arr[j], arr[j+1] = arr[j+1], arr[j]                  swapped = True          # 如果没有发生交换,则已经排序完成          if not swapped:              break      return arr    第二段:def bubble_sort_basic(arr):      n = len(arr)      # 遍历所有数组元素      for i in range(n):          # 内层循环,进行逐一比较          for j in range(0, n-i-1):              # 交换如果发现元素是逆序的              if arr[j] > arr[j+1]:                  arr[j], arr[j+1] = arr[j+1], arr[j]      return arr

输出:

name: |Optimized Bubble Sortcontent: |def bubble_sort_optimized(arr):n = len(arr)for i in range(n):# 提前退出冒泡循环的标志位swapped = False# 从第一个元素到n-i-1,最后的i个已经排好序了for j in range(0, n-i-1):# 交换如果发现元素是逆序的if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]swapped = True# 如果没有发生交换,则已经排序完成if not swapped:breakreturn arrwhy: |The optimized bubble sort is chosen because it includes a mechanism to stop the algorithm early if the list is already sorted. This optimization can significantly reduce the number of passes the algorithm needs to make on nearly sorted lists, improving the average case performance.flow:|Initialize the length of the array.|Iterate over the array with a variable 'i' from 0 to n-1.|Set a flag 'swapped' to False before starting inner loop.|Iterate over the array from 0 to n-i-1 with a variable 'j'.|Compare adjacent elements and swap if they are in the wrong order.|If any swap occurs, set the flag 'swapped' to True.|After completing inner loop, check if 'swapped' is False, if so, break the outer loop as the array is sorted.|Return the sorted array.problem_tests:input: |[64, 34, 25, 12, 22, 11, 90]output: |[11, 12, 22, 25, 34, 64, 90]input_output_examples_flow:|Initialize n to 7 (length of the array).|In the first pass, 'swapped' is set to True and several swaps are made.|In subsequent passes, fewer swaps are needed as the largest elements bubble to the end of the list.|If in any pass, no swaps are made, the 'swapped' flag remains False and the algorithm terminates early.|The final sorted array is returned, which matches the expected output.

我们看到输出不仅正确选出了较好的代码,还给出了选择理由。

提供上面两个验证,我们可以看出AlphaCodium的源码本质上是把下面这个环境通过prompt+py给串起来:

Flow Engineering本质上的核心是:我们不大可能把代码中这么多prompt放到一起通过一次调用实现,需要流程化。本质上,我们有了源码,利用autogen执行这个逻辑也可以。


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询