谷歌重磅:LLM时代,我们用Prompt生成代码大纲,用文学编程
接手一个大型项目,面对成千上万行代码,你会从哪里着手?或者,在review一个复杂的pull request时,如何快速抓住核心变更?再或者,想向非技术同事解释你的代码做了什么,该怎么表达才能让他们秒懂?这些问题,几乎是每位开发者日常都会遇到的灵魂拷问。一项研究数据更有意思:开发人员会把70%的时间花在“程序理解”上——也就是说,读代码的时间比写代码的时间还多。
这些场景都指向同一个核心挑战:如何既快又准地理解和传达代码的意图。传统的做法,比如写详细的注释或文档,要么太冗长,要么一迭代就过期。而硬啃代码本身,又耗时费力,尤其是面对那些逻辑复杂的“屎山”。

Google的研究团队倒是拿出了一套新解法:利用AI生成代码的自然语言大纲,简称NL Outlines(Natural Language Outlines)。听起来不复杂,但这个思路背后蕴含的潜力,可能真会改变我们写代码和读代码的方式。
这可不是传统代码注释的简单升级,更像是对软件开发范式的一次重新定义。它把自然语言处理、机器学习跟软件工程的精髓揉在了一起,给开发者提供了一套前所未有的代码理解与交互的新工具。
01 NL Outlines:代码的自然语言骨架
什么是NL Outlines?
说白了,NL Outlines就是一种代码函数的高级概述,由一系列简洁的自然语言语句组成。这些语句巧妙地帮你把代码切分成逻辑块,并概括每块的核心思路。和传统注释比起来,NL Outlines更结构化、更抽象,相当于给你一张代码的“鸟瞰图”。
想象一下,以前你面对一个几十行代码的复杂函数,只能逐行去啃。现在有了NL Outlines,你快速扫几行自然语言描述,函数的逻辑结构就清清楚楚了。这不仅仅是看得快,更是为后续开发和维护提供了清晰的指引。

上图展示了一个集成了NL Outlines功能的IDE界面效果图。虽然论文没有直接给这套IDE的实现代码,但很直观地展示了它的应用场景:
- 左侧面板是函数的NL Outline,提供了“计算距离矩阵”、“初始化路径”、“迭代添加节点”等一系列高级步骤概述。
- 主编辑区是
nearest_neighbor_tour函数的代码实现。 - 代码中用绿色标注的注释,就是与左侧Outline对应的嵌入式描述,直接贴在相关代码前,上下文一目了然。
- 界面顶部还有个搜索栏,暗示了可以基于NL Outlines进行代码搜索。
这个设计展示了NL Outlines如何与开发环境无缝结合:既给出了代码的高级视图,又与具体实现保持紧密联系。对开发者来说,理解代码结构、提高导航效率,都变得轻松很多。
NL Outlines的独特之处
1. 双向同步:
2. 灵活展示:
3. AI驱动生成:
02 AI如何理解和概括代码?
LLM的选择与优化
Google团队尝试了多个顶级模型,包括Gemini 1.0 Pro、Ultra和Gemini 1.5系列。结果显示,Gemini 1.5系列在生成NL Outlines方面表现最好,无论准确性还是表述质量都明显领先。
这个发现挺有意思——对Prompt工程师来说是个重要提醒:选模型做代码理解和生成时,不是越新越大就越好。模型的特定能力、训练数据的质量,以及针对任务的微调程度,才是关键因素。
下面通过一个具体的例子,直观感受下NL Outlines是怎么用的。
这是一个NL Outlines的SYSTEM PROMPT的系统示例,最终经过几轮迭代,生成了下面的代码(上下滑动查看):
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 tra vels 120 km in 2 hours, what is its a verage 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行:示例使用和时间测量
解释几点:
- 这个实现定义了一个
gen函数来模拟APPL的生成,直接调用了DeepSeek AI的API,避免了对APPL库的依赖。 cot_sc函数完整实现了CoT-SC算法的流程:生成样本、提取答案、自洽性检查、生成结论。- 用列表推导式并行生成了多个推理样本。
- 额外加了时间测量,方便评估性能。
这个代码保留了原始逻辑,同时解决了环境依赖冲突的问题。不过这个案例也说明一个现实问题:环境依赖的冲突是开发中很常见的困扰。
03 AI如何生成这些大纲?
生成高质量的NL Outlines不是简单活。AI不仅要理解代码的语法,还要理解其语义和意图。研究团队用的是一线大语言模型(如Gemini系列)来完成。
生成过程
- 把需要解释的函数送入AI模型。
1. 输入代码:
- 用精心设计的prompt,指导AI生成符合要求的大纲。
2. 提示工程:
- AI分析代码,吐出对应的自然语言描述。
3. 生成大纲:
- 对生成的大纲做一些清理和格式化。
4. 后处理:
两种主要的生成技术
团队探索了两种方向:
1. 交错生成(Interlea ved Generation):
- 方法:让AI模型直接在原始代码中插入大纲注释。
- 优点:结果可以直接用,和代码紧密集成。
- 缺点:可能意外改代码,需要额外验证。
2. 行号填充(Line Number Infilling):
- 方法:AI生成大纲语句及其对应的代码行号。
- 优点:生成效率高,不修改原始代码。
- 缺点:需要额外的整合步骤。
两种方法各有适用场景,不存在绝对的优劣之分。
解析与后处理
生成之后,还需要一系列步骤来确保质量:
- 检查格式错误、行号越界、重复行号等问题。
1. 错误检测:
- 移除无关或重复信息,保证简洁。
2. 内容过滤:
- 调整语句位置,让它们跟代码结构完美对应。
3. 对齐优化:
- 标准化语言表达,让整个项目的大纲风格一致。
4. 样式统一:
这些步骤不仅提高了质量,也为后续应用和扩展打下了基础。

