微信扫码
添加专属顾问
Manus论文揭示AI代理开发的关键基础与实用洞察,避免多代理陷阱从简单架构开始。 核心内容: 1. 上下文窗口与KV缓存在LLM交互中的核心作用 2. 主流LLM模型的上下文窗口参数对比 3. 业务导向的Agent开发原则与架构设计建议
Tl;DR
在学习Manus的经验教训" data-itemshowtype="0" linktype="text" data-linktype="2">AI代理的上下文工程:构建Manus的经验教训一文时,对于前两点做了一些深入的研究,发现原来在与LLM通过API交互时,有2个忽略的基础知识,如果不理清就很难理解该文中描述的具体操作。
这几天一直在整理与Multi Agent以及Context Engineering的文章,逐步理解了这两者的含义和关系,结合最近遇到的一些落地案例,特别想强调一下,在做Agent相关开发时,一定在充分分析业务的基础上,从尽可能简单的架构出发,千万不能为了用Context Engineering而去用。
补充一点:昨天Context Engineering:不要构建多代理这篇文章被转发阅读了很多次(对于我来讲已经算是爆发了),我觉得主要还是"不要构建多代理"这个标题很吸引人,在B站上关于Multi Agent视频比比皆是,都在讲怎么快速、怎么简单,但是真正做过或在做的人,一定知道其中的艰险。
“上下文窗口(Context Window)”指的是语言模型在生成新文本时可以回顾和参考的文本总量,加上它生成的新文本。这与语言模型训练所用的大型语料库不同,而是代表了模型的”工作记忆”。较大的上下文窗口允许模型理解并回应更复杂和更长的提示,而较小的上下文窗口可能会限制模型处理更长提示或在延长对话中保持连贯性的能力。
在通过API调用大模型时,上下文的内容是由调用端提供的,调用端需要在每次调用API时,将上下文的内容作为参数传入。如下图:
所有大模型在发布时,都会标明模型的上下文窗口大小,如上图所示,当上下文窗口超过模型的限制时,模型一般会截取或限制服务。
以下是一些主流LLM模型的上下文窗口大小,一般在官网都可以查询到:
这个问题我问了一下Gemini,它的回答是:
从模型的内部视角(Model's Internal Perspective),LLM 的核心是 Transformer 架构,其关键是自注意力(Self-Attention)机制。为了计算下一个 token,模型需要“回顾”之前所有的 token。
结论: KV 缓存是一个性能优化工具,它极大地加快了模型的推理速度(即响应速度),尤其是长文本的生成。
但是,为什么文章中,作者一直在强调:
幸运的是,具有相同前缀的上下文可以利用KV缓存[7],这大大减少了首个token的生成时间(TTFT)和推理成本——无论你是使用自托管模型还是调用推理API。我们说的不是小幅度的节省:例如使用Claude Sonnet时,缓存的输入token成本为0.30美元/百万token,而未缓存的成本为3美元/百万token——相差10倍。
这其中的推理成本可能对现在的使用场景更加关键,像最近Cursor、Claude Code等出现的订阅收费的问题,更加说明了在Agent快速发展的时候,推理成本的问题会变得更加突出。好像现在市面上,原来号称可以无限"续杯"的会员服务都在调整策略,其中最大的原因就是Agent数量庞大的Tokens消耗(在Anthropic: 如何构建多智能体研究系统文章中,Claude的工程师就提出Multi Agent系统的Token耗用量大概是普通聊天的15倍左右,这是一个非常惊人的数字)
现在主流的LLM基本都已经支持"Prompting Cache"这样的技术,在查阅Deepseek官网时,看到它对整个缓存的动作机制有清晰的描述。
下面摘取一段Deepseek官网的说明,它是以API接口中消息的顺序进行讲解的,与AI代理的上下文工程:构建Manus的经验教训一文中的缓存表述非常吻合,可以作为参考。
例一:长文本问答
第一次请求
messages: [
{"role": "system", "content": "你是一位资深的财报分析师..."}
{"role": "user", "content": "<财报内容>\n\n请总结一下这份财报的关键信息。"}
]第二次请求
messages: [
{"role": "system", "content": "你是一位资深的财报分析师..."}
{"role": "user", "content": "<财报内容>\n\n请分析一下这份财报的盈利情况。"}
]在上例中,两次请求都有相同的前缀,即 system 消息 + user 消息中的 <财报内容>。在第二次请求时,这部分前缀会计入“缓存命中”。
例二:多轮对话
第一次请求
messages: [
{"role": "system", "content": "你是一位乐于助人的助手"},
{"role": "user", "content": "中国的首都是哪里?"}
]第二次请求
messages: [
{"role": "system", "content": "你是一位乐于助人的助手"},
{"role": "user", "content": "中国的首都是哪里?"},
{"role": "assistant", "content": "中国的首都是北京。"},
{"role": "user", "content": "美国的首都是哪里?"}
]在上例中,第二次请求可以复用第一次请求开头的 system 消息和 user 消息,这部分会计入“缓存命中”。
例三:使用 Few-shot 学习
在实际应用中,用户可以通过 Few-shot 学习的方式,来提升模型的输出效果。所谓 Few-shot 学习,是指在请求中提供一些示例,让模型学习到特定的模式。由于 Few-shot 一般提供相同的上下文前缀,在硬盘缓存的加持下,Few-shot 的费用显著降低。
第一次请求
messages: [
{"role": "system", "content": "你是一位历史学专家,用户将提供一系列问题,你的回答应当简明扼要,并以`Answer:`开头"},
{"role": "user", "content": "请问秦始皇统一六国是在哪一年?"},
{"role": "assistant", "content": "Answer:公元前221年"},
{"role": "user", "content": "请问汉朝的建立者是谁?"},
{"role": "assistant", "content": "Answer:刘邦"},
{"role": "user", "content": "请问唐朝最后一任皇帝是谁"},
{"role": "assistant", "content": "Answer:李柷"},
{"role": "user", "content": "请问明朝的开国皇帝是谁?"},
{"role": "assistant", "content": "Answer:朱元璋"},
{"role": "user", "content": "请问清朝的开国皇帝是谁?"}
]第二次请求
messages: [
{"role": "system", "content": "你是一位历史学专家,用户将提供一系列问题,你的回答应当简明扼要,并以`Answer:`开头"},
{"role": "user", "content": "请问秦始皇统一六国是在哪一年?"},
{"role": "assistant", "content": "Answer:公元前221年"},
{"role": "user", "content": "请问汉朝的建立者是谁?"},
{"role": "assistant", "content": "Answer:刘邦"},
{"role": "user", "content": "请问唐朝最后一任皇帝是谁"},
{"role": "assistant", "content": "Answer:李柷"},
{"role": "user", "content": "请问明朝的开国皇帝是谁?"},
{"role": "assistant", "content": "Answer:朱元璋"},
{"role": "user", "content": "请问商朝是什么时候灭亡的"},
]在上例中,使用了 4-shots。两次请求只有最后一个问题不一样,第二次请求可以复用第一次请求中前 4 轮对话的内容,这部分会计入“缓存命中”。
综上所述,无论是处理长文档、进行多轮对话,还是利用 Few-shot 提升效果,其背后都遵循着同一个核心原则:通过保持 Prompt 前缀的稳定性来最大化缓存命中率。理解并善用 Prompt Caching 机制,已经不再是一个锦上添花的技术选项,而是未来在开发高效率、低成本 AI 应用,尤其是在构建复杂 Agent 系统时,每一位开发者都必须掌握的关键技能。
在Manus的论文中,第二点提到:"遮蔽,而非移除(Mask, Don't Remove)",那什么是遮蔽(Mask)呢?
“遮蔽 (Masking)” 的核心思想是:在任何时候,都将所有可能的工具定义完整地保留在模型的上下文(Context)中,但通过技术手段在模型生成(解码)的瞬间,动态地限制模型只能选择当前可用的工具。
在文章有如下的描述:
函数调用通常有三种模式(Hermes):
• 自动(Auto)–模型可以选择调用或不调用函数。通过预填充回复前缀实现:<|im_start|>assistant • 必需(Required)–模型必须调用函数,但选择不受约束。通过预填充到工具调用令牌实现:<|im_start|>assistant<tool_call> • 指定(Specified)–模型必须从特定子集中调用函数。通过预填充到函数名称的开头实现: <|im_start|>assistant<tool_call>{"name": "browser_ 通过这种方式,我们通过直接掩码token的logits来约束动作选择。 Jack,公众号:LiveThinkingAI代理的上下文工程:构建Manus的经验教训
而如果使用API调用模型时,已经有对遮蔽(Mask) 进行支持,以OpenAI的API为例:
当我们调用 chat.completions.create 接口时,可以传递一个 tool_choice 参数来精确控制模型的行为。
tool_choice 参数的作用就是告诉模型:“在这次生成中,你关于工具使用的选择空间被我‘遮蔽’了,你必须遵循以下规则”。
它有几种模式:
response = client.chat.completions.create(
model="gpt-4-turbo",
messages=my_messages,
tools=my_tools,
tool_choice="required" # 强制模型必须选择一个工具调用
)response = client.chat.completions.create(
model="gpt-4-turbo",
messages=my_messages,
tools=my_tools,
tool_choice="none" # 强制模型不能调用任何工具,只能生成文本
)response = client.chat.completions.create(
model="gpt-4-turbo",
messages=my_messages,
tools=my_tools,
# 强制模型必须调用名为 "get_current_weather" 的函数
tool_choice={"type": "function", "function": {"name": "get_current_weather"}}
)总结:可以看出几乎所有主流的模型都支持动态选择,tool_choice 参数(或其它命名方式,视模型而定)是 API 层面对“遮蔽”原则的直接实现。它稳定、可靠,是与 OpenAI、Claude、Gemini 或任何兼容 OpenAI API 的模型交互时的首选方法。
最近的几篇文章:
都是围绕在 Multi-Agent 实施过程中,如何通过 Context Engineering 从理论走向实操的探讨。在深入这些技术细节之后,我希望分享我最核心的一点体会:警惕复杂性。
在实际的落地过程中,我深刻体会到管理和控制 Multi-Agent 系统的复杂度是项目成功的关键。这与行业顶尖公司的理念不谋而合。正如 Anthropic 在其工程建议(Anthopic:构建有效的Agent)中明确指出的:
(何时(以及何时不)使用智能体)
在构建LLM应用时,我们建议寻找最简单的解决方案,并仅在必要时增加复杂性。这可能意味着根本不需要构建智能体系统。智能体系统通常以牺牲延迟和成本为代价,换取更好的任务性能,因此您应该考虑这种权衡何时是合理的。当需要更多复杂性时,工作流为明确定义的任务提供了可预测性和一致性,而智能体则在需要灵活性和模型驱动的决策时是更好的选择。然而,对于许多应用来说,通常通过检索和上下文示例优化单次LLM调用就已足够。
这段话清晰地告诉我们一个朴素的真理:技术是工具,而非目标。智能体(Agent)只是我们工具箱中的一个强大选项,但它有明确的适用场景和需要付出的代价——延迟、成本,以及不可预测性。
因此,在面对眼花缭乱的新技术时,请务必保持清醒与克制。千万不要为了技术而技术。 回归工程的本源,让真实的业务价值,成为驱动你技术选型的唯一核心。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-06-30
Context 即 Agent:下一场 AI 产品战争,是上下文之争
2026-06-30
解析Agent Loop(智能体循环)的三层分级体系
2026-06-30
Cursor、OpenClaw 同时出手,“口袋编程”时代来了:程序员只用“动嘴”!
2026-06-30
从文本到多模态:大模型非结构化数据加工与质量控制实践
2026-06-30
从Anthropic的B端战略,给迷茫中的扣子一些建议
2026-06-30
Claude最新:创始人实操手册:打造 AI 原生初创公司(中文版)
2026-06-30
本体+AI驱动的AI智能体工厂-从设计到实现
2026-06-30
微信AI,能避开豆包手机的窘境吗?
2026-04-15
2026-04-07
2026-04-07
2026-04-24
2026-04-17
2026-04-05
2026-04-02
2026-04-05
2026-04-14
2026-04-24
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。