
作为开发者你是否曾困惑为什么大模型能查股票价格、查天气一个只会“词语接龙”的概率模型怎么突破虚拟限制调用外部工具明明训练数据里没有实时数据却能返回精准的股票收盘价这篇文章我会用可直接运行的Node.js代码拆解LLM工具调用的底层逻辑从0到1实现股票价格查询的工具调用让你彻底搞懂工具调用不是“黑魔法”而是精心设计的交互流程如何用JSON Schema给大模型“植入工具认知”传统代码如何和大模型协作完成任务一、核心认知LLM本质是“缸中大脑”先打破一个误区大模型没有自我意识。它本质上只是一个“Next Token Prediction”下一个词预测的概率模型像被困在服务器里的“缸中大脑”——看不见屏幕、摸不到键盘只能处理文本。工具调用的核心是把复杂的软件函数比如查股票价格降维成大模型能理解的自然语言说明书再通过传统代码执行工具逻辑最后把结果返回给大模型生成最终回答。二、实战场景实现股票收盘价查询工具调用我们以“查询青岛啤酒收盘价”为例完整实现一次LLM工具调用流程技术栈Node.js dotenv环境变量管理OpenAI SDK兼容DeepSeek API自定义工具函数 大模型交互逻辑步骤1环境准备与依赖安装首先初始化项目安装所需依赖# 初始化package.jsonnpminit-y# 安装依赖npminstallopenai dotenv步骤2完整可运行代码创建index.js文件复制以下代码记得配置.env文件importOpenAIfromopenai;importdotenvfromdotenv;dotenv.config();// 初始化DeepSeek客户端兼容OpenAI SDKconstclientnewOpenAI({apiKey:process.env.DEEPSEEK_API_KEY,baseURL:process.env.DEEPSEEK_BASE_URL});// 1. 定义工具给大模型的使用说明书consttools[{type:function,function:{name:get_closing_price,description:获取指定股票的收盘价,// 描述必须清晰影响大模型决策parameters:{type:object,properties:{name:{type:string,description:股票名称例如青岛啤酒、贵州茅台}},required:[name]// 必传参数约束大模型调用格式}}},{type:function,function:{name:get_weather,description:获取指定城市的天气,parameters:{type:object,properties:{city:{type:string,description:城市名称例如上海、北京}},required:[city]}}}];// 2. 传统软件逻辑实现工具函数真实场景可替换为API调用functionget_closing_price(name){if(name青岛啤酒){return67.92;}elseif(name贵州茅台){return1488.21;}else{return未找到该股票;}}// 3. 封装大模型调用函数asyncfunctionsendMessage(messages){constresawaitclient.chat.completions.create({model:deepseek-v4-pro,// 替换为你使用的模型messages,tools,// 传入工具定义tool_choice:auto// 让大模型自动决定是否调用工具});returnres;}// 4. 核心交互逻辑asyncfunctionmain(){// 初始化对话上下文letmessages[{role:user,content:青岛啤酒的收盘价是多少}];// 第一次调用大模型判断是否需要调用工具constresponseawaitsendMessage(messages);constmessageresponse.choices[0].message;console.log(模型返回message 对象,JSON.stringify(message));// 将大模型的响应加入上下文messages.push({role:message.role,content:message.content,tool_calls:message.tool_calls});// 关键判断如果大模型返回了工具调用指令if(response.choices[0].message.tool_calls){consttoolCallresponse.choices[0].message.tool_calls[0];// 处理股票价格查询工具if(toolCall.function.nameget_closing_price){// 解析大模型传递的参数constargsJSON.parse(toolCall.function.arguments);// 执行传统工具函数获取结果constpriceget_closing_price(args.name);console.log(股票收盘价,price);// 将工具执行结果加入上下文关键返回给大模型messages.push({role:tool,// 标记为工具返回结果content:price,tool_call_id:toolCall.id// 通过ID关联工具调用});console.log(更新后完整对话上下文:,messages);// 第二次调用大模型基于工具结果生成最终回答constfinalResawaitsendMessage(messages);console.log(最终模型返回:,finalRes.choices[0].message.content);}elseif(toolCall.function.nameget_weather){// 扩展天气查询工具逻辑可自行实现}}}// 执行主函数main();步骤3配置环境变量创建.env文件填入你的DeepSeek API信息DEEPSEEK_API_KEY你的DeepSeek API密钥 DEEPSEEK_BASE_URLDeepSeek API的baseURL例如https://api.deepseek.com/v1步骤4运行代码nodeindex.js运行后你会看到大模型先返回工具调用指令而非直接回答代码执行get_closing_price函数获取价格工具结果返回给大模型大模型生成最终的自然语言回答三、关键拆解工具调用的3个核心阶段1. 认知植入把工具“翻译”成大模型能懂的语言代码里的tools数组就是给大模型的“工具使用说明书”核心是JSON Schemaname工具函数名唯一标识description工具用途大模型靠这个判断是否调用parameters参数约束类型、描述、必传项⚠️ 踩坑提醒描述越具体大模型调用越精准比如把“股票名称”改成“股票名称例如青岛啤酒、贵州茅台”能大幅降低参数错误率。参数约束必须严格比如required否则大模型可能漏传参数。2. 决策阶段大模型判断是否调用工具当用户提问“青岛啤酒的收盘价是多少”大模型会检查自身训练数据没有实时股票数据无法直接回答匹配工具列表发现get_closing_price工具能解决这个问题返回tool_calls字段包含要调用的工具名、参数、唯一ID3. Runtime介入传统代码执行工具逻辑这是最关键的“人类兜底”环节代码解析tool_calls里的指令调用对应的传统函数get_closing_price获取结果后把结果以role: tool的形式加入对话上下文再次调用大模型让它基于工具结果生成自然语言回答四、踩坑提醒避坑指南工具描述模糊导致调用失败❌ 错误示例description: 查股票价格✅ 正确示例description: 获取指定A股股票的当日收盘价参数为股票全称参数解析异常大模型返回的arguments是字符串必须用JSON.parse解析建议加try-catchletargs;try{argsJSON.parse(toolCall.function.arguments);}catch(e){console.error(参数解析失败:,e);args{};}上下文管理混乱每次交互都要把大模型响应、工具结果加入messages数组否则大模型会“失忆”无法关联工具结果生成回答。API兼容问题不同厂商的LLM API如DeepSeek、OpenAI对tool_calls的格式略有差异需根据文档调整。五、总结工具调用的本质是LLM的语言能力 传统代码的执行能力的结合用JSON Schema给大模型“植入工具认知”大模型做“决策”判断是否调用工具、传什么参数传统代码做“执行”调用工具、获取结果大模型做“总结”把工具结果转换成自然语言回答这套逻辑不仅适用于股票查询还能扩展到天气查询、Excel分析、网页搜索等场景——这也是AI Agent的核心基础。最后本文的完整源码包含天气查询工具的扩展实现已整理好你可以查看仓库获取[完整源码地址]替换为你的源码地址若无则注明“私信我获取完整源码”。掌握工具调用后你可以解锁更多场景让大模型调用API查实时数据、操作数据库、甚至控制硬件设备——这才是AI落地的核心能力。如果这篇文章对你有帮助欢迎点赞收藏后续会更新“AI Agent操作本地文件”“多工具串联调用”等实战内容# 告别LLM能力边界30分钟掌握AI工具调用核心逻辑作为开发者你是否曾困惑为什么大模型能查股票价格、查天气一个只会“词语接龙”的概率模型怎么突破虚拟限制调用外部工具明明训练数据里没有实时数据却能返回精准的股票收盘价这篇文章我会用可直接运行的Node.js代码拆解LLM工具调用的底层逻辑从0到1实现股票价格查询的工具调用让你彻底搞懂工具调用不是“黑魔法”而是精心设计的交互流程如何用JSON Schema给大模型“植入工具认知”传统代码如何和大模型协作完成任务一、核心认知LLM本质是“缸中大脑”先打破一个误区大模型没有自我意识。它本质上只是一个“Next Token Prediction”下一个词预测的概率模型像被困在服务器里的“缸中大脑”——看不见屏幕、摸不到键盘只能处理文本。工具调用的核心是把复杂的软件函数比如查股票价格降维成大模型能理解的自然语言说明书再通过传统代码执行工具逻辑最后把结果返回给大模型生成最终回答。二、实战场景实现股票收盘价查询工具调用我们以“查询青岛啤酒收盘价”为例完整实现一次LLM工具调用流程技术栈Node.js dotenv环境变量管理OpenAI SDK兼容DeepSeek API自定义工具函数 大模型交互逻辑步骤1环境准备与依赖安装首先初始化项目安装所需依赖# 初始化package.jsonnpminit-y# 安装依赖npminstallopenai dotenv步骤2完整可运行代码创建index.js文件复制以下代码记得配置.env文件importOpenAIfromopenai;importdotenvfromdotenv;dotenv.config();// 初始化DeepSeek客户端兼容OpenAI SDKconstclientnewOpenAI({apiKey:process.env.DEEPSEEK_API_KEY,baseURL:process.env.DEEPSEEK_BASE_URL});// 1. 定义工具给大模型的使用说明书consttools[{type:function,function:{name:get_closing_price,description:获取指定股票的收盘价,// 描述必须清晰影响大模型决策parameters:{type:object,properties:{name:{type:string,description:股票名称例如青岛啤酒、贵州茅台}},required:[name]// 必传参数约束大模型调用格式}}},{type:function,function:{name:get_weather,description:获取指定城市的天气,parameters:{type:object,properties:{city:{type:string,description:城市名称例如上海、北京}},required:[city]}}}];// 2. 传统软件逻辑实现工具函数真实场景可替换为API调用functionget_closing_price(name){if(name青岛啤酒){return67.92;}elseif(name贵州茅台){return1488.21;}else{return未找到该股票;}}// 3. 封装大模型调用函数asyncfunctionsendMessage(messages){constresawaitclient.chat.completions.create({model:deepseek-v4-pro,// 替换为你使用的模型messages,tools,// 传入工具定义tool_choice:auto// 让大模型自动决定是否调用工具});returnres;}// 4. 核心交互逻辑asyncfunctionmain(){// 初始化对话上下文letmessages[{role:user,content:青岛啤酒的收盘价是多少}];// 第一次调用大模型判断是否需要调用工具constresponseawaitsendMessage(messages);constmessageresponse.choices[0].message;console.log(模型返回message 对象,JSON.stringify(message));// 将大模型的响应加入上下文messages.push({role:message.role,content:message.content,tool_calls:message.tool_calls});// 关键判断如果大模型返回了工具调用指令if(response.choices[0].message.tool_calls){consttoolCallresponse.choices[0].message.tool_calls[0];// 处理股票价格查询工具if(toolCall.function.nameget_closing_price){// 解析大模型传递的参数constargsJSON.parse(toolCall.function.arguments);// 执行传统工具函数获取结果constpriceget_closing_price(args.name);console.log(股票收盘价,price);// 将工具执行结果加入上下文关键返回给大模型messages.push({role:tool,// 标记为工具返回结果content:price,tool_call_id:toolCall.id// 通过ID关联工具调用});console.log(更新后完整对话上下文:,messages);// 第二次调用大模型基于工具结果生成最终回答constfinalResawaitsendMessage(messages);console.log(最终模型返回:,finalRes.choices[0].message.content);}elseif(toolCall.function.nameget_weather){// 扩展天气查询工具逻辑可自行实现}}}// 执行主函数main();步骤3配置环境变量创建.env文件填入你的DeepSeek API信息DEEPSEEK_API_KEY你的DeepSeek API密钥 DEEPSEEK_BASE_URLDeepSeek API的baseURL例如https://api.deepseek.com/v1步骤4运行代码nodeindex.js运行后你会看到大模型先返回工具调用指令而非直接回答代码执行get_closing_price函数获取价格工具结果返回给大模型大模型生成最终的自然语言回答三、关键拆解工具调用的3个核心阶段1. 认知植入把工具“翻译”成大模型能懂的语言代码里的tools数组就是给大模型的“工具使用说明书”核心是JSON Schemaname工具函数名唯一标识description工具用途大模型靠这个判断是否调用parameters参数约束类型、描述、必传项⚠️ 踩坑提醒描述越具体大模型调用越精准比如把“股票名称”改成“股票名称例如青岛啤酒、贵州茅台”能大幅降低参数错误率。参数约束必须严格比如required否则大模型可能漏传参数。2. 决策阶段大模型判断是否调用工具当用户提问“青岛啤酒的收盘价是多少”大模型会检查自身训练数据没有实时股票数据无法直接回答匹配工具列表发现get_closing_price工具能解决这个问题返回tool_calls字段包含要调用的工具名、参数、唯一ID3. Runtime介入传统代码执行工具逻辑这是最关键的“人类兜底”环节代码解析tool_calls里的指令调用对应的传统函数get_closing_price获取结果后把结果以role: tool的形式加入对话上下文再次调用大模型让它基于工具结果生成自然语言回答四、踩坑提醒避坑指南工具描述模糊导致调用失败❌ 错误示例description: 查股票价格✅ 正确示例description: 获取指定A股股票的当日收盘价参数为股票全称参数解析异常大模型返回的arguments是字符串必须用JSON.parse解析建议加try-catchletargs;try{argsJSON.parse(toolCall.function.arguments);}catch(e){console.error(参数解析失败:,e);args{};}上下文管理混乱每次交互都要把大模型响应、工具结果加入messages数组否则大模型会“失忆”无法关联工具结果生成回答。API兼容问题不同厂商的LLM API如DeepSeek、OpenAI对tool_calls的格式略有差异需根据文档调整。五、总结工具调用的本质是LLM的语言能力 传统代码的执行能力的结合用JSON Schema给大模型“植入工具认知”大模型做“决策”判断是否调用工具、传什么参数传统代码做“执行”调用工具、获取结果大模型做“总结”把工具结果转换成自然语言回答这套逻辑不仅适用于股票查询还能扩展到天气查询、Excel分析、网页搜索等场景——这也是AI Agent的核心基础。最后本文的完整源码包含天气查询工具的扩展实现已整理好你可以查看仓库获取[Knowledge_Repository/ai/agent/tool_use at main · Guwen-yue/Knowledge_Repository]替换为你的源码地址若无则注明“私信我获取完整源码”。掌握工具调用后你可以解锁更多场景让大模型调用API查实时数据、操作数据库、甚至控制硬件设备——这才是AI落地的核心能力。如果这篇文章对你有帮助欢迎点赞收藏后续会更新“AI Agent操作本地文件”“多工具串联调用”等实战内容