上图展示的是不同LLM在生成NL Outlines时的性能评估结果,对比了交错生成和行号填充两种技术。评估维度包括整体质量、有用性、正确性、详细程度和风格。颜色编码从红到深绿,代表从差到优。
主要观察结果:
- Gemini 1.5 Pro和Flash在大多数指标上表现最好,尤其整体质量、有用性和正确性方面。
- 交错生成技术通常比行号填充略好一些。
- 所有模型在正确性方面都比较稳,说明生成的大纲基本能准确反映代码内容。
- 详细程度和风格方面的评分比较分散,说明不同评估者对这些方面的主观偏好还挺明显的。
这些结果说明,像Gemini 1.5系列这样的最新模型,确实能生成高质量、有用且正确的代码大纲,为开发者提供了可靠的辅助工具。而不同的生成技术选择,也会影响最终输出的质量。
04 NL Outlines如何改变开发流程?

研究者用这张图展示了NL Outlines在软件开发中的多种应用,主要归为三类:代码理解、代码维护和开发者体验。展开来讲,至少有以下五个方面值得关注:
1. 代码理解与导航
这是最直接的应用。当你打开一个新项目或看同事的代码时,不用再逐行硬读,通过简洁的自然语言描述就能快速get到整体结构和关键逻辑。在IDE里,NL Outlines可以集成到符号列表中,提供函数概览。点击大纲语句直接跳到对应代码位置,实现精确导航。还可以用于智能代码折叠,根据需求展开或隐藏细节。可以预见,不管是VS Code还是其他IDE,相关的插件很快就会出来。
2. 代码维护与重构
NL Outlines在维护过程中扮演的是“活文档”的角色。代码一改,大纲自动更新,解决了传统注释容易过时的问题。更有意思的是,你可以通过编辑大纲来指导代码变更。比如,修改一个语句来表达逻辑变更的高级意图,然后让AI自动完成对应的代码修改。这种方式让开发者能在更抽象的层面上思考和操作代码,同时保留对细节的控制。
3. 代码生成与原型设计
NL Outlines提供了一种新的交互模式:先写或改大纲,然后让AI根据大纲生成或调整代码。这种方法不仅能产生更符合预期的代码,还能在生成过程中进行更精细的控制和迭代。对于快速原型设计特别有价值——先写个高级功能描述,快速生成可工作的代码框架,再逐步细化完善。
4. 代码审查
审查时,NL Outlines可以显著提高效率。审查者先看大纲变更,快速了解修改的主要内容和意图,再深入具体的代码细节。这既加速了审查过程,还有助于发现高层次的设计问题。对于大型变更或复杂重构,大纲甚至可以自动生成变更摘要,帮助审查者更好评估修改的影响。
5. 代码搜索与复用
NL Outlines给代码搜索带来了新可能。你可以用自然语言查询来搜代码库,找到实现特定功能或遵循某种模式的代码段。这种基于语义的搜索比传统的关键词搜索更强大、更直观。当需要实现类似功能时,通过搜索和比较大纲,可以快速找到参考实现,提高开发效率。
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名