AI知识库

53AI知识库

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


谷歌重磅:LLM时代,我们用Prompt生成代码大纲,用文学编程
发布日期:2024-08-14 21:34:37 浏览次数: 1947 来源:AI修猫Prompt



假如,你接手了一个大型项目,面对成千上万行代码,你会如何开始理解它?或者,你正在review一个复杂的pull request,如何快速抓住核心变更?再或者,你想向非技术同事解释你的代码做了什么,该怎么表达才能让他们明白?大型软件项目非常复杂,一项研究发现,开发人员将70%的时间花在程序理解上。
这些场景都指向一个共同的挑战:如何既快速又准确地理解和传达代码的意图。传统的方法,如详细的注释或文档,往往要么过于冗长,要么难以保持更新。而仅仅阅读代码本身,又常常耗时费力,特别是对于复杂的逻辑。


Google的研究团队提出了一个创新的解决方案:利用AI生成代码的自然语言大纲(Natural Language Outlines,简称NL Outlines)。这个想法看似简单,却蕴含着改变软件开发方式的潜力。


这项技术不仅仅是对传统代码注释的简单升级,而是对软件开发范式的全新定义。它融合了自然语言处理、机器学习和软件工程的精髓,为开发者提供了一种前所未有的代码理解和交互方式。


图片由修猫制作

作为一名Code开发人员,你可能已经习惯了使用自然语言生成代码。但是,NL Outlines带来的不仅仅是代码生成,它重新构想了代码、文档和开发流程之间的关系。让我们深入探讨这项技术的核心理念、实现方法和潜在影响。



01

NL Outlines:代码的自然语言骨架

什么是NL Outlines?


NL Outlines本质上是一种代码函数的高级概述,由一系列简洁的自然语言语句组成。这些语句巧妙地将代码分割成逻辑部分,并概括每个部分的主要思想。与传统的代码注释不同,NL Outlines更加结构化、抽象化,能够提供代码的"鸟瞰图"。


过去,你面对一个复杂的函数,里面包含了数十行代码。传统做法是逐行阅读,试图理解每个细节。而有了NL Outlines,你可以先快速浏览几句自然语言描述,立即获得函数的核心逻辑和结构。这不仅加速了代码理解,还为后续的开发和维护提供了清晰的指引。


上图展示了一个集成了NL Outlines功能的IDE界面,虽然论文中没有直接提供这个具体的IDE实现代码,但它展示了NL Outlines如何在实际开发环境中应用。

1、左侧面板显示了函数的NL Outline,提供了函数功能的高级概述。这些概述包括计算距离矩阵、初始化路径、迭代添加节点等步骤。

2、主编辑区域显示了 nearest_neighbor_tour 函数的具体代码实现。

3、代码中插入了与左侧Outline对应的注释(以绿色标注),这些注释直接嵌入在相关代码段之前,提供了即时的上下文说明。

4、界面顶部有一个搜索栏,暗示了可以基于NL Outlines进行代码搜索的功能。

这个界面展示了NL Outlines如何无缝集成到开发环境中,既提供了代码的高级概述,又保持了与具体实现的紧密联系。这种设计可以帮助开发者更快地理解代码结构,提高导航效率,并在编写和维护代码时提供上下文支持。

NL Outlines的独特之处


1. 双向同步:NL Outlines最令人兴奋的特性之一是它可以与代码保持双向同步。当你修改代码时,相应的大纲描述会自动更新;反之,当你调整大纲时,代码也会相应变化。这种动态关联确保了代码和文档的一致性,解决了长期困扰开发者的文档过时问题。


2. 灵活展示:NL Outlines可以灵活地以多种形式呈现。它可以作为独立的概述展示,也可以巧妙地穿插在代码之间,形成一种现代化的"文学编程"风格。这种灵活性使得开发者可以根据需求快速切换视角,既能获得高层次的理解,又能深入代码细节。


3. AI驱动生成:借助先进的LLMs,NL Outlines可以自动生成,无需开发者手动编写。这不仅节省了时间,还能保证描述的准确性和一致性。更重要的是,AI可以捕捉到人类可能忽视的代码模式和结构,提供更加全面和洞察性的概述。



02

AI如何理解和概括代码?

LLM的选择与优化


Google的研究团队尝试了多个顶级LLMs,包括Gemini 1.0 Pro、Ultra和Gemini 1.5等。实验结果表明,Gemini 1.5系列在生成NL Outlines方面表现最为出色,无论是准确性还是表述质量都远超其他模型。


这一发现对Prompt工程师有重要启示:在选择用于代码理解和生成任务的LLM时,最新、最大的模型并不总是最佳选择。模型的特定能力、训练数据的质量以及针对任务的微调程度都是关键因素。
让我们通过一个例子来直观理解NL Outlines:

