从第一性原理理解 AI Agent:模型、工具、记忆和规划

系列:Python + FastAPI 大模型应用基础(第 22 篇)

1. Agent 的最小定义

Agent(智能体)不是“更会聊天的模型”。从第一性原理看,它是一个闭环控制程序:

读取目标和状态 → 选择下一动作 → 执行动作 → 观察结果
→ 更新状态 → 达到终止条件

其中模型负责不确定的推理与选择,程序负责确定性的状态、权限、执行和停止。

2. 四个组件

  • 模型:提出下一步动作;
  • 工具:查询或改变外部世界;
  • 记忆:保存当前任务需要的状态;
  • 规划:决定动作顺序和终止条件。

记忆不是越多越好,工具也不是越多越强。额外能力会增加 Token、误调用和攻击面。

3. 一个不依赖框架的最小 Agent

from dataclasses import dataclass, field
from typing import Literal, Protocol


@dataclass(frozen=True)
class Action:
    kind: Literal["search", "finish"]
    argument: str


class Planner(Protocol):
    def next_action(self, goal: str, observations: tuple[str, ...]) -> Action:
        """模型适配器只需实现这个接口。"""


@dataclass
class AgentState:
    goal: str
    observations: list[str] = field(default_factory=list)
    step: int = 0


class AgentRunner:
    def __init__(self, planner: Planner, max_steps: int = 4) -> None:
        if max_steps <= 0:
            raise ValueError("max_steps 必须大于 0")
        self.planner = planner
        self.max_steps = max_steps

    def run(self, goal: str) -> str:
        state = AgentState(goal=goal)
        while state.step < self.max_steps:
            action = self.planner.next_action(
                state.goal,
                tuple(state.observations),
            )
            state.step += 1

            if action.kind == "finish":
                return action.argument
            if action.kind == "search":
                # 示例使用受控本地工具,生产中还需权限、超时和审计
                state.observations.append(search_knowledge(action.argument))
                continue
            raise ValueError("规划器返回了未知动作")
        raise RuntimeError("Agent 超过最大步骤数")


def search_knowledge(query: str) -> str:
    data = {"退款期限": "演示资料:退款期限需以订单政策为准。"}
    return data.get(query, "未找到资料")

4. 用 Fake Planner 验证闭环

class FakePlanner:
    """确定性规划器用于验证状态循环,不代表真实模型。"""

    def next_action(self, goal: str, observations: tuple[str, ...]) -> Action:
        if not observations:
            return Action("search", "退款期限")
        return Action("finish", f"根据工具结果:{observations[-1]}")


def test_agent_loop() -> None:
    answer = AgentRunner(FakePlanner(), max_steps=2).run("退款期限是什么?")
    assert "根据工具结果" in answer
    assert "演示资料" in answer

Fake Planner 的意义是把框架控制流与模型效果分离。接入真实模型后,还需要契约测试和线上评测。

5. 终止条件比“规划能力”更重要

生产 Agent 至少需要:

  • 最大步骤数;
  • 总超时时间;
  • Token 或费用预算;
  • 同一工具重复次数限制;
  • 写操作次数限制;
  • 用户取消和人工接管;
  • 明确成功、失败和部分成功状态。

没有终止条件的循环会造成费用失控,也可能重复执行有副作用的操作。

6. 对抗性审查

  • 模型不能直接修改 Agent 状态中的身份和权限;
  • 观察结果可能含恶意指令,仍按不可信数据处理;
  • 记忆只保存当前任务必需内容,并设置过期时间;
  • 每一步记录输入摘要、动作、耗时和结果状态;
  • 写工具使用幂等键;
  • 高风险任务优先改为确定性工作流。

7. 总结

Agent 的价值是让模型参与“下一步做什么”,风险也来自这种自由度。可靠 Agent 必须由代码限定状态、动作空间和停止条件。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