Self-evolve——基于大语言模型的代码演进框架

导语

本研究提出了一个名为Self-evolve的框架,它旨在通过大型语言模型(LLMs)实现代码生成的进化。这一框架在Text-to-Code任务中引入了一种全新的处理流程,以提高LLMs在代码生成方面的效率和准确性。在之前,尽管LLMs在代码生成方面已取得显著成效,但它们仍然面临着一次性准确生成代码的挑战。Self-evolve通过其独特的双阶段流程,有效地解决了这一问题。在第一阶段,该框架利用LLMs从输入的提示中提取知识,生成中间代码。进入第二阶段,Self-evolve转变LLMs的角色,使其成为专家级程序员,对这些生成的代码进行调试和优化,而且这个过程不需要专门设计的测试用例,仅通过解释器的错误消息即可完成。

  • 链接:https://arxiv.org/abs/2306.02907

1 引言

在现代应用程序开发中,代码生成是一个关键且具有挑战性的组成部分。随着预训练语料库的扩展,大型语言模型(LLMs)在多种任务和领域的表现显著提升,使得LLMs成为代码生成的首选模型。事实上,LLMs的表现远超过之前专门用于代码生成的深度神经网络模型。同时,LLMs已经被用于增强以前的方法,它们能够消化各种提示内容,并进行文本生成。尽管以往的研究中,人们通过添加各种辅助信号到提示中以获取更准确的代码,但这些方法大多通过外部检索器和大型知识库来获取这些信号。然而,这些方法存在一个问题:检索器在适应不同任务时可能会遇到领域不匹配的问题,这限制了它们的通用性。此外,当前的检索器并不适合处理半结构化的知识项,如库文档,这可能导致检索结果不佳。

为了避免领域不匹配和不准确的检索结果,本研究提出Self-evolve框架,旨在通过大型语言模型(LLMs)推动代码生成的进步。与以往依赖于外部检索器和大型知识库的方法不同,Self-evolve采用两阶段范式,将LLM本身视为知识来源。作者指出,LLM已编码了各种领域知识,可作为一个大型知识库。因此,Self-evolve通过提示LLM自行生成所需知识,避免了传统检索方法的领域不匹配和检索不准确的问题。

Self-evolve的创新之处在于它的自动优化(self-refinement)机制,该机制模仿人类程序员依赖调试器来确保代码实现的正确性。通过构建可运行的程序并执行测试用例,该框架能够自动纠正初步代码,提高代码的准确性和可靠性。

在实验方面,作者使用gpt-3.5-turbo(ChatGPT)来构建Self-evolve,并在多项任务上评估其性能,包括数据科学代码生成、通用代码生成和代码翻译任务。实验结果显示,Self-evolve在各项任务中均实现了显著的性能提升。此外,该框架能够提供比传统检索方法更准确的知识,并且能轻松扩展到更强大的模型,如GPT-4。

image.png

2 相关工作

增强型代码生成(Augmented code generation):在LLM时代之前,研究人员已经尝试通过编程环境和功能文档来生成代码。最近,基于各种语料库预训练的LLMs支持了零次或少次学习的上下文学习流程。例如,一些研究利用检索类似代码片段或API文档来增强代码生成模型。然而,这些方法的性能受限于当前检索器模型的能力,且难以适应目标领域。

自动代码优化(Automatic code refinement):由于语言模型常常以高置信度输出不可靠信息,一些研究致力于专门修复错误代码的模型。近期的工作中,LLMs被用作“教师”角色,修复代码中的隐藏错误。不过,这些方法在代码生成中的应用有其局限性,例如格式化问题或暴露测试用例,与真实编程场景不符。

相较于现有方法,Self-evolve不需要特定领域的微调,提供了更高的可访问性和通用性,其自动代码精炼方法也更贴近实际编码场景。

3 self-evolve: Code Evolution via Large Language Models

3.1 背景

代码生成形式化:在自然语言 d d d和代码上下文 c

### 大语言模型提示词设计框架及结构 #### TAG框架 TAG框架是一种用于构建高效提示词的方法,能够帮助提升生成结果的一致性和质量。此框架强调了标签的重要性,在创建提示词的过程中引入特定的标记来指导模型理解上下文并作出更精准的回答[^1]。 #### BROKE框架 BROKE框架提供了一套更为全面的设计思路: - **背景(Background)** 描述任务发生的环境或前提条件,使模型能基于具体场景调整其响应方式。 - **角色定义(Role)** 明确指出谁是对话中的参与者及其身份特征,这有助于模拟真实的交流情境。 - **目标设定(Objectives)** 清晰表达希望通过此次交互达成的目标是什么样的输出形式或是解决问题的方向。 - **关键成果展示(Key Result)** 预先规划好期望看到的具体成效指标作为评估标准之一。 - **持续的试验与优化(Evolve)** 鼓励不断测试不同的参数组合并对效果进行分析改进,从而找到最合适的配置方案[^2]。 #### 提示词设计的通用原则 除了上述两种具体的架构外,还有若干普遍适用的原则适用于大多数情况下的提示词创作过程。例如保持简洁明了的语言风格;利用正则表达式等工具增强灵活性;借助外部数据源扩充信息量等等。这些都是为了确保最终形成的指令既易于被机器解析又能有效引导预期行为的发生[^3]。 ```python # 示例:使用BROKE框架编写的一个简单提示词脚本 prompt = """ 背景(Background): 用户正在寻找有关Python编程入门教程的信息。 角色(Role): 假设自己是一名经验丰富的程序员导师。 目标(Objective): 推荐三份适合初学者阅读的学习资料链接给对方。 关键成果(KeyResult): 所选资源应该覆盖基础知识介绍、实际操作练习两个方面,并且评价较高。 """ print(prompt) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值