跳转到正文
技术教程·

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 工具使用指南 了解网络稳定方案。

进阶学习

---

本文最后更新于 2026-07-08。代码示例基于 LangChain 0.2+ 和 OpenAI API,其他 LLM 的实现方式类似。*

保障 API 调用稳定性

调用 OpenAI、Anthropic 等海外 API 时,网络波动可能导致请求超时或失败。稳定的网络环境有助于提升开发效率。

⚠️ 请遵守所在地的法律法规和服务条款。使用 AI API 时请遵守各平台的使用政策。

了解安全上网方案 →

常见问题

相关推荐

获取更多 AI 内容

订阅更新,第一时间获取新教程和工具推荐。