文章目录课程导读 学习目标前置知识与环境准备1.1 环境沿用1.2 依赖包安装1.3 模型选择1.4 上节课回顾与本课定位核心概念深度拆解2.1 ReAct Agent提示词驱动的通用模式2.2 OpenAI Function Calling原生结构化调用2.3 两种模式的对比总结2.4 LangGraph中的create_react_agent函数底层运行原理剖析3.1 ReAct Agent的内部实现3.2 Function Calling Agent的内部实现3.3 思维链Chain-of-Thought与ReAct的关系核心API/组件源码解读4.1 create_react_agent 快速上手4.2 自定义系统提示词state_modifier4.3 手动实现ReAct Agent不借助create_react_agent手把手项目实战教学实战一使用create_react_agent构建本地ReAct AgentOllama实战二Function Calling Agent智谱GLM-4实战三对比ReAct和Function Calling的输出差异完整可运行Python代码环境依赖安装命令常见报错坑点与避坑方案坑1create_react_agent 报错 Model does not support bind_tools坑2ReAct Agent 无法正确解析 Action坑3Function Calling Agent 调用工具时参数类型错误坑4本地Ollama模型无响应或超时本节核心知识点总结课后练习题选择题简答题实践题《30节课 LangChain 从入门到精通》系列课程导航课程导读 学习目标在上一节课中我们深入剖析了Agent的核心原理并使用LangGraph从零构建了一个支持工具调用的ReAct Agent。你理解了“LLM 工具 循环”的工作机制。但是在实际开发中我们往往不需要从头编写所有节点和边——LangChain和LangGraph提供了更高级的抽象和预置模式可以大幅简化Agent的开发工作。本节课将聚焦于两种最主流的Agent模式ReAct和OpenAI Function Calling。ReActReasoning Acting是一种基于提示词模板的通用模式通过引导LLM输出“Thought/Action/Action Input/Observation”结构来实现工具调用兼容任何支持文本生成的LLM。OpenAI Function Calling则是OpenAI、智谱GLM-4等模型原生支持的结构化工具调用方式模型直接返回JSON格式的工具参数更加可靠和高效。需要注意的是LangChain旧版中的initialize_agent、AgentExecutor等API已被标记为废弃。现代开发中我们推荐使用LangGraph的统一框架来实现这两种模式。本节课将教你如何在LangGraph中优雅地实现ReAct Agent和Function Calling Agent并对比它们的适用场景。学完本节课你将达到以下目标深刻理解ReAct Agent的工作机制掌握如何通过提示词模板引导模型输出结构化的“思考-行动-观察”序列。掌握OpenAI Function Calling Agent的实现学会使用llm.bind_tools()构建原生工具调用的Agent体验更可靠的工具使用。对比两种模式的优缺点了解何时选择ReAct兼容任何模型何时选择Function Calling模型原生支持精度更高。能够快速构建具备多工具调用能力的Agent通过LangGraph预置组件简化代码。完成两个完整的实战项目基于本地Ollama模型的ReAct Agent无需function calling支持和基于智谱GLM-4的Function Calling Agent。前置知识与环境准备1.1 环境沿用继续使用前几课的langchain_course虚拟环境Python 3.10。# 激活虚拟环境sourcevenv/bin/activate# Mac/Linux# venv\Scripts\activate # Windows# 升级pippipinstall--upgradepip1.2 依赖包安装# 核心依赖pipinstalllangchain0.3.7 langchain-core0.3.21 langchain-community0.3.7 langchain-openai0.2.8 python-dotenv1.0.1# LangGraph 基础pipinstalllanggraph# 本地模型支持ReAct Agent演示用pipinstalllangchain-ollama# 验证安装python-cfrom langgraph.prebuilt import create_react_agent; print(✓ LangGraph预置ReAct Agent可用)python-cfrom langchain_core.messages import HumanMessage; from langchain_openai import ChatOpenAI; llmChatOpenAI(modelgpt-3.5-turbo); llm.bind_tools([]); print(✓ Function calling支持)1.3 模型选择本节课将演示两种AgentReAct Agent使用Ollama本地模型如qwen2.5:7b不需要function calling能力通用性最强。OpenAI Function Calling Agent使用智谱GLM-4兼容OpenAI接口或真正的OpenAI GPT-4。确保你的.env文件中配置了对应的API密钥如果是智谱或OpenAI。Ollama用户请确保已下载模型并启动服务。1.4 上节课回顾与本课定位第23课我们手写了LangGraph Agent的所有组件agent_node、tools_node、条件边。本节课我们将使用LangGraph提供的create_react_agent预置函数快速构建ReAct Agent并演示如何利用bind_tools实现更简洁的Function Calling Agent。两者的核心思想相同但实现方式和适用场景不同。学完本课你将对Agent的工程实践有更全面的掌握。核心概念深度拆解2.1 ReAct Agent提示词驱动的通用模式ReActReasoning and Acting是2022年由Google Research提出的Agent范式。它通过提示词引导LLM输出一个特定的格式包含Thought模型的推理过程。Action要调用的工具名称。Action Input传递给工具的参数。Observation工具返回的结果由系统填充不是模型生成。LangGraph的create_react_agent函数封装了这一模式。你只需要提供工具列表和LLM它会自动构建状态图、解析器、工具执行器等。核心逻辑是将工具的描述和调用规范注入到系统提示词中然后解析模型输出中的Action和Action Input。这种模式的优势是兼容任何文本生成模型包括不支持原生function calling的开源模型如Llama 2、Qwen 1.5等。缺点是依赖模型严格遵循输出格式对提示词工程要求较高且解析可能失败。2.2 OpenAI Function Calling原生结构化调用OpenAI、智谱GLM-4、DeepSeek-V4等模型在API层面支持functions或tools参数。通过bind_tools将工具schema传给模型后模型直接返回一个结构化的tool_calls字段包含工具名称和参数JSON。这种方式无需手动解析文本极其可靠。在LangGraph中我们可以使用ToolExecutor和自定义节点来处理tool_calls或者在create_react_agent中也支持传入state_modifier来指定使用function calling。优势高可靠性、支持复杂参数类型、并行工具调用。劣势要求模型API支持function calling不适用于普通本地模型除非通过Ollama的兼容模式但部分模型仍不支持。2.3 两种模式的对比总结特性ReAct AgentFunction Calling Agent实现原理提示词模板 文本解析原生API结构化调用模型要求任何文本生成模型模型需支持function calling可靠性中等依赖格式遵循高机器可读JSON参数复杂度仅支持简单字符串参数支持嵌套对象、数组、枚举等并行调用通常单步单工具原生支持并行多个工具调试难度较难需检查模型输出文本简单直接查看tool_calls适用场景本地模型、旧模型、教学演示生产环境、API模型2.4 LangGraph中的create_react_agent函数create_react_agent是LangGraph提供的预置Agent构建器。其签名如下fromlanggraph.prebuiltimportcreate_react_agent agentcreate_react_agent(model:BaseChatModel,tools:List[BaseTool],state_modifier:Optional[str]None,messages_modifier:Optional[Callable]None,checkpointer:Optional[BaseCheckpointSaver]None,interrupt_before:Optional[List[str]]None,interrupt_after:Optional[List[str]]None,)model支持bind_tools的聊天模型如果模型不支持可以传一个自定义的model内部会使用ReAct提示词。tools工具列表。state_modifier系统提示词用来指导Agent行为。checkpointer可选的状态持久化。该函数返回一个编译后的StateGraph实例可以像普通LangGraph应用一样调用.invoke或.stream。对于不支持function calling的模型create_react_agent会自动降级为ReAct模式提示词中包含工具描述和输出格式指令。对于支持function calling的模型它会使用原生工具调用方式。这意味着create_react_agent是一个统一的接口你无需关心底层实现它会自动选择最优策略。底层运行原理剖析3.1 ReAct Agent的内部实现当create_react_agent检测到模型不支持bind_tools时它会构建一个ReAct提示词模板。该模板包括你是一个非常有用的AI助手能够使用以下工具来解决问题 {tools} 使用格式如下 Thought: 你当前的想法。 Action: 工具名称必须是[{tool_names}]之一 Action Input: 工具的输入应该是JSON字符串。 ……重复Thought/Action/Action Input/Observation直到获得最终答案 Final Answer: 对用户的最终回复LLM的输出会被正则表达式或json.loads解析提取Action和Action Input。然后ToolExecutor执行工具生成Observation再将Observation附加到消息历史中重复循环。3.2 Function Calling Agent的内部实现如果模型支持bind_toolscreate_react_agent会调用model.bind_tools(tools)获得一个绑定好工具的模型实例。构建一个代理节点调用该模型期望模型返回AIMessage对象其tool_calls属性非空。如果tool_calls存在路由到tools_node执行工具调用将结果以ToolMessage形式追加。如果没有tool_calls则直接输出content作为最终答案。这种模式避免了文本解析直接使用API原生功能。3.3 思维链Chain-of-Thought与ReAct的关系ReAct是思维链的一种扩展。思维链只关注推理步骤而ReAct在此基础上增加了“行动”和“观察”使模型不仅能思考还能与外部环境交互。核心API/组件源码解读4.1 create_react_agent 快速上手fromlanggraph.prebuiltimportcreate_react_agentfromlangchain_community.toolsimporttoolfromlangchain_openaiimportChatOpenAItooldefadd(a:int,b:int)-int:两数相加returnab llmChatOpenAI(modelgpt-3.5-turbo)agentcreate_react_agent(llm,[add])resultagent.invoke({messages:[(human,3加5等于多少)]})print(result[messages][-1].content)4.2 自定义系统提示词state_modifieragentcreate_react_agent(llm,tools,state_modifier你是一个数学专家。请一步步思考使用计算器工具辅助计算。)state_modifier会作为系统消息插入到对话开头指导Agent的行为风格。4.3 手动实现ReAct Agent不借助create_react_agent如果需要完全控制提示词格式可以手动实现ReAct Agent但通常没有必要。create_react_agent已经足够灵活。手把手项目实战教学实战一使用create_react_agent构建本地ReAct AgentOllama目标使用本地Ollama模型qwen2.5:7b和create_react_agent构建一个ReAct Agent配备计算器和时间查询工具。由于qwen2.5:7b支持function calling需要确认。实际上qwen2.5:7b在Ollama中可能不支持原生function calling但create_react_agent会自动使用ReAct模式。我们将演示跨平台兼容性。importdatetimefromlangchain_ollamaimportChatOllamafromlangchain_core.toolsimporttoolfromlanggraph.prebuiltimportcreate_react_agenttooldefcalculate(expression:str)-str:计算数学表达式。例如22try:returnstr(eval(expression))except:return计算错误tooldefget_current_time()-str:获取当前时间returndatetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S)llmChatOllama(modelqwen2.5:7b,temperature0)tools[calculate,get_current_time]agentcreate_react_agent(llm,tools)resultagent.invoke({messages:[(human,现在几点了然后计算1234*5678)]})print(result[messages][-1].content)注意第一次运行时模型可能会尝试输出Action和Action Inputcreate_react_agent会自动解析并调用工具。实战二Function Calling Agent智谱GLM-4目标使用智谱GLM-4支持OpenAI function calling构建一个更为可靠的Agent。importosfromdotenvimportload_dotenvfromlangchain_openaiimportChatOpenAIfromlangchain_core.toolsimporttoolfromlanggraph.prebuiltimportcreate_react_agent load_dotenv()tooldefcalculate(expression:str)-str:计算数学表达式returnstr(eval(expression))llmChatOpenAI(modelglm-4,openai_api_keyos.getenv(ZHIPU_API_KEY),openai_api_baseos.getenv(BASE_URL),temperature0)agentcreate_react_agent(llm,[calculate])resultagent.invoke({messages:[(human,计算(23)*4的结果)]})print(result[messages][-1].content)由于glm-4支持function callingcreate_react_agent会自动切换到原生模式无需手动解析文本。实战三对比ReAct和Function Calling的输出差异通过流式输出查看内部步骤# ReAct模式使用Ollamaforstepinagent.stream({messages:[(human,2的10次方)]}):print(step)你会看到agent节点输出包含thought和action字段的文本而在Function Calling模式下你会看到tool_calls字段。完整可运行Python代码整合上述实战形成完整的演示脚本。#!/usr/bin/env python# -*- coding: utf-8 -*- LangChain 第24课内置Agent实战 演示两种模式 1. 基于Ollama的ReAct Agent通用 2. 基于智谱GLM-4的Function Calling Agent importdatetimeimportosfromdotenvimportload_dotenvfromlangchain_core.toolsimporttoolfromlanggraph.prebuiltimportcreate_react_agentfromlangchain_ollamaimportChatOllamafromlangchain_openaiimportChatOpenAI load_dotenv()# 定义公共工具 tooldefcalculate(expression:str)-str:计算数学表达式的值。输入应为字符串格式如 22 或 sqrt(16)。try:# 注意生产环境请用安全计算库这里仅演示returnstr(eval(expression))exceptExceptionase:returnf计算错误:{e}tooldefget_current_time()-str:获取当前日期和时间returndatetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S)defrun_react_agent():使用本地Ollama模型 ReAct模式自动降级print(\n ReAct Agent (Ollama) )llmChatOllama(modelqwen2.5:7b,temperature0)agentcreate_react_agent(llm,[calculate,get_current_time])query现在几点了然后帮我计算 1234 * 5678 的结果。print(f用户:{query})resultagent.invoke({messages:[(human,query)]})finalresult[messages][-1].contentprint(fAgent:{final})defrun_function_calling_agent():使用智谱GLM-4 Function Calling原生模式print(\n Function Calling Agent (智谱GLM-4) )llmChatOpenAI(modelglm-4,openai_api_keyos.getenv(ZHIPU_API_KEY),openai_api_baseos.getenv(BASE_URL),temperature0)agentcreate_react_agent(llm,[calculate])query计算 (23)*4 的结果print(f用户:{query})resultagent.invoke({messages:[(human,query)]})finalresult[messages][-1].contentprint(fAgent:{final})if__name____main__:run_react_agent()run_function_calling_agent()环境依赖安装命令# 激活虚拟环境sourcevenv/bin/activate# venv\Scripts\activate# 安装核心依赖pipinstalllangchain0.3.7 langchain-core0.3.21 langchain-community0.3.7 langchain-openai0.2.8 python-dotenv1.0.1 langgraph langchain-ollama# 拉取本地模型如未下载ollama pull qwen2.5:7b# 验证安装python-cfrom langgraph.prebuilt import create_react_agent; print(✓ create_react_agent可用)常见报错坑点与避坑方案坑1create_react_agent报错Model does not support bind_tools原因你使用的模型如某些Ollama模型确实不支持function calling但create_react_agent仍会以ReAct模式运行不会报错。如果报错请升级langchain-core和langgraph到最新版。解决方案确保langgraph0.1.0。如果模型确实不支持程序会自动降级无需干预。坑2ReAct Agent 无法正确解析 Action现象模型输出不符合预期格式Agent卡住或循环。原因模型能力较弱不能很好地遵循输出格式指令。解决方案尝试更换更强的模型如qwen2.5:14b、llama3.2或使用更精确的提示词模板在state_modifier中明确要求“必须严格按格式输出”。坑3Function Calling Agent 调用工具时参数类型错误现象模型生成tool_calls但参数是字符串而非数字。原因工具函数的参数类型定义不清晰如使用了int但docstring未说明。解决方案使用Pydantic模型定义参数并在工具注解中明确类型。tool会自动从类型注解生成schema。tooldefadd(a:int,b:int)-int:相加两个整数returnab坑4本地Ollama模型无响应或超时原因模型加载慢或硬件不足。解决方案减少max_tokens或使用更小的量化模型如qwen2.5:7b-q4_0。本节核心知识点总结两种内置Agent模式ReAct Agent基于提示词模板兼容任何模型通过解析Action/Action Input文本调用工具。Function Calling Agent利用模型原生的结构化输出可靠、高效但要求模型支持function calling。create_react_agent是LangGraph提供的预置Agent构建器它会根据模型能力自动选择ReAct或Function Calling模式。你只需提供LLM和工具列表即可快速得到生产级的Agent。核心参数model聊天模型实例。tools工具列表。state_modifier系统提示词用于指导Agent行为。checkpointer可选的状态持久化支持断点续传。适用场景本地开发、模型受限时使用ReAct模式。生产环境、API模型推荐使用Function Calling模式。与旧版AgentExecutor的对比新版LangGraph的create_react_agent功能更强大支持流式、状态持久化、人机交互是官方推荐的统一接口。课后练习题选择题1. 使用create_react_agent构建Agent时如果本地模型不支持function calling会发生什么A. 程序报错退出。B. 自动降级为ReAct模式通过文本解析调用工具。C. 忽略工具列表直接回答问题。D. 自动下载支持function calling的模型。答案及解析B。create_react_agent会检测模型能力自动选择合适模式。2. 以下哪项是ReAct Agent相比Function Calling Agent的劣势A. 需要更多token。B. 解析依赖模型输出格式可靠性较低。C. 不支持并行工具调用。D. 以上都是。答案及解析D。ReAct模式通常需要更多token因为要输出Thought解析不可靠且不支持并行调用。3.state_modifier参数的作用是什么A. 修改工具列表。B. 设置系统提示词指导Agent行为。C. 定义模型温度。D. 开启记忆功能。答案及解析B。state_modifier作为系统消息注入影响Agent的决策风格。简答题4. 请简述在LangGraph中create_react_agent比手工编写Agent节点如第23课的优势。参考答案代码量少无需手动定义agent_node、tools_node、条件边减少样板代码。自动模式切换根据模型能力自动选择ReAct或Function Calling兼容性强。内置解析器处理ReAct的文本解析和Function Calling的tool_calls避免自己写正则。支持检查点可选checkpointer参数轻松集成状态持久化。流式支持内置.stream方法方便调试。5. 解释为什么在生产环境中更推荐使用Function Calling Agent而非ReAct Agent。参考答案Function Calling Agent利用模型原生的结构化输出避免了文本解析的不确定性和格式错误可靠性大大提升。此外它还支持复杂参数类型嵌套对象、数组和并行多工具调用而ReAct通常只能处理简单字符串参数且单步单工具。Function Calling Agent的调试也更容易因为tool_calls字段是机器可读的JSON。实践题6. 扩展本课的Function Calling Agent添加一个“发送邮件”工具模拟要求工具的参数为收件人、主题、正文。然后让Agent发送一封测试邮件。参考答案frompydanticimportBaseModel,FieldclassEmailInput(BaseModel):to:strField(description收件人邮箱)subject:strField(description邮件主题)body:strField(description邮件正文)tool(args_schemaEmailInput)defsend_email(to:str,subject:str,body:str)-str:发送邮件模拟print(f[模拟] 发送邮件给{to}:{subject}-{body[:50]}...)returnf邮件已发送至{to}tools.append(send_email)# 然后让Agent执行请发一封主题为 测试 的邮件给 adminexample.com正文为 Hello Agent。通过这个练习你将体会到Function Calling对复杂参数类型的天然支持。《30节课 LangChain 从入门到精通》系列课程导航去订阅 感谢您耐心阅读到这里 如果本文对您有所启发欢迎 点赞 收藏 分享给更多需要的伙伴。️ 期待在评论区看到您的想法, 共同进步。 关注我持续获取更多干货内容 我们下篇文章见
第24课:LangChain|内置Agent使用【ReAct、OpenAI Function Calling实战】
发布时间:2026/5/22 16:44:55
文章目录课程导读 学习目标前置知识与环境准备1.1 环境沿用1.2 依赖包安装1.3 模型选择1.4 上节课回顾与本课定位核心概念深度拆解2.1 ReAct Agent提示词驱动的通用模式2.2 OpenAI Function Calling原生结构化调用2.3 两种模式的对比总结2.4 LangGraph中的create_react_agent函数底层运行原理剖析3.1 ReAct Agent的内部实现3.2 Function Calling Agent的内部实现3.3 思维链Chain-of-Thought与ReAct的关系核心API/组件源码解读4.1 create_react_agent 快速上手4.2 自定义系统提示词state_modifier4.3 手动实现ReAct Agent不借助create_react_agent手把手项目实战教学实战一使用create_react_agent构建本地ReAct AgentOllama实战二Function Calling Agent智谱GLM-4实战三对比ReAct和Function Calling的输出差异完整可运行Python代码环境依赖安装命令常见报错坑点与避坑方案坑1create_react_agent 报错 Model does not support bind_tools坑2ReAct Agent 无法正确解析 Action坑3Function Calling Agent 调用工具时参数类型错误坑4本地Ollama模型无响应或超时本节核心知识点总结课后练习题选择题简答题实践题《30节课 LangChain 从入门到精通》系列课程导航课程导读 学习目标在上一节课中我们深入剖析了Agent的核心原理并使用LangGraph从零构建了一个支持工具调用的ReAct Agent。你理解了“LLM 工具 循环”的工作机制。但是在实际开发中我们往往不需要从头编写所有节点和边——LangChain和LangGraph提供了更高级的抽象和预置模式可以大幅简化Agent的开发工作。本节课将聚焦于两种最主流的Agent模式ReAct和OpenAI Function Calling。ReActReasoning Acting是一种基于提示词模板的通用模式通过引导LLM输出“Thought/Action/Action Input/Observation”结构来实现工具调用兼容任何支持文本生成的LLM。OpenAI Function Calling则是OpenAI、智谱GLM-4等模型原生支持的结构化工具调用方式模型直接返回JSON格式的工具参数更加可靠和高效。需要注意的是LangChain旧版中的initialize_agent、AgentExecutor等API已被标记为废弃。现代开发中我们推荐使用LangGraph的统一框架来实现这两种模式。本节课将教你如何在LangGraph中优雅地实现ReAct Agent和Function Calling Agent并对比它们的适用场景。学完本节课你将达到以下目标深刻理解ReAct Agent的工作机制掌握如何通过提示词模板引导模型输出结构化的“思考-行动-观察”序列。掌握OpenAI Function Calling Agent的实现学会使用llm.bind_tools()构建原生工具调用的Agent体验更可靠的工具使用。对比两种模式的优缺点了解何时选择ReAct兼容任何模型何时选择Function Calling模型原生支持精度更高。能够快速构建具备多工具调用能力的Agent通过LangGraph预置组件简化代码。完成两个完整的实战项目基于本地Ollama模型的ReAct Agent无需function calling支持和基于智谱GLM-4的Function Calling Agent。前置知识与环境准备1.1 环境沿用继续使用前几课的langchain_course虚拟环境Python 3.10。# 激活虚拟环境sourcevenv/bin/activate# Mac/Linux# venv\Scripts\activate # Windows# 升级pippipinstall--upgradepip1.2 依赖包安装# 核心依赖pipinstalllangchain0.3.7 langchain-core0.3.21 langchain-community0.3.7 langchain-openai0.2.8 python-dotenv1.0.1# LangGraph 基础pipinstalllanggraph# 本地模型支持ReAct Agent演示用pipinstalllangchain-ollama# 验证安装python-cfrom langgraph.prebuilt import create_react_agent; print(✓ LangGraph预置ReAct Agent可用)python-cfrom langchain_core.messages import HumanMessage; from langchain_openai import ChatOpenAI; llmChatOpenAI(modelgpt-3.5-turbo); llm.bind_tools([]); print(✓ Function calling支持)1.3 模型选择本节课将演示两种AgentReAct Agent使用Ollama本地模型如qwen2.5:7b不需要function calling能力通用性最强。OpenAI Function Calling Agent使用智谱GLM-4兼容OpenAI接口或真正的OpenAI GPT-4。确保你的.env文件中配置了对应的API密钥如果是智谱或OpenAI。Ollama用户请确保已下载模型并启动服务。1.4 上节课回顾与本课定位第23课我们手写了LangGraph Agent的所有组件agent_node、tools_node、条件边。本节课我们将使用LangGraph提供的create_react_agent预置函数快速构建ReAct Agent并演示如何利用bind_tools实现更简洁的Function Calling Agent。两者的核心思想相同但实现方式和适用场景不同。学完本课你将对Agent的工程实践有更全面的掌握。核心概念深度拆解2.1 ReAct Agent提示词驱动的通用模式ReActReasoning and Acting是2022年由Google Research提出的Agent范式。它通过提示词引导LLM输出一个特定的格式包含Thought模型的推理过程。Action要调用的工具名称。Action Input传递给工具的参数。Observation工具返回的结果由系统填充不是模型生成。LangGraph的create_react_agent函数封装了这一模式。你只需要提供工具列表和LLM它会自动构建状态图、解析器、工具执行器等。核心逻辑是将工具的描述和调用规范注入到系统提示词中然后解析模型输出中的Action和Action Input。这种模式的优势是兼容任何文本生成模型包括不支持原生function calling的开源模型如Llama 2、Qwen 1.5等。缺点是依赖模型严格遵循输出格式对提示词工程要求较高且解析可能失败。2.2 OpenAI Function Calling原生结构化调用OpenAI、智谱GLM-4、DeepSeek-V4等模型在API层面支持functions或tools参数。通过bind_tools将工具schema传给模型后模型直接返回一个结构化的tool_calls字段包含工具名称和参数JSON。这种方式无需手动解析文本极其可靠。在LangGraph中我们可以使用ToolExecutor和自定义节点来处理tool_calls或者在create_react_agent中也支持传入state_modifier来指定使用function calling。优势高可靠性、支持复杂参数类型、并行工具调用。劣势要求模型API支持function calling不适用于普通本地模型除非通过Ollama的兼容模式但部分模型仍不支持。2.3 两种模式的对比总结特性ReAct AgentFunction Calling Agent实现原理提示词模板 文本解析原生API结构化调用模型要求任何文本生成模型模型需支持function calling可靠性中等依赖格式遵循高机器可读JSON参数复杂度仅支持简单字符串参数支持嵌套对象、数组、枚举等并行调用通常单步单工具原生支持并行多个工具调试难度较难需检查模型输出文本简单直接查看tool_calls适用场景本地模型、旧模型、教学演示生产环境、API模型2.4 LangGraph中的create_react_agent函数create_react_agent是LangGraph提供的预置Agent构建器。其签名如下fromlanggraph.prebuiltimportcreate_react_agent agentcreate_react_agent(model:BaseChatModel,tools:List[BaseTool],state_modifier:Optional[str]None,messages_modifier:Optional[Callable]None,checkpointer:Optional[BaseCheckpointSaver]None,interrupt_before:Optional[List[str]]None,interrupt_after:Optional[List[str]]None,)model支持bind_tools的聊天模型如果模型不支持可以传一个自定义的model内部会使用ReAct提示词。tools工具列表。state_modifier系统提示词用来指导Agent行为。checkpointer可选的状态持久化。该函数返回一个编译后的StateGraph实例可以像普通LangGraph应用一样调用.invoke或.stream。对于不支持function calling的模型create_react_agent会自动降级为ReAct模式提示词中包含工具描述和输出格式指令。对于支持function calling的模型它会使用原生工具调用方式。这意味着create_react_agent是一个统一的接口你无需关心底层实现它会自动选择最优策略。底层运行原理剖析3.1 ReAct Agent的内部实现当create_react_agent检测到模型不支持bind_tools时它会构建一个ReAct提示词模板。该模板包括你是一个非常有用的AI助手能够使用以下工具来解决问题 {tools} 使用格式如下 Thought: 你当前的想法。 Action: 工具名称必须是[{tool_names}]之一 Action Input: 工具的输入应该是JSON字符串。 ……重复Thought/Action/Action Input/Observation直到获得最终答案 Final Answer: 对用户的最终回复LLM的输出会被正则表达式或json.loads解析提取Action和Action Input。然后ToolExecutor执行工具生成Observation再将Observation附加到消息历史中重复循环。3.2 Function Calling Agent的内部实现如果模型支持bind_toolscreate_react_agent会调用model.bind_tools(tools)获得一个绑定好工具的模型实例。构建一个代理节点调用该模型期望模型返回AIMessage对象其tool_calls属性非空。如果tool_calls存在路由到tools_node执行工具调用将结果以ToolMessage形式追加。如果没有tool_calls则直接输出content作为最终答案。这种模式避免了文本解析直接使用API原生功能。3.3 思维链Chain-of-Thought与ReAct的关系ReAct是思维链的一种扩展。思维链只关注推理步骤而ReAct在此基础上增加了“行动”和“观察”使模型不仅能思考还能与外部环境交互。核心API/组件源码解读4.1 create_react_agent 快速上手fromlanggraph.prebuiltimportcreate_react_agentfromlangchain_community.toolsimporttoolfromlangchain_openaiimportChatOpenAItooldefadd(a:int,b:int)-int:两数相加returnab llmChatOpenAI(modelgpt-3.5-turbo)agentcreate_react_agent(llm,[add])resultagent.invoke({messages:[(human,3加5等于多少)]})print(result[messages][-1].content)4.2 自定义系统提示词state_modifieragentcreate_react_agent(llm,tools,state_modifier你是一个数学专家。请一步步思考使用计算器工具辅助计算。)state_modifier会作为系统消息插入到对话开头指导Agent的行为风格。4.3 手动实现ReAct Agent不借助create_react_agent如果需要完全控制提示词格式可以手动实现ReAct Agent但通常没有必要。create_react_agent已经足够灵活。手把手项目实战教学实战一使用create_react_agent构建本地ReAct AgentOllama目标使用本地Ollama模型qwen2.5:7b和create_react_agent构建一个ReAct Agent配备计算器和时间查询工具。由于qwen2.5:7b支持function calling需要确认。实际上qwen2.5:7b在Ollama中可能不支持原生function calling但create_react_agent会自动使用ReAct模式。我们将演示跨平台兼容性。importdatetimefromlangchain_ollamaimportChatOllamafromlangchain_core.toolsimporttoolfromlanggraph.prebuiltimportcreate_react_agenttooldefcalculate(expression:str)-str:计算数学表达式。例如22try:returnstr(eval(expression))except:return计算错误tooldefget_current_time()-str:获取当前时间returndatetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S)llmChatOllama(modelqwen2.5:7b,temperature0)tools[calculate,get_current_time]agentcreate_react_agent(llm,tools)resultagent.invoke({messages:[(human,现在几点了然后计算1234*5678)]})print(result[messages][-1].content)注意第一次运行时模型可能会尝试输出Action和Action Inputcreate_react_agent会自动解析并调用工具。实战二Function Calling Agent智谱GLM-4目标使用智谱GLM-4支持OpenAI function calling构建一个更为可靠的Agent。importosfromdotenvimportload_dotenvfromlangchain_openaiimportChatOpenAIfromlangchain_core.toolsimporttoolfromlanggraph.prebuiltimportcreate_react_agent load_dotenv()tooldefcalculate(expression:str)-str:计算数学表达式returnstr(eval(expression))llmChatOpenAI(modelglm-4,openai_api_keyos.getenv(ZHIPU_API_KEY),openai_api_baseos.getenv(BASE_URL),temperature0)agentcreate_react_agent(llm,[calculate])resultagent.invoke({messages:[(human,计算(23)*4的结果)]})print(result[messages][-1].content)由于glm-4支持function callingcreate_react_agent会自动切换到原生模式无需手动解析文本。实战三对比ReAct和Function Calling的输出差异通过流式输出查看内部步骤# ReAct模式使用Ollamaforstepinagent.stream({messages:[(human,2的10次方)]}):print(step)你会看到agent节点输出包含thought和action字段的文本而在Function Calling模式下你会看到tool_calls字段。完整可运行Python代码整合上述实战形成完整的演示脚本。#!/usr/bin/env python# -*- coding: utf-8 -*- LangChain 第24课内置Agent实战 演示两种模式 1. 基于Ollama的ReAct Agent通用 2. 基于智谱GLM-4的Function Calling Agent importdatetimeimportosfromdotenvimportload_dotenvfromlangchain_core.toolsimporttoolfromlanggraph.prebuiltimportcreate_react_agentfromlangchain_ollamaimportChatOllamafromlangchain_openaiimportChatOpenAI load_dotenv()# 定义公共工具 tooldefcalculate(expression:str)-str:计算数学表达式的值。输入应为字符串格式如 22 或 sqrt(16)。try:# 注意生产环境请用安全计算库这里仅演示returnstr(eval(expression))exceptExceptionase:returnf计算错误:{e}tooldefget_current_time()-str:获取当前日期和时间returndatetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S)defrun_react_agent():使用本地Ollama模型 ReAct模式自动降级print(\n ReAct Agent (Ollama) )llmChatOllama(modelqwen2.5:7b,temperature0)agentcreate_react_agent(llm,[calculate,get_current_time])query现在几点了然后帮我计算 1234 * 5678 的结果。print(f用户:{query})resultagent.invoke({messages:[(human,query)]})finalresult[messages][-1].contentprint(fAgent:{final})defrun_function_calling_agent():使用智谱GLM-4 Function Calling原生模式print(\n Function Calling Agent (智谱GLM-4) )llmChatOpenAI(modelglm-4,openai_api_keyos.getenv(ZHIPU_API_KEY),openai_api_baseos.getenv(BASE_URL),temperature0)agentcreate_react_agent(llm,[calculate])query计算 (23)*4 的结果print(f用户:{query})resultagent.invoke({messages:[(human,query)]})finalresult[messages][-1].contentprint(fAgent:{final})if__name____main__:run_react_agent()run_function_calling_agent()环境依赖安装命令# 激活虚拟环境sourcevenv/bin/activate# venv\Scripts\activate# 安装核心依赖pipinstalllangchain0.3.7 langchain-core0.3.21 langchain-community0.3.7 langchain-openai0.2.8 python-dotenv1.0.1 langgraph langchain-ollama# 拉取本地模型如未下载ollama pull qwen2.5:7b# 验证安装python-cfrom langgraph.prebuilt import create_react_agent; print(✓ create_react_agent可用)常见报错坑点与避坑方案坑1create_react_agent报错Model does not support bind_tools原因你使用的模型如某些Ollama模型确实不支持function calling但create_react_agent仍会以ReAct模式运行不会报错。如果报错请升级langchain-core和langgraph到最新版。解决方案确保langgraph0.1.0。如果模型确实不支持程序会自动降级无需干预。坑2ReAct Agent 无法正确解析 Action现象模型输出不符合预期格式Agent卡住或循环。原因模型能力较弱不能很好地遵循输出格式指令。解决方案尝试更换更强的模型如qwen2.5:14b、llama3.2或使用更精确的提示词模板在state_modifier中明确要求“必须严格按格式输出”。坑3Function Calling Agent 调用工具时参数类型错误现象模型生成tool_calls但参数是字符串而非数字。原因工具函数的参数类型定义不清晰如使用了int但docstring未说明。解决方案使用Pydantic模型定义参数并在工具注解中明确类型。tool会自动从类型注解生成schema。tooldefadd(a:int,b:int)-int:相加两个整数returnab坑4本地Ollama模型无响应或超时原因模型加载慢或硬件不足。解决方案减少max_tokens或使用更小的量化模型如qwen2.5:7b-q4_0。本节核心知识点总结两种内置Agent模式ReAct Agent基于提示词模板兼容任何模型通过解析Action/Action Input文本调用工具。Function Calling Agent利用模型原生的结构化输出可靠、高效但要求模型支持function calling。create_react_agent是LangGraph提供的预置Agent构建器它会根据模型能力自动选择ReAct或Function Calling模式。你只需提供LLM和工具列表即可快速得到生产级的Agent。核心参数model聊天模型实例。tools工具列表。state_modifier系统提示词用于指导Agent行为。checkpointer可选的状态持久化支持断点续传。适用场景本地开发、模型受限时使用ReAct模式。生产环境、API模型推荐使用Function Calling模式。与旧版AgentExecutor的对比新版LangGraph的create_react_agent功能更强大支持流式、状态持久化、人机交互是官方推荐的统一接口。课后练习题选择题1. 使用create_react_agent构建Agent时如果本地模型不支持function calling会发生什么A. 程序报错退出。B. 自动降级为ReAct模式通过文本解析调用工具。C. 忽略工具列表直接回答问题。D. 自动下载支持function calling的模型。答案及解析B。create_react_agent会检测模型能力自动选择合适模式。2. 以下哪项是ReAct Agent相比Function Calling Agent的劣势A. 需要更多token。B. 解析依赖模型输出格式可靠性较低。C. 不支持并行工具调用。D. 以上都是。答案及解析D。ReAct模式通常需要更多token因为要输出Thought解析不可靠且不支持并行调用。3.state_modifier参数的作用是什么A. 修改工具列表。B. 设置系统提示词指导Agent行为。C. 定义模型温度。D. 开启记忆功能。答案及解析B。state_modifier作为系统消息注入影响Agent的决策风格。简答题4. 请简述在LangGraph中create_react_agent比手工编写Agent节点如第23课的优势。参考答案代码量少无需手动定义agent_node、tools_node、条件边减少样板代码。自动模式切换根据模型能力自动选择ReAct或Function Calling兼容性强。内置解析器处理ReAct的文本解析和Function Calling的tool_calls避免自己写正则。支持检查点可选checkpointer参数轻松集成状态持久化。流式支持内置.stream方法方便调试。5. 解释为什么在生产环境中更推荐使用Function Calling Agent而非ReAct Agent。参考答案Function Calling Agent利用模型原生的结构化输出避免了文本解析的不确定性和格式错误可靠性大大提升。此外它还支持复杂参数类型嵌套对象、数组和并行多工具调用而ReAct通常只能处理简单字符串参数且单步单工具。Function Calling Agent的调试也更容易因为tool_calls字段是机器可读的JSON。实践题6. 扩展本课的Function Calling Agent添加一个“发送邮件”工具模拟要求工具的参数为收件人、主题、正文。然后让Agent发送一封测试邮件。参考答案frompydanticimportBaseModel,FieldclassEmailInput(BaseModel):to:strField(description收件人邮箱)subject:strField(description邮件主题)body:strField(description邮件正文)tool(args_schemaEmailInput)defsend_email(to:str,subject:str,body:str)-str:发送邮件模拟print(f[模拟] 发送邮件给{to}:{subject}-{body[:50]}...)returnf邮件已发送至{to}tools.append(send_email)# 然后让Agent执行请发一封主题为 测试 的邮件给 adminexample.com正文为 Hello Agent。通过这个练习你将体会到Function Calling对复杂参数类型的天然支持。《30节课 LangChain 从入门到精通》系列课程导航去订阅 感谢您耐心阅读到这里 如果本文对您有所启发欢迎 点赞 收藏 分享给更多需要的伙伴。️ 期待在评论区看到您的想法, 共同进步。 关注我持续获取更多干货内容 我们下篇文章见