LLM Agent 的工具调用、规划与记忆:可执行架构
1. 三件事必须联动设计
很多 Agent 失败并非模型不够强,而是三件事割裂:
- 工具调用策略(Tool Use)。
- 任务规划策略(Planning)。
- 记忆管理策略(Memory)。
可把 Agent 抽象为:
$$ Agent = f(Policy_{tool},\ Policy_{plan},\ Memory_{short/long}) $$
2. 工具调用:从“能调”到“调得对”
核心问题:
- 是否需要调用工具。
- 调哪个工具。
- 何时停止调用。
一个简单决策规则:当内部置信度低于阈值且外部工具可显著降低不确定性时,触发调用。
3. 规划:反应式与分层式
- 反应式(ReAct):边想边做,适合短任务。
- 分层规划(Hierarchical):先全局计划,再子任务执行,适合复杂工作流。
- 约束规划:把预算、时延、合规限制写入计划器目标函数。
建议:对长度 >3 步、存在外部依赖的任务优先使用分层规划。
4. 记忆:短期工作记忆 + 长期语义记忆
- 短期记忆:当前会话上下文、临时中间态。
- 长期记忆:跨任务偏好、历史事实、稳定知识。
长期记忆要解决三件事:写入策略、检索策略、遗忘策略。
没有遗忘机制会快速污染系统。
5. 一个可实现目标函数
$$ \max \ \mathbb{E}[U] = \mathbb{E}[Q] - \alpha,\text{Cost}_{tool} - \beta,\text{Latency} - \gamma,\text{Risk} $$
其中 $Q$ 是任务质量,成本包含 API、token、检索延迟。
6. Python 极简执行循环
class AgentRuntime:
def __init__(self, planner, tools, memory):
self.planner = planner
self.tools = tools
self.memory = memory
def run(self, task: str):
plan = self.planner.make_plan(task, self.memory.read_short())
for step in plan:
if step["type"] == "tool":
result = self.tools.call(step["name"], step["args"])
self.memory.write_short({"step": step, "result": result})
else:
self.memory.write_short({"reasoning": step["content"]})
answer = self.planner.summarize(self.memory.read_short())
self.memory.write_long(task, answer)
return answer
7. 常见失败模式
- 工具雪崩:低价值工具被连环调用。
- 计划漂移:目标被中间步骤替代。
- 记忆污染:错误事实写入长期记忆并反复召回。
8. 工程落地建议
- 给每个工具配置“调用预算上限”和“失败回退策略”。
- 对计划器输出做静态检查:是否可执行、是否越权。
- 对长期记忆启用置信度与时间衰减,低置信条目自动降权。
- 把关键指标接入监控:成功率、平均调用数、延迟、违规率。
工具、规划、记忆三者闭环后,Agent 才能从 demo 走向生产。