深入浅出 LangGraph —— 第6章:工具调用与ToolNode

Langgraph ToolNode 的原理 及综合实战 LangGraph ToolNode 是一个预构建的组件,用于在 LangGraph 状态图中执行工具调用。 阅读详情

📖 本章学习目标

  • ✅ 理解 LLM 工具调用(Function Calling)的工作机制
  • ✅ 掌握使用 tool() 函数定义类型安全的工具
  • ✅ 学会使用 ToolNode 预构建节点简化工具集成
  • ✅ 构建完整的 ReAct Agent(推理→行动→观察循环)
  • ✅ 掌握工具调用的错误处理和超时机制
  • ✅ 避免常见的工具设计陷阱和性能问题

一、工具调用:让 AI 能"动手"

1、什么是工具调用

大语言模型本身只能"说话"——接受文本输入,生成文本输出。工具调用(Tool Calling,也叫 Function Calling)让 LLM 能够:

  • 🔍 搜索:调用搜索 API 获取实时信息
  • 🧮 计算:调用计算工具处理数学问题
  • 📁 操作文件:读写本地文件系统
  • 🌐 调用 API:与第三方服务交互
  • 🗄️ 查询数据库:获取结构化数据

工具调用就像给 AI 配备了"工具箱"。AI 本身是大脑,工具是手和脚,两者结合才能真正完成任务。

传统LLM vs 工具增强LLM对比:

传统LLM

用户提问

LLM基于训练数据回答

可能过时或不准确

工具增强LLM

是

否

用户提问

LLM分析需求

需要工具?

调用工具获取实时数据

LLM基于真实数据回答

直接回答

准确且实时的答案

2、工具调用流程

工具 LLM 用户 工具 LLM 用户 关键:LLM决定何时调用工具 ToolNode负责执行工具 "帮我搜索今天的天气" 分析:需要调用 search 工具 调用 search({ query: "今日天气" }) 返回搜索结果 基于结果生成回复 "今天北京天气晴,25°C..."

完整工作流程详解:

  1. 用户输入:用户提出问题或任务
  2. LLM推理:LLM分析问题,判断是否需要调用工具
  3. 工具调用:如果需要,LLM生成工具调用请求(tool_calls)
  4. 工具执行:ToolNode解析并执行工具,返回结果
  5. 结果整合:工具结果作为消息返回给LLM
  6. 最终回复:LLM基于工具结果生成最终回答

二、定义工具

1、使用 tool() 函数

LangChain 提供了 tool() 函数,结合 Zod 定义类型安全的工具:

步骤1:导入依赖
import { tool } from '@langchain/core/tools';
import { z } from 'zod';
步骤2:定义简单工具
// 定义一个天气查询工具
const getWeatherTool = tool(
  async ({ city }) => {
    // 实际项目中这里调用真实的天气 API
    const mockData: Record<string, string> = {
      '北京': '晴天,25°C,东南风3级',
      '上海': '多云,22°C,东风2级',
    };
    return mockData[city] ?? `暂无 ${city} 的天气数据`;
  },
  {
    name: 'get_weather',
    description: '获取指定城市的实时天气信息',
    schema: z.object({
      city: z.string().describe('城市名称,如:北京、上海'),
    }),
  }
);

tool(fn, config)第一参数是工具的执行函数,第二参数是配置

  • name:工具名称(LLM 通过此名称调用工具,建议用下划线命名)
  • description:工具描述(LLM 根据此描述决定何时调用该工具,要写清楚)
  • schema:Zod 定义的参数结构,LLM 会按此格式传参
  • describe():为每个参数添加说明,帮助 LLM 理解参数含义

重要原则:

  1. name 必须唯一,只使用字母、数字和下划线
  2. description 要详细说明工具的用途和适用场景
  3. schema 要严格定义参数类型,提高LLM调用准确率

2、定义多参数工具

const calculatorTool = tool(
  async ({ operation, a, b }) => {
    switch (operation) {
      case 'add': return `${a + b}`;
      case 'subtract': return `${a - b}`;
      case 'multiply': return `${a * b}`;
      case 'divide':
        if (b === 0) return '错误:除数不能为零';
        return `${a / b}`;
      default:
        return '不支持的运算';
    }
  },
  {
    name: 'calculator',
    description: '执行基本的数学运算(加减乘除)',
    schema: z.object({
      operation: z.enum(['add', 'subtract', 'multiply', 'divide'])
        .describe('运算类型'),
      a: z.number().describe('第一个数字'),
      b: z.number().describe('第二个数字'),
    }),
  }
);

