假如,你接手了一个大型项目,面对成千上万行代码,你会如何开始理解它?或者,你正在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还可以辅助代码复用。当开发者需要实现类似功能时,可以通过搜索和比较大纲快速找到参考实现,从而提高开发效率。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。