智能体系统架构深度解析:LLM、Agent、Skill、MCP 的协同范式
核心认知:从拟人化到工程化
在深入探讨四者协同之前,必须建立精准的工程化认知模型,摒弃"AI 有意识"的拟人化误区:
1. LLM(大语言模型)- 文本生成器
-
本质 :高级概率模型,
f(输入文本) → 输出文本 -
核心能力:基于海量训练数据的模式匹配和文本补全
-
关键局限 :无状态、无感知、无执行能力
-
真相:LLM 是"被动应答机",只在被调用时生成文本,对自身输出无"理解"
2. Agent(智能体)- 程序执行框架
-
本质:状态机 + 循环控制器
-
核心功能 :上下文管理、输出解析、工具调用、流程控制
-
关键能力:字符串操作、协议通信、条件判断
-
真相 :Agent 是"自动化的流程引擎",但完全不理解语义
3. Skill(技能)- 功能封装
-
本质:可执行单元的 API 封装
-
表现形式:函数、服务接口、命令行工具
-
关键特性:输入输出明确、功能单一、可复用
-
真相:Skill 是"功能的黑盒",不关心调用者和上下文
4. MCP(模型上下文协议)- 标准化接口
-
本质:工具描述和调用的通用协议
-
核心价值 :解耦 Agent 与具体工具实现
-
关键功能:工具发现、统一调用、结果标准化
-
真相:MCP 是"工具世界的 USB-C",解决兼容性问题
纠正三大核心误解
在进入工作流程前,必须澄清:
误解 1:"LLM 在规划和思考"
事实:LLM 生成"看似规划"的文本,但这种生成是基于统计模式而非逻辑推理。"规划文本"和"闲聊文本"对 LLM 而言没有本质区别。
误解 2:"Agent 能理解任务"
事实 :Agent 的"理解"仅限于字符串匹配和规则判断。它不知道"天气"是什么,只知道当 LLM 输出 Action: get_weather 时,应该调用某个注册的函数。
误解 3:"系统是智能的"
事实 :智能是涌现属性。单个组件都"不智能",但通过精心设计的协议和流程,整个系统表现出智能行为。
四者协同:机械但高效的流水线
整个系统的工作流程可以概括为:LLM 生成指令文本,Agent 解析并执行,Skill 提供功能,MCP 确保通信。
第一阶段:初始化(无 LLM 参与)
flowchart TD
A[Agent 启动] --> B[连接 MCP Server]
B --> C[获取工具清单]
C --> D[注册 Skill 描述]
D --> E[构建 Prompt 模板]
E --> F[等待用户输入]
此时发生了什么:
-
Agent 进程启动,加载配置文件
-
通过 MCP 协议连接到所有配置的工具服务器
-
获取每个 Skill 的标准化描述(名称、参数、返回值)
-
将这些描述插入预设的 Prompt 模板
-
系统进入就绪状态
关键:LLM 此时完全不在内存中,这只是框架的准备阶段。
第二阶段:单次交互的完整流程
以"查询上海天气并建议是否带伞"为例,展示微观执行:
flowchart TD
A[用户输入] --> B(Agent 接收)
B -- 1. 机械拼接 --> C["Prompt = 模板 + 工具列表<br>+ 历史 + 用户输入"]
C --> D(调用 LLM API)
D -- 2. 文本生成 --> E["LLM 返回纯文本:<br>'Thought: 先查天气<br>Action: get_weather<br>Action Input: {上海}'"]
E --> B
B -- 3. 解析与分派 --> F{解析结果类型}
F -- 工具调用 --> G["通过 MCP 调用<br>get_weather(上海)"]
F -- 最终答案 --> H[直接返回用户]
G --> I[MCP Server]
I --> J[真实天气 API]
J --> I --> G --> B
B -- 4. 循环或结束 --> K{是否继续?}
K -- 继续 --> C
K -- 结束 --> H
步骤 1:Agent 的字符串拼接(无智能)
Agent 内部执行:
# 伪代码:完全机械的操作
def build_prompt(user_input, history, tools):
template = """
你是一个助手,可以调用工具。
可用工具:{tools}
历史对话:{history}
用户输入:{user_input}
请按格式回复:Thought: ... Action: ... Action Input: ...
"""
return template.format(
tools=tools, # 来自MCP
history=history, # 字符串拼接
user_input=user_input # 原样传递
)
# 完全不知道内容含义
prompt = build_prompt("上海天气怎样要带伞吗", history_str, tool_list_str)
步骤 2:LLM 的模式匹配(统计智能)
LLM 看到的输入:
可用工具:[get_weather(location: str), ...]
历史对话:无
用户输入:上海天气怎样要带伞吗
基于训练数据中的类似模式,LLM 生成:
Thought: 用户需要天气信息来决定是否带伞。我需要先获取上海天气。
Action: get_weather
Action Input: {"location": "上海"}
注意:LLM 并不知道自己在"规划",它只是在生成一段符合"工具调用格式"的文本。
步骤 3:Agent 的机械执行(无智能)
Agent 解析 LLM 输出:
# 伪代码:基于规则的解析
def parse_llm_output(text):
lines = text.split('\n')
action = None
params = None
for line in lines:
if line.startswith('Action:'):
action = line.replace('Action:', '').strip()
elif line.startswith('Action Input:'):
# 提取JSON部分
json_str = line.replace('Action Input:', '').strip()
params = json.loads(json_str) # 可能失败
return action, params
# 调用工具
if action == "get_weather":
# 通过MCP标准化接口调用
result = mcp_client.call("get_weather", params)
步骤 4:MCP 的协议转换(无智能)
MCP 客户端的调用:
# 伪代码:MCP客户端的标准化调用
def call_via_mcp(tool_name, params):
# 构建标准MCP请求
request = {
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": tool_name,
"arguments": params
},
"id": 1
}
# 发送到MCP Server
response = mcp_server.call(request)
return response["result"]
MCP Server 再将标准调用转换为具体实现:
MCP Request → 路由到对应工具 → 调用实际API → 标准化结果 → 返回Agent
第三阶段:复杂任务的多轮交互
对于"分析我上周代码提交并生成报告":
flowchart LR
A[用户请求] --> B[第一轮<br>LLM: 调用git工具]
B --> C[Agent执行git]
C --> D[第二轮<br>LLM: 调用分析工具]
D --> E[Agent执行分析]
E --> F[第三轮<br>LLM: 生成报告]
F --> G[Agent返回结果]
subgraph "LLM的'金鱼记忆'"
B
D
F
end
subgraph "Agent的状态维护"
C
E
G
end
每一轮的本质:
-
Agent 拼凑完整上下文:将历史对话 + 工具结果 + 原始问题合并
-
LLM 重新阅读整个故事:基于完整上下文生成"下一步"建议
-
Agent 执行建议:调用工具或返回结果
-
Agent 更新历史:为下一轮准备
关键洞察 :LLM 每次调用都是独立的,是 Agent 通过精心维护的上下文,制造了"连续对话"的假象。
四者关系的精确技术定位
1. 信息流向
用户 → Agent(接收) → LLM(生成文本) → Agent(解析) → MCP(标准化) → Skill(执行) → 逆序返回
2. 智能分布
-
语义理解层:LLM 独有(基于统计模式)
-
流程控制层:Agent 独有(基于程序逻辑)
-
协议适配层:MCP 独有(基于接口标准)
-
功能实现层:Skill 独有(基于业务代码)
3. 核心分工表
| 组件 | 输入 | 处理 | 输出 | 有无"智能" |
|---|---|---|---|---|
| LLM | 文本提示词 | 概率生成 | 文本补全 | 模式匹配智能 |
| Agent | 用户输入 + 历史 | 字符串操作 + 规则解析 | 工具调用或最终回复 | 无(机械智能) |
| MCP | 标准化请求 | 协议转换 | 标准化响应 | 无 |
| Skill | 结构化参数 | 业务逻辑 | 结构化结果 | 无 |
系统级智能的涌现机制
1. 为什么整体"显得"智能?
-
上下文连贯性:Agent 维护的上下文让 LLM 的每次生成都"恰好"衔接
-
工具可及性:MCP 让 LLM 的"建议"几乎都能被实现
-
错误恢复机制:Agent 能在工具失败时重新询问 LLM
-
逐步逼近目标:多轮交互逐步缩小目标空间
2. 智能的边界
-
能做的:LLM 训练数据中出现过的模式 + 已注册的工具能力
-
不能做的:需要真实世界体验、物理交互、未注册工具的功能
-
脆弱的:Prompt 设计的微小变化可能导致完全不同的行为
-
可解释的:每一步都有明确的日志可追溯
架构优势:为什么这样设计?
1. 解耦合带来的灵活性
-
更换 LLM:修改 API 密钥即可(如 GPT-4 → Claude → DeepSeek)
-
增加 Skill:实现 MCP 接口,注册即可用
-
替换 Agent 框架:只要支持 MCP,工具生态不变
-
独立升级:每个组件可独立迭代
2. 专注于核心竞争力
-
LLM 厂商:专注提升模型能力
-
Agent 框架开发者:专注优化流程控制和状态管理
-
Skill 开发者:专注业务逻辑实现
-
MCP 维护者:专注协议标准化
3. 动态扩展能力
Agent 启动时不知道所有工具,但通过 MCP 可:
-
动态发现新上线的工具
-
热加载工具而无需重启
-
按需调用远程工具服务
现实世界的类比
餐厅后厨模型
-
LLM = 主厨:看订单决定做什么菜,但不下厨房
-
Agent = 厨师长:安排流程、传递指令、协调资源
-
Skill = 专业厨师:切菜、炒菜、摆盘等具体技能
-
MCP = 标准化操作流程:确保所有厨师用同样的刀、锅、火候
软件开发模型
-
LLM = 架构师:画设计图,不写代码
-
Agent = 项目经理:分解任务、分配资源、跟踪进度
-
Skill = 开发工程师:实现具体模块
-
MCP = 接口文档:确保模块间能正确对接
总结:精准的认知模型
通过深入分析,我们可以得出以下精确结论:
-
LLM 是文本生成器,不是"思考者"。它生成"看似规划"的文本,但这种生成基于统计而非逻辑。
-
Agent 是流程引擎,不是"理解者"。它机械地解析、执行、循环,对语义一无所知。
-
Skill 是功能黑盒,不是"参与者"。它只关心输入输出,不关心调用链条。
-
MCP 是连接协议,不是"智能组件"。它确保不同部分能通信,但不参与"思考"。
-
系统级智能是涌现的,来自四个"非智能"组件的精密协作。这类似于:单个神经元不智能,但神经网络表现出智能。
最终的协同范式:
-
LLM 说:"应该先查天气,再根据温度判断是否带伞。"
-
Agent 做:解析这句话,调用天气工具,获取结果,再问 LLM:"温度 18 度,要带伞吗?"
-
MCP 通:确保 Agent 能调用任何天气服务商的 API。
-
Skill 实现:实际调用气象局接口,返回结构化数据。
这个架构的成功在于:每个组件都极其简单、专注、可替换,但组合后能完成极其复杂的任务。这正是现代 AI 工程的核心洞察------不追求"全能 AI",而是通过精巧的架构,让专门的组件各司其职,协同达成目标。