3、定义复杂工具

// 数据库查询工具
const databaseQueryTool = tool(
  async ({ table, filters, fields }) => {
    try {
      // 模拟数据库查询
      const results = await mockDatabase.query(table, filters, fields);
      return JSON.stringify(results, null, 2);
    } catch (error) {
      return `查询失败: ${error instanceof Error ? error.message : '未知错误'}`;
    }
  },
  {
    name: 'query_database',
    description: '查询数据库中的记录,支持过滤和字段选择',
    schema: z.object({
      table: z.enum(['users', 'orders', 'products'])
        .describe('要查询的表名'),
      filters: z.record(z.string(), z.any())
        .describe('过滤条件,key-value对')
        .optional(),
      fields: z.array(z.string())
        .describe('要返回的字段列表')
        .optional(),
    }),
  }
);
  • 复杂工具可以包含可选参数(.optional())
  • 内部做好错误捕获,返回错误描述而非抛出异常
  • 返回JSON字符串便于LLM解析结构化数据
  • z.enum限制可查询的表,防止SQL注入风险

三、ToolNode:预构建工具节点

1、ToolNode 的作用

ToolNode 是 LangGraph 预构建的节点,它自动:

  1. 解析 LLM 消息中的工具调用请求
  2. 并行执行所有被调用的工具
  3. 将工具结果包装成 ToolMessage 返回
import { ToolNode } from '@langchain/langgraph/prebuilt';

const tools = [getWeatherTool, calculatorTool];
const toolNode = new ToolNode(tools);
  • ToolNode(tools):传入工具数组,创建工具执行节点
  • ToolNode 自动处理工具调用的并发执行(多个工具同时调用时)
  • 如果 LLM 没有调用工具,ToolNode 什么都不做

工作原理:

  1. 接收包含tool_calls的AIMessage
  2. 解析每个tool_call的名称和参数
  3. 查找对应的工具并执行
  4. 将结果封装为ToolMessage
  5. 返回ToolMessage数组

2、构建完整的工具调用图

步骤1:绑定工具到模型
import { MessagesAnnotation, StateGraph } from '@langchain/langgraph';
import { ChatOpenAI } from '@langchain/openai';
import { HumanMessage, AIMessage } from '@langchain/core/messages';

const model = new ChatOpenAI({ model: 'gpt-4o-mini' });
// 将工具绑定到模型(告诉 LLM 有哪些工具可用)
const modelWithTools = model.bindTools(tools);

bindTools(tools)将工具列表绑定到模型,这会在系统层面告知LLM可用的工具及其schema。 LLM会根据问题决定是否调用工具以及调用哪个工具。必须在创建agent节点前完成绑定。

步骤2:定义Agent节点
// Agent 节点:调用绑定了工具的 LLM
async function agentNode(state: typeof MessagesAnnotation.State) {
  const response = await modelWithTools.invoke(state.messages);
  return { messages: [response] };
}

agentNode是核心推理节点,调用LLM生成回复。state.messages包含完整的对话历史,返回的{messages: [response]}会追加新消息到对话历史。 LLM可能返回普通AIMessage或带tool_calls的AIMessage。

步骤3:定义路由函数
// 路由函数:检查是否需要调用工具
function shouldUseTool(state: typeof MessagesAnnotation.State): string {
  const lastMsg = state.messages[state.messages.length - 1] as AIMessage;
  if (lastMsg.tool_calls && lastMsg.tool_calls.length > 0) {
    return 'tools';
  }
  return '__end__';
}

检查最后一条消息是否包含tool_calls字段,如果有工具调用,路由到’tools’节点执行,否则直接结束(‘end’), 这是标准的工具调用路由模式。

步骤4:构建图
const agentGraph = new StateGraph(MessagesAnnotation)
  .addNode('agent', agentNode)
  .addNode('tools', toolNode)
  .addEdge('__start__', 'agent')
  .addConditionalEdges('agent', shouldUseTool)
  // 工具执行完后,把结果返回给 agent 继续推理
  .addEdge('tools', 'agent')
  .compile();

执行流程: start → agent → (有tool_calls?) → tools → agent → … → end

完整流程图:

是

否

__start__

agent节点
LLM推理

需要工具?

