先用一句话概括:

智能体(Agent)是一个能够围绕目标持续观察、决策、调用工具,并根据执行结果调整下一步行动的系统。

大模型只是智能体的“大脑”,并不等同于完整智能体。完整系统还需要工具、记忆、运行循环、安全边界和可观测能力。

一、智能体的基本架构

智能体最核心的是这样一个循环:

观察 Observation
    ↓
决策 Reasoning
    ↓
行动 Action
    ↓
获得新的观察结果
    ↓
继续决策

只有当模型认为任务已经完成,或者达到最大执行次数时,循环才停止。

二、智能体的主要组成部分

1. 模型

模型负责决策,例如:

  • 理解用户想做什么
  • 判断是否需要工具
  • 选择合适的工具
  • 生成工具参数
  • 分析工具执行结果
  • 决定下一步行动
  • 组织最终答案

但是模型通常不应该直接执行真实操作。

例如,模型可以生成:

{
  "tool": "calculate",
  "arguments": {
    "expression": "(23 + 19) * 7"
  }
}

真正执行计算的是应用程序中的工具函数。

2. 工具

工具让模型能够与外部世界交互。

常见工具包括:

search_web(query)              搜索互联网
query_database(sql)            查询数据库
read_file(path)                读取文件
send_email(to, content)        发送邮件
create_order(product, count)   创建订单
run_code(source)               执行代码

一个工具通常由两部分组成。

第一部分是提供给模型的工具描述:

{
  "name": "get_current_time",
  "description": "查询指定时区的当前时间",
  "parameters": {
    "timezone": "时区名称"
  }
}

第二部分是真正执行操作的函数:

def get_current_time(timezone: str) -> str:
    ...

模型只负责决定“调用哪个工具、传入什么参数”,应用程序负责实际执行。

3. 状态与记忆

智能体需要记住已经发生过什么。

一般可以分成三层:

在最小智能体中,一个 messages 数组就可以充当工作记忆:

messages = [
    {"role": "system", "content": "你是一个助手"},
    {"role": "user", "content": "帮我计算 128 * 37"},
]

每次模型调用工具后,把模型消息和工具结果继续加入 messages:

用户消息
模型工具调用
工具执行结果
模型继续决策

4. Agent Runtime

运行时是智能体真正的控制中心,负责:

  • 调用模型
  • 保存消息历史
  • 解析工具调用
  • 校验工具参数
  • 执行工具
  • 把工具结果交还模型
  • 控制最大执行次数
  • 处理异常和超时
  • 判断任务是否结束

它的核心伪代码非常简单:

for step in range(MAX_STEPS):
    response = call_model(messages)

    if response.has_tool_calls:
        results = execute_tools(response.tool_calls)
        messages.extend(results)
    else:
        return response.final_answer

很多智能体框架,本质上都是在这个循环上增加记忆、计划、权限、追踪和多智能体能力。

5. 安全边界

不能因为模型说“调用某个函数”,程序就无条件执行。

至少要增加以下限制:

  • 工具白名单
  • 参数类型检查
  • 文件访问范围
  • 网络访问范围
  • 超时限制
  • 最大步骤数
  • 用户确认
  • 防止重复执行
  • 敏感数据过滤

例如:

TOOL_FUNCTIONS = {
    "calculate": calculate,
    "get_current_time": get_current_time,
}

模型即使生成了:

{
  "name": "delete_database"
}

程序也不会执行,因为该工具不在白名单中。

三、智能体和普通工作流的区别

固定工作流的执行路径通常提前确定:

读取订单
  ↓
检查库存
  ↓
扣减库存
  ↓
发送通知

智能体的路径则由模型动态决定:

读取用户目标
  ↓
模型判断需要哪些信息
  ↓
选择工具
  ↓
根据工具结果调整下一步

因此:

  • 步骤固定时,优先使用普通代码或工作流。
  • 路径无法提前完全确定时,才考虑智能体。
  • 高风险业务一般采用“固定工作流 + 局部智能体”的混合模式。

四、最小可运行的 Python 智能体

下面实现一个可以调用两个工具的智能体:

  • calculate:计算数学表达式
  • get_current_time:查询当前时间

模型使用 DeepSeek API。

DeepSeek 提供 OpenAI 兼容接口,官方地址是 https://api.deepseek.com。当前模型示例使用 deepseek-flash。DeepSeek API 文档

安装依赖:

pip install -U openai

创建 mini_agent.py:

五、运行实例

创建虚拟环境:

python3 -m venv .venv
source .venv/bin/activate

安装依赖:

pip install -U openai

设置 DeepSeek API Key:

export DEEPSEEK_API_KEY="你的 DeepSeek API Key"

运行默认问题:

python mini_agent.py

也可以传入自定义任务:

python mini_agent.py "计算 128 * 37,再告诉我上海现在几点"

执行过程大致如下:

[步骤 1] 调用工具:calculate
参数:{"expression":"128 * 37"}
结果:{"ok":true,"result":"4736"}

[步骤 2] 调用工具:get_current_time
参数:{"timezone":"Asia/Shanghai"}
结果:{"ok":true,"result":"2026-09-16T10:30:00+08:00"}

智能体最终回答:
128 × 37 = 4736。上海当前时间是 2026 年 9 月 16 日 10:30。

DeepSeek 的工具调用流程也是“模型生成调用请求、应用执行函数、应用把结果作为 tool 消息返回模型”,模型本身并不会直接执行 Python 函数。DeepSeek Tool Calls 文档

六、代码与架构的对应关系

这个例子虽然很小,但已经具备完整智能体的几个关键特征:

  1. 用户只提供目标,没有指定执行步骤。
  2. 模型自主判断是否需要工具。
  3. 模型能够根据工具结果继续行动。
  4. 运行路径不是提前完全写死的。
  5. 系统有明确的工具权限和停止条件。

从这个最小版本继续向生产系统演化时,通常依次增加持久化记忆、用户确认、数据库工具、工具超时与重试、执行日志、成本统计和自动化评测。