引言
大家好,这里是最佳拍档,我是大飞。在如今广泛使用编程 AI 工具的时代,不知大家是否思考过 AI 是如何生成这些代码的。这不仅是技术问题,更是关于如何让机器真正理解人类意图的深入思考。在 AI IDE 领域,Cursor 处于领先地位。尽管我们知道 Cursor 在训练自己的小模型,但其设计思路及背后思考一直是个谜。前不久,Cursor 放出近 1 小时的内部团队讨论视频,深度剖析了所用技术与思考,让我们有机会深入了解 Cursor 团队对训练超人类编程模型的看法,这些见解揭示了当前 AI 编程领域最前沿的挑战与突破方向。
训练编程 AI 的挑战
编程领域强化学习的独特性
Cursor 团队指出,编程领域的强化学习与数学或写作等其他领域有根本差异。数学推理中,答案通常较短,推理过程能助模型逐步得出正确答案。但在编程中,推理嵌入在答案里,代码既是思考过程也是最终结果。编程任务往往需多步骤工具调用,不像简单生成任务生成推理 token 后生成答案并获奖励,而是生成 token、调用工具、获取响应,且可能需多次迭代。这种多步骤特点使强化学习形态发生根本变化,需优化整个多步骤工具调用过程,而非单一输出。
无明确反馈信号的强化学习
Cursor 团队特别关注无法通过传统方式验证的场景。数学问题有标准答案,编程问题可通过测试验证,但实际应用中,用户常不明确告知系统解决方案是否有效,这就需在无明确反馈信号下进行强化学习,这是前所未有的挑战。
写作与编程的差异及训练方法思考
对于写作等领域,当前后训练方法常让模型写出僵硬内容,这非模型固有局限,而是训练方式所致。团队提出有趣想法,为何一定要训练模型预测下一个词,而非整个章节?若让模型据当前章节预测下一章节,用相似性度量评估预测与真实章节的相似度,就能将下一个词的预测问题转化为更长序列预测,并允许使用语义奖励优化。不过,编程和写作关键差异在于,代码好坏有相对客观标准,主要是功能性是否正确,而写作质量很大程度上取决于个人品味。
训练方法与奖励信号
对测试作为奖励信号的态度
Cursor 团队对将测试作为奖励信号既认可又谨慎。测试优势明显,提供接近真实的信号,若覆盖充分,能给出代码是否有效的可靠反馈,可基于此进行长期强化学习并学习有趣行为模式。但测试无法捕捉所有重要方面,需放宽条件寻找其他获奖励方式。
创新的奖励方式
一个创新想法是使用真实变更的对比数据,如某个功能变更的真实 diff,虽非完美信号,但可作为验证信号的有用信息。团队还提到模型实际看到的是优势值(相对奖励),若任务太困难,稀疏奖励会成问题,成功率达百分之一或稍高时信号可用。对于大任务分解,如完整 Pull Request,除非投入大量计算资源,否则困难且稀疏,若能分解为更小部分并分别测试,可能减少奖励稀疏,显著提升模型性能。
工具选择与应用
不同实验室的工具集选择
不同实验室会选择不同工具集训练强化学习模型。OpenAI 的 o3 模型专门针对终端高度优化,只倾向于使用 grep 和 sed 命令,除终端外不愿使用其他工具。而 Claude 模型倾向于围绕搜索和编辑设计,这种差异反映了不同团队对工具复杂性与效果权衡的不同理解。
终端工具的优势与拓展
终端工具受青睐主因是简单性,无需构建复杂测试框架运行 agent,给它 shell 访问权限就能完成工作。但可在核心工具集基础上做得更好,如代码检查工具 Linter 能提供大量信号,不过获取信号需运行语言服务器,让其在任意代码上运行相当困难。Cursor 自带预安装语言服务器扩展,用户设置后可获得 Linter 等工具信号。
语义搜索工具的优势
语义搜索在静态代码文件上可能无法提供比多跳搜索更多信息,但速度更快、成本更低、使用上下文窗口更少。
用工具管理模型行为
团队提到可用工具管理模型本身行为,如很多推理模型喜欢过度推理,缓解方法是给模型添加思考工具,任务需推理时才调用启用推理过程。现在推理模型常提交用户消息后、未看到任何内容前就开始思考并调用所有工具,团队成员建议某些步骤可在工具调用之后再进行思考。
代码与长上下文交互
长上下文的重要性与趋势
Cursor 团队指出,长上下文在某种程度上非常重要,若将所有内容限制在 8K token 以内,所有模型基本等效,可能需至少 50 - 60k token 上下文长度才能看出不同模型区别。上下文趋势会越来越长,但成本也会越来越高。
上下文窗口长度与评估
对于上下文窗口长度,更长肯定更好,但存在递减效应。长期来看,即时查询检索相关 token 不是唯一方法,最有意义的可能是使用混合机制,如 DeepSeek 的 NSA 机制,将注意力分为三部分,一个进行滑动窗口注意力关注短期,另外两个进行块状注意力,每隔一定数量 token 存储为键和值,查询关注这些块并获得最相关的前 k 个块,然后对这些块进行完全注意力。对于长上下文评估,真正困难在于判断基线效果,因各种机制都有效,评估必须非常严谨。
复杂状态工具:记忆工具
记忆工具的概念与问题
Cursor 团队提出记忆工具概念,允许模型存储信息片段并稍后检索。但问题是如何鼓励模型存储对以后有用的好记忆,这涉及跨时间序列的信用分配问题。记忆工具包含“存储记忆”和“检索记忆”两个不同工具,检索记忆相对简单,有帮助可获奖励,存储记忆则复杂得多,奖励要看后面一系列动作表现,而非当前步骤。
记忆工具的训练
训练时需做很多不同情境下的采样才能给到信号,既要让模型学会写入记忆,又要做后续采样读取记忆并根据效果回传奖励。这种跨轨迹的信用分配问题使记忆存储机制很难直接反向传播,最好办法是做基准测试,用不同规则、启发式方法或提示词实验,比较不同情况下存储与忘记记忆的效果。
硬件对长上下文处理的影响
新一代 GPU 的支持
Cursor 团队对底层技术有深刻理解,新一代 GPU 让长上下文处理更易。GB200 和 NVL72 架构通过两种方式支持超长上下文:一是拥有 72 个通过 NVLink 网格互连的 GPU,可进行大规模张量并行,还能把注意力头分布在不同设备上,更易搞定 KV 存储;二是 Grace CPU 能做统一内存,可存储更多 KV。另外,KV 不一定要都放在 GPU 上,运算和加载交错,用到注意力时再加载到 GPU 就行。
文档级注意力
Cursor 团队特别喜欢文档级注意力(章鱼注意力 squid attention)概念,每个文档像不同触手,让每个文档独立“关注自己”,最后一起全局关注。好处是可把多个文档的 key 和 value 各自缓存起来,推理时随时替换,无需重新预填充,这对产品快速创建内容、语义检索和读取文件等功能非常有用。
优化真实世界使用
当前强化学习方法的局限
Cursor 团队指出,目前大多数强化学习为完成一堆测试用例,但训练人员真正关心的是模型处理人类实际需求的能力,如在文件中添加 console log 等以人为中心的工作。要获得以人为本的奖励信号,需从真实环境中的真实人类那里获得真实信号,如用户是否喜欢 agent 所做更改或是否接受编辑。
优化方法
团队提出观察用户实际做出的真实更改,据此判断模型做得像不像。让后台对某个问题进行三到四次尝试,尝试不同模型、参数设置和温度,选择最有效选项作为训练奖励模型的信号。若有奖励信号但用户总在三个选项中选一个,可只针对此信号训练奖励模型,好处是奖励模型看到真实情况后会比原始模型知道更多,饱和更晚。
编程 agent 的未来
模型发展趋势
Cursor 团队认为未来模型会使用更多 token,特别是在输出上下文方面。像 o3 模型会一直生成内容直到建立正确上下文才知如何解决问题,预计未来模型会在做决定前连续调用工具很长时间,但这样较浪费,很多内容下次需重新算。不过大多数情况没必要每次都推理那么多,可复用之前推理过程摊销成本,如让 agent 查看轨迹或在代码库中之前做过的事情,学到有用知识并存储。
长上下文与代码库专用模型
长上下文或代码库专用模型会变得重要,只要能复用之前积累的知识、理解代码结构,不用每次都重新理解,模型就会高效很多。另外,输出 token 的扩展会让训练采样更高效,通常 SFT 中模型只从输出 token 获得信号,相当低效,若超长输出,信用分配也困难。Cursor 团队发现,对于大语言模型训练,高质量数据比算力更稀缺,最好的数据有限,如何有效利用算力可能是未来优化方向。
总结与展望
从 Cursor 团队的讨论中,我们看到编程 AI 更清晰的未来图景,它们将更智能,能理解当前任务需求,从历史经验中学习,建立对代码库的深入理解并高效重用知识。我们正站在编程范式转换的临界点,即将从手动编写每一行代码、逐步调试和反复测试的方式,逐渐被 AI 辅助的协作式编程取代。在新模式下,开发者将更多专注于高层次设计和创意,具体实现细节交给能理解上下文、学习代码偏好并持续改进的 AI agent 。大家对编程 AI 的未来有何看法?欢迎在评论区留言。感谢收看本期视频,下期再见。