Agent 状态机、记忆和工具权限
🤖 Agent 是能自主規划、调用工具、持续记忆并完成项目级任务的 LLM 系统。设计的核心是可靠性、可观测性和安全边界。
Agent 工作循环
目标 → 规划 → 工具调用 → 观察结果 → 更新记忆 → 重新规划(循环直到任务完成)
主流架构模式
| 模式 | 说明 | 适用场景 |
|---|---|---|
| ReAct | 思考-行动交替 | 一般任务,易解释 |
| Plan & Execute | 先全局规划再执行 | 项目级任务 |
| ReWOO | 预先规划工具调用图 | 减少中间 LLM 调用 |
| LLM×LLM | 多 Agent 协作 | 复杂工作流 |
状态管理
什么需要状态?
LLM 本身无状态,多轮对话和长运行任务需要外部状态存储。
状态类型
class AgentState:
messages: list[Message] # 对话历史
plan: list[str] # 当前执行计划
tool_results: dict # 工具调用结果
iteration: int # 循环计数(防止无限循环)
status: Literal["running", "done", "error"]
状态持久化方案
- 内存:单局、短任务
- Redis:分布式、会话级共享
- 数据库:长期持久化和审计
记忆系统
四类记忆
| 类型 | 内容 | 存储 | 具体例子 |
|---|---|---|---|
| 工作记忆 | 当前任务上下文 | 内存 | 已调用的工具和结果 |
| 封锁记忆 | 压缩后的长期信息 | KV 存储 | 上次会话摘要 |
| 语义记忆 | 用户偏好、事实 | 向量库 | 用户嗜好 → RAG 召回 |
| 程序记忆 | 已学会的技能 | 工具/代码 | 分析数据的 Python 脚本 |
记忆压缩策略
- 渐进摘要:每 N 轮对话摘要一次
- 中间邏出:保留头尾,序列压缩中间
- 向量召回:过长记忆存入向量库,按需召回
工具权限控制
最小权限原则
# 工具应式需要最小权限
tools = [
read_file, # 只读
search_web, # 只读
# write_file, # 写入,需确认才开放
# delete_file, # 删除,需确认才开放
]
確认机制(Human-in-the-Loop)
# 高风险操作需要人类批准
@requires_approval
def send_email(to: str, body: str): ...
@requires_approval
def delete_database(table: str): ...
资源限制
| 资源 | 限制方式 |
|---|---|
| Token 预算 | 每次调用记录消耗,超限就停 |
| 工具调用次数 | max_iterations 防止无限循环 |
| 时间限制 | timeout 高于阈值则中断 |
| 并发工具调用 | 限制最大并行数 |
多 Agent 协作
# Orchestrator 分配任务给专业 Agent
orchestrator → code_agent (写代码)
orchestrator → search_agent (检索信息)
orchestrator → verify_agent (验证结果)
设计原则:
- 每个 Agent 有清晰的职责边界
- 共享状态用结构化消息传递
- 中心化日志和错误处理
常见问题
- 无限循环:设置 max_iterations,超出即退出
- 工具权限过大导致安全事故:遵循最小权限原则
- 记忆上下文过长:实时压缩,不要将全部历史塩入 Prompt