从零构建AI Agent:基于ReAct框架的智能体开发实战指南
2026/7/25 13:34:38 网站建设 项目流程

1. 先搞清楚 Agentic AI 和 AI Agent 到底在解决什么问题

如果你最近在看 AI 相关的资料,大概率会频繁遇到Agentic AIAI Agent这两个词。它们听起来很高级,但很多介绍要么太学术,要么太抽象,看完还是不知道从哪下手。简单来说,它们解决的核心问题是:让 AI 从一个“被动的答题者”变成一个“主动的做事者”

传统的 AI 模型,比如你问 ChatGPT 一个问题,它给你一段回答,任务就结束了。它不会、也不能主动去打开一个网页查资料,不会去调用一个 API 帮你订机票,更不会在完成一个复杂任务(比如写一份市场分析报告)时,自己规划步骤、调用工具、检查结果。而AI Agent的目标就是赋予 AI 这种“做事”的能力。一个 Agent 可以理解你的目标,规划步骤,使用工具(如搜索引擎、代码执行器、API),并在过程中根据反馈调整策略。

Agentic AI则是一个更上层的概念,指的是一套由多个 AI Agent 组成的、能够自主协作完成复杂目标的系统。你可以把它想象成一个“AI 团队”,里面有负责不同职能的“员工”(Agent),还有一个“项目经理”(Orchestrator)在协调。它的关键特征是目标驱动有限监督下的自主性

所以,这篇文章不是给你罗列一堆框架名字和理论,而是帮你建立最基础的认知,然后立刻动手,用一个最简单的例子,让你亲眼看到 Agent 是怎么“动起来”的。我会带你从零开始,搭建一个能执行“思考-行动-观察”循环的智能体。适合以下人群:

  • 想了解 AI Agent 核心概念,但被各种术语绕晕的开发者。
  • 想亲手运行一个 Agent 看看效果,而不是只停留在理论层面。
  • 在考虑如何将 AI 能力集成到现有业务流程中,实现自动化。

最值得关注的不是 Agent 能做什么惊天动地的事,而是它将复杂任务分解、执行、迭代的“工作流”思维。这种思维,是构建下一代智能应用的基础。

2. 动手之前:理解 Agent 的核心组件与工作循环

在写第一行代码之前,我们需要先拆解一个 AI Agent 到底由哪些部分构成,以及它是如何“思考”的。这能帮你理解后续每一步操作的意义,而不是盲目复制命令。

一个典型的 AI Agent 通常包含以下几个核心组件:

  1. 规划(Planning):Agent 的核心大脑。它接收用户的目标(例如:“帮我查一下北京明天天气,并建议是否需要带伞”),并将其分解成一系列可执行的子任务(1. 确定城市‘北京’;2. 获取明天日期;3. 调用天气查询工具;4. 分析降水概率;5. 生成建议)。
  2. 工具使用(Tool Use):Agent 的“手”和“脚”。Agent 本身(通常是一个大语言模型)无法直接获取实时数据或操作系统。它需要通过预定义的工具(Tools)来与外界交互。常见的工具包括:搜索引擎 API、计算器、代码执行器、数据库查询、文件读写等。
  3. 记忆(Memory):Agent 的“笔记本”。分为短期记忆(当前对话的上下文)和长期记忆(存储历史交互、知识库)。记忆让 Agent 能在多轮对话中保持一致性,并学习经验。
  4. 行动(Action):根据规划,选择并执行一个工具。
  5. 观察(Observation):获取工具执行后的结果(例如,天气 API 返回了“降水概率 60%”)。
  6. 反思(Reflection):根据观察结果,评估当前进展,决定是继续执行下一个子任务,还是需要调整规划。

这些组件如何协同工作?目前最主流、也最适合入门理解的范式是ReAct(Reason + Act)框架。它的工作流是一个循环:

思考(Reason)-> 行动(Act)-> 观察(Observe)-> 再思考(Reason)...

