LangGraph Tools 实战:工具调用怎么定义、怎么执行、怎么不撑爆上下文
LangGraph 企业级 Agent 教程 · 第 2 集。Tool 定义、ToolNode 执行、bind_tools 与 return_direct 分工外加一次 639 万字符的真实翻车现场。很多人第一次做 Agent最容易高估模型的一件事是以为会说就等于会做。比如用户只说了一句帮我查一下明天下午平原轩还有没有空位。这句话听起来很简单但真正把它做成可上线的系统内部要做的事其实不止一句回复去外部系统查实时数据把查到的信息压缩成模型能看懂的摘要保留原始结构化结果给后面的流程继续用在需要的时候停下来别让模型把一大坨 JSON 直接塞进上下文里。人做这件事会很自然先去查再总结再决定要不要继续。可 Agent / Graph 不会天然这样做。它只会生成文本不会自动知道哪些事实来自外部系统也不会自动帮你把危险动作和普通回答分开。这就是 Tool 真正存在的原因它不是聊天内容的一部分而是模型和外部世界之间的边界。先把一个需求拆开看我们用书房预约助手这个例子来讲。用户可能会连续问“帮我查一下明天下午平原轩还有没有空位”“把 15:00 之后能约的时段列出来”“那就帮我约 16:00-18:00”“看看我最近的预约记录”如果只用普通聊天模型最多能帮你组织语言但它不知道数据库里到底有什么不知道预约系统有没有冲突也不知道这次操作会不会真的成功。所以这类系统里至少要分清三件事Tool一个可以被调用的外部能力ToolNode在图里真正执行工具调用的节点Agent决定什么时候调工具、看完结果后怎么继续说话。这个区分很重要。很多人写着写着就把三者混在一起最后模型输出、工具执行、状态更新全挤成一个大函数后面一改就崩。一个好 Tool先要让模型看得懂Tool 不是写个函数名就完了。模型真正需要的是什么时候调用它、该传什么参数、返回结果大概长什么样。一个最小的例子长这样from pydantic import BaseModel, Fieldfrom langchain_core.tools import toolclassAvailabilityInput(BaseModel): room_name: str Field(description书房名称例如 平原轩) booking_date: str Field(description预约日期格式 YYYY-MM-DD) start_after: str | None Field(defaultNone, description只返回这个时间之后的可用时段格式 HH:MM)tool(args_schemaAvailabilityInput)defquery_availability(room_name: str, booking_date: str, start_after: str | None None) - str: 查询书房可预约时段。 returnf{room_name} 在 {booking_date} 可预约时段14:00-15:00, 16:00-18:00, 19:00-20:00这里最值钱的不是代码本身而是三个信息都明确了description让模型知道这是什么args_schema让参数不会乱飞返回值保持短小让后续推理还能继续。如果工具说明写得含糊模型就会瞎猜参数如果参数 schema 太松模型就会传错字段如果返回结果太大下一轮上下文就会被撑爆。上面这个例子返回值是手写的短字符串看起来岁月静好。接下来把它接上真实数据源事情马上变样。一次能跑通的调用离撑爆只差一步课程里做了一个很直接的实验让查询工具老老实实返回真实的完整候选数据不做任何处理。工具本身跑得好好的返回也完全正确。但看一眼数字未裁剪 ToolMessage 字符数: 6,391,451未裁剪候选条数: 12,960639 万字符。一个能跑通的工具调用单次返回就接近很多模型整个上下文窗口的量级。关键在于这坨数据的去向工具的返回值会变成ToolMessage进入messages而messages是下一次模型调用要原样携带的内容。也就是说工具返回有多大下一轮就有多少上下文压力——费用飙升还是轻的直接超限报错才是常态。这是很多 Agent 项目最容易踩的坑工具本身能返回和返回内容适合进入模型上下文是两回事。单独测试工具时一切正常接进 Agent 循环后第二轮就爆而且爆的位置不在工具是在下一次模型调用排查起来特别绕。摘要进消息完整数据走旁路处理方案不是少查点数据而是把一份数据拆成两个去向给模型的只保留少量摘要和统计完整结构化结果通过运行时旁路保存后续节点需要时再取。最小实现只有两个函数def clip_items_for_llm(items: list[dict], max_items: int 5) - tuple[list[dict], dict]: 把完整候选拆成两份给 LLM 的少量摘要 统计信息。 clipped items[:max_items] return clipped, {total_items: len(items), llm_items: len(clipped)}def runtime_state_from_config(config: RunnableConfig | None) - dict: 从 RunnableConfig 里取 runtime_state作为不进消息流的旁路存储。 configurable (config or {}).get(configurable, {}) return configurable.setdefault(runtime_state, {})工具里的用法查到 12,960 条候选后只把前 5 条和一行统计写进返回值完整列表写进runtime_state。改造后再跑同一个查询ToolMessage从 639 万字符缩到原来的万分之几而后续的提交预约工具依然能从 runtime 里拿到完整候选继续干活。课程里还做了一个更较真的验证把 runtime 里第一条和最后一条候选的candidate_id拿去搜整个消息流——都搜不到。完整数据真的只在旁路里一个字都没漏进模型上下文。一句话总结这个分工Tool 负责接事实runtime / State 负责保现场消息流只保留推理需要的那一小段。ToolNode、bind_tools、return_direct分别管什么很多人第一次看工具相关 API 时会把几个概念混在一起。其实它们各自解决的问题不一样。1bind_tools它的作用是告诉模型有哪些工具。它不会替你执行工具只是让模型能在合适的时候生成tool_calls。你可以把它理解成模型知道了菜单但还没真的下单。2ToolNode它的作用是真的执行工具。在 LangGraph 里模型先产出tool_calls然后ToolNode把这些调用落地执行再把结果写回流程。你可以把它理解成菜单已经选好了厨房开始做菜。3return_direct它决定工具结果是不是直接结束流程。return_directFalse工具结果先回模型再由模型组织最终答复return_directTrue工具结果本身就足够了流程可以直接结束。这个选项不是性能参数而是一个路由信号。如果工具返回的就是最终答案比如某些简单计算、纯查表结果它就可以直接返回如果工具结果还需要解释、整合、补一句人话那就让模型继续说。哪些数据该缓存哪些不该工具很多时候会查同一类稳定数据比如规则说明、固定配置、公开知识。这类数据适合缓存因为它们变化慢重复查会浪费时间。但用户当前会话里的状态、临时候选、审批结果不适合塞进缓存里冒充通用记忆。简单判断就够了稳定、重复、无个体差异可以考虑缓存跟当前会话、当前用户、当前动作强相关别缓存成全局结果。缓存是为了少重复查不是为了把状态偷懒地藏起来。运行时注入有些东西不该让模型自己填还有一类数据模型不应该自己生成比如用户 ID会话 ID权限信息当前运行时的状态持久化存储里的内容。这些东西应该由程序注入而不是让模型猜。这就是运行时注入的意义模型做判断程序提供边界内的事实。如果把这些字段也交给模型填系统就会变成看起来聪明实际上不可信。换一个场景这套边界还成立吗把书房预约换成胰腺癌辅助问诊同样的判断反而更扎眼模型可以组织语言、可以追问症状但它不能凭空编造检验结果、影像报告或诊疗指南。这些事实必须通过 Tool 去外部系统读读回来之后给模型的是可读摘要原始报告留在 State / runtime 里给下游节点继续判断。医疗场景还多一条书房预约里容易忽略的要求查不到、缺参数、系统异常时工具要返回可恢复的错误让图能继续追问或者转人工而不是直接把整条链路挂掉。你会发现这套边界设计根本不挑业务查库存、查工单、查合同换个名词全都适用。越是模型不能出错的领域Tool 边界越值钱。学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