tools节点
执行工具

__end__


四、ReAct Agent 完整实现

1、ReAct 模式解析

ReAct(Reasoning + Acting)是最经典的 Agent 模式:

是

否

用户提问

🧠 推理
(LLM 思考)

需要行动?

⚡ 行动
(执行工具)

👁️ 观察
(获取结果)

✅ 最终回答

ReAct 循环详解:

  1. Reasoning(推理):LLM分析问题,决定下一步行动
  2. Acting(行动):如果需要,调用工具执行具体任务
  3. Observation(观察):获取工具执行结果
  4. 循环:回到推理阶段,基于新信息继续决策
  5. 终止:当LLM认为任务完成时,输出最终答案

2、带搜索功能的完整 ReAct Agent

步骤1:定义工具集
import * as dotenv from 'dotenv';
dotenv.config();

import { tool } from '@langchain/core/tools';
import { z } from 'zod';
import { ToolNode } from '@langchain/langgraph/prebuilt';
import { MessagesAnnotation, StateGraph } from '@langchain/langgraph';
import { ChatOpenAI } from '@langchain/openai';
import { HumanMessage, AIMessage } from '@langchain/core/messages';

// 工具1:网页搜索(模拟)
const searchTool = tool(
  async ({ query }) => {
    console.log(`🔍 正在搜索: ${query}`);
    return `搜索"${query}"的结果:这是模拟的搜索结果,包含相关信息...`;
  },
  {
    name: 'web_search',
    description: '搜索互联网获取最新信息,适用于需要实时数据的问题',
    schema: z.object({ query: z.string().describe('搜索关键词') }),
  }
);

// 工具2:代码执行(模拟)
const codeRunnerTool = tool(
  async ({ code }) => {
    console.log(`💻 执行代码: ${code}`);
    // 实际项目中这里可以对接真实的代码执行沙箱
    return `代码执行成功,输出:42`;
  },
  {
    name: 'run_code',
    description: '执行 JavaScript 代码片段并返回结果',
    schema: z.object({ code: z.string().describe('要执行的 JS 代码') }),
  }
);

*定义若干个工具,每个工具都有清晰的name、description和schema。description详细说明适用场景,帮助LLM正确选择工具(实际项目中应该替换为真实的API调用)。

步骤2:组装ReAct Agent
// 所有可用工具的数组
const allTools = [searchTool, calculatorTool, codeRunnerTool];
// 绑定工具后的LLM实例
const reactModel = new ChatOpenAI({ model: 'gpt-4o-mini' })
  .bindTools(allTools);

// 推理节点,调用LLM
async function reactAgentNode(state: typeof MessagesAnnotation.State) {
  const response = await reactModel.invoke(state.messages);
  return { messages: [response] };
}

// 路由函数,检查是否有tool_calls
function reactRouter(state: typeof MessagesAnnotation.State): string {
  const last = state.messages[state.messages.length - 1] as AIMessage;
  return last.tool_calls?.length ? 'tools' : '__end__';
}
步骤3:构建并运行
const reactGraph = new StateGraph(MessagesAnnotation)
  .addNode('agent', reactAgentNode)
  .addNode('tools', new ToolNode(allTools))
  .addEdge('__start__', 'agent')
  .addConditionalEdges('agent', reactRouter)
  .addEdge('tools', 'agent')
  .compile();

async function main() {
  const result = await reactGraph.invoke({
    messages: [new HumanMessage('请搜索一下 LangGraph 的最新版本,然后计算 123 × 456')],
  });
  
  const finalMsg = result.messages[result.messages.length - 1] as AIMessage;
  console.log('\n🤖 最终回复:\n', finalMsg.content);
}

main().catch(console.error);

留意上述构建图时的节点和边,tools节点运行后会连接agent节点,实现调用工具后重新推理,这是标准的ReAct Agent实现模式。

运行结果示例:

🔍 正在搜索: LangGraph latest version
💻 执行代码: 123 * 456

🤖 最终回复:
LangGraph 的最新版本是 0.2.0。
123 × 456 = 56088

执行过程追踪:

Code Tool Search Tool Agent 用户 Code Tool Search Tool Agent 用户 搜索LangGraph版本并计算123×456 推理:需要搜索和计算 web_search("LangGraph latest version") 返回搜索结果 run_code("123 * 456") 返回56088 推理:整合结果 返回最终答案

五、工具错误处理

