大模型能力在涨,Agent 框架在瘦身,用户界面在变薄。三层夹心结构里,中间那层到底该多厚、谁来砌砖,正在成为整个 Agent 生态最激烈的争夺点。
三层结构:底座、夹心、壳
Manus、OpenClaw、Claude Managed Agent——三个当下最受关注的 Agent 方案,骨子里都是同一副骨架:
| 层级 | 角色 | 典型内容 |
|---|---|---|
| 底层 | 基础模型 | GPT-4o、Claude 3.5、开源 LLM |
| 中间层 | Agent 能力构建 | 工具编排、记忆管理、规划推理、权限控制 |
| 顶层 | 用户交互界面 | 对话窗口、任务面板、浏览器插件 |
三层本身没什么争议。争议集中在中间层:谁来写中间层的代码,中间层该多厚。
三种答案,三种厚度
Manus:中间层最厚,自己全砌
Manus 的策略是"全栈 Agent"——中间层几乎全部由团队自建:工具调用链、多步规划器、沙箱执行环境、结果校验模块,一层叠一层。用户只管提需求,剩下的 Manus 自己跑完。
好处是体验丝滑:用户不需要懂工具、不需要写 prompt 技巧,丢一句"帮我调研竞品定价"就能拿到完整报告。代价是中间层膨胀——每新增一个场景,就要在夹心层里多码一层胶水代码,维护成本随场景数线性上升。
OpenClaw:中间层最薄,用户自砌
OpenClaw 走了另一个极端——中间层只提供最基础的 hook:一个工具注册接口、一个简单的循环调度器、一个上下文窗口管理器。至于怎么规划、怎么选工具、怎么处理异常,全部交给用户(或开发者)在顶层自己拼。
结果:中间层极薄,框架本身几乎零学习成本,但用户要自己写编排逻辑。对开发者来说这是自由,对普通用户来说这是门槛。
Claude Managed Agent:中间层适中,模型自砌
Claude 的 Managed Agent 方案最有意思——中间层的厚度由模型能力决定。Anthropic 不手动写厚重的编排框架,而是让 Claude 自己在推理过程中完成规划、工具选择、回溯纠错。框架只提供"工具描述 + 安全边界",剩下的交给模型的自推理能力。
这意味着:模型越强,中间层越薄;模型越弱,中间层越厚。 中间层的厚度变成了模型能力的倒数。
什么正在变厚?
中间层在塌缩,但有两样东西在变厚:
一是工具生态层。 当中间层不再负责硬编码每个工具的调用逻辑,工具本身的描述质量、接口规范、错误处理就成了新的"厚度"来源。一个写得好、描述清晰的 MCP 工具,比十个需要中间层手写胶水的碎片 API 更有价值。
二是模型推理层。 当编排逻辑从中间层代码迁移到模型推理链,prompt engineering、推理链设计、安全护栏配置就成了新的"厚度"。这不是代码厚度,而是认知厚度——你需要在模型可理解的范围内,把任务边界、约束条件、回退策略全部表达清楚。
简单说:代码在变薄,语义在变厚。
实践:用三种厚度搭同一个 Agent
下面用一个"调研竞品定价"的 Agent 为例,展示三种中间层厚度的实现差异。所有示例基于 Python,可直接改造运行。
方案一:厚中间层——硬编码编排
"""厚中间层:所有编排逻辑写在框架代码里"""
import json
from typing import Any
class ThickMiddleware:
"""Manus 风格:框架硬编码每一步"""
def __init__(self, model_client, tools: dict[str, Any]):
self.model = model_client
self.tools = tools # {"web_search": fn, "scrape_page": fn, "summarize": fn}
def run(self, task: str) -> str:
# 第一步:搜索竞品
search_result = self.tools["web_search"](query=f"{task} 竞品定价")
# 第二步:抓取详情页
pages = []
for url in search_result["urls"][:3]:
pages.append(self.tools["scrape_page"](url=url))
# 第三步:摘要
combined = "\n".join(p["text"] for p in pages)
summary = self.tools["summarize"](text=combined, prompt="提取定价信息")
# 第四步:模型润色
final = self.model.chat(
f"根据以下调研结果,生成定价对比报告:\n{summary}"
)
return final
# 使用
agent = ThickMiddleware(model_client=my_llm, tools=my_toolbox)
report = agent.run("智能客服 SaaS")
每加一个场景,就要写一个新的 run 方法。中间层代码量随场景数增长——这就是"厚"。
方案二:薄中间层——用户自编排
"""薄中间层:框架只提供循环调度,编排交给用户"""
from openclaw import Agent, Tool # 假设的 OpenClaw SDK
# 用户自己定义工具和编排 prompt
agent = Agent(
model="gpt-4o",
tools=[
Tool(name="web_search", fn=my_search, desc="搜索网页,返回 URL 和摘要"),
Tool(name="scrape_page", fn=my_scrape, desc="抓取网页全文"),
],
# 编排逻辑全写在 system prompt 里——这就是"薄中间层"
system_prompt="""你是一个竞品调研助手。
步骤:
1. 用 web_search 搜索目标竞品的定价信息
2. 用 scrape_page 抓取前 3 个结果的详情
3. 综合分析后输出定价对比表格
如果搜索结果不足,换关键词重试。""",
)
result = agent.run("调研智能客服 SaaS 的竞品定价")
框架只管"调用模型 → 解析工具调用 → 执行工具 → 回传结果"这个循环。编排全靠 prompt——薄到几乎没有框架代码。
方案三:模型自编排——中间层厚度随模型浮动
"""模型自编排:Claude Managed Agent 风格"""
import anthropic
client = anthropic.Anthropic()
# 中间层只提供工具描述和安全边界
tools = [
{
"name": "web_search",
"description": "搜索网页。输入查询关键词,返回相关页面 URL 和摘要。",
"input_schema": {
"type": "object",
"properties": {"query": {"type": "string"}},
"required": ["query"],
},
},
{
"name": "scrape_page",
"description": "抓取指定 URL 的网页内容,返回纯文本。",
"input_schema": {
"type": "object",
"properties": {"url": {"type": "string"}},
"required": ["url"],
},
},
]
# 不写编排逻辑——模型自己规划步骤
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=4096,
tools=tools,
messages=[
{"role": "user", "content": "调研智能客服 SaaS 的竞品定价,输出对比表格"}
],
)
# 模型自行决定:先搜索、再抓取、再分析
# 中间层代码量 ≈ 0,厚度由模型推理能力决定
print(response.content)
注意这里没有 system_prompt 写编排步骤——模型自己推理出"先搜索再抓取再分析"的链路。中间层代码几乎为零,但前提是模型足够强。
运行前需要修改: 将
my_search、my_scrape替换为你自己的搜索/抓取实现;方案三需要anthropicSDK 和有效 API key。
选哪种厚度?
| 场景 | 推荐厚度 | 原因 |
|---|---|---|
| 垂直 SaaS 产品,场景固定 | 厚中间层 | 可控、可测、可审计 |
| 开发者平台,场景开放 | 薄中间层 | 灵活、可扩展、社区驱动 |
| 模型能力持续升级 | 模型自编排 | 减少硬编码,随模型进化自动变薄 |
一个务实的混合策略:核心路径用厚中间层保稳定,探索性任务用薄中间层给自由,长线押注模型自编排。 三种厚度不是互斥的,而是同一系统里不同模块的选择。
最后一条提醒:中间层变薄不代表"不用写了",而是"写的位置变了"。原来写在框架里的胶水代码,现在要写在工具描述、prompt 约束和安全护栏里。代码厚度在下降,语义厚度在上升——这才是真正的迁移方向。