举个例子,你让 Agent “查一下爱因斯坦的生日,并计算到今年他多少岁了”。

  • 思考1:“用户需要两个信息:爱因斯坦的生日和他的年龄。要计算年龄,我需要知道当前日期。我先查生日。”
  • 行动1:调用“维基百科查询工具”,输入“爱因斯坦 出生日期”。
  • 观察1:工具返回“1879年3月14日”。
  • 思考2:“生日拿到了。现在需要当前日期来计算年龄。”
  • 行动2:调用“获取当前日期工具”。
  • 观察2:工具返回“2024年10月27日”。
  • 思考3:“有了出生日期和当前日期,我可以计算年龄了。需要调用计算工具。”
  • 行动3:调用“计算工具”,输入“2024 - 1879”。
  • 观察3:工具返回“145”。
  • 思考4:“所有信息已齐备。可以组织最终答案了。”
  • 最终回答:“爱因斯坦出生于1879年3月14日,到2024年10月27日,他将是145岁。”

这个“思考-行动-观察”的循环,就是 Agent 智能的体现。它不再是一次性生成答案,而是通过与环境(工具)的交互,一步步逼近目标。

3. 环境准备与最小化 Agent 搭建实战

理论讲完了,我们立刻动手。为了让演示最清晰,我们选择LangChain这个目前最流行的 AI 应用开发框架,它内置了对 Agent 的良好支持。同时,为了简化,我们使用 OpenAI 的模型(例如 GPT-3.5-Turbo)作为 Agent 的“大脑”。你需要准备:

  • Python 环境:建议 Python 3.8 以上。
  • OpenAI API Key:如果你没有,需要去 OpenAI 官网注册获取。这是调用模型能力的凭证。
  • 基础的命令行操作能力

3.1 第一步:安装依赖与设置环境

打开你的终端或命令行,创建一个新的项目目录,并安装必要的包。

# 创建项目目录并进入 mkdir my_first_agent && cd my_first_agent # 创建虚拟环境(推荐,避免包冲突) python -m venv venv # 激活虚拟环境 # Windows: venv\Scripts\activate # macOS/Linux: source venv/bin/activate # 安装 LangChain 和 OpenAI 库 pip install langchain langchain-openai

安装完成后,我们需要设置 API Key。永远不要将 API Key 硬编码在代码中。推荐使用环境变量。

# 在终端中设置环境变量(临时) # Windows: set OPENAI_API_KEY=你的-api-key-here # macOS/Linux: export OPENAI_API_KEY=你的-api-key-here

3.2 第二步:定义你的第一个工具(Tool)

Agent 的强大在于使用工具。我们先定义一个最简单的工具:一个能进行幂运算(计算一个数的 N 次方)的计算器。

创建一个名为agent_demo.py的文件:

# agent_demo.py from langchain.agents import tool from langchain_openai import ChatOpenAI # 1. 使用 @tool 装饰器定义一个工具 @tool def power_calculator(base: float, exponent: float) -> float: """计算一个数的幂。输入基数和指数,返回结果。""" return base ** exponent # 让我们测试一下这个工具是否工作 print(power_calculator.invoke({"base": 2, "exponent": 3})) # 输出: 8.0

运行python agent_demo.py,你应该看到输出8.0。这说明我们的工具函数定义正确,并且能被调用。

关键点@tool装饰器是 LangChain 用来将普通 Python 函数“包装”成 Agent 可识别工具的标准方法。文档字符串"""计算一个数的幂..."""非常重要,Agent 的“大脑”(LLM)会阅读这段描述来决定在什么情况下使用这个工具。

3.3 第三步:创建 Agent 并运行 ReAct 循环

现在,我们把工具交给 Agent,并观察它如何执行一个需要“思考”的任务。

修改agent_demo.py

