持续改进Cursor Agent引擎:从上下文窗口到多智能体未来
Cursor团队分享了他们如何像开发软件产品一样持续优化AI编程助手背后的agent引擎。文章详细介绍了上下文窗口的演变(从静态上下文到动态获取)、评估引擎改进的两种方式(离线基准与在线A/B测试)、跟踪和修复退化问题的机制(错误分类与自动化告警)、为不同模型定制引擎的策略,以及支持中途切换模型的挑战与解决方案。最后展望了多智能体协作的未来。
Cursor团队近日发布博客,详细阐述了他们如何像打造一款雄心勃勃的软件产品一样,持续改进其AI编程助手的底层“agent引擎”。文章揭示了从上下文窗口管理到多智能体协作的全方位思考与实践。
上下文窗口的进化
agent与大型语言模型交互的核心是上下文窗口。2024年末初代agent时,模型自主选择上下文的能力较弱,团队大量投入上下文工程,例如每次编辑后自动显示lint和类型错误、限制每次调用工具数量等,并提供了大量静态上下文(如代码库结构、语义匹配代码片段)。随着模型能力提升,这些静态上下文大多被移除,转而让agent在工作时动态获取所需信息。团队认为,动态上下文获取是当前工作的重点。
评估引擎改进的两种方式
引擎与模型共同决定agent质量,但“好”很难定义。团队建立了多层次的度量体系:除了维护公开基准和内部测试集CursorBench外,还进行在线A/B实验。实验中使用延迟、token效率、工具调用次数等客观指标,同时引入两个更模糊但重要的度量:一是“代码保留率”(agent生成的代码在用户仓库中经过一段时间后仍保留的比例),二是用语言模型分析用户对agent初始输出的反应(如用户继续推进下一功能表示满意,粘贴错误栈则表示不满意)。在线测试有时会否决看似有希望的方案,例如尝试更昂贵的摘要模型并未带来显著质量提升。
跟踪与修复退化
随着模型和功能增加,引擎复杂度提升,bug也更难避免。工具调用的错误尤其有害,会导致“上下文腐烂”。团队将错误分为未知错误(即引擎bug)和预期错误(如模型提出错误编辑、读取不存在的文件)。预期错误进一步细分为InvalidArguments、UnexpectedEnvironment、ProviderError等。他们设置告警:未知错误率超过阈值立即报警,预期错误则通过异常检测(按工具和模型计算基线)来发现显著偏离。此外,每周自动化脚本会搜索日志,发现新问题或激增问题并创建工单。通过这个“软件工厂”流程,团队在一个冲刺中将未知工具调用错误降低了一个数量级。
为不同模型定制引擎
引擎抽象层与模型无关,但为每个模型深度定制。例如,OpenAI模型擅长补丁格式编辑,Anthropic模型擅长字符串替换,引擎会为之配备各自熟悉的工具格式。定制深入到提示词层面:OpenAI模型更字面精确,Claude更直觉化。当提前拿到新模型时,团队从最相近的现有模型引擎开始迭代,通过离线评估发现困惑点,反复调整直到满意。有时还会遇到模型特有的“怪癖”,比如某个模型在上下文填满时出现“上下文焦虑”——拒绝继续工作,团队通过提示词调整减轻了这一行为。
支持中途切换模型的挑战
用户可能在对话中途切换模型,这要求引擎同时支持不同模型的行为、提示词和工具形状。Cursor会自动切换至对应引擎,但模型需要处理由另一模型产生的对话历史,这属于分布外数据。为此,引擎会向模型添加指令,告知其正在接手其他模型的任务,并引导其避免调用不属于当前工具集的工具。切换还会导致缓存失效,增加延迟和成本。团队尝试用对话摘要来缓解,但复杂任务中摘要可能丢失细节,因此建议用户在单个对话中尽量保持同一模型。另一种方案是使用子agent(subagent),其拥有全新的上下文窗口,用户可直接要求以特定模型运行子agent。
引擎与软件开发的未来
团队认为,AI辅助软件工程的未来是多智能体协作。系统将学会把任务委托给专门的智能体:一个负责规划,一个负责快速编辑,一个负责调试等。而这一切的核心是引擎——它需要知道派遣哪个agent、如何为其构建任务、以及如何将结果整合成连贯的工作流。因此,引擎工程对于agent成功的意义将越来越重大。