接连陷裁员、“跑路”争议后, Manus联创发文深度复盘
- 2025-07-24 17:28:52
- 756
距3月6日惊艳亮相仅100余天,Manus接连陷入大规模裁员传闻和“删博跑路”争议。
近日,Manus联创季逸超通过一偏技术博客,对公司发展进行了深度复盘,他在文中坦诚地总结了团队在构建Manus过程中积累的经验教训,主要集中在7个方面:
1.不再只是训练模型,而是押注上下文。放弃“从头开始为开放信息提取和语义搜索训练模型”,Manus将押注于上下文工程,“在几小时内而非几周内推出改进,并使产品与底层模型保持正交”。
2.KV-cache命中率是生产阶段AIAgent最重要的单一指标,它直接影响延迟和成本。从上下文工程的角度来看,提高KV-缓存命中率涉及几个关键实践:保持提示前缀稳定、使上下文仅追加、在需要时明确标记缓存断点。
3.除非绝对必要,避免在迭代过程中动态添加或移除工具。Manus使用遮蔽tokenlogits的方法,让模型看不见不应调用的工具。
4.使用文件系统作为上下文。Manus让模型把长期记忆写入虚拟文件系统,按需读写,实现外部记忆,规避信息丢失。
5.通过复述操控注意力。模型容易中途忘记目标,Manus会不断用自然语言更新并重述todo.md文件,把全局目标拉回注意力焦点,防止任务跑偏。
6.保留错误的内容。Manus发现,“改善Agent行为最有效的方法之一出奇地简单:将错误尝试保留在上下文中。当模型看到失败的行动——以及由此产生的观察结果或堆栈跟踪——它会隐式地更新其内部信念。这会使其先验远离类似的行动,减少重复相同错误的可能性”。
7.不要被少样本提示所困。语言模型会模仿上下文中的行为模式,解决方法是增加多样性,Manus选择在行动和观察中引入少量的结构化变化——不同的序列化模板、替代措辞、顺序或格式的微小噪声,这种受控的随机性有助于打破模式并调整模型的注意力。
Manus此前曾在在业界大火,官方介绍是全球首款通用AI智能体,产品发布后,其官网的访问量迅速增长至千万级别,成为Deepseek之后,在国内另一个出圈的AI应用。
资料显示,Manus于3月6日凌晨发布,是一个通用的AI代理,可以连接思想和行动,它不仅会思考,还会提供结果。Manus擅长工作和生活中的各种任务,在用户休息时完成所有事情。产品官网显示,Manus在GAIA基准测试中取得SOTA的成绩,该成绩大幅超过OpenAI。
然而进入7月,Manus“问题不断”。
首先是7月8日,Manus被爆启动国内业务调整:其120名员工中,仅40余名核心技术人员迁往新加坡总部,其余人员均被裁撤;与此同时,公司正式将全球总部迁至新加坡,并同步退出中国市场。针对上述传闻,Manus回应:“基于公司自身经营效率考量,我们决定对部分业务团队进行调整。公司将继续专注核心业务发展,提升整体运营效率。”
随后在7月11日,Manus官方微博和小红书账号的内容清空。
以下为Manus联合创始人季逸超博客全文:
AIAgent的上下文工程:从构建Manus中学到的经验
在Manus项目的最初阶段,我和我的团队面临一个关键决定:我们应该使用开源基础模型训练一个端到端的Agent,还是基于前沿模型的上下文学习能力构建一个Agent?
在我从事NLP的第一个十年,我们没有这种选择的奢侈。在遥远的BERT时代(是的,已经过去七年了),模型必须先进行微调——并评估——才能转移到新任务。这个过程通常每次迭代需要数周时间,即使与今天的LLM相比,这些模型都很小。对于快速发展的应用,特别是在产品市场契合度(PMF)之前,这种缓慢的反馈循环是一个致命问题。
这是我上一个创业公司的惨痛教训,我从头开始为开放信息提取和语义搜索训练模型。然后GPT-3和Flan-T5出现了,我的内部模型一夜之间变得无关紧要。讽刺的是,这些相同的模型标志着上下文学习的开始——以及一条全新的前进道路。
这个来之不易的教训使选择变得明确:Manus将押注于上下文工程。这使我们能够在几小时内而非几周内推出改进,并使我们的产品与底层模型保持正交:如果模型进步是上涨的潮水,我们希望Manus成为那条船,而不是固定在海床上的柱子。
然而,上下文工程证明并非那么直截了当。它是一门实验科学——我们已经重建了我们的Agent框架四次,每次都是在发现了更好的塑造上下文的方式之后。我们亲切地将这种手动架构搜索、提示调整和经验猜测的过程称为「随机研究生下降法」。它不够优雅,但很有效。
这篇文章分享了我们通过自己的「SGD」所达到的局部最优解。如果你正在构建自己的AIAgent,我希望这些原则能帮助你更快地收敛。
围绕KV-Cache进行设计
如果我必须选择仅一个指标,我认为KV-cache命中率是生产阶段AIAgent最重要的单一指标。它直接影响延迟和成本。为了理解原因,让我们看看典型Agent如何运作:
在接收用户输入后,Agent通过一系列工具使用来完成任务。在每次迭代中,模型根据当前上下文从预定义的动作空间中选择一个动作。然后该动作在环境(例如,Manus的虚拟机沙盒)中执行以产生观察结果。动作和观察结果被附加到上下文中,形成下一次迭代的输入。这个循环持续直到任务完成。
正如你可以想像,上下文随著每一步而增长,而输出——通常是结构化的函数调用——保持相对简短。这使得Agent程序中的预填充和解码比例与聊天机器人相比高度倾斜。例如,在Manus中,平均输入与输出token比率约为100:1。
幸运的是,具有相同前缀的上下文可以利用KV-cache,这大大减少了首个token的时间(TTFT)和推理成本——无论你使用的是自托管模型还是调用推理API。我们谈论的不是小额节省:以ClaudeSonnet为例,缓存的输入token成本为0.30美元/MTok(每百万token),而未缓存的成本为3美元/MTok——相差10倍。
从上下文工程的角度来看,提高KV-缓存命中率涉及几个关键实践:
1.保持提示前缀稳定。由于LLM的自回归特性,即使单个标记的差异也会使该标记之后的缓存失效。一个常见的错误是在系统提示的开头包含时间戳——尤其是精确到秒的时间戳。没错,它可以让模型告诉你当前时间,但它也会降低你的缓存命中率。
2.使你的上下文仅追加。避免修改先前的操作或观察。确保你的序列化是确定性的。许多程式语言和库在序列化JSON对象时不保证稳定的键排序,这可能会悄悄破坏缓存。
3.在需要时明确标记缓存断点。某些模型提供商或推理框架不支持自动增量前缀缓存,而是需要在上下文中手动插入缓存断点。在分配这些断点时,要考虑潜在的缓存过期,并至少确保断点包含系统提示的结尾。
此外,如果你正在使用vLLM等框架自托管模型,请确保启用前缀/提示缓存,并且你正在使用会话ID等技术来一致地路由分布式工作节点间的请求。
遮蔽,而非移除
随著你的Agent获得更多能力,其行动空间自然变得更加复杂——简单来说,工具数量爆炸性增长。最近流行的MCP只会火上浇油。如果你允许用户配置工具,相信我:总会有人不可避免地将数百个神秘工具插入到你精心策划的行动空间中。结果,模型更可能选择错误的行动或采取低效的路径。简而言之,你的全副武装的Agent变得更笨了。
一个自然的反应是设计一个动态行动空间——也许使用类似RAG的东西按需加载工具。我们在Manus中也尝试过这种方法。但我们的实验表明一个明确的规则:除非绝对必要,避免在迭代过程中动态添加或移除工具。这主要有两个原因:
1.在大多数LLMs中,工具定义在序列化后位于上下文的前部,通常在系统提示之前或之后。因此,任何更改都将使所有后续操作和观察的KV-缓存失效。
2.当先前的操作和观察仍然引用在当前上下文中不再定义的工具时,模型会变得困惑。没有约束解码,这通常会导致模式违规或幻觉行为。
为了解决这个问题,同时仍然改进行动选择,Manus使用上下文感知的状态机来管理工具可用性。它不是移除工具,而是遮蔽tokenlogits,在解码过程中防止(或强制)基于当前上下文选择某些行动。
在实践中,大多数模型提供者和推理框架支持某种形式的回应前缀预填充,这允许你在不修改工具定义的情况下限制动作空间。通常有三种函数调用模式(我们将使用来自NousResearch的Hermes格式作为例子):
•必需–模型必须调用函数,但选择不受限制。通过预填充到工具调用标记来实现:<|im_start|>assistant
•指定–模型必须从特定子集中调用函数。通过预填充到函数名称的开头来实现:<|im_start|>assistant{「name」:"browser_
使用这个,我们通过直接遮蔽token的logits来限制动作选择。例如,当用户提供新输入时,Manus必须立即回复而不是采取动作。我们还特意设计了具有一致前缀的动作名称——例如,所有与浏览器相关的工具都以browser_开头,命令行工具则以shell_开头。这使我们能够轻松地强制Agent在给定状态下只从某个特定工具组中进行选择,而无需使用有状态的logits处理器。
这些设计有助于确保ManusAgent循环保持稳定——即使在模型驱动的架构下。
使用文件系统作为上下文
现代前沿大语言模型现在提供128K个token或更多的上下文窗口。但在真实世界的Agent场景中,这通常不够,有时甚至是一种负担。有三个常见的痛点:
1.观察可能非常庞大,尤其是当Agent与网页或PDF等非结构化数据互动时。很容易超过上下文限制。
2.模型性能往往会下降,超过一定的上下文长度后,即使技术上支援该窗口大小。
3.长输入成本高昂,即使使用前缀缓存。你仍需要为传输和预填充每个标记付费。
为了解决这个问题,许多Agent系统实现了上下文截断或压缩策略。但过度激进的压缩不可避免地导致信息丢失。这个问题是根本性的:Agent本质上必须基于所有先前状态预测下一个动作——而你无法可靠地预测哪个观察可能在十步之后变得至关重要。从逻辑角度看,任何不可逆的压缩都带有风险。
这就是为什么我们在Manus中将文件系统视为最终上下文:大小不受限制,本质上持久存在,并且可由Agent自身直接操作。模型学会按需写入和读取文件——不仅将文件系统用作储存,还用作结构化的外部记忆。
我们的压缩策略始终设计为可恢复的。例如,只要保留URL,网页的内容就可以从上下文中删除,如果沙盒中仍然有文件路径,则可以省略文件的内容。这使Manus能够缩短上下文长度而不会永久丢失信息。
在开发这个功能时,我发现自己在想像状态空间模型(SSM)要在Agent环境中有效运作需要什么条件。与Transformers不同,SSMs缺乏完整的注意力机制,并且在处理长距离的向后依赖关系时表现不佳。但如果它们能够掌握基于文件的记忆——将长期状态外部化而不是保持在上下文中——那么它们的速度和效率可能会开启一种新型Agent。基于Agent的SSMs可能是神经图灵机的真正继承者。
通过复述操控注意力
如果你使用过Manus,你可能注意到一个有趣的现象:在处理复杂任务时,它倾向于创建一个todo.md文件——并在任务进行过程中逐步更新它,勾选已完成的项目。
这不仅仅是可爱的行为——这是一种操控注意力的刻意机制。
Manus中的典型任务平均需要大约50次工具调用。这是一个很长的循环——由于Manus依赖LLM进行决策,它很容易偏离主题或忘记早期目标,尤其是在长上下文或复杂任务中。
通过不断重写待办事项列表,Manus将其目标重述到上下文的末尾。这将全局计划推入模型的近期注意力范围,避免了「迷失在中间」的问题,并减少了目标错位。实际上,它正在使用自然语言来使自己的焦点偏向任务目标——而无需特殊的架构更改。
保留错误的内容
Agent会犯错。这不是一个错误—这是现实。语言模型会产生幻觉,环境会返回错误,外部工具会出现异常,而意外的边缘情况随时都会出现。在多步骤任务中,失败不是例外;它是循环的一部分。
然而,一个常见的冲动是隐藏这些错误:清理追踪记录,重试动作,或重置模型的状态,并将其留给神奇的「温度」。这感觉更安全,更受控制。但这是有代价的:抹去失败会移除证据。而没有证据,模型就无法适应。
在我们的经验中,改善Agent行为最有效的方法之一出奇地简单:将错误尝试保留在上下文中。当模型看到失败的行动——以及由此产生的观察结果或堆栈跟踪——它会隐式地更新其内部信念。这会使其先验远离类似的行动,减少重复相同错误的可能性。
事实上,我们相信错误恢复是真正Agent行为的最清晰指标之一。然而,在大多数学术工作和公开基准测试中,这一点仍然代表性不足,这些测试通常关注理想条件下的任务成功。
不要被少样本提示所困
少样本提示是提高LLM输出的常见技术。但在Agent系统中,它可能以微妙的方式适得其反。
语言模型是优秀的模仿者;它们模仿上下文中的行为模式。如果你的上下文充满了类似的过去行动-观察对,模型将倾向于遵循该模式,即使它不再是最优的。
这在涉及重复决策或行动的任务中可能很危险。例如,当使用Manus帮助审查20份简历时,Agent常常会陷入一种节奏——仅仅因为这是它在上下文中看到的内容而重复类似的行动。这导致偏移、过度泛化,或有时出现幻觉。
解决方法是增加多样性。Manus在行动和观察中引入少量的结构化变化——不同的序列化模板、替代措辞、顺序或格式的微小噪声。这种受控的随机性有助于打破模式并调整模型的注意力。
换句话说,不要让自己陷入少量样本的窠臼。你的上下文越统一,你的Agent就越脆弱。
结论
上下文工程仍然是一门新兴科学——但对于Agent系统来说,它已经是必不可少的。模型可能变得更强大、更快速、更便宜,但再多的原始能力也无法取代对记忆、环境和反馈的需求。你如何塑造上下文最终定义了你的Agent的行为方式:它运行的速度、恢复的效果以及扩展的程度。
在Manus,我们通过反复重写、死胡同和跨数百万用户的真实世界测试学到了这些教训。我们在这里分享的内容并非普遍真理——但这些是对我们有效的模式。如果它们能帮助你避免哪怕一次痛苦的迭代,那么这篇文章就达到了它的目的。
Agent化的未来将取决于一次次对上下文的精雕细琢。好好设计它们吧。
- 上一篇:多家新成立公司以拉布布命名
- 下一篇:原来排卵期一直都在被误解