# agent_demo.py from langchain.agents import tool, create_react_agent, AgentExecutor from langchain_openai import ChatOpenAI from langchain import hub # 用于拉取预设的提示词 # 1. 定义工具(同上) @tool def power_calculator(base: float, exponent: float) -> float: """计算一个数的幂。输入基数和指数,返回结果。""" return base ** exponent # 将工具放入列表 tools = [power_calculator] # 2. 初始化大语言模型(LLM)作为 Agent 的大脑 # 确保你的 OPENAI_API_KEY 环境变量已设置 llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) # 3. 获取 ReAct 框架的标准提示词模板 # 这个模板会指导 LLM 按照“Thought/Action/Observation”的格式进行输出 prompt = hub.pull("hwchase17/react") # 4. 创建 ReAct Agent agent = create_react_agent(llm, tools, prompt) # 5. 创建 Agent 执行器,它负责运行循环 agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True) # 6. 向 Agent 提问一个需要工具计算的问题 print("=== Agent 开始执行 ===") result = agent_executor.invoke({ "input": "请计算 5 的 3 次方是多少?" }) print("\n=== 最终结果 ===") print(result["output"])

运行这段代码python agent_demo.py。你会看到类似以下的详细输出(因为设置了verbose=True):

=== Agent 开始执行 === > Entering new AgentExecutor chain... 我需要计算 5 的 3 次方。我可以使用 power_calculator 工具来完成这个计算。 Action: power_calculator Action Input: {"base": 5, "exponent": 3} Observation: 125.0 Thought: 我已经得到了计算结果,5 的 3 次方是 125。 Action: Final Answer Action Input: 5 的 3 次方是 125。 > Finished chain. === 最终结果 === 5 的 3 次方是 125。

这就是一个完整的 ReAct 循环!让我们拆解 Agent 的“思考”过程:

  1. Thought: “我需要计算 5 的 3 次方。我可以使用 power_calculator 工具...” (规划)
  2. Action: 它决定调用power_calculator工具。
  3. Action Input: 它正确地生成了工具所需的参数格式{"base": 5, "exponent": 3}
  4. Observation: 工具执行,返回结果125.0
  5. Thought: “我已经得到了计算结果...” (反思并决定结束任务)
  6. Final Answer: 输出最终答案。

这个简单的例子展示了 Agent 最本质的能力:理解任务、选择工具、处理结果。虽然任务简单,但框架已经搭好了。

4. 进阶实操:构建一个实用的多工具 Agent

只会做数学题显然不够。一个实用的 Agent 应该能处理更开放的世界知识问题。我们给它增加两个强大的工具:维基百科搜索计算器(LangChain 内置)。这样它就能回答“谁是谁”、“发生了什么”以及进行数学计算。

4.1 安装并配置更多工具

首先,安装维基百科工具所需的包:

pip install wikipedia

然后,我们创建第二个演示文件advanced_agent.py

# advanced_agent.py from langchain.agents import load_tools, create_react_agent, AgentExecutor from langchain_openai import ChatOpenAI from langchain import hub # 1. 加载工具集 # load_tools 可以方便地加载 LangChain 社区维护的众多工具 # 我们加载:llm-math(数学计算工具)和 wikipedia(维基百科查询工具) tools = load_tools(["llm-math", "wikipedia"], llm=ChatOpenAI(model="gpt-3.5-turbo", temperature=0)) # 注意:llm-math 工具内部也需要一个 LLM 来解析问题,所以我们传入一个 llm 参数。 # 2. 初始化主 Agent 的 LLM llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) # 3. 获取提示词模板并创建 Agent prompt = hub.pull("hwchase17/react") agent = create_react_agent(llm, tools, prompt) agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True) # 4. 提出一个复合型问题 print("=== 测试1:知识查询 + 计算 ===") question1 = "特斯拉(Nikola Tesla)是哪一年出生的?他的年龄如果活到今天是多少岁?" result1 = agent_executor.invoke({"input": question1}) print(f"答案: {result1['output']}\n") # 5. 提出一个需要多步推理的问题 print("=== 测试2:多步推理 ===") question2 = "已知圆的半径是 7 厘米,请问这个圆的面积是多少?请用中文回答。" result2 = agent_executor.invoke({"input": question2}) print(f"答案: {result2['output']}")