相关新闻

settings.local.json,Claude Code 里最适合个人差异化配置的一层

settings.local.json,Claude Code 里最适合个人差异化配置的一层

最近在梳理 Claude Code 的配置体系时,最容易被低估的文件之一就是 .claude/settings.local.json。它不像 CLAUDE.md 那样负责给模型提供项目背景,也不像 .claude/settings.json 那样适合提交到仓库、统一团队行为。它更像一个贴在本机开发环境旁边的小控制台,专门处理个人偏…

2026/10/19 20:50:38 阅读更多 →
海洋观测技术:从传统探测到空天地海一体化

海洋观测技术:从传统探测到空天地海一体化

1. 海洋观测技术发展现状与突破我国海洋观测技术近年来取得了一系列重大突破,从传统的水下探测发展到空天地海一体化观测体系。这种技术飞跃主要体现在三个方面:首先是观测范围的扩展。传统海洋观测主要依靠船舶和浮标等水面设备,观测深度和范…

2026/10/20 0:16:31 阅读更多 →
社交平台 AI 功能的用户接受度:推荐算法透明性,决定信任成败的关键

社交平台 AI 功能的用户接受度:推荐算法透明性,决定信任成败的关键

社交平台 AI 功能的用户接受度:推荐算法透明性,决定信任成败的关键 一、"这个推荐是怎么来的?""因为这个功能就是为了让你花更多时间在平台上" 这是社交平台用户对 AI 推荐最常见的两种态度。一部分用户接受推荐并乐在其…

