最近很多人在问到底要不要专门学一套“AI Agent 教程”。这个问题的背景很直接:现在各个群里都在聊 Agent,工作岗位上也出现越来越多“AI Agent 开发”“智能体应用工程师”相关的需求。你去搜教程,会发现一套“全 748 集”的合集,标题还写着“一小时快速入门”。先别管这个标题有多少流量成分,它背后反映了一个事实:AI Agent 已经从概念走向工程,现在缺的不是“这个方向重不重要”,而是“怎么写代码把它跑起来”。
这篇文章不打算评价那套课程本身,而是把 AI Agent 开发这条路线完整梳理一遍。你会看到 Agent 的核心架构、主流框架怎么选、开发环境怎么搭、一个最小 Agent 怎么跑通,以及一个很典型的实战场景:Agent 通过 ES REST API 智能分析日志。最后我会给出一套从入门到进阶的学习路径,方便你自己规划节奏。
先说结论:Agent 开发的门槛不在显卡,而在工程能力。云端调用大模型 API 就能起步,本地部署则看你自己选的基座模型。你只要有 Python 基础、会写接口调用,就能在一个下午把第一个能解决实际问题的 Agent 跑起来。这套能力适合后端开发、运维、数据分析师,也适合想转型 AI 应用的开发者。
1. AI Agent 开发核心能力速览
先给一张速览表,把 Agent 开发涉及的知识边界和技能要求列清楚。后续每个模块都会在对应章节展开。
| 能力项 | 说明 |
|---|---|
| 开发模式 | 云 API 调用或本地模型推理,两者都能起步 |
| 硬件要求 | 调云端 API 基本无特殊要求;本地部署按模型参数量决定,7B 量化模型通常 6G 显存起步,实际以本机测试为准 |
| 核心语言 | Python 为主,Java/Node.js 可以做服务端接入 |
| 基础组件 | LLM 调用、Function Calling、工具注册、记忆管理、任务规划 |
| 主流框架 | LangChain、LangGraph、AutoGen、CrewAI、Dify、Coze、smolagents 等 |
| 典型应用 | 日志分析、知识库问答、报表生成、自动化运维、客服工单处理 |
| 接口能力 | 可以封装 REST API,也可以做成批处理任务队列 |
| 批量任务 | 支持,但需要设计输入队列、失败重试、结果持久化 |
| 适合场景 | 需要对接业务系统、处理重复性信息工作、降低人工分析成本的地方 |
| 上手难度 | 有 Python 基础就能学;真正的难点在稳定性设计和成本控制 |
2. AI Agent 到底是什么
2.1 一句话定义
AI Agent 是一个以大语言模型为“大脑”、能够自主调用工具、做规划、维持记忆并完成多步骤任务的系统。它不是一个独立的模型,而是一套围绕模型的工程架构。
你直接问 GPT 一个“今天天气怎么样”,那是聊天机器人。你给它一个任务,让它自己决定“先调用天气接口、拿到结果、再根据结果决定要不要提醒带伞”,这就是 Agent。区别在于:Agent 有目标、有行动、有反馈循环。
2.2 Agent 与 RAG、工作流的区别
很多人把 Agent、RAG、工作流混在一起,这里明确区分一下。
RAG 的核心是“检索增强生成”。它先把外部文档切成向量存进数据库,用户提问时先检索相关内容,再让模型基于检索结果作答。它解决的是“模型不知道私有知识”的问题。RAG 本身不一定有循环和工具调用。
工作流是“固定流程自动化”。比如:读取文件 -> 清洗数据 -> 调用模型 -> 输出报告,每一步都是预设好的。它的特点是稳定、可预期,但改不了流程。
Agent 在工作流的基础上增加了“模型自主决策”。模型可以自己决定先调用哪个工具、结果不满意就重试、多步任务拆解执行。它的灵活性最高,但稳定性也最难保证。
推荐的做法不是“二选一”,而是混合:核心流程用工作流保证稳定,分支和异常处理交给 Agent 决策。
2.3 AI Skills 和 Agent 的区别
AI Skills 可以理解为一个可复用的“技能包”。比如“把一段文字翻译成英文”“提取 PDF 里的表格”,这是一个 Skill。Skill 是单一能力单元,输入输出清晰,不需要复杂规划。
Agent 则是一个“会使用技能的主体”。它可以同时拥有多个 Skill,并根据任务目标选择调用哪个。简单说:Skill 是工具,Agent 是使用工具的人。学习的时候不要把两者对立,Agent 开发中大量时间都在写各种 Skill 注册进去。
3. AI Agent 完整架构拆解
要写 Agent 代码,先搞清楚它的内部结构。一次完整的 Agent 执行,至少包含以下五个部分。
| 模块 | 职责 | 举例 |
|---|---|---|
| 大脑(LLM) | 理解任务、生成决策 | GPT 系列、Claude、Qwen、DeepSeek、本地 LLaMA |
| 规划器 | 拆解任务、决定执行顺序 | ReAct、Plan-and-Execute、HuggingGPT 思路 |
| 工具层 | 外部能力接入 | 搜索 API、ES REST API、数据库连接、代码执行器 |
| 记忆模块 | 保存跨轮上下文和长期知识 | 上下文窗口、向量数据库、会话记录 |
| 执行与反馈循环 | 把决策变成动作,把结果带回模型继续推理 | Agent 主循环中的 tool_call 与 observation |
3.1 ReAct 模式
ReAct 是目前 Agent 最主流的实现思路,核心是“推理 -> 行动 -> 观察 -> 再推理”的循环。模型先分析当前状态,决定调用哪个工具;工具返回结果后,模型再根据结果继续分析,直到任务完成。
伪代码如下:
输入任务 -> 模型推理(Thought) -> 调用工具(Action) -> 工具返回结果(Observation) -> 回到推理ReAct 的优势是可控性强,每一步都有日志,出了问题容易排查。
3.2 Plan-and-Execute 模式
Plan-and-Execute 先把大任务拆成多个子步骤,然后按顺序执行。典型做法是模型先输出一个 TODO 列表,再逐个执行。这个模式适合目标明确、步骤固定的批量任务,比如“每天读取日志文件 -> 提取异常 -> 生成报表 -> 发送通知”。
对比之下,ReAct 更灵活但 token 消耗大,Plan-and-Execute 更高效但应对突发变化的能力弱。实战中常用混合方案:先规划,再在每个子任务里用 ReAct 微调。
3.3 工具调用与 Function Calling
工具调用是 Agent 和外部系统交互的桥梁。大模型本身不能直接查询数据库、不能请求接口,但可以通过 Function Calling 机制输出一个“调用意图”,由代码去真正执行。
典型的 Function Calling 流程:
{ "name": "search_logs", "arguments": { "keyword": "ERROR", "time_range": "last_1h" } }模型只负责生成这个 JSON,真正的网络请求、权限校验、数据过滤都由你写的 Python 函数完成。这也是 Agent 开发中最核心的代码部分。
3.4 记忆模块
Agent 记忆分为两层。短期记忆就是模型上下文窗口里的对话历史,简单但容易被 token 长度限制;长期记忆一般用向量数据库保存历史任务、用户偏好、领域知识,需要时检索出来放回上下文。
很多 Agent 项目做不好的原因之一就是没有设计记忆。任务一多,模型忘记前面的决策,结果越来越差。
4. 主流 Agent 框架选型
现在 Agent 框架非常多,选型时要看项目规模、团队能力和部署环境。下面是一张主流框架对比表。
| 框架 | 定位 | 适合场景 | 备注 |
|---|---|---|---|
| LangChain | 通用组件库 | 快速搭建原型、工具链整合 | 生态大,组件多,但抽象层次较高,排错要看文档 |
| LangGraph | 图状态机编排 | 复杂流程、需要精细控制状态 | 适合想把 Agent 流程“画清楚”的工程团队 |
| AutoGen | 多智能体协作 | 多个 Agent 互相讨论、协作完成任务 | 微软开源,对话驱动 |
| CrewAI | 角色化多 Agent | 模拟团队分工,如分析师、程序员、审查员 | 上手比 LangGraph 简单,适合做任务协作 |
| Dify | 低代码 Agent 平台 | 业务快速落地、内部工具平台 | 支持工作流编排、RAG、插件扩展 |
| Coze(扣子) | 国内可用的低代码平台 | 快速发布机器人、插件市场丰富 | 适合非深度定制场景 |
| smolagents | 轻量级 Agent 框架 | 想直接写 Python 代码控制 Agent | Hugging Face 出品,代码简洁 |
| MetaGPT | 模拟软件公司 | 自动化生成软件开发流程产物 | 偏研究向,生产环境使用需评估 |
选型建议:
- 想快速做业务验证,优先选 Dify 或 Coze,低代码能省大量时间。
- 想深入掌握 Agent 原理,建议从 LangChain 学起,再切到 LangGraph 控制状态。
- 如果你想做研究、轻量实验,可以用 smolagents,代码量小,逻辑清晰。
- 多 Agent 协作优先看 AutoGen 或 CrewAI。
不建议一上来就同时学所有框架。Agent 开发的底层能力是相通的:工具调用、规划、记忆、反馈循环。把一个框架吃透,再迁移到其他框架成本很低。
5. AI Agent 本地开发环境准备
5.1 基础环境清单
Agent 开发不是一个重部署场景,但环境干净能减少大量排错时间。建议按以下步骤准备。
# 1. 安装 Python 3.10 或更高版本 python --version # 2. 使用 uv 或 conda 创建独立虚拟环境 # 以 uv 为例: uv venv agent_env source agent_env/bin/activate # Windows 下: agent_env\Scripts\activate # 3. 安装基础依赖 pip install openai langchain langchain-openai langgraph注意:不需要一次装全,上面这些只是最常见的起步组合。实际项目里按框架文档安装即可。
5.2 API Key 配置
云 API 模式需要准备大模型服务的 API Key,一般在环境变量中配置,不要硬编码进代码。
export OPENAI_API_KEY="your-api-key" # 或者使用兼容 OpenAI 协议的国内模型服务 export BASE_URL="https://your-model-service-endpoint"如果你使用 DeepSeek、Qwen 等模型的 API,通常它们都提供 OpenAI 兼容接口,只需要改 base_url 和 model 名称。
5.3 本地模型可选方案
没有 API Key 或者数据敏感需要本地部署时,可以用 Ollama 等工具跑本地模型。
# 安装 Ollama 后,拉取一个入门级模型 ollama pull qwen2.5:7b # 测试是否可用 ollama run qwen2.5:7b本地部署的优点是数据不出内网,缺点是需要 GPU 资源,且小参数模型的复杂推理能力弱于云端大模型。如果你要处理复杂的 Agent 规划任务,优先用云 API;如果只是实验和学习,本地 7B 模型足够起步。
5.4 开发工具与调试建议
建议使用 Jupyter Notebook 或 VS Code 的 Notebook 做小步验证。Agent 执行过程中会生成大量中间日志,建议在代码里加上结构化日志输出,把每次“Thought、Action、Observation”都打印出来,这比事后猜原因高效得多。
6. 写一个最小可运行的 Agent 循环
先不看任何框架,理解 Agent 的底层循环。下面的代码是一个教学示意,展示“模型决定调用工具 -> 代码执行工具 -> 结果回传给模型”的完整过程。实际生产请使用你选择框架的官方实现。
import json from openai import OpenAI client = OpenAI( api_key="your-api-key", base_url="https://your-model-service-endpoint" ) def call_llm(messages, tools=None): response = client.chat.completions.create( model="your-model-name", messages=messages, tools=tools, tool_choice="auto" ) return response.choices[0].message def get_current_time(city: str) -> str: """获取指定城市的当前时间,这里仅作为工具示例""" # 真实项目中替换为具体 API 调用 return f"现在是 {city} 的上午 10:00" tools = [ { "type": "function", "function": { "name": "get_current_time", "description": "获取指定城市的当前时间", "parameters": { "type": "object", "properties": { "city": {"type": "string", "description": "城市名称"} }, "required": ["city"] } } } ] messages = [ {"role": "user", "content": "北京现在几点?"} ] # 第一轮:模型可能返回 tool_calls,而不是直接回答 assistant_message = call_llm(messages, tools=tools) print("模型决策:", assistant_message.tool_calls) # 如果模型决定调用工具,就执行对应函数 if assistant_message.tool_calls: for tool_call in assistant_message.tool_calls: args = json.loads(tool_call.function.arguments) result = get_current_time(**args) print("工具返回:", result) # 把工具结果作为新的 message 放回对话 messages.append(assistant_message) messages.append({ "role": "tool", "tool_call_id": tool_call.id, "content": result }) # 第二轮:模型结合工具结果生成最终回答 final_message = call_llm(messages) print("最终回答:", final_message.content)这个例子虽然简单,但包含了 Agent 最核心的闭环:模型出决策,代码执行工具,结果再回到模型。在这个基础上加循环、加记忆、加任务列表,就是一个真正能用的 Agent。
7. Agent 实战:通过 ES REST API 智能分析日志
日志分析是 Agent 落地非常合适的场景。传统做法是人工写 Kibana 查询,或者固定写死一套查询规则。用 Agent 之后,可以让模型理解自然语言需求,自动生成 ES 查询语句,再通过 ES REST API 执行,最后把结果总结成报告。
7.1 需求拆解
假设运维同学提出一个问题:“最近一小时内订单服务出现错误的时间点和频率分别是多少?”
传统方式需要懂得 ES DSL,然后手动写查询。Agent 方式则是:
- 用户说出需求。
- 模型判断需要调用日志检索工具。
- 代码调用 ES REST API 执行查询。
- 查询结果返回给模型。
- 模型生成分析结论。
7.2 通过 REST API 查询 ES
下面是一个 Python 示例,Agent 工具层通过 REST API 查询 Elasticsearch。实际使用时,你需要把 host、用户名、密码替换成你的 ES 配置。
import requests import json ES_BASE_URL = "http://your-es-host:9200" ES_USERNAME = "your-username" ES_PASSWORD = "your-password" def search_logs(index_pattern: str, query_dsl: dict) -> str: """ 在 Elasticsearch 中执行查询 index_pattern: 索引名或通配符,例如 "order-service-*" query_dsl: ES Query DSL 字典 """ url = f"{ES_BASE_URL}/{index_pattern}/_search" headers = {"Content-Type": "application/json"} response = requests.get( url, auth=(ES_USERNAME, ES_PASSWORD), headers=headers, data=json.dumps(query_dsl), timeout=30 ) if response.status_code != 200: return f"查询失败: {response.status_code} {response.text}" data = response.json() hits = data.get("hits", {}).get("hits", []) return json.dumps(hits[:10], ensure_ascii=False, indent=2)7.3 让模型生成 ES 查询 DSL
把上面的函数注册为工具后,模型会生成类似下面的 ES Query DSL:
{ "query": { "bool": { "must": [ {"match": {"service": "order-service"}}, {"range": {"@timestamp": {"gte": "now-1h"}}}, {"match": {"level": "ERROR"}} ] } }, "aggs": { "error_time_points": { "date_histogram": { "field": "@timestamp", "calendar_interval": "5m" } } } }然后由代码执行请求,把结果返回给模型。模型可以继续分析节流趋势、统计错误码分布,甚至给出告警建议。
7.4 完整 Agent 工作流
一个能用的日志分析 Agent,建议抽象成如下流程:
- 接收用户问题,例如“最近一小时 ERROR 日志分布”。
- 模型通过 Function Calling 调用
search_logs,传参为索引模式和 query_dsl。 - 工具层执行 REST 请求,返回 JSON 结果。
- 模型把 JSON 结果整理成自然语言报告。
- 如果结果不满足需求,模型可以修改 query_dsl 再次查询。
关键点是:让模型做决策,让代码做执行。模型的 DSL 生成不一定每次都对,要预设一轮校验逻辑,比如对 DSL 做模板校验、字段白名单校验,避免模型输出不可控查询导致 ES 压力过大。
8. Agent 的接口 API 与批量任务设计
8.1 用 FastAPI 封装 Agent 服务
Agent 要落地,不能只在 Notebook 里跑。用 FastAPI 封装一个 API 服务,外部系统就能直接调用。
from fastapi import FastAPI, Request from pydantic import BaseModel app = FastAPI() class AgentRequest(BaseModel): question: str index_pattern: str = "order-service-*" class AgentResponse(BaseModel): answer: str logs_count: int @app.post("/api/agent/analyze_logs") def analyze_logs(req: AgentRequest): # 实际项目里这里调用 Agent 执行循环 answer = f"正在分析 {req.index_pattern} 中的日志,问题:{req.question}" logs_count = 0 return AgentResponse(answer=answer, logs_count=logs_count)启动:
uvicorn main:app --host 0.0.0.0 --port 80008.2 调用测试
curl -X POST http://127.0.0.1:8000/api/agent/analyze_logs \ -H "Content-Type: application/json" \ -d '{"question": "最近一小时错误日志主要集中在哪里", "index_pattern": "order-service-*"}'8.3 批量任务设计
Agent 的批量任务不能简单写成 for 循环直接跑,否则一旦中间某个任务失败,整个流程都要重来。更稳妥的做法是:
- 把待分析的任务写到队列(表或消息队列)。
- 每个任务独立执行,记录状态。
- 失败任务重试两次,重试间隔逐步增大。
- 每次请求都做超时控制。
- 结果写回文件或数据库。
伪代码:
tasks = [ {"question": "分析 order-service 最近 1 小时错误", "index_pattern": "order-service-*"}, {"question": "分析 payment-service 最近 1 小时错误", "index_pattern": "payment-service-*"}, ] for task in tasks: try: result = run_agent(task["question"], task["index_pattern"]) save_result(result) except Exception as e: log_error(task, e) # 重试或标记失败批量任务的核心不是“跑得快”,而是“跑得稳”。
9. 资源占用与性能观察
Agent 的性能和资源观察分三个层面:模型推理资源、外部服务请求量、整体任务耗时。
9.1 模型推理资源
- 云端 API:关注 token 消耗和单次请求耗时。模型生成 DSL 和总结报告都会消耗 token。
- 本地模型:关注显存占用。7B 量化模型通常 6G 显存起步,实际占用和上下文长度、最大生成长度直接相关。建议用 nvidia-smi 观察。
9.2 外部服务压力
Agent 经常会频繁请求 ES、数据库或第三方 API。要给每个工具调用设置超时和频率限制,避免 Agent 陷入循环请求打垮下游服务。
9.3 任务耗时拆解
一个 Agent 任务的总耗时 = 模型推理时间 + 工具执行时间 + 网络传输时间。调试时建议分别打印各个阶段耗时,找到瓶颈。
10. AI Agent 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| Agent 一直不调用工具 | Function Calling 定义错误或模型不支持 | 检查工具定义 JSON,查看模型返回的原始消息 | 简化工具描述,减少参数个数 |
| 调用工具后没有继续推理 | 工具结果未按 tool 消息格式回传 | 检查 tool_call_id 是否匹配 | 按框架要求回传完整的 assistant 消息和 tool 消息 |
| ES 查询返回大量数据 | 未加 size 限制或查询条件太宽 | 查看工具函数日志 | 在查询 DSL 中限制 size,加时间范围 |
| 模型生成的 DSL 格式错误 | 提示词不够清晰 | 打印模型返回内容 | 在工具描述中给出 DSL 模板示例 |
| 批量任务跑到一半失败 | 单个任务异常未捕获 | 查看任务日志和错误记录 | 增加 try/except 和重试机制 |
| token 消耗过大 | 推理轮次过多、上下文太长 | 统计每轮 token 数量 | 限制最大迭代轮数,精简上下文 |
| API 请求超时 | 外部服务响应慢或网络问题 | 查看请求耗时日志 | 设置合理的 timeout,增加重试 |
| 本地模型显存不足 | 模型参数过大或上下文过长 | 使用 nvidia-smi 查看显存 | 换小参数量模型或用量化版本 |
11. AI Agent 开发学习路线:从入门到进阶
11.1 阶段一:掌握 Prompt 与 Function Calling
第一步不是学框架,而是学提示词和 Function Calling。你要先知道怎么让模型稳定输出 JSON 格式的调用意图。可以拿一个简单工具练手,比如天气查询、计算器。
11.2 阶段二:实现一个最小 Agent
不依赖框架,自己实现上面第 6 节的循环逻辑。这一步能让你彻底理解 Agent 的运行机制,之后用任何框架都不会觉得“黑盒”。
11.3 阶段三:选择一个框架深入
基于你的定位选一个框架,建议优先 LangGraph 或 Dify。前者适合有代码能力的开发者,后者适合快速交付业务项目。
11.4 阶段四:做一个小而完整的实战项目
建议从日志分析、工单分类、报表生成这类企业内部需求开始。这类项目数据丰富、价值明确,也容易评估效果。
11.5 阶段五:工程化与稳定化
重点解决批量任务、错误重试、日志追踪、效果评测。可以关注 GAIA、AgentBench 等基准,理解当前 Agent 能力边界。
关于“学完即可就业”这类说法,客观一点看:Agent 开发能力是工程师技能树上重要的加分项,但岗位录用还要看候选人整体工程能力、项目经验和业务理解。不要把注意力放在“多少集能学完”,而是放在“能不能独立跑通一个真实场景”。
12. 合规与安全边界
Agent 开发中要特别注意边界问题,尤其是涉及日志、用户数据、内部系统时。
- 日志往往包含敏感信息,使用前要做脱敏处理。
- 让 Agent 访问 ES、数据库时,用最小权限账号,禁止使用 root 权限。
- Agent 不能无限制执行危险操作,比如删除索引、修改线上数据,关键操作要增加人工审批。
- 调用云 API 时注意数据合规,确认数据是否可以发送到外部模型服务;不能出网的数据,用本地部署方案。
- 生成内容要复核,Agent 的输出不能直接作为最终告警或报告,需要规则校验或人工抽检。
13. 总结与下一步
这次把 AI Agent 开发从概念到实践完整梳理了一遍。最值得先动手验证的是第 6 节的最小 Agent 循环,把工具调用跑通,后面所有框架、项目都建立在这个闭环上。最容易踩的坑是工具定义不规范和批量任务没有异常处理,建议一开始就做好日志和重试设计。
接下来你可以按这个顺序推进:先注册一个可用的大模型 API,写一个带工具调用的小 Agent,然后接上 ES REST API 处理日志,最后封装成 FastAPI 服务并加上批量任务队列。国内可以使用兼容 OpenAI 协议的模型服务和 Dify、Coze 等平台,整体上手成本已经很低。
往下扩展的方向还有:多 Agent 协作处理更复杂的故障排查、把 Agent 接入告警系统实现自动化响应、把长期记忆做到向量数据库里形成知识沉淀。建议收藏备用,准备动手时不用从零开始搜。