运行python advanced_agent.py。你会看到更精彩的输出。对于第一个问题,Agent 的思考链可能是:

  1. 思考:用户问特斯拉的出生年份和当前年龄。我需要先查他的出生年份。
  2. 行动:调用wikipedia工具,查询“Nikola Tesla”。
  3. 观察:维基百科返回信息,包含出生日期“1856年7月10日”。
  4. 思考:现在需要计算他活到今天的年龄。我需要当前年份和出生年份。
  5. 行动:调用llm-math工具,计算“2024 - 1856”。
  6. 观察:计算工具返回“168”。
  7. 思考:信息已齐全,可以组织答案。
  8. 最终答案:输出包含出生年份和计算出的年龄。

这就是多工具协作的雏形。Agent 自己判断在哪个步骤该用哪个工具,并串联起整个流程。

4.2 关键参数与配置解析

在创建 Agent 时,有几个参数直接影响其行为和稳定性:

  • llm: Agent 的“大脑”。model选择决定了能力和成本。temperature控制创造性(0 更确定,接近1更随机)。对于执行确定任务的 Agent,通常设为 0 或 0.1。
  • verbose=True:强烈建议在开发和调试时开启。它能打印出完整的 ReAct 思考链,是你理解 Agent 决策过程、排查问题的最重要依据。
  • handle_parsing_errors=True: 这是一个重要的安全网。LLM 的输出有时可能不符合工具调用的格式要求,导致解析错误。设置这个参数为 True,可以让执行器尝试修复或提示 Agent 重新输出,避免整个流程崩溃。
  • max_iterations: 在AgentExecutor中可以设置最大迭代次数,防止 Agent 陷入死循环。例如AgentExecutor(..., max_iterations=5)
  • tools: 工具列表。工具的定义质量(名称、描述、参数)直接决定了 Agent 能否正确使用它。工具的描述要清晰、准确。

5. 生产环境考量与常见问题排查

当你跑通 Demo,兴奋地想把它用到真实项目时,会立刻遇到一系列工程化问题。下面是我从实际项目中总结的几个关键点和排查顺序。

5.1 稳定性与错误处理

Agent 在复杂任务中很容易“跑偏”或“卡住”。你需要为它设计护栏。

  • 超时与重试:网络调用、工具执行都可能失败。要为工具调用和整个 Agent 执行设置超时(timeout)和重试逻辑(retry)。LangChain 的很多工具支持max_retries参数。
  • 验证输出:不要完全信任 Agent 的最终输出。对于关键任务,设计后置验证步骤。例如,如果 Agent 的任务是生成 SQL,在执行前先用语法检查器过一遍。
  • 限制迭代次数:务必设置max_iterations(如10-15次)。我曾见过一个 Agent 因为无法找到完美答案而思考了上百次,消耗了大量 token。
  • 结构化输出:鼓励 Agent 输出 JSON 等结构化格式,便于后续程序化处理。可以使用 LangChain 的StructuredOutputParser等功能。

5.2 工具设计的核心原则

工具是 Agent 能力的延伸,设计好坏至关重要。

  1. 单一职责:一个工具只做一件事。不要设计一个“万能查询工具”,而应该拆成“查询天气”、“查询股价”、“查询新闻”等多个工具。这样 Agent 更容易理解和选择。
  2. 清晰的描述:工具的description和每个参数的description必须用自然语言写清楚在什么情况下使用以及参数是什么。LLM 完全依赖这些描述来做决策。
  3. 健壮性:工具函数内部要有充分的错误处理(try-catch),返回明确的错误信息,而不是抛出异常导致整个 Agent 崩溃。例如,调用 API 失败时,返回{"error": "API request failed due to network"},这比直接崩溃更有助于 Agent 进行下一步决策(比如重试或换方案)。
  4. 安全性:工具能访问哪些资源(数据库、内部 API)必须有严格的权限控制。绝不能让一个处理外部用户提问的 Agent 拥有删除数据库的工具。

