从全球爆火,到成功融资,再到被曝删博、裁员、跑路新加坡,Manus仅仅用了四个月,就把一条新兴赛道的创业演示了个遍。
有人认为Manus开了一个很坏的头,利用中国工程师资源打造产品,迅速融资,裁员跑路......
在一片争议声中,今天凌晨,这家公司的联合创始人季逸超罕见发声,发布了长达数千字的博客,试图把舆论拉回到产品和技术本身,也第一次公开回应了这场起落背后的关键教训。
我们先简单回顾一下。今年3月,Manus因“全球首个通用Agent”概念走红,当时有人说这是中国的“第二个DeepSeek时刻”。
5月,Manus很快完成由硅谷顶级风投Benchmark领投的7500万美元B轮融资,估值飙升至5亿美元。外界对它的一度期待极高。
但6月底,Manus突然被媒体曝出多起争议事件:部分员工称被无预警裁员、创始团队在社交平台上大规模删博、公司主体搬到新加坡,舆论哗然。
一时间,删博、裁员、跑路,成了这家明星Agent创业公司的主要标签。
面对外界质疑,季逸超这次选择用一篇技术向的长文作答,首次系统总结了团队对Agent产品和技术的核心认知:
1. 选择上下文工程,而非端到端自研大模型。Manus创始人上一家公司曾尝试从零训练NLP模型,结果被GPT-3等大模型淘汰。这次复盘后,他们选择不再自研底层模型,而是专注于如何基于开源或商业大模型,做“上下文工程”,把现有能力最大化发挥出来。
2. KV缓存命中率是代理系统的核心指标。多轮智能代理与单轮聊天不同,输入输出比可能高达100:1,长输入会极大影响延迟和推理成本。上下文设计的目标是最大化KV缓存命中率,这要求提示要稳定、上下文只追加不修改、保证前缀可重复利用。
3. 工具管理避免动态增减,用遮蔽代替删除。代理功能多,动作空间会迅速扩大,模型更易选错。动态添加或删除工具会导致缓存失效。Manus的实践是用上下文状态机管理工具可用性:通过屏蔽Token概率,而非直接从上下文移除,既保证灵活性,又保留缓存。
4. 把文件系统当作无限上下文。大模型上下文窗口再大也有限,且超长上下文会拉低推理速度、抬高成本。Manus做法是把文件系统当作代理的外部记忆,信息可随时存取,保证历史状态可查、可读写、可恢复。
5. 用显式“背诵”机制操控模型注意力。在长任务中,Manus会自动生成todo.md,把任务拆解成可执行清单,并不断更新,把目标重复写到上下文末尾,相当于“反复提醒模型”,避免任务中途跑偏。
6. 不抹掉错误,保留失败信息以帮助模型自我修正。智能体必然会出错,与其隐藏错误、重新开始,不如把失败信息留在上下文里,让模型“看到”失败路径,形成负面示例,从而减少同类错误。
7. 一句话总结就是:上下文工程是一门新兴的实验科学,Manus想用上下文塑造代理的行为和能力:不是比拼模型多聪明,而是比拼怎么让模型更有用。
从这篇博客看得出,Manus并非完全是个“PPT项目”。它确实做了不少面向Agent场景的底层探索,也踩过不少坑。
但这篇长文没提到外界最关心的问题:公司为什么要搬去新加坡?国内被裁员工如何善后?等等。
季逸超在结尾写道:“智能代理的未来将由一个个情境逐步构建。精心设计每一个情境。”
当下的现实是,Manus是否还有机会把这些“情境”从技术文档带回真正的用户手里?
面向AI代理的上下文工程:构建 Manus 的经验教训
2025 年 7 月 18 日 季逸超
在Manus 项目伊始,我和团队面临一个关键抉择:是使用开源基础模型训练一个端到端的代理模型,还是基于前沿模型的上下文学习能力构建代理?
回想我在自然语言处理领域的最初十年,我们没有这样的选择余地。在BERT 的远古时代,模型必须经过微调并评估后才能迁移到新任务。即使当时的模型远小于如今的 LLMs,这一过程每次迭代往往也需数周。对于快速发展的应用,尤其是产品市场匹配前期,这样缓慢的反馈周期是致命的。这是我上一家创业公司的惨痛教训,当时我从零开始训练模型用于开放信息抽取和语义搜索。随后 GPT-3 和 Flan-T5 的出现,让我自研的模型一夜之间变得无关紧要。讽刺的是,正是这些模型开启了上下文学习的新纪元——也为我们开辟了一条全新的前进道路。
这个来之不易的教训让选择变得清晰:Manus 将押注于上下文工程。这使我们能够在数小时内发布改进,而不是数周,同时保持我们的产品与底层模型正交:如果模型进步是涨潮,我们希望 Manus 是船,而不是固定在海床上的柱子。
然而,上下文工程远非简单。这是一门实验科学——我们已经重建了四次代理框架,每次都是在发现了更好的上下文塑造方法之后。我们亲切地称这种手动的架构搜索、提示调整和经验猜测过程为“随机梯度下降”。它不优雅,但有效。
这篇文章分享了我们通过自己的“SGD”达到的局部最优解。如果你正在构建自己的 AI 代理,希望这些原则能帮助你更快收敛。
围绕KV缓存设计
如果只能选择一个指标,我认为KV 缓存命中率是生产阶段 AI 代理最重要的指标。它直接影响延迟和成本。要理解原因,我们先看看典型代理的工作方式:
在接收到用户输入后,代理通过一系列工具调用来完成任务。在每次迭代中,模型根据当前上下文从预定义的动作空间中选择一个动作。然后在环境中执行该动作,以产生观察结果。动作和观察结果被追加到上下文中,形成下一次迭代的输入。这个循环持续进行,直到任务完成。
正如你所想象的,上下文随着每一步增长,而输出——通常是结构化的函数调用——则相对较短。这使得预填充与解码之间的比例在代理中远远偏高,区别于聊天机器人。例如,在 Manus 中,平均输入与输出的Token比约为100:1。
幸运的是,具有相同前缀的上下文可以利用KV 缓存,这大大减少了首次生成标记时间和推理成本——无论你是使用自托管模型还是调用推理 API。这里的节省可不是小数目:以 Claude Sonnet 为例,缓存的输入标记费用为 0.30 美元/千标记,而未缓存的则为 3 美元/千标记——相差 10 倍。
从上下文工程的角度来看,提高KV 缓存命中率涉及几个关键做法:
保持提示前缀稳定。由于LLMs 的自回归特性,即使是单个标记的差异也会使该标记及其之后的缓存失效。一个常见错误是在系统提示开头包含时间戳——尤其是精确到秒的时间戳。虽然这样可以让模型告诉你当前时间,但也会大幅降低缓存命中率。
使你的上下文仅追加。避免修改之前的操作或观察。确保你的序列化是确定性的。许多编程语言和库在序列化JSON 对象时不保证键的顺序稳定,这可能会悄无声息地破坏缓存。
在需要时明确标记缓存断点。一些模型提供商或推理框架不支持自动增量前缀缓存,而是需要在上下文中手动插入缓存断点。设置这些断点时,应考虑缓存可能过期的情况,至少确保断点包含系统提示的结尾部分。
此外,如果你使用像vLLM 这样的框架自托管模型,确保启用了前缀/提示缓存,并且使用会话 ID 等技术在分布式工作节点间一致地路由请求。
遮蔽,而非移除
随着你的智能体功能不断增强,其动作空间自然变得更加复杂——简单来说,就是工具数量激增。最近 MCP 的流行更是火上浇油。如果允许用户自定义工具,相信我:总会有人将数百个神秘工具接入你精心策划的动作空间。结果,模型更可能选择错误的动作或走低效路径。简而言之,你的重装智能体反而变得更笨。
一种自然的反应是设计动态动作空间——或许使用类似 RAG 的方式按需加载工具。我们在 Manus 中也尝试过。但实验表明一个明确的规则:除非绝对必要,避免在迭代过程中动态添加或移除工具。主要有两个原因:
1. 在大多数LLMs 中,工具定义在序列化后通常位于上下文的前部,通常在系统提示之前或之后。因此,任何更改都会使所有后续操作和观察的 KV 缓存失效。
2. 当之前的操作和观察仍然引用当前上下文中不再定义的工具时,模型会感到困惑。如果没有受限解码,这通常会导致模式违规或幻觉操作。
为了解决这一问题,同时提升动作选择的效果,Manus 使用了一个上下文感知的状态机来管理工具的可用性。它不是移除工具,而是在解码过程中屏蔽Token的对数概率,以根据当前上下文防止选择某些动作。
在实际操作中,大多数模型提供商和推理框架都支持某种形式的响应预填充,这使你可以在不修改工具定义的情况下限制动作空间。函数调用通常有三种模式:
自动——模型可以选择是否调用函数。通过仅预填回复前缀实现:assistant
必需——模型必须调用一个函数,但选择不受限制。通过预填充到工具调用标记实现:assistant
指定——模型必须从特定子集中调用函数。通过预填充到函数名开头实现:assistant
{"name": “browser_ 利用此方法,我们通过直接屏蔽标记的对数概率来限制动作选择。例如,当用户提供新输入时,Manus 必须立即回复,而不是执行动作。我们还特意设计了具有一致前缀的动作名称——例如,所有与浏览器相关的工具都以 browser_开头,命令行工具以 shell_开头。这使我们能够轻松确保代理在特定状态下仅从某一组工具中选择,而无需使用有状态的对数概率处理器。
这些设计有助于确保Manus 代理循环保持稳定——即使在模型驱动架构下也是如此。
将文件系统用作上下文
现代前沿的LLMs 现在提供 128K Token或更多的上下文窗口。但在现实世界的智能代理场景中,这通常不够,有时甚至成为负担。有三个常见的痛点:
1. 观察内容可能非常庞大,尤其是当代理与网页或PDF 等非结构化数据交互时。很容易超出上下文限制。
2. 即使窗口技术上支持,模型性能在超过某个上下文长度后往往会下降。
3. 长输入代价高昂,即使使用前缀缓存也是如此。你仍然需要为传输和预填充每个标记付费。
为了解决这个问题,许多智能体系统实施了上下文截断或压缩策略。但过度压缩不可避免地导致信息丢失。问题是根本性的:智能体本质上必须基于所有先前状态来预测下一步动作——而你无法可靠地预测哪条观察在十步之后可能变得关键。从逻辑角度看,任何不可逆的压缩都存在风险。
这就是为什么我们将文件系统视为Manus 中的终极上下文:大小无限,天生持久,并且可以由智能体自身直接操作。模型学会按需写入和读取文件——不仅将文件系统用作存储,更作为结构化的外部记忆。
我们的压缩策略始终设计为可恢复的。例如,只要保留网址,网页内容就可以从上下文中删除;只要沙盒中仍有文档路径,文档内容也可以省略。这使得
Manus 能够缩短上下文长度而不永久丢失信息。在开发此功能时,我不禁想象,状态空间模型要在具代理性的环境中有效工作需要什么条件。与 Transformer 不同,SSM 缺乏完全的注意力机制,难以处理长距离的向后依赖。但如果它们能掌握基于文件的记忆——将长期状态外部化而非保存在上下文中——那么它们的速度和效率可能会开启新一代代理。具代理性的 SSM 或许才是神经图灵机的真正继任者。
通过背诵操控注意力
如果你使用过Manus,可能会注意到一个有趣的现象:在处理复杂任务时,它倾向于创建一个 todo.md 文件,并随着任务的推进逐步更新,勾选已完成的事项。
这不仅仅是可爱的行为——这是一种有意操控注意力的机制。
Manus 中的一个典型任务平均需要大约 50 次工具调用。这是一个较长的循环——由于 Manus 依赖 LLMs 进行决策,因此在长上下文或复杂任务中,容易偏离主题或忘记之前的目标。
通过不断重写待办事项清单,Manus 将其目标反复写入上下文末尾。这将全局计划推入模型的近期注意力范围,避免了“中途丢失”问题,减少了目标不一致的情况。实际上,它利用自然语言来引导自身关注任务目标——无需特殊的架构改动。
保留错误信息
智能体会犯错。这不是漏洞——这是现实。语言模型会产生幻觉,环境会返回错误,外部工具会出现异常,意外的边缘情况时常发生。在多步骤任务中,失败不是例外;它是循环的一部分。
然而,一个常见的冲动是隐藏这些错误:清理痕迹,重试操作,或重置模型状态,寄希望于神奇的“温度”参数。这看起来更安全、更可控。但这付出了代价:抹去失败就抹去了证据。没有证据,模型就无法适应。
根据我们的经验,改善智能体行为的最有效方法之一看似简单:在上下文中保留错误的路径。当模型看到失败的操作及其产生的观察结果或堆栈跟踪时,它会隐式地更新内部信念。这会使其先验偏离类似的操作,从而减少重复同样错误的可能性。
事实上,我们认为错误恢复是衡量真正智能体行为的最明确指标之一。然而,在大多数学术研究和公开基准测试中,这一指标仍然被忽视,这些研究和测试通常侧重于理想条件下的任务成功率。
避免被少量示例限制
少量示例提示是提升LLM 输出的常用技巧。但在智能体系统中,它可能以微妙的方式适得其反。
语言模型擅长模仿;它们会复制上下文中的行为模式。如果你的上下文充满了类似的过去动作-观察对,模型往往会遵循这种模式,即使这已不再是最优选择。
在涉及重复决策或操作的任务中,这可能会带来危险。例如,在使用Manus 帮助审查一批 20 份简历时,代理经常陷入一种节奏——仅仅因为上下文中出现了类似内容,就重复执行相似的操作。这会导致偏离、过度泛化,甚至有时产生幻觉。
解决方法是增加多样性。Manus 在动作和观察中引入少量结构化的变化——不同的序列化模板、替代表达、顺序或格式上的细微噪声。这种受控的随机性有助于打破模式,调整模型的注意力。
换句话说,不要让少量示例把自己限制在固定模式中。上下文越统一,代理就越脆弱。
结论
上下文工程仍是一门新兴科学——但对于代理系统来说,它已经至关重要。模型可能变得更强大、更快速、更廉价,但再强的原始能力也无法替代记忆、环境和反馈的需求。你如何塑造上下文,最终决定了代理的行为:运行速度、恢复能力以及扩展范围。
在Manus,我们通过反复重写、走过死胡同以及在数百万用户中的实际测试,学到了这些经验。我们在这里分享的内容并非普遍真理,但这些是对我们有效的模式。如果它们能帮助你避免哪怕一次痛苦的迭代,那么这篇文章就达到了它的目的。
智能代理的未来将由一个个情境逐步构建。精心设计每一个情境。