这是一个NL Outlines的SYSTEM PROMPT

代码迭代后运行


上下滑动查看更多

Slide left and right to see more

经过几轮迭代得到下面的代码

from openai import OpenAI
import json
import time

# 初始化DeepSeek AI客户端
client = OpenAI(api_key="sk-ee3", base_url="https://api.deepseek.com")

def gen(prompt):
    """模拟APPL的gen函数,使用DeepSeek AI生成回复"""
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=[
            {"role": "system", "content": "You are a helpful assistant skilled in step-by-step reasoning."},
            {"role": "user", "content": prompt}
        ],
        max_tokens=1024,
        temperature=0.7,
        stream=False
    )
    return response.choices[0].message.content

def cot_sc(question: str, num_samples: int = 5):
    # 设置系统提示和用户问题
    system_prompt = "You are a helpful assistant skilled in step-by-step reasoning."
    user_prompt = f"Question: {question}\nLet's approach this step-by-step:"
    
    # 生成多个CoT推理样本
    samples = [gen(user_prompt) for _ in range(num_samples)]
    
    # 从每个样本中提取最终答案
    final_answers = []
    for sample in samples:
        # 解析每个样本的最后一行作为最终答案
        final_answer = sample.split('\n')[-1].strip()
        if final_answer.startswith("Therefore, "):
            final_answer = final_answer[len("Therefore, "):]
        final_answers.append(final_answer)
    
    # 进行自洽性检查
    consistency_prompt = "Now, let's analyze the consistency of our reasoning:\n"
    for i, answer in enumerate(final_answers):
        consistency_prompt += f"Sample {i+1}: {answer}\n"
    consistency_prompt += "Based on the above samples, the most consistent answer is:"
    
    # 生成最终结论
    final_conclusion = gen(consistency_prompt)
    
    return final_conclusion

# 示例使用
question = "If a train travels 120 km in 2 hours, what is its average speed in km/h?"
start_time = time.time()
result = cot_sc(question)
end_time = time.time()

print(f"Final conclusion: {result}")
print(f"Total time taken: {end_time - start_time:.2f} seconds")

这个代码的NL Outline如下:


1: 导入必要的库和初始化DeepSeek AI客户端 

6: 定义gen函数模拟APPL的生成功能 

19: 定义cot_sc函数实现CoT-SC算法 

21: 设置系统提示和用户问题 

25: 生成多个CoT推理样本 

28: 从每个样本中提取最终答案 

39: 进行自洽性检查 

46: 生成最终结论 

51: 示例使用和时间测量

主要的解释如下:

1、定义了一个gen函数来模拟APPL的生成功能,它直接使用DeepSeek AI的API。

2、cot_sc函数实现了完整的CoT-SC算法,包括生成多个样本、提取答案、进行自洽性检查,以及生成最终结论。

3、使用标准的Python列表推导式来并行生成多个样本。

4、添加了时间测量,以便了解整个过程所需的时间。

这个实现保留了原始代码的核心逻辑和结构,同时避免了对APPL库的依赖。它直接使用DeepSeek AI的API来生成响应,实现了类似的功能。

注:APPL语言是一个可以直接运行各种Prompt技术的Python语言,起始代码没问题,但我的环境中的APPL库与环境中的litellm库版本不兼容,最终迭代版本为模拟APPL的gen函数实现CoT-SC,关于APPL语言下一篇文章会详细介绍。


03

AI如何生成这些大纲?

生成高质量的NL Outlines并不是一个简单的任务。它需要AI不仅理解代码的语法,还要理解其语义和意图。Google的研究团队使用了最先进的大语言模型(如Gemini系列)来完成这项任务。


生成过程


1. 输入代码:将需要解释的代码函数输入到AI模型。


2. 提示工程:使用精心设计的提示(prompt),指导AI模型生成符合要求的大纲。


3. 生成大纲:AI模型分析代码,生成对应的自然语言描述。


4. 后处理:对生成的大纲进行必要的清理和格式化。


两种主要的生成技术


研究团队探索了两种主要的生成技术:


1. 交错生成(Interleaved Generation):


- 方法:要求AI模型直接在原始代码中插入大纲注释。


- 优点:生成的结果直接可用,与代码紧密集成。


- 缺点:可能会意外修改原始代码,需要额外的验证步骤。


2. 行号填充(Line Number Infilling):


- 方法:AI模型生成大纲语句及其对应的代码行号。


- 优点:生成过程更高效,不会修改原始代码。


- 缺点:需要额外的处理步骤来将大纲整合到代码中。


这两种方法各有优劣,研究人员发现它们在不同场景下都有其适用性。