1、工具级别的错误处理

工具的调用可能会发生异常。在工具内部捕获错误并返回错误描述字符串(而非抛出异常),LLM 收到错误信息后,可以决定换一种方式处理。如果工具抛出异常,ToolNode 默认会让其传播,导致图失败。

const robustSearchTool = tool(
  async ({ query }) => {
    try {
      const result = await realSearchAPI(query);
      return result;
    } catch (error) {
      // 工具返回错误描述,让 LLM 知道工具失败了
      return `搜索失败:${error instanceof Error ? error.message : '未知错误'}。请尝试其他方式。`;
    }
  },
  { 
    name: 'search', 
    description: '搜索网络信息', 
    schema: z.object({ query: z.string() }) 
  }
);

错误处理策略:

  1. 捕获所有异常,转换为友好提示
  2. 提供重试建议
  3. 保持返回类型为string

2、ToolNode 的错误回退配置

import { ToolNode } from '@langchain/langgraph/prebuilt';

// 配置错误处理:工具失败时返回错误消息而非抛出异常
const safeToolNode = new ToolNode(tools, {
  handleToolErrors: true, // 默认为 true:工具错误被捕获并作为 ToolMessage 返回
});

handleToolErrors这是为true(默认),会在工具执行异常时,返回包含错误信息的 ToolMessage。LLM 收到错误 ToolMessage 后,可以重试或换策略。设为 false 则错误会直接抛出,让图整体失败。

两种模式对比:

  • true: 容错性强,LLM可自行处理错误
  • false: 严格模式,适合关键任务需要立即失败的场景

3、超时控制

工具的调用可能还会发生超时,我们不能让工具一直处于调用状态,因此通常需要在工具超时调用时取消调用或做其它的容错处理。

生产环境必须设置超时,防止工具长时间挂起。

const timeoutSearchTool = tool(
  async ({ query }) => {
    //  AbortController:浏览器/Node.js标准的取消请求机制
    const controller = new AbortController();
    // setTimeout设置5秒超时, 超时时触发abort,捕获AbortError
    const timeoutId = setTimeout(() => controller.abort(), 5000);
    
    try {
      const response = await fetch(`https://api.search.com?q=${query}`, {
        signal: controller.signal,
      });
      // 走到这里说明没有超时,取消超时限制
      clearTimeout(timeoutId);
      return await response.text();
    } catch (error) {
      if (error.name === 'AbortError') {
        return '搜索超时,请稍后重试';
      }
      return `搜索失败: ${error.message}`;
    }
  },
  {
    name: 'timeout_search',
    description: '带超时控制的搜索工具',
    schema: z.object({ query: z.string() }),
  }
);

六、最佳实践和踩坑指南

💡 实践 1:工具描述要精准

❌ 模糊的描述:

{ description: '获取信息' }  // LLM 不知道该什么时候用

✅ 精准的描述:

{
  description: '搜索互联网获取实时信息。当用户询问最新事件、' +
               '当前数据或需要查证的事实时使用。不适用于通用知识问题。'
}

原因:描述是 LLM 决定是否调用工具的唯一依据,越精准工具利用率越高。

💡 实践 2:工具幂等性设计

✅ 确保工具可以安全重试:

// 查询操作天然幂等,多次调用结果相同
const queryTool = tool(async ({ id }) => await db.find(id), { ... });

// 写入操作需要额外处理幂等性
const createTool = tool(
  async ({ key, value }) => await db.upsert(key, value), // 用 upsert 代替 insert
  { ... }
);

原因:LLM可能会重复调用同一工具,幂等性保证不会产生副作用。

💡 实践 3:工具命名规范

❌ 不好的命名:

{ name: 'Get Weather Data' }  // 包含空格
{ name: '查询数据库' }         // 中文命名

✅ 推荐的命名:

{ name: 'get_weather' }       // 小写+下划线
{ name: 'query_database' }    // 语义清晰

原因:某些LLM对工具名有特殊字符要求,统一使用小写+下划线最安全。

⚠️ 常见问题

问题现象解决方案
工具名使用空格或特殊字符LLM 调用工具失败工具名只使用字母、数字和下划线
忘记 bindToolsLLM 不会调用工具,直接文字回复使用 model.bindTools(tools) 创建带工具的模型
tools → agent 边缺失工具执行后图意外结束确保工具节点有边连回 agent 节点
工具返回非字符串ToolMessage 解析错误工具函数必须返回 string 或 Promise<string>
工具描述不清晰LLM不调用或误调用工具详细描述工具用途、参数、适用场景
未设置超时工具长时间挂起,图卡死所有外部API调用必须设置超时
工具内部抛异常整个图崩溃工具内捕获异常,返回错误描述字符串