2026/10/18 11:26:06 阅读更多 →

最新新闻

生物医学传感器信号链设计:从换能原理到工程实践

生物医学传感器信号链设计:从换能原理到工程实践

简介:山东大学《生物医学传感器与测量》国家精品课程课件共447页,压缩包内为单个PDF文件,总大小46.57MB。课程面向生物医学工程、传感器技术相关专业学生,以及智能手环、血氧仪等可穿戴设备研发和医疗仪器应用工程师。内容从绪论入…

2026/10/20 18:13:46 阅读更多 →
Android语音识别与TTS实战:从崩溃到稳定闭环

Android语音识别与TTS实战:从崩溃到稳定闭环

1. 这不是“调个API就完事”的语音开发——为什么新手常在第一步就卡死三天“Android 智能语音开发新手入门实战”——看到这个标题,我猜你大概率已经点开过三四个教程,结果要么是照着敲完代码,App一运行就报SpeechRecognizer not available&…

2026/10/20 18:13:46 阅读更多 →
OpenCV+Python车牌识别实战:传统图像处理管线实现稳定识别

OpenCV+Python车牌识别实战:传统图像处理管线实现稳定识别

简介:这是一套基于OpenCV与Python实现的车牌识别系统,附带项目报告,定位为期末大作业和课程设计参考,适合计算机相关专业学生及需要视觉项目实战练习的学习者。项目覆盖车牌图像预处理(灰度化、滤波去噪、二值化&#…

2026/10/20 18:13:46 阅读更多 →
端到端VLA上船:海洋具身智能真实海试技术拆解

端到端VLA上船:海洋具身智能真实海试技术拆解

“端到端”这个概念,在智驾圈已经吵了好几年,但大家聊的基本都是四个轮子的车。最近某海洋大学(筹)把一套VLA端到端自动驾驶系统装到了无人船上,在真实海域跑完了验证,还打出了“海洋具身智能全球首发”的旗…

2026/10/20 18:13:46 阅读更多 →
AI编程安全:用pre-push代码扫描拦截AI生成代码的隐性风险

AI编程安全:用pre-push代码扫描拦截AI生成代码的隐性风险

AI编程工具普及之后,最让我头疼的其实不是代码质量下降,而是安全审查的工作量在成倍往上翻。以前Review一个PR,主要看逻辑对不对、命名规不规范;现在Review一个PR,得先回答一个问题:这段代码到底是人写的还…

2026/10/20 18:13:46 阅读更多 →
AI代理“猜你有钱就推贵的”:基于购买力评估的推荐价格带动态调整策略

AI代理“猜你有钱就推贵的”:基于购买力评估的推荐价格带动态调整策略

先说个真实的感受。做推荐系统的人都知道,模型调来调去,无非是在“猜用户想要什么”上打转。但你有没有想过一个问题:系统会不会猜用户“买得起什么”?我最近复盘了一个实验项目,项目代号干脆就叫“模拟项目X”&#x…

2026/10/20 18:12:45 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →