Cursor核心成员圆桌:用强化学习训练编码超级模
未经许可不得转载,务必保留公众号名片
【城主说】两天前Windsurf被Anthropic背刺了一次, 马上就要被禁其Claude模型API的调用,得益的显然就是竞争对手Cursor。且Cursor之前已经独享了Claude4.0的API调用,抛开商业竞争,从使用者角度,Windsurf的用户是很有可能迁徙到Cursor的。
回归到Cursor本身,这两天发布了正式版1.0。显然这是一个重大的里程碑,本次访谈是Cursor官方团队深入探讨了将强化学习(RL)应用于代码生成的复杂性与前沿进展。对话涵盖了编码领域强化学习的独特性、奖励机制设计的挑战、高级工具与长上下文窗口的作用、新型注意力架构与智能体记忆的实现,以及构建高效RL基础设施和未来发展方向等核心议题。团队一致认为,成功的关键在于结合高质量的真实世界反馈信号、高效的工具利用、更长的上下文理解能力以及能够摊销计算成本的智能体设计。(原文未见成员名字,且用ABCD指代)
核心观点
• 编码领域的强化学习因其巨大的动作空间、多步工具调用和验证的复杂性而区别于其他领域。
• 奖励机制正从简单的测试通过率,向更接近真实世界价值的信号演进,如代码质量、用户采纳率甚至流失率。
• 长上下文窗口和高效的工具(如语义搜索、历史PR分析)是提升代码智能体能力的关键,但需解决成本和效率问题。
• 新型注意力机制(如NSA)和智能体记忆系统是未来发展方向,旨在更高效地利用信息和摊销“思考”成本。
• RL基础设施的优化(如吞吐量导向的推理、参数同步)和算法选择(如gRPO)对于处理大规模、高方差的训练任务至关重要。
• 未来的编码智能体将能够处理更长的输入和输出序列,并能通过代码库专业化来复用知识,实现更高效、更精准的代码生成与修改。
主持人
: 对话的初始起点是强化学习(RL)。一个有趣的问题是,对编码进行强化学习与对其他更容易、更可验证的领域进行强化学习有什么不同?无论是数学,还是像写作或其他更有风险的领域。编码模型的不同之处是什么?
成员A
: 嗯,其中一点是,编码的动作空间要大得多。所以如果我们考虑数学,推理在数学方面效果很好,因为最终的答案非常简短。因此,推理有助于提供大量的行动以得出答案。而编码,某种程度上,推理已经包含在答案中,对吧?
成员B
: 是的,而且为了得到答案,你必须调用多个工具。因此,它不是像生成推理token、生成答案、获得奖励这样,而是看起来像生成一些token、调用一些工具、从这些工具获得响应,并且你可能会迭代多次。所以强化学习(RL),强化学习的形式看起来有点不同,因为现在你必须经历这种多步骤的工具调用过程,并在此之上进行优化。
成员C
: 对我们来说,强化学习特别有趣,因为在收到模型完成结果后,我们并不总是有办法确定它是否真正解决了用户的问题,或者做了用户想要的事情。你知道,如果你有一个带有标准答案的数学问题或者一个编码问题,那么你可以测试它是否得到了正确的答案。但我们希望在用户并不总是告诉我们它是否有效的情况下进行强化学习。
成员D
: 你认为在写作这样的领域会发生什么?你认为我们根本不会在那里使用强化学习,而只是希望基础模型通过预训练变得足够好吗?你认为强化学习在那里改进事物存在一条路径吗?
成员C
: 目前在模型上进行的后训练往往使它们以一种非常生硬和正式的方式写作。但我我不认为那是模型的固有局限。我认为那只是它们被训练成要做的。
成员A
: 是啊,为什么不能训练模型来预测下一章节呢?当然可以,你可以改变学习动态,让它开始预测整个序列,而不是预测下一个token。给定书的当前章节,模型应该尝试预测书的整个下一章节,有点像故事的走向。然后你就可以使用某种相似度度量来衡量下一章节与真实章节的相似程度。
成员D
: 这就像解决困难的下一token预测问题。在写作中,然后允许它进行某种推理,并使用某种相似性奖励。
成员B
: 最好是某种语义奖励。
成员A
: 因为我认为这些模型的局限性之一是,下一token预测目标并没有完全捕捉到我们真正想要的东西,即生成一个完整的序列。
成员D
: 嗯,那里有两个问题,对吧?有效地来说,就像让它在预测下一个token之前花费更多的计算量。然后还有,它实际上不需要预测确切的下一个词元,而是预测类似于下一章的完整序列。
成员C
: 写作困难之处在于,产出好不好,比起编码,更多的是一个品味问题。而对于编码,你真的只是希望它能正常工作。然而对于写作,即使是经验丰富的人也可能对它是好是坏产生分歧。
成员D
: 但你不认为编码中也有类似的方面吗?比如一旦你通过了测试,之后可能就很难再进一步了,对吧?
成员C
: 是的,没错。我认为代码质量是一个难题。
成员A
: 是的,但是通过测试有时不起作用,因为通过测试没有捕捉到模型实际上做了什么来通过测试。所以即使忽略掉它开始做一些边缘情况来通过测试的“作弊”行为,模型也可能开始做一些与任务完全无关的事情,但仍然能通过测试。而且那会给他们带来很好的回报,对吧?
成员D
: 嗯,我的意思是,这只是你的测试有多好的一个函数,对吧?
成员C
: 对于代码质量,或者说你想要的东西,有点像是优雅的代码,而且长度不超过它所需要的长度。就像也许你想要最短的解决方案,或者说最小的描述长度,这和数学类似。就像也许最美的证明就是最短的证明。我是说,这不完全相同,但这里面存在着那个要素。
成员D
: 那么对于编辑呢?你是否会因此倾向于认为,删除代码也是一件好事?
成员C
: 如果你只是想要最短的解决方案。我是说,我认为删除代码是很棒的。如果你你能提交一个精简 100 行代码的 PR,并且能保留所有功能,我会非常高兴。
成员D
: 是的,没问题,这很合理。
奖励机制的挑战:从测试到真实世界信号
主持人
: 一般来说,好的奖励机制有哪些?我想这个话题涉及到了这些奖励。我认为我们正在尝试许多不同的奖励方式来训练强化学习模型。你最喜欢哪些想法?
成员D
: 那么测试的优点是什么呢?
成员B
: 它非常接近真实情况。就像你说的,测试存在一些问题,例如,如果覆盖率不够,你可能会绕过测试,而没有真正解决问题。但是,如果有良好的测试,那么它就非常接近于代码是否工作的真实信号。
主持人
: 并且你可以真正地针对它进行很长时间的强化学习,并从模型中学习到一些潜在的有趣行为。
成员B
: 但是,你知道,并非所有的事情都能通过测试来捕捉。所以,我们可能需要放宽一些条件,并思考其他获取奖励的方式。因此,一个可能的想法是,例如使用一个特征变化的真实差异。而且,你知道,可能存在多种方法来实现相同的改变。所以,它不是一个完美的信号,但是你可以潜在地使用这些信息来帮助产生一个验证信号。
成员D
: 那么奖励和测试的稀疏性呢?也许一个缺点是你必须采样大量的轨迹,但只有其中一个通过。你只能得到这种要么1要么0的结果,比如,是否通过了所有测试?
成员B
: 是的,我的意思是,这使得训练在计算上变得昂贵,我想。但是,这里有一个很有趣的现象,如果你有足够的计算能力进行大量的推演,你可以通过从每个令牌以一种分支的方式进行推演来获得更稀疏的信号,但这会变得非常昂贵。所以基本上,稀疏性只是转化成了一个昂贵的计算问题。
成员A
: 因为模型实际上看不到奖励,它们看到的是优势,这有点像相对于来自同一提示的其他推演的奖励而言的奖励。
成员D
: 嗯,有趣的是,如果对一个完整的PR(Pull Request,拉取请求)进行测试,通常会非常有用,但这将非常困难和非常稀疏,除非你花费大量的计算资源,对吧?因为很少情况下,例如在一个完整的PR中,以模型目前的水平,它们能够通过所有的测试吗?但是,也许你想要的是能够将它分解成完整PR的更小部分,然后在这些部分中进行测试。这可能仅仅是,如果你有能力这样做,那会是一个严格的改进吗?
成员B
: 是的,我认为这很可能是一个改进。所以我想,是的,存在这样一个问题:如果任务非常困难,模型仅在千分之一的情况下才能正确完成,那么这种稀疏的奖励就会成为一个真正的问题。如果它的成功率是,比如百分之一,或者更高,那么你可能就可以处理它了。但是的,所以一旦你把它做到那种像是千分之一的水平,或许你需要考虑像是进一步分解,或者你认为我们正处在那种完全投入的状态,以至于它可能有点过于稀疏?
成员C
: 是的,我认为在某些情况下,你可能需要通过将它分解成组成部分,并希望每个部分都正确来减少稀疏性。我的意思是,在某种程度上,我认为你想要的是一种在功能上等同于真实情况或良好变化的变化。这很简洁。问题在于,这不仅是一个困难的目标,而且即使是评估一个候选解决方案是否满足这个目标,也等同于停机问题。所以,这非常困难。你实际上做不到。但如果你能做一些接近它的事情,也许那是一个好的方向。
工具与上下文:赋能智能体的双翼
主持人
: 最有趣的工具是什么?所以一般来说,你知道,我们已经看到了这种趋势,即不同的实验室选择不同的工具集来评估模型的性能。那么O3,可以说针对终端进行了非常、非常优化的设计。而且,你知道,它倾向于喜欢这种非常奇怪的模型,它只倾向于抓取和设置,不使用,你知道,它不想使用终端之外的任何工具。然后,云模型在那里倾向于可能设计你自己的搜索和编辑方式。是否有一些围绕工具的有趣想法,你知道,人们会使用那些不仅仅是传统工具的东西?
成员D
: 我的意思是,我认为你可以做得比核心工具集好得多。我认为终端有意义的原因是它非常容易,对吧?就像你不需要构建一些超级花哨的工具。为了运行你的代理,你实际上只是给它一个shell的访问权限。我就可以在那里做所有的事情。简单性可能是最大的原因,对吧?所以一个例子就像是代码检查工具的错误。代码检查工具的错误会给你大量的信号,但很难获得这些信号,因为你需要运行一个语言服务器才能得到它。然后,实际上为任意代码运行一个语言服务器是相当困难的。
主持人
: 但是,你知道,我们在Cursor中有一个有趣的信号,因为Cursor自带预装了语言服务器的扩展程序,用户会去设置它。
成员D
: 所以你可以获得诸如代码检查工具之类的东西。我们还有类似语义搜索的东西。而且我不知道,例如,我实际上不认为语义搜索可以仅通过静态代码文件为你找到一些东西。它会为你找到类似于使用足够多的跳数后的grep命令能找到的东西。但它会更快地找到。所以这意味着它更便宜,使用了更少的上下文窗口,并且更快。
主持人
: 好,所以也许这就引出了你还想要提高工具质量的观点。我不知道,你们怎么看待选择高质量的工具,以及如何权衡工具的简洁性,比如,你可以选择最简单的描述方式,也就是终端。然后你可以提出这样的问题,比如,你可能想要为模型提供越来越高质量的工具。
成员A
: 嗯,一种方法是,你也可以使用工具来建模模型自身的行为。比如,我们知道很多推理模型喜欢大量推理和过度思考,即使在它们实际上不需要开始推理的情况下也是如此。所以,你可以缓解这种情况的一种方法是添加一个思考工具,让模型意识到任务需要一些推理。然后它就开始调用该工具来启用这种推理。
成员D
: 是的,我一直觉得推理模型与自主代理工具调用之间的互动方式很有意思。也许O3有点不同,除非我没有过多地使用它。但它总是有点奇怪,它会在你提交用户消息之后,甚至在它还没有看到任何东西之前就进行思考,然后去调用这些工具。
主持人
: 那么你的意思是,你认为模型应该在使用每个工具之后都进行思考,对吗?
成员D
: 不是在使用每个工具之后。我的意思是,我认为,人们训练这些推理模型的理由是什么,以及他们通常是如何训练的?我觉得,O1的第一个版本可能只是在比赛,比如竞争性编程,以及数学问题上进行训练。而且,那里的想法是,你希望最终能得出一个好的答案。要么你可以向用户展示这个答案,要么你可以把它展示给负责绘制图形和验证答案的东西。在此之前,你想要花费大量的tokens进行思考。我想知道对于智能体轨迹,你实际上最终要向用户展示或验证的是什么?要么是一些文字,可能是用户可以看到的。但很多时候,如果你没有问它一个问题,你只是要求它做出改变。这就像,实际上就是编辑工具,对吧,当它,像,编辑一个文件时。所以我想知道当你只是要求模型,像,编辑代码时,你是否真的需要存在单独推理的这个概念。并且,就像,在训练时,它在那些工具调用中随便做什么。你让它随便做什么,而不是限制,像,某些,像,好的推理部分。
成员C
: 另一个,像,非常有趣的工具,我们正在考虑的是查看PR(Pull Request)以及代码库中的人们一直在做什么。我的意思是,像,你可以对这些模型抱有的一个,像,心理模型是,它们是有能力的工程师,他们就像,总是处于,像,他们入职的第三天,对吧?并且他们获得,像,两天的,像,背景信息来,像,尝试并且,像,尽快地在代码库中进入状态。然后,你知道,第三天,他们被要求做一些事情。并且,你知道,如果你处于那种情况,我认为,你知道,一个合理的做法将是,你花那两天时间试图理解你的同事一直在做什么,以及,像,为什么他们做出他们正在做出的改变,以及他们在接触什么代码。并且目前,你知道,这些模型并没有真正围绕着查看PR和查看人们一直在做什么而构建。它们更倾向于以大块的方式消费代码并搜索相关的代码,这与这些模型的预训练方式非常匹配。并且很明显,这仍然是解决方案的重要组成部分。但是,能够查看PR(Pull Request,拉取请求)的内容对我们来说也很有意思。
主持人
: 你认为代码和长上下文之间是如何相互作用的?所以至少在某种奇怪的程度上,你可以说长上下文非常重要,因为如果你只考虑将所有内容限制在8k(8192)个token(令牌)以内,比如SONET和401以及GPT-4,它们最初的东西在某种程度上是等价的。所以你需要比关键上下文长度更大的东西,比如你至少需要5万到6万个token。你认为只要不断增加上下文长度,就可以改善强化学习(RL)的效果吗?你认为这两者之间是如何相互作用的?
成员C
: 我的意思是,趋势一直是上下文变得越来越长。注意力机制非常擅长利用长上下文,但是,你也知道,代价也越来越高。在技术层面,我认为长上下文一个非常有趣的方向是,如何保持成本的降低?如何在多个提示词中复用缓存的上下文?这与最新的、能力比以往更强的模型尤其相关。但是,如果你没有巧妙地缓存和使用上下文,总成本可能会非常高。而且,当你开始研究专业的代码库时,对于你想要做的事情来说,存在着大量的相关上下文。我认为这在某种程度上对代码来说可能是特殊的,因为,如果你是ChatGPT,或者你是Plot应用,在大多数情况下,用户带来的上下文并不多。他们有一个问题,通常是100个token。因此,你主要关心的是如何将人类知识的总和压缩成权重,然后用它来为问题提供一个好的答案。你不太关心如何获取一百万个token,并从中获得可以有效利用的有用信息。因为这并非你的大多数用户所关心的事情。
主持人
: 你认为我们需要多长时间的上下文?1百万,1千万,还是1亿?
成员C
: 我认为时间越长越好,但也会有边际效益递减。动态地检索与查询相关的令牌这种方法不是我们唯一需要的方法,但它也相当不错。因此,某种混合机制,例如,某种机制可以消耗1亿个令牌,但可能,你知道,从每个令牌中获取的信息更少,对吧?并且利用它来获得对代码库的总体理解。但是,当你确切地知道你想做什么时,它可以记住哪些部分是相关的,并刷新对这些部分的记忆,这可能才是长期来看最有意义的。
前沿架构与智能体记忆:从注意力机制到状态化工具
主持人
: 你们如何看待所有涌现出来的新架构?你知道,有一些趋势,它在某种程度上减少了,你知道,存在着正常的滑动窗口注意力机制。而且,你知道,越来越多地你发现了这些,你知道,Llama4 甚至拥有更复杂的注意力机制。
成员D
: 好的,我是说,NSA相当精妙,对吧?你对NSA有什么看法?我的意思是,实际上,用精妙来形容它可能并不准确。
主持人
: 这里的NSA是DeepSeek发布的注意力机制。
成员D
: 希望他们能在下一个模型中发布它。但这是他们的注意力机制,扩展性非常好。他们发现它的表现优于注意力机制。其核心工作方式是将注意力分解成三个部分。其中一部分执行滑动窗口注意力,因此会关注短期内发生的事情,比如最近的4000个token。另外两个部分有点意思,因为它基本上执行分块注意力,每隔一定数量的token,将其存储为键和值。然后查询将关注这些。然后从那之中,你得到你想完全关注的前K个区块。然后你获取这些区块,然后你实际对它们进行完全注意力计算。我认为这非常酷,因为,是的,它应该能很好地完成跨越这个长上下文窗口的检索。
主持人
: 你们怎么看?我猜NSA(非对称流注意)相对而言,我们内部更关心的是关于逐层注意力或类似的东西。
成员D
: 我的意思是,你觉得NSA怎么样?
成员C
: 我认为它采用了使MOE(混合专家模型)工作的思想,并将其应用于注意力机制,你知道,我们有这个剧本,用于将稀疏性引入通过梯度下降训练的模型中,也就是你得到一些值,对它们进行Top K操作,然后对结果值进行softmax运算。这就是MOE的训练方式。其理念是,即使你没有获得所有事物的梯度,但事实上,它鼓励门控权重对于更相关的部分(在MOE专家模型的情况下)相对于特定示例而言更大,这意味着稀疏机制仍然可以学习将其路由到最合适的专家。就像国家安全局的案例一样,要针对更合适的情境部分。我认为,这实际上就像是开发它并将其应用到不同的领域。
主持人
: 您还有其他特别喜欢的注意力机制吗?
成员C
: 我的意思是,评估长程上下文机制的难点在于,要真正了解基准情况,因为你知道,所有方法在某种程度上都有效。你知道,就像你可以进行稀疏注意力。你可以,比如说,设置一些注意力头进行局部关注,另一些进行全局关注。
主持人
: 这些都会使性能略微下降,但速度会更快。
成员C
: 所以你必须非常严格地评估这些东西。我不知道我是否有任何特别的偏好。
主持人
: 比如,添加一个记忆工具。所以这种,像是,与强化学习术语的交互,有点像是在其中添加状态,你可以在里面,像是,存储一部分东西,并希望之后能够检索它。但问题在于,如何确切地鼓励模型实际存储良好的、有用的记忆,以便将来使用?你们觉得,强化学习会如何发展,才能让你们在许多期限内使用更复杂的有状态工具?
成员D
: 感觉很有趣,事情在多大程度上朝着这样的方向发展,像是,并非所有东西都在模型中,而不是,像是,模型能够,像是,采取行动来让它做所有事情,对吧?像是,与其,像是,拥有一个非常好的长上下文模型,可以进行检索,不如说,好的,现在的模型,像是,非常擅长使用检索这个工具。无论是通过语义搜索进行搜索,还是,像是,它被训练的方式,抓取。
成员A
: 像是,记忆工具非常有趣,因为实际上有两个工具。像是,第一个工具是我想要存储,像是,这次特定交互的记忆。另一个是检索它。某种程度上,像是,教导模型检索记忆是相当直接的。你可以简单地在检索到那段记忆,并且确实对对话有所帮助时,给予奖励。但是储存这段记忆要复杂得多,因为奖励并不取决于当前的轨迹,而是取决于不同的轨迹。这也会增加训练期间的计算量,因为它意味着,基本上,为了从储存这段记忆中获得好的信号,我必须在一堆完全不相关的随机轨迹中进行多次展开。
成员B
: 是的,完全正确。就像,一旦你进行了写入,你就是在储存某种状态,以便在未来的轨迹中使用。所以,当你进行训练时,你既要进行展开来储存它,又要进行后续的展开来检索它,应用奖励,并将其反向传播到写入部分。
成员D
: 是的。或许用非模型训练的方式来生成和检索记忆会更容易。我们前几天就在讨论这个。相反,使用像Federico描述的系统,就像是在各种不同的生成、使用和获取记忆的方式之间进行评估。
主持人
: 好吧,我们应该如何评估记忆呢?
成员D
: 我的意思是,这个想法是你的还是卢克的?
成员C
: 我觉得实际上是卢克的。因为费德里科提到的信用分配问题,实际上很难反向传播到记忆存储机制中。所以,取而代之的是,你得到一个基准,比如说,500个例子,关于智能体应该做的事情,以及一种检查它是否做到的方法。然后,你只需尝试不同的规则、启发式方法和提示,关于何时存储记忆以及何时忘记它。你只需衡量每一种方法的表现。而这不足以反向传播到某个东西中,因为它会很快学会对它们进行奖励破解。但是,如果你有一个启发式系统,它或许可以帮助你找到最佳的那个。
成员D
: 是的。我想知道事情会变成什么样子,像是,短期内做的记忆才有意义。我想知道这是否会在明年持续存在,还是会变成像雅各布描述的那种更长期的上下文机制,也许它会看到你之前所有的聊天记录,并能够加强联系。
主持人
: 你们觉得之前的聊天记录重要,还是用户之前所有的PR(Pull Request)重要?
成员D
: 这是两种不同的事情,对吧?
主持人
: 很多时候,之前的聊天记录感觉,嗯,有一些相似之处,也有一些不同之处,对吧?
成员D
: 比如,你从之前的聊天记录中获得的一件事是你在之前的PR中无法获得的,比如,实际操作,以及看到你的环境如何反应,对吧?然后你就可以从中进行更新,而PR则无法做到这一点。PR只是一种演示。是的,我认为它们对不同的事情都有用。就像,我的意思是,你也在使用你在PR中永远不会真正看到的东西。就像,你在看,比如,终端。你在看,比如,代码检查器如何响应,以及,比如,你的自动格式化工具可能如何响应,诸如此类。
成员B
: 而且看起来你可以从之前的PR中获得一些,比如,类似的个性化设置。比如,如果你的代码库中有一堆PR,你可以大致了解到,比如,什么样的更改,像这种,在代码库中进行某些编辑时,必须做出某些风格上的调整。你可以学会定期进行这些调整。比如,首先我更改这个文件,然后我更改那个文件。
成员A
: 是的,我对整个长上下文的故事非常乐观,因为,我的意思是,我有点不想当计算机专家,但新一代GPU确实让长上下文变得非常容易。比如,GB200和L72架构允许以两种方式非常轻松地进行超长上下文处理。一方面,你知道,因为你有这些通过NVLink网格互连的72个GPU,你可以进行超过8GPU网格的张量并行。这让你能够减少每个设备上存储KV的注意力头数量。除此之外,这种灰色的CPU允许你在统一内存上存储KV,因此允许你每个设备存储更多数量的KV。
主持人
: 是的,我的意思是,真正酷的事情是,我们听说有人尝试过,你实际上不需要将你的KV存储在GPU内存中,对吧?
成员D
: 而且你可能几乎不会产生任何减速,因为你可以基本上在加载下一个时间步,并将其加载到GPU的过程中,交错进行计算。
成员A
: 是的,当你到达第0层时,你开始从CPU卸载你在第1层需要的KV。所以它基本上是免费的。你永远不需要KV,完整的KV,存在于你的GPU内存上,除非你实际到达该层。
成员D
: 是的,但我的意思是,这只能扩展到,比如,一百万个上下文?比如,你仍然需要付出这种二次方的代价,而且这总是会,比如,你可以超过,比如,仅仅是字面内存的成本。
成员A
: 但它仍然有点像,如果你使你的并行性正确,它应该仍然是,比如,72倍的便宜,对吧?因为如果你正确地分片注意力头。
成员D
: 72 它会便宜 72 倍,但这种便宜 72 倍是针对这种大规模的 n 平方级爆炸式增长。因此,或许你需要比如 100 万个联系人,并加上所有这些,比如,人们正在添加的所有这些常数因子来使其更好,对吗?比如,时不时地使用滑动窗口,或许可以共享。我的意思是,美国国家安全局 (NSA) 是另一个很好的例子。它是一个很大的常数因子,但它确实是一个常数因子。
成员A
: 我们如何看待文档级别的注意力机制?
成员D
: 我们喜欢它。是的,我们称之为鱿鱼注意力机制,因为我们把它想象成一只鱿鱼,其中每个文档都像一根不同的触手。是因为这个原因吗?你觉得呢,你为什么这么想?我不知道。我完全不知道。谁想出了“鱿鱼注意力”这个名字?卢卡斯。这不太像卢卡斯会起的名字。“鱿鱼注意力”的想法是,你基本上想要独立地关注每个文档。比如,每个文档都会独立地关注自身。然后在最后,你再关注所有内容。这样做的优点是,你现在可以随意替换文档。如果你关心大约10、20、30个文档,我就可以缓存每个文档的键和值,而无需重新支付预填充的成本。而且我可以仅仅在推理时替换它们。这对于产品中的各种功能来说,都非常有用,对吧?比如,对于标签页,当你检索信息并希望快速完成时,它就非常有用。对于代理,同样,当您使用语义搜索并阅读文件时,这将非常、非常有用。
优化闭环:RL基础设施与算法选择
主持人
: 我想我们在开始时就提到了这一点,但对某种测试使用进行大量优化是强化学习最初所采用的一种方式。但是,你们是否有更好的想法,关于如何更多地针对真实世界的使用进行优化,在这种情况下,人类正在使用它,而不仅仅是为了优化测试覆盖率?比如,你这话是什么意思?大部分情况下,强化学习都在用来完成大量的测试用例。而且,你知道,大部分情况下,我们关心的不是模型完成测试用例。我们希望它非常擅长,比如,我不知道,在整个文件中添加控制台日志。我们希望它擅长各种更以人为中心的事情,而不是仅仅为了完成一项特定的微小任务并通过一堆测试。这也许是对SweetBench的一种控诉,我知道Federico并不喜欢它。
成员B
: 是的,我的意思是,如果我们要获得这些更像是人类的回报,这些回报能够触及到一些品味。比如,你想要代码质量,或者,是的,比如,打印出正确的东西。看起来要获得这些,你需要做的就是从真实环境中的真实人类那里获得一些真实的信号。用户喜欢智能体所做的改变吗?或者基于某些代理,比如,他们是否接受了这些编辑,或者……
成员D
: 是的,我的意思是,我认为有很多事情要做,比如,仅仅是看看用户所做的真实改变是什么。然后由此,很好地了解,比如,当你重新推出智能体时,它是否做了类似的事情。因为,比如,用户会进去,而且,如果它是错误的,他们就会做一些不同的事情。而且还有很多很酷的事情,当你有一个在后台运行的东西时,你可以做,对吧?而且你可以,例如,让它尝试三、四次解决这个问题。尝试一堆不同的模型。尝试一堆不同的方法,比如,把温度调高。然后选择,就像,我会浏览Cursor提供的所有选项。然后我会选择那个有效的,对吧?这对于训练奖励模型来说是一个非常好的信号。
成员A
: 从K次尝试中模型得到正确答案的比例,即PassAtK,比PassAt1(即模型第一次尝试就得到正确答案的次数)高得多,这有点令人惊讶。
成员D
: 即使没有一个好的Oracle,或者甚至没有一个奖励模型,也有一些技巧可以做到,也许不能完全达到PassAtK,但可以缩小差距。
成员B
: 是的,是的。那么,比如说,如果你多次采样,你可以采取多数投票,或者你可以,比如说,拥有一个奖励模型来选择最好的一个,这样你就可以在某种程度上缩小差距。
成员D
: 如果我们确实拥有奖励信号,比如说,有大量的关于奖励信号的数据,比如说,有那么多的展开,用户总是从二选一或三选一中选择。是的,我们如何以不同的方式进行强化学习(RL)?我们是否会仅仅根据那个信号训练一个奖励模型,并只专注于那个信号?
成员A
: 是的。
成员D
: 比如,另一个好处是如果你的奖励模型看到了真实情况,对吧?它有点像比原始模型知道得更多,或者说,比策略知道得更多,对吧?
成员A
: 你无法使其饱和,对吧?因为通常情况下,针对奖励模型的强化学习的问题在于,大约经过200步之后,你就差不多完成了。奖励持续上升,但模型实际上并没有改进。
成员D
: 为什么你不能使那个能看到真实情况的模型饱和呢?
成员A
: 嗯,在某个时间点,你肯定会使它饱和。但由于它扎根于某种现实,我的假设是,它会晚很多很多才会饱和。
成员B
: 是的,奖励模型的问题是,你知道,奖励会永远上升,但你真正关心的实际奖励会停止上升。但如果我们更接近我们关心的事物,也许人们会在循环中做出真正的决定,那么……
成员D
: 不好意思,我只是想说,那么,你认为情况会更糟吗?比如,如果用奖励模型来对抗这种非常清晰的信号,和拥有能够看到真实情况的奖励模型相比,情况会更糟吗?
成员A
: 嗯,如果你有机会重新训练奖励模型,那么就没什么问题了,对吧?
成员D
: 所以你的意思是,如果我们能重新训练那个,比如,在成对选择中使用的奖励模型,那会比初始的真实情况更好吗?
成员A
: 是的,我的意思是,结果表明我们基本上拥有无限的人工反馈。所以我们目前状况良好。
成员C
: 是的,我们正处于一个有趣的境地,对于许多这些模型来说,我们是模型和现实世界之间的接口,至少在模型被用于编码的程度上是这样。因此,在某种意义上,这应该是我们的工作,就是使模型与人们在现实世界中想要的东西相匹配。
成员B
: 是的,我认为存在一种权衡,例如,如果你可以针对现实世界进行无限采样,你可以直接优化它,结果会很好。但是如果你有一些约束,比如,这些样本成本很高,你需要更多地思考,也许我们需要引入一个具有真实情况(ground truth)的奖励,或者类似的东西。这样我们就可以在没有真实用户的情况下更多地进行离线优化,但是...
成员D
: 我们是否认为,通过非常频繁地向用户推出,从而实际从代理模型获得真实的奖励信号是可能的?有什么理由不这样做呢?Jacob可能有一些看法。所以这个想法...我认为我们应该做这件事。
成员C
: 你认为我们应该做这件事。嗯,我认为,在某种程度上,我的说法是,新模型训练完成并开始与现实世界互动之间的循环越短,你的结果就越好。
成员A
: 我更看好使用奖励模型,并更频繁地重新训练它。
成员B
: 比如,如果你每隔几天就做一次,也许会有足够的差异性。
成员C
: 你们都看到了OpenAI在回顾性博客文章中关于谄媚现象的描述吗?他们将模型开始变得谄媚归咎于他们使用点赞和点踩数据进行训练。
成员D
: 点赞和点踩,是的,这绝对是一个糟糕的信号,我可以想象。因为它正在使分布产生偏差,对吧?偏向于会点击点赞和点踩的用户群体。
成员A
: 是的,我永远不会点。这是一个评估。
成员D
: 我觉得这就像一个评估。
成员A
: 你怎么看待这样的人?可能有一部分用户,他们只是为了扰乱别人,故意给出与实际相反的赞或踩的反馈?
成员D
: 嗯,谄媚意味着它,比如,存在某种东西,它指向某个方向,对吧?它不会无的放矢。
成员A
: 是的,我的意思是,反馈必须与用户保持一致,对吧?比如,你需要从用户愿意提供反馈的地方获取反馈。因为他们受到了激励。否则,那就是一个代理,是的。
成员B
: 比如,你希望它尽可能接近真正能帮助用户的东西。
成员A
: 是的,你真正想要优化的是用户的微笑。
成员D
: 我们想要……等等,我甚至没有意识到那是……我没看到那篇博文。他们把它放进博文里了,是的。是因为那个吗?
成员C
: 嗯,是因为很多事情,但他们说那可能是,像,主要因素之一,我想,这个或者类似的东西。
成员B
: 我们能有的一个实际用途是,比如,我们有模型选择器。如果他们切换掉我们的模型,那可能是一个真实世界的信号,表明他们对我们提供的结果是否满意?
成员D
: 我最喜欢Jacob的信号,对吧?你知道我在说什么吗?
成员C
: 哦,只是想知道代码是否会保留下来?
成员D
: 不,不,不。这才是你想要的长期信号。
成员C
: 哦,只是如果他们因为光标操作而流失,你就不会强化它吗?是的,是的。我们希望用户能留下来并感到满意。
成员D
: 我想知道我们是否可以实际使用流失率,作为推导奖励的一种方式,对吗?流失率是真实的事实。我们想要,比如,优化,最小化流失率。然后,比如,我们能否用它来,比如,从短期信号预测奖励?
成员C
: 一切都归结于偏差-方差权衡。
主持人
: 这里有一个类似的问题,我觉得所有的争论都集中在这种基于结果的事情上。但这种基于结果的事情实际上在R1时期得到了加强。长时间以来,人们非常热衷于这些过程-奖励模型,但是...是的,过程-奖励模型怎么了?然后过程-奖励模型,你知道的,都消失了。发生了什么,查理?
成员B
: 所以过程-奖励模型的问题在于,就像它们被实践的那样,你只是将轨迹传递给一个模型,然后在每个步骤得到一个分数,问题是,模型在仅仅提供分数方面并不那么准确,尤其是在中间步骤。它必须做出预测,比如,对于某些任务,这是否会导致正确的答案?所以发生的情况是,一旦你对这个奖励模型,这个验证器模型施加优化压力,你只能优化一小部分。这和我们正在讨论的问题类似。但是如果你有这些真实信号,你可以像求解数学题一样,持续不断地进行优化。因此,你可以执行,比如,10...我认为DeepSeek R1执行了10000个强化学习步骤。大多数基于人类反馈的强化学习(RLHF)流程只执行,比如,100个。一旦你能执行10000个强化学习步骤,模型就能开始学习真正有趣的、与起点截然不同的行为。所以,是的,关键真的在于你能对它施加多少优化。而使用PRM,你可以施加一些,但它受到限制。它远不如使用这些真实结果奖励来得多。
成员A
: 而且,你执行的步骤越多,情况就越糟,对吧?所以,比如,在一个多步骤场景中,你执行50次工具调用,就会变得更加困难。这也解释了为什么人们更倾向于使用PPO的变体,比如GRPO或RLU,因为价值模型在你的轨迹上存在某种瓶颈。
成员B
: 是的,所以,就像,对于数学和代码这类困难的任务,我认为,你知道,仅仅期望模型产生一个好的价值,这本身就是一个困难的认知任务。它们很难提供真正准确的价值。所以,是的,人们使用GRPO。你就像是,用蛮力进行多次rollout以获得一个价值。而这更接近于真实值。
成员D
: 我可能错过了前面的部分,但是,对于过程奖励模型与真正的结果奖励,这很有意义。但是,过程奖励模型与结果奖励模型相比呢?
成员B
: 因此,比如,一个过程奖励,实际上,如果进行直接比较,比如一个仅仅在最后产生奖励的奖励模型,与一个具有中间步骤,并且你可能正在对其进行搜索的奖励模型相比,后者具有优势。但它也存在同样的问题,就像,你知道,但在两种情况下,你都只能优化到某种程度。
成员D
: 这是否意味着我们将训练过程奖励?比如,这是否意味着,嗯,好吧,我们已经决定了,比如,其中一件事,我们将追求的奖励信号之一是奖励模型,我们会在一定频率后对其进行重新训练。比如,我们应该训练过程奖励吗?
成员B
: 是的,这可能是有道理的。
成员D
: 我觉得,比如……或者过程奖励模型。
成员B
: 是的,比如,如果我们想从每一轮用户数据中尽可能地榨取信息,这可能会给我们带来一些优势。
主持人
: 所以我想这把我们引向了基础设施的问题。你们很多人都参与了强化学习基础设施的建设。有什么有趣的看法吗?什么是良好的强化学习基础设施?
成员A
: 强化学习基础设施有趣的一点是,它自然比训练基础设施更复杂,因为它建立在训练基础设施之上。就像,你用来为 SFT 或预训练执行前向和反向传播的所有工具,你需要它们在强化学习中也能高效运行。另一个有趣的事情是,现在你还需要推理组件。而且,在这个你不像关注用户那样关注延迟的机制中,推理组件也必须进行优化。你关注的是吞吐量。你关注的是尽可能大规模地获得尽可能多的 rollout(轨迹)。对于像 GRPO 这样的算法,情况甚至更有趣,因为你有一个提示,并且你正在为此提示生成许多、许多、许多补全。然后,最终你将针对该提示的所有这些补全进行反向传播。对于数学,开源社区的人们并不真正关心这个事实,因为在数学领域,大多数开源社区的人都在为解决这个数学任务而优化。极其微小的提示。因此,您可以简单地前后浏览所有序列,而无需担心您一直在重新计算提示。但是对于我们的情况,当您拥有代理时,我们有这些巨大的提示。因此,我们不能承受向后遍历所有共享相同提示的这些回滚。因此,您开始进行优化,即与推理服务器更多地重叠,例如,您可能已经从数据加载器中获得了提示,并且在推理服务器已经在处理回滚时,您开始从该提示中获取 KVs。回滚返回后,您已经拥有 KVs,因此您只需转发已返回的回滚即可。然后,当您进行反向传播时,您已经为您的提示准备好了 KVs,因此您可以重用这些 KVs,并且只对这些 KVs 进行一次反向传播。因此,您可以进行许多以前从未真正完成过的有趣的优化。
成员B
: 您还需要能够快速同步训练节点和推理节点之间的参数。这是另一个巨大的挑战。
成员A
: 这也超级有趣,因为人们会针对不同的情况来生成这些展开序列。很多人采用异步方式,即当你回溯当前展开序列时,模型已经在用旧权重生成下一批次的展开序列。因此,生成展开序列的模型实际上是落后一步的。但这样可以大大加快训练速度,因为在下一次迭代时,你无需等待展开序列完成就可以开始进行前向和反向传播。当你需要同步权重时,你必须停止所有进程并执行同步,这通常通过RDMA实现,或者你可以直接通过InfiniBand或Rocky等方式从内存中读取。
成员D
: 在吞吐量方面,你认为你会采取哪些不同的做法?
成员C
: DeepSeek为其DeepSeek v3的服务设置所做的一些事情,就是以吞吐量为导向的,即每秒的token数并不高,但分配给解码的每个GPU采样的token总数却非常好。所以我觉得...我的意思是,他们用它来服务DeepSeek,这很合理,但如果你正在做强化学习,那么进行这些权衡可能就更合适了。
成员D
: 还有在NVL-72上。
成员A
: 并且还需要PD解耦,对吧?这对于强化学习来说超级重要,因为你只需要在一个提示词上进行一次预填充,然后你的所有解码器工作进程就可以启动并帮助你。是的。
成员D
: 我的意思是,还有另一种有趣的强化学习方法,你不需要考虑……在某些方面,它简化了事情。在某些方面,它使事情变得更加复杂,那就是如果你将你为用户所做的推理,复用为你实际为强化学习所做的推理。我是说,雅各布正在为Tad做这方面的工作。
成员C
: 是的。只要你不需要提示词的多个补全,如果你只关心你实际做了什么,然后你只想加强或不加强你所做的,你实际上不需要一个单独的推理组件用于强化学习训练过程。你只需看看真实用户实际发生了什么。这与重新采样,然后使用奖励模型进行比较的情况相比,是一组不同的权衡,因为它更多地依赖于能够非常快速地推出新的策略。但它可以确保您正在优化的策略与实际生成轨迹的策略之间的高度匹配。我们正在为Tad考虑这一点,因为我们单位时间内可以获得大量数据,因为每当有人使用Cursor展示Tad建议时,我们都会获得反馈。所以这只是一个非常大的反馈量。所以我们有很多数据。因此,我们认为在这种情况下,这可能是有意义的。
成员B
: 是的,我认为强化学习存在一个方差问题,基本上,默认情况下,你会得到这些非常高方差的梯度估计。所以如果你有一大批这种经过强化学习的单次展开轨迹,那没问题。如果你没有一大批数据,你需要其他方法来减少方差。这就是GRPO的用武之地,或者你可以训练价值函数。一旦你将基线化加入到强化学习中,这旨在减少梯度的方差。所以你有一个巨大的批次。理论上,足够大的批次应该可以工作。
成员C
: 大批次和短轨迹。你知道,Tad,它的轨迹看起来像几百个token的上升,诸如此类,而Agent会很乐意推出10000个token后再返回。轨迹的方差非常大,是的。
成员A
: 我们如何增加Tad的动作空间,以便强化学习更容易适用?
成员C
: 比如Tad的其他东西,Tad可以提出的其他类型的建议?
成员A
: 是的,比如Tad,如果它只产生一行,你将不得不进行许多许多次推出,才能得到针对该提示的不同建议,对吧?所以,让它更适用于强化学习的一个技巧是,你开始向它添加更多动作,对吧?比如,像跳跃。
成员C
: 是的,是的。跳跃对于Tad来说是额外动作的一个重要来源,因为如果没有跳跃,它常常不得不停止轨迹。但是如果它可以跳跃,那么它就可以继续前进,并且可以获得关于你是否接受那个跳跃以及在跳跃地点做了什么事情的反馈。
主持人
: 是的,我的意思是,你觉得怎么样,我们谈过,你刚才也谈到了,比如gRPO与其他的RL算法相比?
成员B
: 是的,所以我想gRPO和PPO之间的高层次区别在于,PPO有一个价值函数。所以这对于那些没有大量GPU内存的人来说有一些优势,因为现在你不需要存储额外的价值函数权重。但与此同时,你正在进行更多的浮点运算,因为你必须为gRPO进行多次展开。所以存在一种浮点运算和内存之间的权衡。是的,是的。所以就像你可以训练模型,它不会内存溢出(oom),但训练会花费很长时间。而且,是的,最终,我觉得尤其是在这种数学代码的设置中,价值函数无论如何都不是非常准确的。就像你在做的,这又回到了PRM(概率路线图)的事情,你在模型中进行前向传递,它提供了一些价值。它并不是真的那么准确。所以它对你没有太大的帮助。相反,如果你只是进行多次展开,并取平均值并将其用作问题的价值,那么这比你将获得的价值更好。它更稀疏,但它确实有帮助。
成员A
: 在gRPO(广义相对策略优化)之前,有一种非常相似的算法叫做RLU。为什么人们不在意它?
成员B
: 这是一个好问题。好吧,而且gRPO已经存在很长时间了。它是随着DeepSeek的数学论文一起发布的,我记得那大概是一年多以前的事情了。应该是24年,像是24年初之类的。
成员A
: 我认为RLU也大概是2019年发布的。
成员B
: 哦,好的。那就更早了,是的。我想可能是因为随着DeepSeek R1的发布,强化学习(RL)总体上变得更受欢迎了。随着DeepSeek R1的发布,gRPO也出现了,所以人们开始关注它。但是即便gRPO在R1之前就存在了,大概在R1发布一年多之前,我想。
成员A
: 而且他们那时就已经在使用奖励模型了。
成员B
: 或者他们正在基于真实数据进行强化学习。我认为在那篇论文中,他们也尝试了针对概率路线图(PRM)进行强化学习。是的,有趣的是,为什么这没有产生我们在R1中所看到的相同结果,当他们在DeepSeek数学时代进行这项研究时。你认为是什么原因?所以,有一些关于此的有趣工作,比如尝试理解这一点。看起来似乎与基础模型的能力有关,比如预训练数据中的某些东西,或者模型本身已经足够好,基础模型会进行一定程度的回溯。也许不是很频繁,百分之一的样本或者类似的情况。但这已经足够了,一旦你进行大量的强化学习,它就会捕捉到这些行为并放大它们。所以可能仅仅是因为基础模型已经足够好,以至于它们可以学习这些有趣的行为。
成员D
: 但是有人真正复现过R0吗?
成员B
: R1-0? 嗯,我不认为存在非常...存在某种小规模的复现,尤其是在玩具任务上。我猜这很昂贵而且非常困难,对吧?
成员A
: 问题在于...所以人们已经在像Quan32B这样的模型上复现了类似的结果。问题在于建立基础设施,使你能够训练大型的DeepSeek模型。这就像是一项巨大的提升,对吧?这需要大量的计算。还有数据,对吧?就像DeepSeek获得了大量的强化学习数据,而我们在开源领域并没有真正拥有这些数据。我们大概有一个10万到20万个示例的数据集。
成员D
: 我的意思是,你看到的所有这些结果,比如一千步,并且是在CPU卸载的情况下才能获得一些结果。更像是10步。更像是50步。
编码智能体的未来展望
主持人
: 好的,最后一个问题。你认为编码代理的未来是什么?
成员C
: 它们将会使用更多的令牌。
成员B
: 是的,我们讨论了很多关于输入上下文的内容,但我认为输出上下文将会是一件大事。特别是如果你看看像O3这样的东西。这与某些其他模型非常不同,那些模型会无休止地进行搜索。它会构建正确的上下文,然后知道如何解决问题。是的,我预计我们会看到一些模型能够执行非常长的工具调用序列,然后它们...
成员D
: 感觉就像浪费了所有这些,因为它可能做了类似的事情,然后就像被扔掉了一样,对吗?下次再来的时候。
成员D
: 感觉对于大多数事情来说,你可能不需要做太多的思考,而且你可以重复利用之前已经发生过的思考,对吧?
成员B
: 是的,是的。我认为你应该能够摊销其中的一部分成本。我的意思是,是的,基本上就像有一个代理能够查看轨迹,或者查看代码库中之前已经完成的事情,并且从中做出有用的推断,然后将其存储在某个地方。
成员D
: 是啊,如果世界看起来像你那样,那就太糟糕了……要使用那样最好的代理,或者使用一个足够好的代理,你必须使用像O3这样的速度和成本的东西。
成员B
: 是的,是的。它应该能够复用一些在后台积累的知识。然后当你提出问题时,它应该能够非常迅速地完成。
成员D
: 我认为长上下文或某种代码库专业化将非常重要。我认为有些东西,你知道,它能够……它有点像能够复用过去所做的工作,能够大致了解这个代码库是如何运作的。
主持人
: 它不必每次都重做工作,来理解如何制作这个东西。
成员D
: 我认为这只会使其更有效率,并输出它实际产生答案所需的令牌。
成员A
: 你怎么看?关于你可以扩大输出令牌数量的另一个事实是,它使训练更加具有样本效率,对吧?就像通常在有监督微调(SFT)中,我们有这些大的提示。而且你知道,模型实际上只从输出令牌那里获得信号。
成员D
: 嗯,这也使得它有点低效,对吧?因为如果是一个超长的输出,你需要进行信用分配,比如,哪些令牌是重要的?然后像使用GRPO,如果我们以我们的方式进行,你将在每几个令牌处进行采样,比如在这个巨大的序列中。我想它变得数据高效了。它数据高效吗?它是数据高效的,但不是计算高效的。
主持人
: 是的。
成员B
: 我的意思是,我认为我们正处于,或者说正在接近这样一种状态,尤其是在语言模型训练方面,即最高质量的数据相对于可用的计算资源而言变得越来越稀缺。比如,最好的数据比计算资源稀缺得多。那么,你到底要如何使用所有这些计算资源呢?所以,你知道,那些看起来计算成本非常高昂的方法可能才是合适的。是的。
主持人
: 好的。今天就到这里吗?
成员B
: 是的。
主持人
: 谢谢。