📝 本章小结

核心知识点回顾

知识点关键要点应用场景
tool() 函数Zod schema + 执行函数定义所有自定义工具
bindTools()将工具绑定到模型使 LLM 感知并能调用工具
ToolNode预构建工具执行节点大多数工具调用场景
ReAct 循环agent → tools → agent构建能"行动"的 Agent
错误处理工具内捕获 or handleToolErrors生产级 Agent 必须处理
超时控制AbortController防止工具长时间挂起
幂等性设计工具可安全重试提高系统鲁棒性

🎯 动手练习

练习 1:创建文件操作工具

  • 目标:创建读取、写入本地文件的工具
  • 要求:
    1. 使用 Node.js fs 模块实现read_file和write_file工具
    2. 工具需要处理文件不存在、权限不足等错误
    3. 添加文件大小限制(防止读取过大文件)
  • 验收标准:
    • Agent 能读取指定文件内容
    • Agent 能修改文件并保存
    • 错误情况返回友好提示

练习 2:集成真实搜索 API

  • 目标:将 SerpAPI 或 Tavily API 集成为真实搜索工具
  • 要求:
    1. 注册SerpAPI/Tavily账号获取API Key
    2. 实现带超时控制的搜索工具
    3. 处理API限流(429错误)
  • 验收标准:
    • Agent 能搜索并引用真实网络信息
    • 超时和限流有正确处理
    • 返回结果包含来源链接

练习 3:工具调用追踪

  • 目标:记录每次工具调用的名称、参数、耗时和结果
  • 要求:
    1. 在 State 中添加 toolCallHistory 字段
    2. 创建中间件节点记录每次工具调用
    3. 最终输出包含完整的调用历史
  • 验收标准:
    • 每次工具调用后,历史记录自动追加
    • 包含工具名、参数、耗时、结果摘要
    • 可用于调试和审计

练习 4:多工具协同任务

  • 目标:实现需要多个工具协作的复杂任务
  • 要求:
    1. 创建weather(天气)、location(地理位置)、recommendation(推荐)三个工具
    2. 用户问:“推荐北京明天适合的户外活动”
    3. Agent自动调用多个工具获取信息并综合回答
  • 验收标准:
    • 自动调用location获取北京坐标
    • 调用weather获取明天天气
    • 基于天气推荐合适活动
    • 最多3轮工具调用完成任务

📚 延伸阅读


下一章:第7章 —— 持久化与检查点机制

LangGraph--基础学习(工具调用) ¶由于中的工具很多我们是用不了的,所以这里我们来封装一个自定义工具,使用高德的天气查询接口来做一个天气查询的工具。高德的天气查询接口文档请查阅基础 API 文档-开发指南-Web服务 API | 高德地图API¶参考 TavilySearchResults 工具的实现以及 LangChain 官方的 tools 文档, 我这里使用继承自BaseTool 的方式来实现。主要的流程包括继承类定义几个属性,name: 工具的名字。 阅读详情

相关推荐

LangGraph预构建ToolNode类:解锁工作流中的智能工具调用机制

本文深入解析LangGraph预构建的ToolNode类,揭示其如何优化工作流中的智能工具调用机制。通过标准化工具调用流程、与ReAct代理深度集成及实战案例,展示ToolNode如何简化AI模型与外部工具的协作,提升开发效率。特别关注工具调用、错误处理和多工具协同等核心功能,为构建高效工作流提供专业指导。

weixin_29196891的博客 326

基于大模型智能体Agent的LangGraph入门与实战

基于大模型智能体Agent的LangGraph入门与实战课程目标:本课程旨在为LangGraph的初学者提供深入的理论知识和实践技能,使其能够独立构建和部署基于LangGraph的应用程序。课程形式:理论讲解 + 实战演练第1课 LangGraph基础架构与环境配置-LangGraph的概念解析第2课 LangGraph基础架构与环境配置-LangGraph的环境搭建与依赖管理第3课 LangGraph的基础原理与应用入门-构建基本聊天机器人及使用工具增强第4课 LangGraph的基础原理与应用入门-内存管理、人在回路、状态更新第5课 LangGraph高级图控制技术-并行节点扇出和扇入、增加额外步骤、条件分支第6课 LangGraph高级图控制技术-稳定排序、Map-Reduce并行执行、图递归控制第7课 LangGraph持久化机制与状态管理-线程级持久化、子图持久化、跨线程持久化第8课 LangGraph Human-in-the-loop-断点设置、动态设置断点、编辑更新状态第9课 LangGraph Human-in-the-loop-等待用户输入、时间旅行、工具评审第10课 LangGraph在具有长期记忆的有状态Agent中的应用-长期记忆及短期记忆、过滤信息、删掉信息第11课 LangGraph在具有长期记忆的有状态Agent中的应用-摘要总结、跨线程持久化、代理语义搜索第12课 LangGraph工具集成与调用-直接调用ToolNode、大模型使用工具第13课 LangGraph工具集成与调用-工具调用报错处理、运行时值传递给工具、注入参数第14课 LangGraph工具集成与调用-配置传入工具、从工具更新图状态、管理大量工具第15课 LangGraph子图设计与实现-添加及使用子图、父图及子图状态管理第16课 LangGraph子图设计与实现-子图状态的查看与更新、子图输入输出的转换与处理第17课 LangGraph项目实战演练-多智能体系统主管委托各个代理第18课 LangGraph课程复习与答疑 自我反思案例及论文案例讲解

LangGraph工具调用实战:用ToolNode打造会解数学题的AI家教

本文详细介绍了如何利用LangGraph的ToolNode组件构建一个能解数学题的AI家教系统。通过定义数学工具集、设计多步骤解题流程和验证机制,实现智能化的数学辅导体验。文章重点展示了ToolNode在工具调用和工作流设计中的核心作用,为开发者提供了从基础到进阶的实战指南。

weixin_29223603的博客 343

【LangGraph】langgraph.prebuilt.ToolNode 类:在工作流中处理工具调用(Tool Calling)

langgraph.prebuilt.ToolNode 是 LangGraph 库中的一个预构建类,位于 langgraph.prebuilt 模块中,设计用于在工作流中处理工具调用(Tool Calling)。它是一个专门的节点类型,能够根据图的状态(通常是消息列表)执行外部工具(例如搜索 API、计算函数等),并将工具的执行结果更新到状态中。动态工具执行:根据状态中的 tool_calls 执行工具,追加 ToolMessage。生态集成:优化用于 ReAct 代理,支持自定义 StateGraph,与

彬彬侠的博客 3114

Python爬虫:无账号无限制获取企查查信息

无限制企查查爬虫 ​通过网上爬虫获取了全国所有企业,然后就需要补充企业信息,首先想到的就是企查查,启信宝等专业网站,最终选择了企查查,尝试了多种方法: 1、selenium爬虫,绕过企查查的登录验证,但账号和IP限制太大,最终放弃 2、通过requests直接请求+cookies,遇到了cookie有效期和限制问题 不断的尝试和修改参数,最终发现一种有效方式selenium+ wep 只需要IP代理,不需要账号,没有限制,因为是没有登录,拿到的信息有限,能展示的都能获取。 一、初始化..

攻城狮的家园 1万+

存内计算路线再获加持,清华存内芯片登Science

通过这种方法,可以比较有效的控制二氧化铪忆阻层中的微观变化,以及内部的温度和电场,使得器件具有非常优异的电学特性,而且可以在工厂里大规模生产,推动了高性能忆阻器阵列的诞生。团队搭建了全硬件构成的完整存算一体系统,如下图7所示,在系统里集成了多个忆阻器阵列,并在该系统上高效运行了卷积神经网络算法,成功验证了图像识别功能,证明了存算一体架构全硬件实现的可行性,并且成功实现了以更小的功耗和更低的硬件成本完成复杂的计算[6]。根据测试,在一般神经网络中权重更新的最后阶段,调整步长非常接近0,如图9(C)所示,

PXX12345678的博客 1555

LangGraph之Tool Calling Agent 中ToolNode的使用

在LangGraph的代理架构体系中,Router Agent是基础形式,在此之上构建的Tool Calling Agent(工具调用代理)极大地拓展了大模型的应用能力。它允许大模型根据用户输入自主选择并调用合适工具,有效解决与外部系统交互时自然语言与特定输入模式不匹配的问题,显著增强了模型处理复杂任务的能力。

qq_43588095的博客 2004

Clang Static Analyzer 使用教程:本地 + CMake + GitHub Actions 自动静态分析实战

本文介绍了ClangStaticAnalyzer静态代码分析工具的使用方法。该工具基于Clang/LLVM,可检测C/C++代码中的内存泄漏、空指针等常见错误。主要内容包括:安装指南(Ubuntu/macOS/Windows)、命令行使用方法、CMake项目集成方案、GitHub Actions自动化分析配置,以及HTML报告生成与查看。文章还提供了官方资源链接,帮助开发者系统掌握从本地调试到持续集成的完整静态分析工作流,提升代码质量保障能力。适用于需要在开发过程中实施静态分析的C/C++项目。

u014358031的博客 2158

LangGraph之工具调用 (ToolNode) 扩展智能体的能力边界

本文探讨了LangGraph框架中的ToolNode机制,该组件能有效扩展智能体的工具调用能力。ToolNode作为LangGraph的"工具执行器",封装了工具调度逻辑,支持同步/异步调用,并能自动处理错误。文章介绍了ToolNode的三大核心功能:接收LLM工具请求、执行调用、更新图状态,并重点说明了使用@tool装饰器定义工具的四个关键要素。通过两个代码示例,展示了ToolNode处理单工具和多工具调用的实际应用,最后阐述了如何将ToolNode与LLM节点、条件路由节点结合构建完

AI_today的博客 1924

EG800K 4G模块AT指令避坑指南:让你的STM32物联网项目稳定连接云端

本文详细解析了EG800K 4G模块在STM32物联网项目中的AT指令应用避坑指南,涵盖从底层协议到云端稳定的全链路优化策略。通过实战案例和防护机制,帮助开发者解决常见通信陷阱,提升云端通信的稳定性和效率。

weixin_26834815的博客 288

高效数据迁移:ICCAP到ADS的数据导入与导出实战指南

本文提供了从ICCAP到ADS进行高效、准确数据迁移的实战指南。针对射频与微波电路设计中的关键挑战,详细阐述了迁移前的战略规划、ICCAP数据的精细化导出(包括脚本化批处理)、ADS数据的多种导入方法(如Data Items、DML模型库及编程化API),并强调了数据完整性与准确性验证的重要性,确保模型参数和仿真结果在平台间可靠传递。

weixin_29291185的博客 132

开源模型应用落地-LangGraph101-ToolNode-智能工具调度的核心枢纽

通过ToolNode组件实现了智能体与工具之间的无缝衔接。

以微薄之力,予他人些许温暖. 3万+

上网第二课:办了百兆宽带,为什么测速只有一半?

最慢的那一环。

qq_36765170的博客 110

[ToolNode在LangGraph中的运用-03]ToolNode的工具如何执行?

从前面提供的实例可以看出,当我们传入携带`ToolCall`的`AIMessage`列表作为参数执行`ToolNode`后,它会返回一个`ToolMessage`的列表。其实返回类型不仅于输入参数的类型有关,还与工具函数的返回类型有关。那么`ToolNode`如何决定其返回类型,包含其中的工具又是如何执行的呢?

JaydenAI的博客 675

加密算法:深度解析Ed25519原理

在 Solana 开发过程中,我一直对 Ed25519 加密算法 如何生成公钥、签名以及验证签名的机制感到困惑。为了弄清这一点,我查阅了大量相关资料,终于对其流程有了更清晰的理解。在此记录实现过程,方便日后查阅。

盹猫的博客 1万+

你知道吗?其实这些都是AI——农作物监控AI

随着全球人口的不断增长,粮食需求日益增加。为了应对这一挑战,现代农业正在迅速转型,引入了许多先进技术来提高生产效率和作物产量。在这些技术中,人工智能(AI)在农作物监控方面的应用显得尤为重要。通过利用AI技术,农民和农业专家可以更好地管理农作物的生长,预防病虫害,并优化灌溉和施肥方案,从而实现农业生产的智能化和精准化。

AI科研社 367

[ToolNode在LangGraph中的运用-02]工具调用的拦截和异常处理

为了能够在LangGraph中更有效的利用`ToolNode`,我们对它的定义做一个详细的介绍。`ToolNode`继承了`RunnableCallable`,其`name`字段表示节点名称,上面我们将它称为`tools`节点就是因为它的默认值为“tools”。

