当前位置: 首页 > article >正文

LangGraph Agent 开发指南(9~工具 Tools)

一、什么是工具1.1 通俗解释想象你有一个智能助手没有工具 你: 帮我查一下北京明天的天气 助手: 抱歉我没有联网功能无法查询实时天气 有工具 你: 帮我查一下北京明天的天气 助手: 好的让我调用天气查询工具... 助手: 北京明天晴天温度 25°C工具就是 Agent 的手和眼Agent 大脑LLM 工具执行能力 大脑理解用户意图决定调用什么工具 工具实际执行操作获取结果1.2 工具的作用作用说明例子扩展能力让 Agent 能做 LLM 做不到的事查实时天气、搜索网页与外界交互连接数据库、API、文件系统查询数据库、调用 API执行操作完成具体任务发送邮件、创建文件获取信息检索外部知识搜索文档、查 Wikipedia1.3 核心概念┌─────────────────────────────────────────────────────────────┐ │ 工具调用流程 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 1. 用户提问 │ │ │ │ │ ▼ │ │ 2. LLM 分析意图 │ │ │ │ │ ▼ │ │ 3. LLM 决定调用工具生成 tool_calls │ │ │ │ │ ▼ │ │ 4. 执行工具获取结果 │ │ │ │ │ ▼ │ │ 5. LLM 根据结果生成回复 │ │ │ └─────────────────────────────────────────────────────────────┘二、工具调用原理2.1 LLM 如何决定是否调用工具关键原则LLM 根据输入的相关性决定是否使用工具 情况1输入与工具无关 用户: 你好 LLM: 不调用工具直接回复 你好 情况2输入与工具相关 用户: 2 乘以 3 等于多少 LLM: 调用 multiply 工具参数 a2, b32.2 tool_calls 结构当 LLM 决定调用工具时会生成tool_callsresult.tool_calls [ { name: multiply, # 工具名称 args: {a: 2, b: 3}, # 参数 id: xxx, # 调用ID type: tool_call # 类型 } ]2.3 执行流程图用户输入: 2 乘以 3 等于多少 │ ▼ LLM 分析 │ ▼ 生成 tool_calls: {name: multiply, args: {a: 2, b: 3}} │ ▼ 执行工具: multiply(2, 3) 6 │ ▼ 返回结果: 2 乘以 3 等于 6三、创建工具3.1 方法一使用 tool 装饰器推荐from langchain_core.tools import tool tool def multiply(a: int, b: int) - int: Multiply two numbers. return a * b # 工具会自动提取 # - 名称multiply # - 参数a (int), b (int) # - 描述Multiply two numbers.3.2 方法二普通函数def multiply(a: int, b: int) - int: Multiply two numbers. return a * b # 使用 ToolNode 或 create_react_agent 时会自动转换3.3 方法三自定义工具from langchain_core.tools import tool tool(multiply_tool, parse_docstringTrue) def multiply(a: int, b: int) - int: Multiply two numbers. Args: a: First operand b: Second operand return a * b3.4 方法四使用 Pydantic 定义输入模式from pydantic import BaseModel, Field from langchain_core.tools import tool class MultiplyInput(BaseModel): Multiply two numbers a: int Field(description第一个数) b: int Field(description第二个数) tool(multiply, args_schemaMultiplyInput) def multiply(a: int, b: int) - int: return a * b3.5 工具定义要点要点 1. 函数名作为工具名称 2. 参数类型LLM 会根据类型生成正确的参数 3. 文档字符串LLM 会根据描述决定何时调用 4. 返回值工具执行的结果四、使用工具4.1 将工具绑定到模型from langchain_core.tools import tool from langchain_openai import ChatOpenAI # 定义工具 tool def multiply(a: int, b: int) - int: Multiply two numbers. return a * b # 创建模型 model ChatOpenAI(modelgpt-4) # 绑定工具 model_with_tools model.bind_tools([multiply]) # 调用 response model_with_tools.invoke(42 乘以 7 等于多少) print(response.tool_calls) # [{name: multiply, args: {a: 42, b: 7}, ...}]4.2 执行工具# 方法1直接调用 result multiply.invoke({a: 42, b: 7}) print(result) # 294 # 方法2使用 tool_call tool_call { type: tool_call, id: 1, args: {a: 42, b: 7} } result multiply.invoke(tool_call) print(result) # ToolMessage(content294, ...)4.3 完整流程示例from langchain_core.tools import tool from langchain_openai import ChatOpenAI # 定义工具 tool def multiply(a: int, b: int) - int: Multiply two numbers. return a * b # 绑定工具 model ChatOpenAI(modelgpt-4) model_with_tools model.bind_tools([multiply]) # 1. LLM 决定调用工具 response model_with_tools.invoke(42 乘以 7 等于多少) tool_call response.tool_calls[0] # 2. 执行工具 tool_result multiply.invoke(tool_call) print(tool_result) # ToolMessage(content294, ...) # 3. 将结果返回给 LLM final_response model_with_tools.invoke([ {role: user, content: 42 乘以 7 等于多少}, response, tool_result ]) print(final_response.content) # 42 乘以 7 等于 294五、使用预构建组件5.1 使用 create_react_agent最简单的方式创建一个 ReAct Agentfrom langchain_core.tools import tool from langgraph.prebuilt import create_react_agent from langchain_openai import ChatOpenAI # 定义工具 tool def multiply(a: int, b: int) - int: Multiply two numbers. return a * b tool def add(a: int, b: int) - int: Add two numbers. return a b # 创建 Agent model ChatOpenAI(modelgpt-4) agent create_react_agent(model, tools[multiply, add]) # 执行 result agent.invoke({ messages: [{role: user, content: 42 乘以 7 等于多少}] }) print(result[messages][-1].content)5.2 使用 ToolNode更灵活的方式在自定义图中使用from langchain_core.tools import tool from langgraph.prebuilt import ToolNode from langgraph.graph import StateGraph, MessagesState, START # 定义工具 tool def multiply(a: int, b: int) - int: Multiply two numbers. return a * b # 创建 ToolNode tool_node ToolNode([multiply]) # 在图中使用 builder StateGraph(MessagesState) builder.add_node(tools, tool_node) # ... 添加其他节点和边5.3 ToolNode 的优势优势 1. 支持同步和异步工具 2. 并行执行多个工具 3. 自动错误处理 4. 可集成到自定义图中六、在工具中访问配置和状态6.1 访问配置RunnableConfigfrom langchain_core.tools import tool from langchain_core.runnables import RunnableConfig tool def get_user_info(config: RunnableConfig) - str: 查询用户信息 user_id config[configurable].get(user_id) return f用户ID: {user_id} # 使用时传入配置 agent.invoke( {messages: 查询用户信息}, config{configurable: {user_id: user_123}} )6.2 访问状态InjectedStatefrom typing import Annotated from langchain_core.tools import tool from langgraph.prebuilt import InjectedState class CustomState(TypedDict): messages: list user_id: str tool def get_user_info(state: Annotated[CustomState, InjectedState]) - str: 查询用户信息 user_id state[user_id] return f用户ID: {user_id}6.3 更新状态返回 Commandfrom langchain_core.tools import tool, InjectedToolCallId from langgraph.types import Command from langchain_core.messages import ToolMessage tool def update_user_info( tool_call_id: Annotated[str, InjectedToolCallId], config: RunnableConfig ) - Command: 更新用户信息 user_id config[configurable].get(user_id) name 张三 if user_id user_123 else 未知用户 return Command(update{ user_name: name, messages: [ ToolMessage(更新成功, tool_call_idtool_call_id) ] })七、长期记忆7.1 读取长期记忆from langchain_core.tools import tool from langgraph.config import get_store tool def get_user_info(config: RunnableConfig) - str: 查询用户信息 store get_store() user_id config[configurable].get(user_id) user_info store.get((users,), user_id) return str(user_info.value) if user_info else 未知用户7.2 更新长期记忆from langchain_core.tools import tool from langgraph.config import get_store tool def save_user_info(user_info: str, config: RunnableConfig) - str: 保存用户信息 store get_store() user_id config[configurable].get(user_id) store.put((users,), user_id, user_info) return 保存成功7.3 完整示例from langchain_core.tools import tool from langgraph.config import get_store from langgraph.prebuilt import create_react_agent from langgraph.store.memory import InMemoryStore from langchain_openai import ChatOpenAI # 创建存储 store InMemoryStore() store.put((users,), user_123, {name: 张三, language: 中文}) # 定义工具 tool def get_user_info(config: RunnableConfig) - str: 查询用户信息 store get_store() user_id config[configurable].get(user_id) user_info store.get((users,), user_id) return str(user_info.value) if user_info else 未知用户 # 创建 Agent model ChatOpenAI(modelgpt-4) agent create_react_agent(model, tools[get_user_info], storestore) # 执行 result agent.invoke( {messages: 查询用户信息}, config{configurable: {user_id: user_123}} )八、预构建工具8.1 常用工具类别类别工具说明搜索Tavily, SerpAPI, DuckDuckGo网页搜索代码执行Python REPL执行代码数据库SQL, MongoDB数据库查询网页WebBaseLoader网页抓取APIOpenWeatherMap, NewsAPIAPI 调用8.2 使用预构建工具from langchain_community.tools import DuckDuckGoSearchRun from langgraph.prebuilt import create_react_agent from langchain_openai import ChatOpenAI # 使用预构建的搜索工具 search DuckDuckGoSearchRun() # 创建 Agent model ChatOpenAI(modelgpt-4) agent create_react_agent(model, tools[search]) # 执行 result agent.invoke({ messages: 搜索 LangGraph 的最新教程 })8.3 自定义工具 预构建工具from langchain_core.tools import tool from langchain_community.tools import DuckDuckGoSearchRun # 自定义工具 tool def multiply(a: int, b: int) - int: Multiply two numbers. return a * b # 预构建工具 search DuckDuckGoSearchRun() # 组合使用 agent create_react_agent(model, tools[multiply, search])九、错误处理9.1 ToolNode 自动错误处理from langgraph.prebuilt import ToolNode # 默认启用错误处理 tool_node ToolNode([multiply], handle_tool_errorsTrue) # 如果工具执行出错会返回错误信息而不是崩溃9.2 自定义错误处理tool def divide(a: int, b: int) - float: Divide two numbers. if b 0: return 错误除数不能为零 return a / b十、完整示例10.1 数学计算 Agentfrom langchain_core.tools import tool from langgraph.prebuilt import create_react_agent from langchain_openai import ChatOpenAI # 定义工具 tool def multiply(a: int, b: int) - int: Multiply two numbers. return a * b tool def add(a: int, b: int) - int: Add two numbers. return a b tool def divide(a: int, b: int) - float: Divide two numbers. if b 0: return 错误除数不能为零 return a / b # 创建 Agent model ChatOpenAI(modelgpt-4) agent create_react_agent(model, tools[multiply, add, divide]) # 执行 result agent.invoke({ messages: 计算 (42 7) * 3 / 5 等于多少 }) print(result[messages][-1].content)10.2 带搜索功能的 Agentfrom langchain_core.tools import tool from langchain_community.tools import DuckDuckGoSearchRun from langgraph.prebuilt import create_react_agent from langchain_openai import ChatOpenAI # 自定义工具 tool def get_current_time() - str: 获取当前时间 from datetime import datetime return datetime.now().strftime(%Y-%m-%d %H:%M:%S) # 预构建工具 search DuckDuckGoSearchRun() # 创建 Agent model ChatOpenAI(modelgpt-4) agent create_react_agent(model, tools[get_current_time, search]) # 执行 result agent.invoke({ messages: 现在几点了另外搜索一下今天的新闻 }) print(result[messages][-1].content)十一、常见问题Q1: 工具描述重要吗非常重要LLM 根据工具描述决定何时调用。 好的描述 tool def search_web(query: str) - str: 搜索网页内容用于查找实时信息 ... 不好的描述 tool def search_web(query: str) - str: 搜索 # 太简单LLM 不知道何时使用 ...Q2: 如何限制工具参数from pydantic import BaseModel, Field class SearchInput(BaseModel): query: str Field(description搜索关键词) max_results: int Field(default5, ge1, le10) # 限制1-10 tool(args_schemaSearchInput) def search(query: str, max_results: int 5) - str: 搜索网页 ...Q3: 工具可以返回复杂对象吗tool def get_user_info(user_id: str) - dict: 获取用户信息 return { name: 张三, age: 25, email: zhangsanexample.com } # 注意返回值会被转换为字符串Q4: 如何处理工具执行失败# 方法1在工具内部处理 tool def risky_operation() - str: try: # 执行可能失败的操作 result do_something() return result except Exception as e: return f操作失败: {str(e)} # 方法2使用 ToolNode 的错误处理 tool_node ToolNode([risky_operation], handle_tool_errorsTrue)十二、API 速查表12.1 创建工具方法说明tool装饰器方式推荐tool(name, args_schema...)自定义工具普通函数自动转换12.2 使用工具方法说明model.bind_tools([tools])绑定到模型tool.invoke(args)执行工具create_react_agent(model, tools)创建 AgentToolNode([tools])创建工具节点12.3 访问上下文注解说明RunnableConfig访问配置InjectedState访问状态InjectedToolCallId获取工具调用IDget_store()访问长期记忆十三、延伸阅读LangGraph 官方文档 - 工具LangChain 工具集成自定义工具指南总结工具的核心要点定义工具使用 tool 装饰器提供清晰的描述绑定工具使用 bind_tools() 或 create_react_agent()执行工具LLM 决定何时调用自动执行访问上下文通过特殊注解访问配置和状态工具的作用扩展 Agent 能力与外界交互执行具体操作获取外部信息一句话总结工具是 Agent 的手和眼让 LLM 能够执行实际操作与外界交互。

相关文章:

LangGraph Agent 开发指南(9~工具 Tools)

一、什么是工具? 1.1 通俗解释 想象你有一个智能助手: 没有工具:你: 帮我查一下北京明天的天气助手: 抱歉,我没有联网功能,无法查询实时天气有工具:你: 帮我查一下北京明天的天气助手: 好的,…...

别再只做静态分析了!用DPABI探索小鼠大脑rs-fMRI的动态功能连接(含Matlab代码片段)

动态功能连接分析:解锁小鼠大脑rs-fMRI的时变奥秘 在神经影像研究领域,静息态功能磁共振成像(rs-fMRI)已成为探索大脑功能组织的强大工具。传统静态分析方法虽然提供了宝贵的基础认知,但大脑本质上是一个动态系统,其功能连接会随时…...

3步解决Beyond Compare 5评估模式错误:密钥生成与完全激活指南

3步解决Beyond Compare 5评估模式错误:密钥生成与完全激活指南 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 当Beyond Compare 5的30天评估期结束后,软件会显示"评…...

高性能JSXBIN解码器架构设计:3大核心技术优势深度解析

高性能JSXBIN解码器架构设计:3大核心技术优势深度解析 【免费下载链接】jsxer A fast and accurate JSXBIN decompiler. 项目地址: https://gitcode.com/gh_mirrors/js/jsxer Jsxer是一个快速且准确的JSXBIN反编译器,专门用于将Adobe ExtendScrip…...

批量转账工具评测:GTokenTool 凭什么成为 Web3 首选?

GTokenTool 是一个支持多链、不涉及代码操作的综合性 Web3 工具箱。它的批量转账功能支持一键分发 ERC-20 和 NFT 代币,特别适合用来高效完成各类代币分发任务,最高能节省 90% 的 Gas 费,且其合约模板已通过多重安全审计。 下面我按照新手最关…...

英雄联盟终极自动化助手:三步掌握LeagueAkari提升游戏体验

英雄联盟终极自动化助手:三步掌握LeagueAkari提升游戏体验 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit LeagueAkari是一款基于英…...

【基于Xilinx ZYNQ7000与PYNQ的嵌入式AI实践】从零构建实时人脸识别系统

1. 项目背景与核心价值 最近在折腾嵌入式AI项目时,发现Xilinx ZYNQ7000系列开发板真是个宝藏硬件。它独特的PS(处理器系统)PL(可编程逻辑)双架构,配合PYNQ框架的Python生态,让算法部署变得异常灵…...

AUBO机械臂视觉跟踪避坑指南:手眼标定后,如何让末端稳定跟随移动的ArUco码?

AUBO机械臂视觉跟踪避坑指南:手眼标定后如何实现稳定动态跟随 在工业自动化领域,机械臂的视觉跟踪能力直接决定了柔性制造系统的智能化水平。AUBO i5作为国产协作机械臂的代表性产品,其与视觉系统的集成应用越来越广泛。然而,许多…...

LaTeX引用中文文献总出乱码?可能是你的.bib文件编码和编译顺序没搞对

LaTeX中文文献引用乱码全解析:从编码原理到实战排错 当你熬夜赶论文,终于把参考文献列表整理进.bib文件,满心期待地按下编译键——结果引用位置跳出一串问号,参考文献列表变成乱码战场。这种崩溃瞬间,每个用LaTeX写过中…...

Python知乎API开发完全指南:从零构建高效数据采集系统

Python知乎API开发完全指南:从零构建高效数据采集系统 【免费下载链接】zhihu-api Zhihu API for Humans 项目地址: https://gitcode.com/gh_mirrors/zh/zhihu-api 在当今数据驱动的时代,知乎作为中文互联网最大的知识分享平台,其丰富…...

ARMv8浮点运算单元与MVFR寄存器深度解析

1. ARMv8浮点运算单元架构解析在移动计算和嵌入式系统领域,ARMv8架构已经成为事实上的行业标准。作为其核心计算能力的重要组成部分,浮点运算单元(FPU)和高级SIMD(Neon)扩展的性能直接影响着机器学习、图形处理、科学计算等关键应用的执行效率。与x86架构…...

Translumo终极指南:3个简单技巧掌握实时屏幕翻译

Translumo终极指南:3个简单技巧掌握实时屏幕翻译 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo 你是否曾在游…...

Power Query处理月度报表,遇到数据有null怎么办?详解【标准】运算与自定义列的计算逻辑差异

Power Query空值处理实战:标准运算与自定义列的计算逻辑深度解析 财务总监Lisa盯着屏幕上满是错误标记的月度汇总报表,眉头紧锁。她刚刚用Power Query合并了六个部门的销售数据,却发现总金额列出现了大量意料之外的null值——这直接导致季度预…...

DockDoor终极指南:快速掌握macOS窗口预览与高效切换

DockDoor终极指南:快速掌握macOS窗口预览与高效切换 【免费下载链接】DockDoor Window peeking, alt-tab and other enhancements for macOS 项目地址: https://gitcode.com/gh_mirrors/do/DockDoor 还在为macOS上繁琐的窗口切换而烦恼吗?DockDoo…...

课程第四天(基础)

while 循环语句whilewhile(){}:当小括号条件成立了执行{}里面的东西,条件不成立的时候,循环就结束了格式:while (条件){(执行语句)}do...while格式:do{(执行语句)}while(…...

怎样快速删除背景?2026年免费工具实测对比,找到最简单的抠图方法

图片背景删除已经成为日常工作中的常见需求——无论是制作证件照、电商商品图,还是社交媒体头像,都离不开一个靠谱的背景去除工具。但市面上的工具五花八门,从专业软件到在线应用,从手机App到小程序,到底哪个才是最简单…...

蜡笔变蜡烛:DIY分层香薰蜡烛的材料原理与制作实践

1. 项目概述:当蜡笔遇见蜡烛,一次关于气味与色彩的记忆重塑不知道你有没有过这样的体验:打开一盒崭新的蜡笔,那股混合着油脂、黏土与淡淡皂感的独特气味扑面而来,瞬间就能将你拉回铺满画纸的童年午后。Crayola蜡笔的官…...

从“记录系统”到“智能系统” From “System of Record” to “System of Intelligence” —— A16Z

From “System of Record” to “System of Intelligence” 从“记录系统”到“智能系统” https://www.a16z.news/p/from-system-of-record-to-system-of Here’s one way you can think about system of record stickiness: For a long time, the valuable part of social…...

Claude 代码在大型代码库中的运作方式:最佳实践与入门指南

How Claude Code works in large codebases: Best practices and where to start Claude 代码在大型代码库中的运作方式:最佳实践与入门指南 https://claude.com/blog/how-claude-code-works-in-large-codebases-best-practices-and-where-to-start The most succ…...

基于RAG与智能体技术构建法律领域AI应用实战指南

1. 项目概述:一个法律智能体的诞生最近在GitHub上看到一个挺有意思的项目,叫mileson/moticlaw。光看这个名字,可能有点摸不着头脑,但稍微拆解一下就能明白它的野心:“motic” 很可能是 “motion”(动议、提…...

技术管理者最痛:如何让团队从“要我做”变成“我要做”?

在软件测试领域,技术管理者常常陷入一种无形的焦虑:测试用例的执行越来越像机械的流水线,回归测试变成了纯粹的体力劳动,而探索性测试和深度质量分析这些真正有价值的活动,却总是无人主动认领。你尝试过推行自动化覆盖…...

AssetStudio:从Unity游戏资源中提取3D模型、纹理和Lua脚本的完整指南

AssetStudio:从Unity游戏资源中提取3D模型、纹理和Lua脚本的完整指南 【免费下载链接】AssetStudio AssetStudio - Based on the archived Perfares AssetStudio, I continue Perfares work to keep AssetStudio up-to-date, with support for new Unity versions a…...

ncmdump终极解决方案:解锁网易云音乐NCM格式的完整指南

ncmdump终极解决方案:解锁网易云音乐NCM格式的完整指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM加密文件无法在其他设备播放而烦恼吗?ncmdump工具使用为你提供了完美的NCM格…...

Bili2Text:3分钟将B站视频转为文字稿,AI语音识别提升学习效率10倍

Bili2Text:3分钟将B站视频转为文字稿,AI语音识别提升学习效率10倍 【免费下载链接】bili2text Bilibili视频转文字,一步到位,输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 还在为无法快速获取…...

从功能测试到测试开发,薪资翻倍的秘密都在这里

当“点点点”撞上职业天花板 如果你是一名功能测试工程师,下面的场景你一定不陌生:每天对着需求文档编写用例,在测试环境里重复着相似的操作路径,偶尔发现一个边界值缺陷便觉得一天没有白费。然而,当你在招聘网站上搜…...

Coolapk-UWP 深度解析:基于MVVM架构的Windows桌面酷安客户端开发实战指南

Coolapk-UWP 深度解析:基于MVVM架构的Windows桌面酷安客户端开发实战指南 【免费下载链接】Coolapk-UWP 一个基于 UWP 平台的第三方酷安客户端 项目地址: https://gitcode.com/gh_mirrors/co/Coolapk-UWP 在移动应用生态日益丰富的今天,将移动端优…...

Windows 10系统优化深度指南:使用Win10BloatRemover打造高效工作环境

Windows 10系统优化深度指南:使用Win10BloatRemover打造高效工作环境 【免费下载链接】Win10BloatRemover Configurable CLI tool to easily and aggressively debloat and tweak Windows 10 by removing preinstalled UWP apps, services and more. Originally bas…...

跨部门协作的“翻译官”角色:技术人最被低估的软技能

测试工程师的隐形天花板如果你问一位软件测试工程师“什么技能最能拉开职业差距”,得到的答案通常是自动化编程能力、性能分析经验或安全测试资质。这些硬技能固然重要,但一个容易被忽视的事实是:许多测试人的职业瓶颈并非技术深度不足&#…...

TC12.0 BMIDE实战:从零构建企业专属业务数据模型

1. 为什么企业需要定制业务数据模型 第一次接触Teamcenter的BMIDE工具时,我和很多技术管理员一样有个疑问:既然系统已经内置了标准数据模型,为什么还要大费周章地自定义?直到参与了一个汽车零部件企业的项目才真正明白。这家企业使…...

2026年5月AI Agent技术全景:多模态与自主决策的范式跃迁

核心结论:2026年5月,AI Agent技术正在从"工具调用"向"自主决策"跃迁。六大趋势——多模态感知、长期记忆、多Agent协作、安全对齐、开发者生态、边缘部署——正在重塑Agent技术栈。12大主流框架(LangGraph、AutoGPT、Met…...