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%免费】