目录
- [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 收到任务后,会先拆解目标,然后依次执行以下动作:
- 调用行情数据工具,拉取新能源板块今日实时数据;
- 将数据交给 LLM 分析,生成简报文本;
- 调用邮件发送工具,将简报发送到指定邮箱;
- 检查每一步的返回结果,如果某一步失败,则调整策略重试。
整个过程无需人工干预,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 | 可视化平台 | 低代码搭建,无需深入代码开发 |
对于刚入门的开发者,建议先从 LangChain 或 LlamaIndex 开始,它们的文档完善、社区活跃、示例丰富;当需要做多 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 调试与可观测性工具。