昨夜西风 返回博客

🧠 构建聪明Agent的秘密:Manus团队的上下文工程实践全揭秘

最近看了一篇Manus AI团队的实战总结,讲的是他们在构建AI代理(Agent)系统时,为什么不从零训练模型,而是专注做"上下文工程"。作为产品/AI开发者,读完收获特别大,所以在这篇文章里,我用通俗的方式总结出来,分享给同样对Agent感兴趣的你。

🧭 为什么不训练模型,而要做"上下文工程"?

过去做NLP,要把模型拉下来、精调、部署,非常慢,一次改动可能就是几周时间。但现在的大模型(像GPT、Claude等)已经"强得离谱",只要组织好上下文,它就能自动完成推理和决策。

所以Manus做了一个关键决策:

我们不训练模型,而是训练上下文。

这带来两个好处:

  • ⚡ 迭代快:几小时就能上线改动
  • 🚀 跟着模型一起升级:大模型越强,我们的Agent就越聪明

他们把这条路叫做"上下文工程"(Context Engineering),是一种让LLM做事的全新方法论。

🧩 一、KV缓存命中率:性能和成本的生死线

LLM每次生成输出,其实就是"把你给的所有上下文吃一遍,再做下一步"。这会非常慢、非常贵。幸运的是,大模型支持KV Cache —— 如果你之前的上下文没变,它就能"跳过重新计算"。

📉 缓存和不缓存的成本差了10倍:

状态 成本(每百万 tokens)
有缓存命中 $0.30
没命中缓存 $3.00

所以,KV Cache 命中率直接决定了你Agent的成本、速度、稳定性。

如何保持缓存命中?

  • ❌ 不要在提示里加"精确到秒的时间戳"
  • ✅ 保持提示和上下文结构稳定
  • ✅ 不要随便修改之前的动作记录或观察结果
  • ✅ JSON序列化保持字段顺序一致

🔧 二、工具太多怎么办?遮蔽,而不是移除!

随着Agent越来越复杂,工具数量会爆炸。但工具越多,模型越难选对——越容易"聪明反被聪明误"。

大多数人会怎么做?

➡️ 把无用的工具删掉

Manus是怎么做的?

✅ 保留工具不删,但用"logits遮蔽"控制它不能被选中

举例:

  • 所有浏览器工具名以 browser_ 开头
  • 所有命令行工具以 shell_ 开头

通过给模型设置"你只能选 browser_ 的工具",来限制它的行为。这种方法:

  • 不破坏上下文(KV Cache 不失效)
  • 不让模型找不到之前提到的工具

🧠 三、文件系统就是"无限上下文+外挂记忆"

你以为128K上下文够用了?错!遇到网页、PDF、代码等大数据,分分钟撑爆。

所以Manus的思路是:

把文件系统当作模型的外挂记忆系统。

让模型:

  • 写入文件(保存数据)
  • 读取文件(按需回忆)

比如:

  • 把一整页网页删掉,但保留URL
  • 保留文件路径,内容不放上下文

这样可以:

  • 减少token成本
  • 让记忆随用随取
  • 保持信息可恢复、可追踪

✅ 四、写"待办清单"=操控模型注意力

Manus的Agent在做复杂任务时,会自动生成一个 todo.md 文件,不断更新它:

  • 勾掉已完成的事项
  • 把目标重复写到上下文最后

这样做的目的是:

让模型在每次决策前,都能"回顾一下当前目标"

不然模型容易走着走着就忘了自己要干嘛,尤其是调用几十个工具那种长任务。

💥 五、错误不能抹去,要保留在上下文里

我们人类能从错误中学习,模型也是一样的。

  • ❌ 错误发生了?不要清空上下文重试
  • ✅ 错误发生了?把错误记录也一并留着!

为什么?

  • 模型看到"这种调用失败了",它会自动避开类似操作
  • 错误本身,是学习的机会,不是需要隐藏的污点

🎲 六、不要被少样本学习套路误导

你以为喂几个例子模型就能学会?在Agent里,情况不一样!

比如:

Agent看了5份简历都说"不合适",它会开始惯性拒人,哪怕第6个很优秀

Manus的解决方案:

在上下文中加入轻微的多样性

比如:

  • 调整措辞
  • 换种顺序
  • 加点格式变体

这样可以打破模式化,让模型根据实际内容做判断,而不是照抄前面的例子。

📌 总结一句话:

大模型不是万能的,但一个精心设计的上下文,可以让它变得非常聪明。

上下文工程是Agent系统里真正的灵魂,它决定了:

  • 模型多快跑
  • 错了怎么改
  • 工具怎么选
  • 记忆能不能持续

✍️ 最后说一句:

Manus团队在过去一年里重写了4次架构,踩了无数坑,才总结出这套上下文工程经验。如果你正在做类似的事,希望这篇整理能帮你少走几步弯路!