什么是 AI Agent?它与直接调用大模型 API 有何区别

目录

  • [1. 引言](#1. 引言)
  • [2. 什么是 AI Agent](#2. 什么是 AI Agent)
    • [2.1 概念定义](#2.1 概念定义)
    • [2.2 一个直观的例子](#2.2 一个直观的例子)
  • [3. 与直接调用大模型 API 的本质区别](#3. 与直接调用大模型 API 的本质区别)
    • [3.1 本质一:从「生成答案」到「完成目标」](#3.1 本质一:从「生成答案」到「完成目标」)
    • [3.2 本质二:从「无状态」到「有记忆」](#3.2 本质二:从「无状态」到「有记忆」)
    • [3.3 本质三:从「封闭系统」到「开放系统」](#3.3 本质三:从「封闭系统」到「开放系统」)
  • [4. AI Agent 的核心架构](#4. AI Agent 的核心架构)
    • [4.1 规划模块](#4.1 规划模块)
    • [4.2 记忆模块](#4.2 记忆模块)
    • [4.3 工具模块](#4.3 工具模块)
    • [4.4 大语言模型](#4.4 大语言模型)
  • [5. 工作流程:Agent 是如何「做事情」的](#5. 工作流程:Agent 是如何「做事情」的)
  • [6. 代码示例:从 API 调用到 Agent](#6. 代码示例:从 API 调用到 Agent)
    • [6.1 直接调用 API 的写法](#6.1 直接调用 API 的写法)
    • [6.2 最简单 Agent 示例:让模型自己选择工具](#6.2 最简单 Agent 示例:让模型自己选择工具)
    • [6.3 一个极简的 ReAct 执行循环](#6.3 一个极简的 ReAct 执行循环)
  • [7. 主流 Agent 开发框架对比](#7. 主流 Agent 开发框架对比)
  • [8. AI Agent 的典型应用场景](#8. AI Agent 的典型应用场景)
  • [9. 常见挑战与局限性](#9. 常见挑战与局限性)
    • [9.1 可靠性问题](#9.1 可靠性问题)
    • [9.2 成本与延迟](#9.2 成本与延迟)
    • [9.3 安全风险](#9.3 安全风险)
    • [9.4 可观测性](#9.4 可观测性)
  • [10. 总结](#10. 总结)
  • [11. 延伸阅读与学习资源](#11. 延伸阅读与学习资源)

1. 引言

大模型 API 的普及让「调用模型」这件事变得极其简单:传入一段 prompt,几秒钟后拿到一段文本。但很快开发者就发现,单纯依赖模型生成文本的能力,远远无法满足真实业务场景中的自动化需求。于是,AI Agent(智能体)成为大模型应用层最核心的演进方向之一。

本文将从概念、架构、工作流程、代码实现、框架选型到落地实践,系统讲解 AI Agent 到底是什么,以及它与「直接调用大模型 API」这一基础用法之间的本质区别。

2. 什么是 AI Agent

2.1 概念定义

AI Agent 是一种以大语言模型(LLM)为核心决策引擎,能够自主规划任务、调用外部工具、观察执行结果并持续迭代,直到完成目标的智能系统。

简而言之,如果大模型是「大脑」,那么 Agent 就是「大脑 + 手脚 + 计划表」。一个完整的 Agent 不仅会「想」和「说」,还会「做」。

2.2 一个直观的例子

假设用户的诉求是:

查一下今天 A 股新能源板块的涨跌情况,生成一份 300 字以内的分析简报,并发送到我的邮箱。

直接调用 API 的做法:将这段需求原样作为 prompt 传给模型,模型输出一段看起来合理的文本。但这段文本中所谓「涨跌情况」很可能是模型基于训练数据编造的,它并不会真的去查数据,也没有能力发邮件。

AI Agent 的做法:Agent 收到任务后,会先拆解目标,然后依次执行以下动作:

  1. 调用行情数据工具,拉取新能源板块今日实时数据;
  2. 将数据交给 LLM 分析,生成简报文本;
  3. 调用邮件发送工具,将简报发送到指定邮箱;
  4. 检查每一步的返回结果,如果某一步失败,则调整策略重试。

整个过程无需人工干预,Agent 自主完成闭环。

3. 与直接调用大模型 API 的本质区别

维度 直接调用 API AI Agent
角色定位 文本生成器 任务执行者
能力边界 只会输出文本 能调用工具、操作环境
任务复杂度 单轮或简单多轮问答 多步骤、多工具的复合任务
外部交互 无,纯文本输入输出 可访问搜索、代码、API、数据库、文件系统等
状态管理 依赖开发者自己维护 Agent 自主记忆、更新状态
错误处理 用户发现错误后重新提问 Agent 观察结果后自行纠错重试
自主性 被动响应 主动规划与执行

3.1 本质一:从「生成答案」到「完成目标」

直接调用 API 时,模型的目标是生成一段高质量的文本。而 Agent 的目标是完成一个任务。文本生成只是 Agent 完成目标过程中的一个中间手段,而不是最终目的。

3.2 本质二:从「无状态」到「有记忆」

API 调用本身是无状态的------每次请求都是全新的。开发者需要自行在外部维护对话历史、上下文和任务进度。Agent 则天然需要一个记忆系统,用来记录任务目标、已完成步骤、中间结果和失败经验。

3.3 本质三:从「封闭系统」到「开放系统」

直接调用 API,模型的输入只有一个:prompt。它的输出也只有一个:文本。Agent 则是一个开放系统,LLM 通过「工具调用」这个桥梁与外部世界连接,可以读写数据库、调用 HTTP 接口、执行代码、操作浏览器,真正融入现有的技术栈。

4. AI Agent 的核心架构

一个典型的 AI Agent 系统由以下核心模块构成:
#mermaid-svg-2kZlqNbu9pl8VYs0{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-2kZlqNbu9pl8VYs0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-2kZlqNbu9pl8VYs0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-2kZlqNbu9pl8VYs0 .error-icon{fill:#552222;}#mermaid-svg-2kZlqNbu9pl8VYs0 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-2kZlqNbu9pl8VYs0 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-2kZlqNbu9pl8VYs0 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-2kZlqNbu9pl8VYs0 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-2kZlqNbu9pl8VYs0 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-2kZlqNbu9pl8VYs0 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-2kZlqNbu9pl8VYs0 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-2kZlqNbu9pl8VYs0 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-2kZlqNbu9pl8VYs0 .marker.cross{stroke:#333333;}#mermaid-svg-2kZlqNbu9pl8VYs0 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-2kZlqNbu9pl8VYs0 p{margin:0;}#mermaid-svg-2kZlqNbu9pl8VYs0 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-2kZlqNbu9pl8VYs0 .cluster-label text{fill:#333;}#mermaid-svg-2kZlqNbu9pl8VYs0 .cluster-label span{color:#333;}#mermaid-svg-2kZlqNbu9pl8VYs0 .cluster-label span p{background-color:transparent;}#mermaid-svg-2kZlqNbu9pl8VYs0 .label text,#mermaid-svg-2kZlqNbu9pl8VYs0 span{fill:#333;color:#333;}#mermaid-svg-2kZlqNbu9pl8VYs0 .node rect,#mermaid-svg-2kZlqNbu9pl8VYs0 .node circle,#mermaid-svg-2kZlqNbu9pl8VYs0 .node ellipse,#mermaid-svg-2kZlqNbu9pl8VYs0 .node polygon,#mermaid-svg-2kZlqNbu9pl8VYs0 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-2kZlqNbu9pl8VYs0 .rough-node .label text,#mermaid-svg-2kZlqNbu9pl8VYs0 .node .label text,#mermaid-svg-2kZlqNbu9pl8VYs0 .image-shape .label,#mermaid-svg-2kZlqNbu9pl8VYs0 .icon-shape .label{text-anchor:middle;}#mermaid-svg-2kZlqNbu9pl8VYs0 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-2kZlqNbu9pl8VYs0 .rough-node .label,#mermaid-svg-2kZlqNbu9pl8VYs0 .node .label,#mermaid-svg-2kZlqNbu9pl8VYs0 .image-shape .label,#mermaid-svg-2kZlqNbu9pl8VYs0 .icon-shape .label{text-align:center;}#mermaid-svg-2kZlqNbu9pl8VYs0 .node.clickable{cursor:pointer;}#mermaid-svg-2kZlqNbu9pl8VYs0 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-2kZlqNbu9pl8VYs0 .arrowheadPath{fill:#333333;}#mermaid-svg-2kZlqNbu9pl8VYs0 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-2kZlqNbu9pl8VYs0 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-2kZlqNbu9pl8VYs0 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-2kZlqNbu9pl8VYs0 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-2kZlqNbu9pl8VYs0 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-2kZlqNbu9pl8VYs0 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-2kZlqNbu9pl8VYs0 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-2kZlqNbu9pl8VYs0 .cluster text{fill:#333;}#mermaid-svg-2kZlqNbu9pl8VYs0 .cluster span{color:#333;}#mermaid-svg-2kZlqNbu9pl8VYs0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-2kZlqNbu9pl8VYs0 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-2kZlqNbu9pl8VYs0 rect.text{fill:none;stroke-width:0;}#mermaid-svg-2kZlqNbu9pl8VYs0 .icon-shape,#mermaid-svg-2kZlqNbu9pl8VYs0 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-2kZlqNbu9pl8VYs0 .icon-shape p,#mermaid-svg-2kZlqNbu9pl8VYs0 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-2kZlqNbu9pl8VYs0 .icon-shape .label rect,#mermaid-svg-2kZlqNbu9pl8VYs0 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-2kZlqNbu9pl8VYs0 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-2kZlqNbu9pl8VYs0 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-2kZlqNbu9pl8VYs0 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 用户任务输入
Agent 核心控制器
规划模块 Planning
记忆模块 Memory
工具执行模块 Tools
大语言模型 LLM
外部环境
最终结果输出

4.1 规划模块

负责将复杂的用户目标拆解为可执行的子任务序列。主流做法有两种:

  • ReAct 模式:交替进行「思考 + 行动」,模型在每一步输出一个 reasoning 和一个 action,边做边想。
  • Plan-and-Execute 模式:先由模型生成一个完整的执行计划,再逐步执行计划中的每一步,适合步骤相对固定的任务。

4.2 记忆模块

记忆分为两类:

  • 短期记忆:当前任务中的对话上下文、中间结果、已执行步骤,通常存储在 session 中。
  • 长期记忆:跨任务的用户偏好、历史经验、知识积累,通常写入向量数据库或关系数据库,供后续任务检索。

4.3 工具模块

工具是 Agent 与外界交互的接口。每个工具本质上是一个函数,附带了名称、参数说明(JSON Schema)、功能描述。LLM 根据 prompt 中的工具描述,决策「此刻该调用哪个工具、传什么参数」。

4.4 大语言模型

LLM 是 Agent 的决策引擎。Agent 的智能上限很大程度上取决于底层模型的理解能力、推理能力和指令遵循能力。同一套 Agent 框架,接入不同水平的模型,表现可能差异巨大。

5. 工作流程:Agent 是如何「做事情」的

以 ReAct 模式为例,Agent 处理一个任务的典型循环如下:
#mermaid-svg-aLSR2uI349DdCI7u{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-aLSR2uI349DdCI7u .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-aLSR2uI349DdCI7u .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-aLSR2uI349DdCI7u .error-icon{fill:#552222;}#mermaid-svg-aLSR2uI349DdCI7u .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-aLSR2uI349DdCI7u .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-aLSR2uI349DdCI7u .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-aLSR2uI349DdCI7u .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-aLSR2uI349DdCI7u .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-aLSR2uI349DdCI7u .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-aLSR2uI349DdCI7u .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-aLSR2uI349DdCI7u .marker{fill:#333333;stroke:#333333;}#mermaid-svg-aLSR2uI349DdCI7u .marker.cross{stroke:#333333;}#mermaid-svg-aLSR2uI349DdCI7u svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-aLSR2uI349DdCI7u p{margin:0;}#mermaid-svg-aLSR2uI349DdCI7u .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-aLSR2uI349DdCI7u .cluster-label text{fill:#333;}#mermaid-svg-aLSR2uI349DdCI7u .cluster-label span{color:#333;}#mermaid-svg-aLSR2uI349DdCI7u .cluster-label span p{background-color:transparent;}#mermaid-svg-aLSR2uI349DdCI7u .label text,#mermaid-svg-aLSR2uI349DdCI7u span{fill:#333;color:#333;}#mermaid-svg-aLSR2uI349DdCI7u .node rect,#mermaid-svg-aLSR2uI349DdCI7u .node circle,#mermaid-svg-aLSR2uI349DdCI7u .node ellipse,#mermaid-svg-aLSR2uI349DdCI7u .node polygon,#mermaid-svg-aLSR2uI349DdCI7u .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-aLSR2uI349DdCI7u .rough-node .label text,#mermaid-svg-aLSR2uI349DdCI7u .node .label text,#mermaid-svg-aLSR2uI349DdCI7u .image-shape .label,#mermaid-svg-aLSR2uI349DdCI7u .icon-shape .label{text-anchor:middle;}#mermaid-svg-aLSR2uI349DdCI7u .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-aLSR2uI349DdCI7u .rough-node .label,#mermaid-svg-aLSR2uI349DdCI7u .node .label,#mermaid-svg-aLSR2uI349DdCI7u .image-shape .label,#mermaid-svg-aLSR2uI349DdCI7u .icon-shape .label{text-align:center;}#mermaid-svg-aLSR2uI349DdCI7u .node.clickable{cursor:pointer;}#mermaid-svg-aLSR2uI349DdCI7u .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-aLSR2uI349DdCI7u .arrowheadPath{fill:#333333;}#mermaid-svg-aLSR2uI349DdCI7u .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-aLSR2uI349DdCI7u .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-aLSR2uI349DdCI7u .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-aLSR2uI349DdCI7u .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-aLSR2uI349DdCI7u .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-aLSR2uI349DdCI7u .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-aLSR2uI349DdCI7u .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-aLSR2uI349DdCI7u .cluster text{fill:#333;}#mermaid-svg-aLSR2uI349DdCI7u .cluster span{color:#333;}#mermaid-svg-aLSR2uI349DdCI7u div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-aLSR2uI349DdCI7u .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-aLSR2uI349DdCI7u rect.text{fill:none;stroke-width:0;}#mermaid-svg-aLSR2uI349DdCI7u .icon-shape,#mermaid-svg-aLSR2uI349DdCI7u .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-aLSR2uI349DdCI7u .icon-shape p,#mermaid-svg-aLSR2uI349DdCI7u .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-aLSR2uI349DdCI7u .icon-shape .label rect,#mermaid-svg-aLSR2uI349DdCI7u .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-aLSR2uI349DdCI7u .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-aLSR2uI349DdCI7u .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-aLSR2uI349DdCI7u :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否

收到用户任务
LLM 输出 Thought
LLM 决策 Action
是最终答案?
调用对应工具
获取工具返回结果 Observation
返回最终结果

循环的三个关键元素:

  • Thought:模型的思考过程,用于分析当前状态、决定下一步。
  • Action:模型决定要调用的工具及传入的参数。
  • Observation:工具执行后的返回结果,被重新注入上下文,供模型继续推理。

整个循环一直持续到模型认为任务已经完成,或者达到最大执行步数限制。

6. 代码示例:从 API 调用到 Agent

下面通过一个最小可运行的 Python 示例,展示「直接调用 API」和「基于 ReAct 模式实现 Agent」的区别。示例基于 OpenAI 兼容接口,便于替换为任意大模型。

6.1 直接调用 API 的写法

python 复制代码
from openai import OpenAI

client = OpenAI(
    api_key="your-api-key",
    base_url="https://api.openai.com/v1",
)

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "user", "content": "今天杭州天气怎么样?"}
    ],
)

print(response.choices[0].message.content)

这段代码的输出模型只会「猜」一个答案,因为它没有任何天气数据来源。

6.2 最简单 Agent 示例:让模型自己选择工具

第一步,定义工具函数,并用 JSON Schema 描述其能力:

python 复制代码
import json

def get_weather(city: str) -> str:
    """模拟天气查询工具,实际场景中接入真实天气 API。"""
    weather_data = {"杭州": "晴,26°C", "北京": "多云,22°C"}
    return weather_data.get(city, "暂无数据")

# 工具描述,供模型理解该工具的作用与参数
weather_tool = {
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "查询指定城市的实时天气",
        "parameters": {
            "type": "object",
            "properties": {
                "city": {"type": "string", "description": "城市名称"}
            },
            "required": ["city"],
        },
    },
}

第二步,发起带工具定义和结果回传的多轮对话:

python 复制代码
from openai import OpenAI

client = OpenAI(api_key="your-api-key", base_url="https://api.openai.com/v1")

messages = [{"role": "user", "content": "今天杭州天气怎么样?"}]

# 第一轮:模型决定调用工具
response = client.chat.completions.create(
    model="gpt-4o",
    messages=messages,
    tools=[weather_tool],
    tool_choice="auto",
)

msg = response.choices[0].message

# 解析工具调用参数
tool_call = msg.tool_calls[0]
args = json.loads(tool_call.function.arguments)

# 执行工具
result = get_weather(args["city"])

# 将工具结果回传给模型,进行第二轮推理
messages.append(msg)  # 模型带工具调用的消息
messages.append({
    "role": "tool",
    "tool_call_id": tool_call.id,
    "content": result,
})

final_response = client.chat.completions.create(
    model="gpt-4o",
    messages=messages,
)

print(final_response.choices[0].message.content)

输出结果是基于真实工具返回数据的答案,例如:

杭州今天的天气是晴,温度 26°C。

这段代码已经完成了 Agent 最核心的「工具调用闭环」。当工具数量增多、任务步骤增多时,只需把上述循环抽象为通用执行器即可。

6.3 一个极简的 ReAct 执行循环

python 复制代码
class SimpleAgent:
    def __init__(self, client, model, tools: dict):
        self.client = client
        self.model = model
        self.tools = tools  # 工具名 -> 可调用函数
        self.messages = []

    def run(self, task: str, max_steps: int = 8) -> str:
        self.messages.append({"role": "user", "content": task})

        for _ in range(max_steps):
            response = self.client.chat.completions.create(
                model=self.model,
                messages=self.messages,
                tools=self._tools_schema(),
                tool_choice="auto",
            )
            msg = response.choices[0].message

            if not msg.tool_calls:
                return msg.content  # 模型认为任务已完成

            self.messages.append(msg)
            for tool_call in msg.tool_calls:
                name = tool_call.function.name
                args = json.loads(tool_call.function.arguments)
                result = self.tools[name](**args)
                self.messages.append({
                    "role": "tool",
                    "tool_call_id": tool_call.id,
                    "content": str(result),
                })

        return "已达到最大执行步数,任务可能未完成。"

    def _tools_schema(self):
        return [
            {
                "type": "function",
                "function": {
                    "name": name,
                    "description": fn.__doc__ or "",
                    "parameters": {
                        "type": "object",
                        "properties": {},
                    },
                },
            }
            for name, fn in self.tools.items()
        ]

这个极简实现已经具备了 Agent 的核心特征:自主决策 + 工具调用 + 结果回传 + 循环迭代。生产级的框架(如 LangChain 的 AgentExecutor、LlamaIndex Agent)本质上就是在上述逻辑之上增加了更完善的解析、重试、并发、安全策略。

7. 主流 Agent 开发框架对比

在动手开发之前,选择合适的框架能显著提升效率。以下是当前主流的几个框架:

框架 定位 适合场景
LangChain 最成熟的 LLM 应用框架 需要丰富工具生态和社区资源的场景
LlamaIndex 侧重 RAG 与数据检索 知识问答、文档分析、数据智能体
AutoGen 多 Agent 协作框架 多角色对话、代码生成、复杂协作任务
CrewAI 面向团队的轻量多 Agent 业务团队快速构建角色化 Agent 系统
OpenAI Swarm / Agents SDK 官方轻量编排 简单多 Agent 场景、快速原型
Dify / Coze 可视化平台 低代码搭建,无需深入代码开发

对于刚入门的开发者,建议先从 LangChainLlamaIndex 开始,它们的文档完善、社区活跃、示例丰富;当需要做多 Agent 协同时,再引入 AutoGen 或 CrewAI。

8. AI Agent 的典型应用场景

  • 智能客服与助手:不只是回答 FAQ,而是能查询订单、处理退款、创建工单。
  • 数据分析 Agent:自然语言提问,Agent 生成并执行 SQL、生成图表、输出洞察报告。
  • 代码开发 Agent:读取代码仓库、定位问题、生成补丁、运行测试,形成完整开发闭环。
  • 内容生产流水线:拆解选题 → 搜索资料 → 撰写初稿 → 自动配图 → 排版发布。
  • 业务流程自动化:定时拉取报表、检查异常、发送通知、更新 CRM 记录。
  • 个人效率 Agent:管理日程、总结邮件、预订会议、整理笔记等。

9. 常见挑战与局限性

9.1 可靠性问题

LLM 生成内容具有随机性,Agent 多步执行时,任何一步出错都可能让整个任务失败。步骤越多,整体成功率越低。生产环境中需要引入重试机制、步骤校验、人工确认节点来保障可靠性。

9.2 成本与延迟

一次 Agent 任务往往需要多轮 LLM 调用,token 消耗和响应延迟都远高于单次 API 调用。需要根据任务复杂度动态选择模型,简单步骤用轻量模型,关键步骤用强模型。

9.3 安全风险

Agent 具有操作外部环境的能力,一旦被恶意 prompt 注入,可能执行危险操作(如删除数据、泄露信息)。生产系统必须做好工具权限隔离、操作审计和输入过滤。

9.4 可观测性

多步执行过程中的每一步决策、工具调用、中间结果都需要完整记录,否则出现问题时难以排查。应引入日志追踪和可视化工具(如 LangSmith、Langfuse)来监控 Agent 的运行轨迹。

10. 总结

AI Agent 和直接调用大模型 API 的关系,并非互斥,而是递进。

  • 直接调用 API 是所有 LLM 应用的基础,适合单轮问答、文案生成、摘要总结等确定性输入输出的场景。
  • AI Agent 构建在 LLM 之上,通过「规划 + 记忆 + 工具调用 + 循环迭代」赋予了模型自主完成任务的能力,适合多步骤、需要外部数据或操作环境的复杂场景。

理解两者的本质区别,是构建真正有价值的大模型应用的起点。单次 API 调用拼的是 prompt 质量,而 Agent 系统拼的是工程架构、工具设计和可靠性的综合能力。在实际开发中,建议从具体业务痛点出发,先用直接调用 API 验证场景可行性,再逐步引入 Agent 能力完成流程自动化。

11. 延伸阅读与学习资源

  • OpenAI Function Calling 官方文档:理解工具调用的底层规范。
  • LangChain 官方教程:系统学习 Agent、Chain、Memory、Tools 的完整体系。
  • ReAct 原论文:《ReAct: Synergizing Reasoning and Acting in Language Models》。
  • AutoGen 官方文档:深入多 Agent 协作与对话编程。
  • LangSmith / Langfuse:Agent 调试与可观测性工具。
相关推荐
隐退山林1 小时前
JavaEE进阶:SpringAOP
java·java-ee
Hopetree1 小时前
AI Agent 实战手记 04:给 Agent 选对 Loop 工作方式_AI
人工智能
一尘之中1 小时前
深入解析面向服务的架构(SOA):从特性到实施
学习·架构·ai写作
掘金酱1 小时前
社区排行榜现已上线
前端·人工智能
zzjyr1 小时前
AI 问答的流式响应是怎么实现的?从 fetch 到 SSE 逐字解析
前端·人工智能·ai编程
Wang's Blog1 小时前
Java框架快速入门: Spring Security+OAuth2之方法级安全注解
java·安全·spring
用户521133498121 小时前
拍照识别试卷:我在一台 2016 年的 NAS 上做「错题本」,踩了 8 个坑
人工智能
Zzj_tju1 小时前
VLM 读图评测:先审计评分器,再判断读错还是算错
人工智能·深度学习·机器学习·语言模型
嘟嘟嘟95271 小时前
AI Agent 的边缘困境
人工智能·架构·agent