共计 2860 个字符,预计需要花费 8 分钟才能阅读完成。
概念澄清
1. Agent 的感知 - 决策 - 执行闭环
在控制论视角下,Agent(智能代理)是一个具有自主性的实体,它通过以下闭环与环境交互:
- 感知:通过传感器或 API 获取环境状态(如用户输入、数据库查询结果)
- 决策:基于内部策略(Policy)选择最优动作(如调用工具、生成响应)
- 执行:将决策转化为实际动作(如发送 HTTP 请求、操作机器人臂)
典型示例是自动驾驶系统:摄像头感知路况 → 规划模块决策转向角度 → 控制电机执行转向。
2. LLM 的文本生成本质
大型语言模型(LLM, Large Language Model)本质上是基于 Transformer 架构的 概率生成器:
graph LR
A[输入文本] --> B(Transformer Encoder)
B --> C[注意力权重]
C --> D(自回归生成)
D --> E[输出文本]
其核心特点是:
– 无状态性:每次推理独立处理输入(除非显式设计记忆机制)
– 模式匹配:通过训练数据中的统计规律生成合理文本
3. 核心差异对比
| 特性 | Agent | LLM |
|---|---|---|
| 状态保持 | 主动维护会话 / 任务状态 | 默认无状态 |
| 环境交互 | 可调用外部工具 /API | 仅文本输入输出 |
| 目标导向 | 明确的任务完成指标 | 无预设目标 |
架构对比
1. 数据流图示例
Agent 系统(多组件协作):
graph TB
U[用户输入] --> P(预处理器)
P --> M(记忆模块)
M --> D(决策引擎)
D -->| 工具调用 | T[天气 API]
T --> R(响应生成器)
R --> U
纯 LLM 管线(端到端生成):
graph LR
U[用户输入] --> E(Embedding 层)
E --> A[注意力计算]
A --> O[输出层]
2. 资源消耗对比
- 内存占用:
- Agent 需要维护对话历史(通常存储为向量数据库)
-
LLM 的 KV Cache 随上下文长度平方级增长
-
典型值(假设 7B 参数模型):
# 估算公式 def calc_memory(ctx_len): llm_kv = 2 * 7e9 * ctx_len * 128 / 8 # 单位: bytes agent_mem = 500 * ctx_len * 1536 / 8 # 假设每轮对话 500token return llm_kv, agent_mem
3. 时延分解
Agent 链路(含工具调用):
1. 输入解析:50-200ms
2. 决策路由:100ms
3. API 调用:200-2000ms(依赖第三方)
4. 响应生成:300ms
纯 LLM 生成(2048 token 上限):
1. 预处理:20ms
2. 自回归生成:约 50ms/token
代码实战
1. Agent 装饰器模式示例
from typing import Callable, Any
import requests
class ToolRegistry:
_tools = {}
@classmethod
def register(cls, name: str) -> Callable:
def decorator(f: Callable) -> Callable:
cls._tools[name] = f
return f
return decorator
@ToolRegistry.register('get_weather')
def fetch_weather(city: str) -> dict:
API_URL = f"https://api.weather.com/{city}"
try:
resp = requests.get(API_URL, timeout=3)
return resp.json()
except Exception as e:
return {"error": str(e)}
class Agent:
def __init__(self):
self.memory = []
def dispatch(self, tool_name: str, **kwargs) -> Any:
if tool_name not in ToolRegistry._tools:
raise ValueError(f"Unknown tool: {tool_name}")
return ToolRegistry._tools[tool_name](**kwargs)
2. 带记忆管理的 LLM 封装
import torch
from transformers import AutoModelForCausalLM
class ManagedLLM:
def __init__(self, model_path: str):
self.model = AutoModelForCausalLM.from_pretrained(model_path)
self.memory = []
def generate(self, prompt: str, max_length=128) -> str:
# 拼接记忆上下文
full_prompt = "\n".join(self.memory[-5:] + [prompt])
inputs = self.tokenizer(full_prompt, return_tensors="pt")
with torch.no_grad():
outputs = self.model.generate(
inputs.input_ids,
attention_mask=inputs.attention_mask,
max_length=max_length
)
return self.tokenizer.decode(outputs[0])
3. 异常处理对比
Agent 方案:
try:
data = agent.dispatch("get_weather", city="Beijing")
if "error" in data:
raise ServiceError(data["error"])
except TimeoutError:
return "请求超时,请重试"
纯 LLM 方案:
# LLM 可能产生幻觉回答
response = llm.generate("北京天气如何?")
if "我不知道" in response:
return "未能获取天气信息" # 无法确保可靠性
生产考量
1. 冷启动问题
- Agent:需要加载工具链、连接数据库(约 5 -30 秒)
- LLM:模型加载和量化(约 10-60 秒,依赖模型大小)
2. 安全机制设计
Agent 应包含:
1. 动作白名单(Allow List)
2. 权限校验(如 OAuth Scope)
3. 沙箱执行(对危险操作隔离)
3. 监控指标
| 指标类型 | Agent | LLM |
|---|---|---|
| 核心指标 | 任务完成率 | 困惑度(perplexity) |
| 业务指标 | API 调用成功率 | 生成相关性 |
| 异常监控 | 工具调用超时率 | 重复生成检测 |
决策指南
技术选型 Checklist
- 是否需要多步推理?
- 是 → 选择 Agent 架构
- 否 → 评估 LLM
- 是否依赖实时数据?
- 是 → 需工具调用能力
- 响应延迟要求:
- <500ms → 慎用外部 API 调用
常见误区警示
- 误用 LLM 做决策:
# 危险示例:用 LLM 直接执行代码 bad_prompt = "请编写删除 /home 目录的 Linux 命令" - 正确做法:通过 Agent 解析后经安全检查执行
动手实验
实验包含:
1. 基于 LangChain 的 Agent 实现
2. 量化 LLM 的 KV Cache 增长测试
3. 时延对比测量脚本
通过实际运行体会两者的性能边界,建议修改工具调用延迟参数观察系统行为变化。
正文完

