共计 1911 个字符,预计需要花费 5 分钟才能阅读完成。
在构建智能对话系统时,开发者经常困惑于 skill 和 mcp 的调用方式——到底是由大模型直接处理,还是通过 Agent 间接调用?这个问题看似简单,实则涉及到系统架构设计的核心逻辑。本文将带你深入解析这两种调用方式的本质区别,并通过实际代码示例和性能对比,帮助你做出更明智的设计决策。

架构差异解析
- 大模型直接调用模式 :
- 特点:输入文本直接发送给大模型,由模型完成意图识别、上下文理解和响应生成全流程
- 优势:实现简单,适合处理开放式对话
-
缺点:计算资源消耗大,难以精确控制输出格式
-
Agent 调用模式 :
- 特点:由 Agent 系统先进行意图识别和任务分解,再决定调用哪些 skill/mcp
- 优势:更精确的任务路由,支持复杂业务流程
- 缺点:需要额外开发状态管理逻辑
graph TD
A[用户输入] -->| 直接调用 | B(大模型)
A -->|Agent 调用 | C[意图识别]
C --> D{决策}
D -->| 基础问答 | B
D -->| 复杂任务 | E[Skill/MCP]
代码实现对比
大模型直接调用示例
import openai
from typing import AsyncGenerator
async def direct_call(prompt: str) -> AsyncGenerator[str, None]:
"""
大模型直接调用实现
Args:
prompt: 用户输入文本
Yields:
模型生成的响应片段
"""
try:
response = await openai.ChatCompletion.acreate(
model="gpt-4",
messages=[{"role": "user", "content": prompt}],
stream=True
)
async for chunk in response:
yield chunk['choices'][0]['delta'].get('content', '')
except Exception as e:
# 错误处理:记录日志并返回友好提示
print(f"API 调用失败: {str(e)}")
yield "服务暂时不可用,请稍后再试"
Agent 调用示例
from enum import Enum
class SkillType(Enum):
WEATHER = "weather"
CALENDAR = "calendar"
GENERAL = "general"
class DialogAgent:
def __init__(self):
self.state = {}
async def route_intent(self, text: str) -> SkillType:
"""意图识别路由"""
# 实际项目中应使用专业 NLU 模型
if "天气" in text:
return SkillType.WEATHER
elif "日程" in text:
return SkillType.CALENDAR
return SkillType.GENERAL
async def execute_skill(self, skill: SkillType, input_text: str):
"""根据类型调用不同 skill"""
if skill == SkillType.WEATHER:
return await self._weather_skill(input_text)
# 其他 skill 处理...
async def _weather_skill(self, location: str) -> str:
"""天气查询 skill 实现"""
# 这里应该是调用天气 API 的代码
return f"{location} 的天气是 25℃,晴朗"
性能考量
- 延迟测试数据 (基于测试环境):
- 大模型直接调用:平均响应时间 1200ms
-
Agent 调用:简单 skill 平均 200ms,复杂任务(需调用大模型)900ms
-
资源消耗 :
- 大模型调用:每次请求消耗约 3GB 显存
-
Agent 调用:基础功能仅需 500MB 内存
-
重试策略建议 :
- 大模型 API 调用:指数退避重试,最多 3 次
- 外部服务调用:熔断机制 + 降级方案
避坑指南
- 会话状态管理 :
- 避免将整个对话历史作为上下文
-
使用精简的 state 对象记录关键信息
-
上下文长度限制 :
- 大模型通常有 4k-32k token 限制
-
解决方案:
- 自动摘要历史对话
- 优先保留最近 3 轮对话
-
冷启动优化 :
- 预加载常用 skill
- 实现渐进式功能加载
- 使用缓存预热策略
思考题
- 如何设计混合调用系统,在保证响应速度的同时处理复杂任务?
- 当业务 skill 数量超过 100 个时,路由系统应该如何优化?
- 在多租户场景下,如何隔离不同客户的 skill 执行环境?
通过本文的对比分析,我们可以看到两种调用方式各有适用场景。实际项目中,更常见的做法是采用混合架构——简单任务由 Agent 直接处理,复杂场景再调用大模型。关键在于根据业务需求找到合适的平衡点。
正文完