JaydenAI的博客 716

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

langGraph从入门到精通(八)——基于LangGraph 实战实现ToolNode 工具节点与多工具自动调用机制

执行器配置、手动指令模拟、模型闭环集成。复现失败快速排查清单检查是否正确继承。确保ToolNode接收的是包含tool_calls的AIMessage。验证thread_id在config中是否已定义。欢迎评论区留言讨论核心主题相关的问题,若复现失败可留言你的系统版本+报错日志,我会及时回复~

swpucwf的博客 1090

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

LangGraph教程(二):工具调用、llm.bind_tools(tools)、ToolNode(tools)原理

本文介绍了LangGraph工具调用的实现原理,通过一个天气查询和乘法计算的小项目演示了工具调用流程。关键点包括:1)使用@tool装饰器定义工具函数,自动生成函数描述和参数信息;2)llm.bind_tools(tools)绑定工具使模型能识别可用工具;3)ToolNode(tools)节点实现工具执行。文章还深入分析了Python函数信息的获取方式,包括使用inspect模块获取函数签名,以及如何自定义JSON Schema来描述工具参数。这些机制共同实现了大模型对工具的自动发现和调用能力,开发者可以据

新人制作,若有问题,请私聊我,或评论区 2059

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

010-LangGraph-ToolNode 分析报告

本案例旨在介绍LangGraph中的ToolNode组件,这是LangGraph提供的一个预构建节点,专门用于处理工具调用。

rengang66的博客 667

【LangGraph实战】《LangGraph实战》_53.[第3章 状态图结构] ToolNode全解:LangGraph的工具调用中心

LangGraph核心技术解析:ToolNode深度剖析与LLM工具调用实践 本文将深入探讨LangGraph中ToolNode的核心机制,帮助开发者构建健壮的生产级LLM应用。主要内容包括: ToolNode的本质定位:作为LangGraph的"工具调用中心",ToolNode实现了从LLM意图到物理世界执行的全生命周期管理,包括解析指令、并发调度工具函数和回写执行结果。 构造与初始化:详细解析工具列表配置、状态映射机制和错误处理参数,避免常见的状态键不匹配和异常处理缺失问题。 执行机制:剖析单工具调用与

430

LangChain与LangGraph工具调用对比与实践指南

在AI应用开发中,工具调用(ToolNode)是实现复杂功能的核心技术环节。函数式编程与状态机是两种典型的工作流建模范式,LangChain通过LCEL表达式语言提供链式编程支持,而LangGraph则基于有限状态机(FSM)实现流程控制。从技术原理看,两者在工具调用场景都遵循输入-处理-输出的基本模式,都需要处理工具绑定、执行触发和结果标准化等共性问题。工程实践中,LangChain适合线性流水线场景,LangGraph则擅长处理带状态循环的复杂逻辑。通过混合架构将LangChain工具链封装为LangG

weixin_33888907的博客 421

LangGraph-KR项目中的ToolNode核心功能解析:如何高效调用工具链

在LangGraph-KR项目中,ToolNode是一个预构建的LangChain可运行组件(Runnable),它专门设计用于在图形化工作流中调用各种工具。ToolNode的主要功能是: 1. 接收包含消息列表的图形状态作为输入 2. 执行工具调用操作 3. 使用工具调用结果更新状态 这个组件特别适合与LangGraph的预构建Agent配合使用,只要状态中包含带有适当reducer的`me

gitblog_01045的博客 515

LangGraph神器:ToolNode一键搞定工具调用

权限校验、日志、参数清洗要在外面再加 FunctionNode。

xh2277659985的博客 35

【值得收藏】LangGraph工具调用实战:使用ToolNode扩展AI智能体能力边界

文章介绍了LangGraph框架中的ToolNode组件,这是处理工具调用的核心模块。ToolNode能够接收LLM的工具调用请求,执行预注册的工具,并将结果封装成ToolMessage返回。文章详细展示了如何使用@tool装饰器定义工具函数,以及如何将ToolNode集成到LangGraph图中构建ReAct智能体。通过ToolNode,开发者可以轻松扩展AI智能体的能力边界,实现更复杂的任务处理。

嘴巴吃糖了 585
上一篇: 深入浅出 LangGraph —— 第5章:条件边与动态路由
下一篇: 深入浅出 LangGraph —— 第7章:持久化与检查点机制
FrontAI
博客等级 码龄1年 61粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值