哈尔滨网络公司网站建设引流推广神器
2026/3/29 7:58:26 网站建设 项目流程
哈尔滨网络公司网站建设,引流推广神器,贵州省和城乡建设厅官方网站,ppt主题模板下载免费本文详细解析了LangGraph框架中Tool-Calling的实现原理#xff0c;从基础概念到源码剖析#xff0c;让AI Agent具备调用外部工具的能力。文章介绍了tool装饰器、bind_tools、ToolNode等核心组件#xff0c;展示了消息流转过程#xff0c;并提供了从环境准备到测试的完整实现…本文详细解析了LangGraph框架中Tool-Calling的实现原理从基础概念到源码剖析让AI Agent具备调用外部工具的能力。文章介绍了tool装饰器、bind_tools、ToolNode等核心组件展示了消息流转过程并提供了从环境准备到测试的完整实现案例。同时深入探讨了工具调用错误处理、多工具协作、工具调用链等进阶技巧对比分析了LangGraph与OpenAI Function Calling的差异为开发者构建具备动手能力的Agent提供了全面指南。一、什么是 Tool-Calling在 AI Agent 的世界里LLM大语言模型虽然聪明但有个致命缺陷它只能思考不能行动。比如你问它今天北京天气怎么样它只能根据训练数据猜测无法实时获取天气信息。Tool-Calling工具调用就是解决这个问题的关键技术让 LLM 能够调用外部工具API、数据库、代码执行器等从而获得动手能力。1.1 Tool-Calling 的工作流程整个流程可以总结为LLM 思考分析用户意图决定是否需要调用工具工具调用按照 LLM 的指令执行对应的工具函数结果整合LLM 根据工具返回的结果生成最终回复1.2 为什么 Tool-Calling 很重要场景无工具调用有工具调用查询实时数据❌ 只能瞎猜✅ 调用 API 获取执行计算❌ 容易出错✅ 调用计算器操作数据库❌ 无能为力✅ 执行 SQL发送邮件❌ 无能为力✅ 调用邮件 API生成图表❌ 无能为力✅ 调用可视化工具Tool-Calling 让 LLM 从能说会道的嘴变成了能干活的手。二、LangGraph 的 Tool-Calling 架构LangGraph 实现 Tool-Calling 的架构可以分为三层2.1 核心组件组件作用tool 装饰器将普通 Python 函数转换为 LLM 可识别的工具bind_tools将工具列表绑定到 LLM让 LLM 知道有哪些工具可用ToolNodeLangGraph 内置的工具执行节点自动处理工具调用AIMessage.tool_callsLLM 返回的工具调用指令包含工具名和参数ToolMessage工具执行结果的标准消息格式2.2 消息流转LangGraph 使用消息Message来传递 Tool-Calling 的信息# 1. 用户消息HumanMessage(content北京今天天气怎么样)# 2. LLM 返回的工具调用指令AIMessage(content,tool_calls[{id:call_123,name:get_weather,args:{city:北京}}])# 3. 工具执行结果ToolMessage(content北京今天晴25°C,tool_call_idcall_123)# 4. LLM 最终回复AIMessage(content北京今天天气晴朗气温25°C非常适合出门活动)三、从零实现 Tool-Calling下面通过一个完整的例子演示如何在 LangGraph 中实现 Tool-Calling。3.1 环境准备pip install langgraph langchain langchain-openai3.2 定义工具from langchain_core.toolsimporttool tool def get_weather(city: str)-str:获取指定城市的天气信息。 Args: city: 城市名称如北京、上海# 模拟天气数据实际项目中调用真实 APIweather_data{北京:晴25°C东北风3级,上海:多云28°C东南风2级,广州:雷阵雨32°C南风4级}returnweather_data.get(city, f暂无{city}的天气数据)tool def calculate(expression: str)-str:计算数学表达式。 Args: expression: 数学表达式如1 2 * 3 try: resulteval(expression)returnf计算结果{expression} {result}except Exception as e: returnf计算出错{e}tool def search_knowledge(query: str)-str:搜索知识库获取相关信息。 Args: query: 搜索关键词# 模拟知识库搜索knowledge{langgraph:LangGraph 是 LangChain 生态中用于构建复杂 Agent 工作流的框架支持状态管理、条件分支和循环。,tool-calling:Tool-Calling 是让 LLM 能够调用外部工具的技术使 Agent 具备执行实际操作的能力。}forkey, valueinknowledge.items():ifkeyinquery.lower():returnvalue returnf未找到与{query}相关的信息# 工具列表tools[get_weather, calculate, search_knowledge]关键点解析tool装饰器将普通函数转换为 LangGraph 可识别的工具docstring 非常重要LLM 通过 docstring 理解工具的功能和参数含义参数类型注解如city: str会被转换为 JSON Schema供 LLM 理解参数格式3.3 绑定工具到 LLMfrom langchain_openaiimportChatOpenAI# 初始化 LLMllmChatOpenAI(modelgpt-4o-mini,temperature0)# 将工具绑定到 LLMllm_with_toolsllm.bind_tools(tools)bind_tools 做了什么bind_tools会将工具的元信息名称、描述、参数 Schema注入到 LLM 的请求中{tools:[{type:function,function:{name:get_weather,description:获取指定城市的天气信息。,parameters:{type:object,properties:{city:{type:string,description:城市名称如北京、上海}},required:[city]}}}]}这样 LLM 就知道有哪些工具可用以及如何调用它们。3.4 构建 Agent 节点from typingimportAnnotated, TypedDict from langgraph.graph.messageimportadd_messages# 定义状态class AgentState(TypedDict): messages: Annotated[list, add_messages]# Agent 节点调用 LLM 进行推理def agent_node(state: AgentState):Agent 节点调用 LLM 进行推理 messagesstate[messages]responsellm_with_tools.invoke(messages)return{messages:[response]}这里的add_messages是 LangGraph 提供的消息累加器会自动将新消息追加到历史消息列表中。3.5 使用 ToolNode 执行工具from langgraph.prebuiltimportToolNode# 创建工具执行节点tool_nodeToolNode(tools)ToolNode 的工作原理接收包含AIMessage的状态解析AIMessage.tool_calls中的工具调用指令执行对应的工具函数将结果封装为ToolMessage返回3.6 定义路由逻辑from langgraph.graphimportEND def should_continue(state: AgentState):判断是否需要继续执行工具 messagesstate[messages]last_messagemessages[-1]# 如果 LLM 返回了工具调用指令则继续执行工具ifhasattr(last_message,tool_calls)and last_message.tool_calls:returntools# 否则结束returnEND核心逻辑检查最后一条消息是否包含tool_calls如果有说明 LLM 想要调用工具路由到tools节点如果没有说明 LLM 已经给出最终回复结束流程3.7 组装 StateGraphfrom langgraph.graphimportStateGraph# 创建状态图workflowStateGraph(AgentState)# 添加节点workflow.add_node(agent, agent_node)workflow.add_node(tools, tool_node)# 设置入口点workflow.set_entry_point(agent)# 添加条件边Agent 节点根据是否有工具调用决定下一步workflow.add_conditional_edges(agent, should_continue,{tools:tools,# 有工具调用 - 执行工具END: END# 无工具调用 - 结束})# 添加普通边工具执行完后回到 Agent 继续处理workflow.add_edge(tools,agent)# 编译appworkflow.compile()关键设计形成循环注意这里tools - agent形成了一个循环这是 LangGraph Tool-Calling 的精髓agent ──(有tool_calls)──tools ──agent ──(无tool_calls)──END │ │ └───────────────────────────────────┘ 循环直到完成这种设计允许多次工具调用LLM 可以连续调用多个工具工具链一个工具的结果可以作为另一个工具的输入自我修正工具执行失败后LLM 可以重新调整参数再试3.8 测试from langchain_core.messagesimportHumanMessage def chat(user_input: str):与 Agent 对话 resultapp.invoke({messages:[HumanMessage(contentuser_input)]})returnresult[messages][-1].content# 测试if__name____main__:# 测试 1调用天气工具print(*50)print(测试1查询天气)print(*50)responsechat(北京今天天气怎么样)print(f回复: {response})# 测试 2调用计算工具print(\n*50)print(测试2数学计算)print(*50)responsechat(帮我算一下 (23 45) * 2 等于多少)print(f回复: {response})# 测试 3调用知识库搜索print(\n*50)print(测试3知识库搜索)print(*50)responsechat(什么是 LangGraph)print(f回复: {response})# 测试 4不需要工具调用print(\n*50)print(测试4普通对话无工具调用)print(*50)responsechat(你好自我介绍一下)print(f回复: {response})输出示例四、深入原理Tool-Calling 的底层实现4.1 tool 装饰器的秘密tool装饰器做了以下事情from langchain_core.toolsimporttool tool def my_func(arg1: str, arg2: int)-str:这是函数描述。 Args: arg1: 参数1描述 arg2: 参数2描述returnresult# 查看工具元信息print(my_func.name)# my_funcprint(my_func.description)# 这是函数描述。print(my_func.args_schema)# Pydantic 模型包含参数定义内部转换过程解析函数签名提取参数名和类型注解解析 docstring提取函数描述和参数描述生成 Pydantic 模型作为args_schema创建StructuredTool对象包装原函数4.2 LLM 如何决定调用哪个工具当 LLM 收到绑定了工具的请求时它会理解用户意图分析用户输入判断需要什么信息/操作匹配工具根据工具的name和description选择合适的工具构造参数根据args_schema从用户输入中提取参数值返回调用指令生成tool_calls结构# LLM 的返回示例AIMessage(content,# 注意调用工具时 content 通常为空tool_calls[{id:call_abc123,name:get_weather,args:{city:北京}}])4.3 ToolNode 源码解析ToolNode 的核心逻辑简化版class ToolNode: def __init__(self, tools: list):# 建立工具名到工具对象的映射self.tools_by_name{tool.name: toolfortoolintools}def __call__(self, state: dict): messagesstate[messages]last_messagemessages[-1]outputs[]fortool_callinlast_message.tool_calls:# 1. 找到对应的工具toolself.tools_by_name[tool_call[name]]# 2. 执行工具resulttool.invoke(tool_call[args])# 3. 封装结果为 ToolMessageoutputs.append(ToolMessage(contentstr(result),tool_call_idtool_call[id]))return{messages:outputs}关键点tool_call_id用于将工具结果与调用指令关联支持并行执行多个工具调用结果以ToolMessage形式返回LLM 可以继续处理4.4 消息流转全过程五、进阶技巧5.1 处理工具调用错误工具执行可能会失败我们需要优雅地处理错误from langchain_core.toolsimporttool tool def risky_operation(param: str)-str:执行可能失败的操作。ifparamerror:raise ValueError(参数不合法)returnf操作成功: {param}# 方法1在工具内部捕获异常tool def safe_operation(param: str)-str:执行操作带错误处理。 try:ifparamerror:raise ValueError(参数不合法)returnf操作成功: {param}except Exception as e: returnf操作失败: {str(e)}# 方法2使用 ToolNode 的 handle_tool_error 参数tool_nodeToolNode(tools,handle_tool_errorTrue# 自动捕获错误将错误信息作为 ToolMessage 返回)5.2 多工具协作LLM 可以在一次响应中调用多个工具# 用户: 北京和上海今天哪个城市更热# LLM 返回多个工具调用AIMessage(content,tool_calls[{id:call_1,name:get_weather,args:{city:北京}},{id:call_2,name:get_weather,args:{city:上海}}])# ToolNode 会并行执行两个调用返回两个 ToolMessage5.3 工具调用链一个工具的输出可以作为决策依据触发另一个工具# 用户: 如果北京今天下雨帮我发一封提醒邮件# 循环 1Agent:我需要先查天气→ 调用 get_weather(北京)Tools: 返回北京今天晴...# 循环 2Agent:天气是晴天不需要发邮件→ 直接回复# 如果返回的是下雨# 循环 2Agent:天气是下雨需要发邮件→ 调用 send_email(...)Tools: 返回邮件发送成功# 循环 3Agent:邮件已发送→ 回复用户5.4 结构化工具定义除了tool装饰器还可以使用StructuredTool进行更灵活的定义from langchain_core.toolsimportStructuredTool from pydanticimportBaseModel, Field# 使用 Pydantic 模型定义参数class WeatherInput(BaseModel): city: strField(description城市名称)date: strField(defaulttoday,description日期默认今天)def get_weather_impl(city: str, date: strtoday)-str: returnf{city}在{date}的天气是晴天# 创建结构化工具weather_toolStructuredTool.from_function(funcget_weather_impl,nameget_weather,description获取指定城市和日期的天气,args_schemaWeatherInput)六、LangGraph Tool-Calling vs OpenAI Function Calling特性OpenAI Function CallingLangGraph Tool-Calling工具定义JSON Schematool 装饰器 / StructuredTool多轮调用需手动实现循环原生支持StateGraph 循环状态管理需手动维护自动管理State错误处理需手动处理内置 handle_tool_error工具链需手动编排图结构自动编排可观测性需额外工具内置 trace与 LangSmith 集成LangGraph 的优势在于把 Tool-Calling 纳入了图结构的工作流中自动处理循环、状态传递和错误恢复。七、实战建议7.1 工具设计原则单一职责每个工具只做一件事功能聚焦清晰描述docstring 要准确描述功能LLM 靠这个理解工具参数简洁参数越少越好减少 LLM 出错概率错误友好返回清晰的错误信息帮助 LLM 理解和调整7.2 常见问题排查问题可能原因解决方案LLM 不调用工具工具描述不够清晰优化 docstringLLM 调用错误的工具多个工具功能重叠明确区分工具职责参数提取错误参数描述不明确添加示例和约束工具循环调用缺少终止条件检查 should_continue 逻辑八、总结本文深入讲解了 LangGraph 中 Tool-Calling 的使用和实现原理核心组件tool装饰器定义工具bind_tools绑定工具到 LLMToolNode执行工具调用AIMessage.tool_callsLLM 的调用指令ToolMessage工具执行结果工作流程关键设计消息驱动的工具调用图结构支持循环调用状态自动管理掌握了 Tool-Calling你的 Agent 就具备了真正的动手能力。如何学习大模型 AI 由于新岗位的生产效率要优于被取代岗位的生产效率所以实际上整个社会的生产效率是提升的。但是具体到个人只能说是“最先掌握AI的人将会比较晚掌握AI的人有竞争优势”。这句话放在计算机、互联网、移动互联网的开局时期都是一样的道理。我在一线科技企业深耕十二载见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事早已在效率与薪资上形成代际优势我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我们整理出这套AI 大模型突围资料包✅ 从零到一的 AI 学习路径图✅ 大模型调优实战手册附医疗/金融等大厂真实案例✅ 百度/阿里专家闭门录播课✅ 大模型当下最新行业报告✅ 真实大厂面试真题✅ 2025 最新岗位需求图谱所有资料 ⚡️ 朋友们如果有需要《AI大模型入门进阶学习资源包》下方扫码获取~① 全套AI大模型应用开发视频教程包含提示工程、RAG、LangChain、Agent、模型微调与部署、DeepSeek等技术点② 大模型系统化学习路线作为学习AI大模型技术的新手方向至关重要。 正确的学习路线可以为你节省时间少走弯路方向不对努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划带你从零基础入门到精通③ 大模型学习书籍文档学习AI大模型离不开书籍文档我精选了一系列大模型技术的书籍和学习文档电子版它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。④ AI大模型最新行业报告2025最新行业报告针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。⑤ 大模型项目实战配套源码学以致用在项目实战中检验和巩固你所学到的知识同时为你找工作就业和职业发展打下坚实的基础。⑥ 大模型大厂面试真题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我精心整理了一份大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。以上资料如何领取为什么大家都在学大模型最近科技巨头英特尔宣布裁员2万人传统岗位不断缩减但AI相关技术岗疯狂扩招有3-5年经验大厂薪资就能给到50K*20薪不出1年“有AI项目经验”将成为投递简历的门槛。风口之下与其像“温水煮青蛙”一样坐等被行业淘汰不如先人一步掌握AI大模型原理应用技术项目实操经验“顺风”翻盘这些资料真的有用吗这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理现任上海殷泊信息科技CEO其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证服务航天科工、国家电网等1000企业以第一作者在IEEE Transactions发表论文50篇获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的技术人员这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。以上全套大模型资料如何领取

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

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

立即咨询