5.3 典型问题排查清单

当你的 Agent 表现不如预期时,按这个顺序排查:

  1. 看日志 (verbose=True):这是第一步,也是最重要的一步。观察 Agent 的“思考(Thought)”是否合理?它是否选择了正确的工具?工具输入(Action Input)的格式对吗?
  2. 检查工具描述:如果 Agent 总是忽略某个工具或错误使用,首先检查工具的描述是否足够清晰、无歧义。用人类的眼光看,这段描述能否让你明白什么时候该用它?
  3. 简化问题:如果复杂任务失败,先测试每个工具单独是否工作。再测试一个仅需使用一个工具的简单任务,看 Agent 能否完成。逐步增加复杂度。
  4. 调整提示词(Prompt):ReAct 的提示词模板(hwchase17/react)是通用的。对于特定领域,你可能需要微调提示词,在开头明确告诉 Agent “你是一个数学助手,请优先使用计算工具”或“你是一个客服助手,请根据知识库回答问题”。
  5. 检查模型能力:过于复杂的规划可能超出了较小模型(如 GPT-3.5-Turbo)的能力。尝试换用更强大的模型(如 GPT-4)进行测试,如果问题解决,说明是模型能力瓶颈。
  6. 资源与依赖:确认所有工具所需的 API Key、网络连接、第三方库都已正确安装和配置。一个常见的坑是wikipedia库因为网络问题超时。

5.4 从单 Agent 到多 Agent 系统(Agentic AI)

单个 Agent 能力有限。真正的Agentic AI系统涉及多个 Agent 协作。例如:

  • “规划者-执行者”模式:一个高级 Agent(规划者)负责分解复杂目标并制定计划,然后将子任务分发给多个 specialized Agent(执行者)去完成。
  • “辩论”模式:多个 Agent 从不同角度分析同一问题,然后通过“辩论”或“评审”达成一致结论,提高输出的质量和可靠性。

实现多 Agent 系统,框架的选择更重要。CrewAIAutoGenLangGraph是当前热门的选择。它们提供了更高级的抽象,用于定义 Agent 的角色、目标、工作流以及它们之间的协作关系。但无论如何,其基础都是我们上面练习的单个 Agent 的 ReAct 循环。

6. 总结:如何开始你的 Agent 开发之旅

如果你已经跟着跑通了上面的代码,那么恭喜,你已经跨过了“认知”到“实操”最关键的一步。接下来,我建议按这个路径深入:

  1. 巩固基础:反复修改上面的 Demo,尝试定义自己的工具。比如,写一个工具从固定的 JSON 文件里查询数据,或者调用一个免费的公开 API(如天气API)。理解工具如何被创建、描述和调用。
  2. 探索框架:不要只停留在 LangChain。去 GitHub 上看一看CrewAIAutoGen的官方示例。它们的编程模型和设计哲学有所不同,了解差异能帮你更好地做技术选型。
  3. 构思场景:从你日常工作中找一个重复、规则相对清晰、但步骤稍多的任务。比如,每天从几个不同格式的报告中提取关键数据,汇总成邮件。思考如何用 2-3 个 Agent 协作来完成它。
  4. 关注成本与延迟:Agent 的每次“思考”和工具调用都可能消耗 Token 和 API 费用。在真实应用中,必须考虑成本优化(如缓存结果、使用小模型进行简单路由)和用户体验(整个循环的耗时)。
  5. 接受不确定性:Agent 不是传统编程,它基于概率模型。它的输出可能每次略有不同,有时会犯错。设计系统时要包含“人工审核”或“后备方案”的环节,尤其是在关键业务流中。

记住,Agent 的核心价值不是替代所有自动化,而是处理那些难以用固定规则描述、需要一定理解和推理的灵活任务。把它当作一个能力强大的、可以编程的“虚拟员工”,从一个小而具体的任务开始让它上岗,你会对 Agentic AI 有更实在的体会。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询