从零构建AI Agent:基于ReAct框架的智能体开发实战指南
1. 先搞清楚 Agentic AI 和 AI Agent 到底在解决什么问题如果你最近在看 AI 相关的资料大概率会频繁遇到Agentic AI和AI 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 通常包含以下几个核心组件规划PlanningAgent 的核心大脑。它接收用户的目标例如“帮我查一下北京明天天气并建议是否需要带伞”并将其分解成一系列可执行的子任务1. 确定城市‘北京’2. 获取明天日期3. 调用天气查询工具4. 分析降水概率5. 生成建议。工具使用Tool UseAgent 的“手”和“脚”。Agent 本身通常是一个大语言模型无法直接获取实时数据或操作系统。它需要通过预定义的工具Tools来与外界交互。常见的工具包括搜索引擎 API、计算器、代码执行器、数据库查询、文件读写等。记忆MemoryAgent 的“笔记本”。分为短期记忆当前对话的上下文和长期记忆存储历史交互、知识库。记忆让 Agent 能在多轮对话中保持一致性并学习经验。行动Action根据规划选择并执行一个工具。观察Observation获取工具执行后的结果例如天气 API 返回了“降水概率 60%”。反思Reflection根据观察结果评估当前进展决定是继续执行下一个子任务还是需要调整规划。这些组件如何协同工作目前最主流、也最适合入门理解的范式是ReActReason 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-here3.2 第二步定义你的第一个工具ToolAgent 的强大在于使用工具。我们先定义一个最简单的工具一个能进行幂运算计算一个数的 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(modelgpt-3.5-turbo, temperature0) # 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(agentagent, toolstools, verboseTrue, handle_parsing_errorsTrue) # 6. 向 Agent 提问一个需要工具计算的问题 print( Agent 开始执行 ) result agent_executor.invoke({ input: 请计算 5 的 3 次方是多少 }) print(\n 最终结果 ) print(result[output])运行这段代码python agent_demo.py。你会看到类似以下的详细输出因为设置了verboseTrue 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 的“思考”过程Thought: “我需要计算 5 的 3 次方。我可以使用 power_calculator 工具...” 规划Action: 它决定调用power_calculator工具。Action Input: 它正确地生成了工具所需的参数格式{base: 5, exponent: 3}。Observation: 工具执行返回结果125.0。Thought: “我已经得到了计算结果...” 反思并决定结束任务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], llmChatOpenAI(modelgpt-3.5-turbo, temperature0)) # 注意llm-math 工具内部也需要一个 LLM 来解析问题所以我们传入一个 llm 参数。 # 2. 初始化主 Agent 的 LLM llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) # 3. 获取提示词模板并创建 Agent prompt hub.pull(hwchase17/react) agent create_react_agent(llm, tools, prompt) agent_executor AgentExecutor(agentagent, toolstools, verboseTrue, handle_parsing_errorsTrue) # 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 的思考链可能是思考用户问特斯拉的出生年份和当前年龄。我需要先查他的出生年份。行动调用wikipedia工具查询“Nikola Tesla”。观察维基百科返回信息包含出生日期“1856年7月10日”。思考现在需要计算他活到今天的年龄。我需要当前年份和出生年份。行动调用llm-math工具计算“2024 - 1856”。观察计算工具返回“168”。思考信息已齐全可以组织答案。最终答案输出包含出生年份和计算出的年龄。这就是多工具协作的雏形。Agent 自己判断在哪个步骤该用哪个工具并串联起整个流程。4.2 关键参数与配置解析在创建 Agent 时有几个参数直接影响其行为和稳定性llm: Agent 的“大脑”。model选择决定了能力和成本。temperature控制创造性0 更确定接近1更随机。对于执行确定任务的 Agent通常设为 0 或 0.1。verboseTrue:强烈建议在开发和调试时开启。它能打印出完整的 ReAct 思考链是你理解 Agent 决策过程、排查问题的最重要依据。handle_parsing_errorsTrue: 这是一个重要的安全网。LLM 的输出有时可能不符合工具调用的格式要求导致解析错误。设置这个参数为 True可以让执行器尝试修复或提示 Agent 重新输出避免整个流程崩溃。max_iterations: 在AgentExecutor中可以设置最大迭代次数防止 Agent 陷入死循环。例如AgentExecutor(..., max_iterations5)。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 能力的延伸设计好坏至关重要。单一职责一个工具只做一件事。不要设计一个“万能查询工具”而应该拆成“查询天气”、“查询股价”、“查询新闻”等多个工具。这样 Agent 更容易理解和选择。清晰的描述工具的description和每个参数的description必须用自然语言写清楚在什么情况下使用以及参数是什么。LLM 完全依赖这些描述来做决策。健壮性工具函数内部要有充分的错误处理try-catch返回明确的错误信息而不是抛出异常导致整个 Agent 崩溃。例如调用 API 失败时返回{error: API request failed due to network}这比直接崩溃更有助于 Agent 进行下一步决策比如重试或换方案。安全性工具能访问哪些资源数据库、内部 API必须有严格的权限控制。绝不能让一个处理外部用户提问的 Agent 拥有删除数据库的工具。5.3 典型问题排查清单当你的 Agent 表现不如预期时按这个顺序排查看日志 (verboseTrue)这是第一步也是最重要的一步。观察 Agent 的“思考Thought”是否合理它是否选择了正确的工具工具输入Action Input的格式对吗检查工具描述如果 Agent 总是忽略某个工具或错误使用首先检查工具的描述是否足够清晰、无歧义。用人类的眼光看这段描述能否让你明白什么时候该用它简化问题如果复杂任务失败先测试每个工具单独是否工作。再测试一个仅需使用一个工具的简单任务看 Agent 能否完成。逐步增加复杂度。调整提示词PromptReAct 的提示词模板hwchase17/react是通用的。对于特定领域你可能需要微调提示词在开头明确告诉 Agent “你是一个数学助手请优先使用计算工具”或“你是一个客服助手请根据知识库回答问题”。检查模型能力过于复杂的规划可能超出了较小模型如 GPT-3.5-Turbo的能力。尝试换用更强大的模型如 GPT-4进行测试如果问题解决说明是模型能力瓶颈。资源与依赖确认所有工具所需的 API Key、网络连接、第三方库都已正确安装和配置。一个常见的坑是wikipedia库因为网络问题超时。5.4 从单 Agent 到多 Agent 系统Agentic AI单个 Agent 能力有限。真正的Agentic AI系统涉及多个 Agent 协作。例如“规划者-执行者”模式一个高级 Agent规划者负责分解复杂目标并制定计划然后将子任务分发给多个 specialized Agent执行者去完成。“辩论”模式多个 Agent 从不同角度分析同一问题然后通过“辩论”或“评审”达成一致结论提高输出的质量和可靠性。实现多 Agent 系统框架的选择更重要。CrewAI、AutoGen、LangGraph是当前热门的选择。它们提供了更高级的抽象用于定义 Agent 的角色、目标、工作流以及它们之间的协作关系。但无论如何其基础都是我们上面练习的单个 Agent 的 ReAct 循环。6. 总结如何开始你的 Agent 开发之旅如果你已经跟着跑通了上面的代码那么恭喜你已经跨过了“认知”到“实操”最关键的一步。接下来我建议按这个路径深入巩固基础反复修改上面的 Demo尝试定义自己的工具。比如写一个工具从固定的 JSON 文件里查询数据或者调用一个免费的公开 API如天气API。理解工具如何被创建、描述和调用。探索框架不要只停留在 LangChain。去 GitHub 上看一看CrewAI、AutoGen的官方示例。它们的编程模型和设计哲学有所不同了解差异能帮你更好地做技术选型。构思场景从你日常工作中找一个重复、规则相对清晰、但步骤稍多的任务。比如每天从几个不同格式的报告中提取关键数据汇总成邮件。思考如何用 2-3 个 Agent 协作来完成它。关注成本与延迟Agent 的每次“思考”和工具调用都可能消耗 Token 和 API 费用。在真实应用中必须考虑成本优化如缓存结果、使用小模型进行简单路由和用户体验整个循环的耗时。接受不确定性Agent 不是传统编程它基于概率模型。它的输出可能每次略有不同有时会犯错。设计系统时要包含“人工审核”或“后备方案”的环节尤其是在关键业务流中。记住Agent 的核心价值不是替代所有自动化而是处理那些难以用固定规则描述、需要一定理解和推理的灵活任务。把它当作一个能力强大的、可以编程的“虚拟员工”从一个小而具体的任务开始让它上岗你会对 Agentic AI 有更实在的体会。