解析与后处理


生成NL Outlines后,还需要一系列解析和后处理步骤来确保质量:


1. 错误检测:检查常见问题,如格式错误、行号越界、重复行号等。


2. 内容过滤:移除无关或重复的信息,确保大纲简洁明了。


3. 对齐优化:调整大纲语句的位置,使其与代码结构完美对应。


4. 样式统一:标准化语言表述,保证整个项目的大纲风格一致。


这些步骤不仅提高了NL Outlines的质量,还为后续的应用和扩展奠定了基础。

上图表展示了不同大语言模型(LLM)在生成NL Outlines时的性能评估结果,比较了两种主要的生成技术:交错生成(Interleaved Generation)和行号填充(Line Number Infilling)。

评估维度包括:

1. Overall(整体质量)

2. Helpful(有用性)

3. Correct(正确性)

4. Detail(详细程度)

5. Style(风格)


图中使用颜色编码来表示性能等级,从红色(最差)到深绿色(最佳)。

主要观察结果:

1. Gemini 1.5 Pro和Flash在大多数指标上表现最佳,特别是在整体质量、有用性和正确性方面。

2. 交错生成技术在某些模型上似乎比行号填充表现略好,尤其是在整体质量和有用性方面。

3. 所有模型在正确性方面都表现相对较好,这表明生成的NL Outlines通常能准确反映代码内容。

4. 详细程度和风格方面的评分相对较为分散,这可能反映了不同评估者对这些方面的主观偏好。

5. DeepSeek-Coder-Instruct模型在某些指标上表现相对较弱,特别是在行号填充技术中。

这些结果说明,最新的LLM模型(如Gemini 1.5系列)能够生成高质量、有用且正确的代码大纲,为开发者提供了有价值的代码理解辅助工具。同时,不同的生成技术可能会影响输出质量,这为进一步优化NL Outlines生成方法提供了方向。



04

NL Outlines如何改变开发流程?

研究者用这张图片展示了NL Outlines(自然语言大纲)在软件开发中的多种应用场景,主要分为三个方面:代码理解、代码维护和开发者体验。

展开来讲,少有以下五个方面可以考虑:

 1. 代码理解与导航


NL Outlines最直接的应用是加速代码理解。假设当你打开一个新项目或查看同事的代码时,不再需要逐行阅读,而是可以通过简洁的自然语言描述快速获得整体结构和关键逻辑。这不仅节省时间,还能帮助开发者更快地进入状态。


在IDE中,NL Outlines可以集成到符号列表中,提供函数的概览。点击大纲语句可以直接跳转到相应的代码位置,实现精确导航。此外,大纲还可以用于智能代码折叠,让开发者能够根据需要展开或隐藏代码细节。不管是集成到VS Code还是别的IDE中,相信很快会有插件出现。


 2. 代码维护与重构


在代码维护过程中,NL Outlines扮演着"活文档"的角色。当代码发生变化时,大纲会自动更新,确保文档始终与代码保持同步。这解决了传统注释容易过时的问题,大大减轻了开发者的维护负担。


更有趣的是,开发者可以通过编辑大纲来指导代码变更。例如,你可以修改一个大纲语句来表达逻辑变更的高级意图,然后让AI自动完成相应的代码修改。这种方式让开发者可以在更抽象的层面上思考和操作代码,同时保持对细节的控制。


3. 代码生成与原型设计


在代码生成方面,NL Outlines提供了一种新的交互模式。开发者可以先编写或修改大纲,然后让AI根据大纲生成或调整代码。这种方法不仅能产生更符合预期的代码,还允许开发者在生成过程中进行更精细的控制和迭代。


对于快速原型设计,这种方法尤其有价值。开发者可以通过编写高级别的功能描述,快速生成可工作的代码框架,然后逐步细化和完善。


4. 代码审查


在代码审查过程中,NL Outlines可以显著提高效率。审查者可以先查看大纲变更,快速了解代码修改的主要内容和意图,然后再深入具体的代码细节。这不仅加速了审查过程,还有助于捕捉高层次的设计问题。


对于大型变更或复杂重构,NL Outlines甚至可以自动生成变更摘要,帮助审查者更好地理解和评估修改的影响。


5. 代码搜索与复用


NL Outlines为代码搜索提供了新的可能性。开发者可以使用自然语言查询来搜索代码库,找到实现特定功能或遵循某种模式的代码段。这种基于语义的搜索比传统的关键词搜索更加强大和直观。


此外,NL Outlines还可以辅助代码复用。当开发者需要实现类似功能时,可以通过搜索和比较大纲快速找到参考实现,从而提高开发效率。



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

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

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

联系我们

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

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询