AI Agent 开发教程:从概念到第一个 Agent
AI Agent 开发教程:从理解 Agent 架构到动手实现第一个智能 Agent。本文使用 Python + LangChain 构建一个能搜索网页、执行代码的 Agent。
这篇教程适合谁
你已经写过 Python,调过 LLM API(至少用过 OpenAI 或 Claude 的 SDK),现在想搞清楚 Agent 到底怎么落地——不是概念层面的"思考-行动-观察"循环,而是代码层面怎么串起来。
不适合:完全零编程基础的读者。如果你还没调过 LLM API,建议先看 OpenAI API 教程 或 Claude API 教程。 最终产物:一个能根据用户问题自动选择工具(查时间、算数、搜网页)并多步推理的 Agent,带调试日志。环境假设
- Python 3.10+(3.9 也能跑,但类型提示语法不同)
- LangChain 0.2+(0.1.x 的 import 路径不一样,注意迁移)
- OpenAI API Key(用
gpt-4o-mini做演示,换成其他模型改一行即可) - 以当前常见版本为准,具体 API 请以官方最新文档为准
Agent 的核心循环
先把架构讲清楚,后面代码才能看懂:
用户输入 → LLM 推理 → 决定调哪个工具(或直接回答)
↓
执行工具,拿到结果
↓
结果喂回 LLM → 继续推理或输出最终回答
关键区别:Chain 是写死的流程,Agent 是 LLM 自己决定下一步。所以 Agent 的行为不可预测——这是它的能力来源,也是调试噩梦的来源。
构建最简单的 Agent
from langchain_openai import ChatOpenAI
from langchain.agents import tool, AgentExecutor, create_openai_tools_agent
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
import os
os.environ["OPENAI_API_KEY"] = "your-api-key" # 生产环境用环境变量,别硬编码
# 定义工具——docstring 就是给 LLM 看的"说明书"
@tool
def get_current_time() -> str:
"""获取当前时间。"""
from datetime import datetime
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
@tool
def calculate(expression: str) -> str:
"""计算数学表达式。参数 expression:数学表达式字符串。"""
try:
result = eval(expression)
return f"计算结果:{result}"
except Exception as e:
return f"计算错误:{e}"
# temperature=0 让推理更确定性,Agent 场景不建议用高温度
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个智能助手,可以使用工具来帮助用户完成任务。"),
MessagesPlaceholder(variable_name="chat_history", optional=True),
("user", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad") # Agent 的中间推理过程
])
agent = create_openai_tools_agent(llm, [get_current_time, calculate], prompt)
executor = AgentExecutor(agent=agent, tools=[get_current_time, calculate], verbose=True)
# 测试
result = executor.invoke({"input": "现在几点了?再帮我算一下 365 24"})
print(result["output"])
为什么这么写:
@tool装饰器的 docstring 不是给人看的,是给 LLM 看的——它靠这段文字决定什么时候调这个工具。写不清楚,LLM 就选错工具。agent_scratchpad是 Agent 的"草稿纸",存放中间推理步骤。没有它,Agent 只能单轮对话。verbose=True开发阶段必开,生产环境关掉(输出太多,且暴露内部逻辑)。
添加更多工具
import requests
@tool
def search_knowledge(query: str) -> str:
"""搜索知识库获取信息。参数 query:搜索关键词。"""
knowledge_base = {
"RAG": "RAG(检索增强生成)是一种让大模型基于外部知识回答问题的技术。",
"Agent": "AI Agent 是能自主规划、使用工具、执行任务的智能系统。",
"向量数据库": "向量数据库是存储和检索向量数据的专用数据库,用于语义搜索。",
}
results = []
for key, value in knowledge_base.items():
if key in query:
results.append(value)
return "\n".join(results) if results else "未找到相关信息。"
@tool
def web_request(url: str) -> str:
"""发送 HTTP GET 请求获取网页内容。参数 url:目标 URL。"""
try:
response = requests.get(url, timeout=10)
return response.text[:1000] # 截断,避免把整个网页喂给 LLM
except Exception as e:
return f"请求失败:{e}"
踩坑点:工具返回的内容会直接塞进 LLM 的上下文。如果 web_request 不截断,一个网页可能几万 token,直接把上下文窗口撑爆。生产环境一定要限制返回长度,或者做摘要。
多步骤推理
tools = [get_current_time, calculate, search_knowledge, web_request]
agent = create_openai_tools_agent(llm, tools, prompt)
executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
max_iterations=5, # 限制最大推理步数——非常重要
handle_parsing_errors=True # LLM 输出格式不对时自动重试
)
result = executor.invoke({
"input": "先告诉我现在几点,然后搜索一下 RAG 是什么,最后帮我算一下 2 的 10 次方"
})
print(result["output"])
max_iterations 为什么必须设:没有上限的 Agent 会陷入死循环——工具返回的信息不够,LLM 反复调同一个工具。实际项目里 5-8 步就够了,超过这个数通常说明任务拆得不对。
调试技巧
# verbose=True 看推理过程,开发阶段必开
# 也可以用回调函数拿到更细粒度的信息
from langchain.callbacks import StdOutCallbackHandler
executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
callbacks=[StdOutCallbackHandler()]
)
调试 Agent 的核心方法:看 verbose 输出里 LLM 选了哪个工具、传了什么参数、拿到什么返回。90% 的问题出在工具描述写得不清楚,LLM 选错了工具或传错了参数。
错误处理
try:
result = executor.invoke({"input": "复杂任务"})
except Exception as e:
print(f"Agent 执行失败:{e}")
最容易踩的坑
- Agent 陷入循环:
max_iterations是安全阀,但根本原因是工具描述不够精确,LLM 无法判断该用哪个工具。 - eval() 安全风险:上面的
calculate用了eval(),开发演示可以,生产环境绝对不行——用户可以注入任意 Python 代码。用ast.literal_eval或专门的数学表达式解析库。 - 工具返回格式不稳定:LLM 对工具返回的解析依赖格式一致。如果有时返回 JSON,有时返回纯文本,Agent 会困惑。统一返回格式。
- API 调用不稳定:调用海外 API 时网络波动是常态。加重试机制,设合理的 timeout。可参考 海外 AI 工具使用指南 了解网络稳定方案。
进阶学习
- 深入学习 LangChain:LangChain 教程
- 搭建 RAG Agent:RAG 教程
- 低代码搭建 Agent:Dify 教程
---
本文最后更新于 2026-07-08。代码示例基于 LangChain 0.2+ 和 OpenAI API,其他 LLM 的实现方式类似。*
保障 API 调用稳定性
调用 OpenAI、Anthropic 等海外 API 时,网络波动可能导致请求超时或失败。稳定的网络环境有助于提升开发效率。
⚠️ 请遵守所在地的法律法规和服务条款。使用 AI API 时请遵守各平台的使用政策。
了解安全上网方案 →常见问题
相关推荐
获取更多 AI 内容
订阅更新,第一时间获取新教程和工具推荐。