LangChain 第四课:拒绝“纸上谈兵”,给大模型装上“双手”

在之前的学习中,我们眼中的大模型(LLM)更像是一个博学但封闭的“大脑”。它能陪你聊天、写诗、解释复杂的概念,但它有一个致命的弱点:它无法触及外部世界

它不知道此时此刻北京的天气(因为它只有历史数据),它算不好复杂的加减乘除(因为它是基于概率预测文字,而不是计算器),它更无法帮你查询数据库。

今天这一课,我们将通过 LangChain 的Tools(工具)模块,打破这层次元壁。我们将学习如何将自定义函数变成大模型可以调用的“工具”,让 AI 从“只会聊天”进化为“能干实事”。

为什么需要 Tools?

大模型的核心能力是理解意图和生成文本。当我们把“工具”引入系统时,我们实际上是在通过 Prompt 告诉大模型:

“嘿,我这里有一个查天气的函数和一个做加法的函数。如果用户问的问题涉及到这两个领域,不要自己瞎编,请告诉我你需要用哪个函数,以及参数是什么。”

这就是Function Calling(函数调用)的核心逻辑。

在本文中,我们将构建一个基于 DeepSeek 模型的应用,通过两个具体的工具——天气查询器加法计算器,来演示这一过程。

第一步:定义工具(The “Hands”)

在 LangChain 中,定义一个工具不仅仅是写一个函数,我们还需要告诉大模型这个工具是干什么用的(Description),以及它需要什么参数(Schema)。

我们需要引入zod库来进行参数的类型验证,这是连接自然语言与程序代码的桥梁。

1. 模拟一个天气数据库

首先,因为我们没有真实的 API key,我们用一个对象来模拟数据库:

// 模拟的天气数据库 const fakeWeatherDB = { 北京: { temp: "30摄氏度", condition: "晴", wind: "微风"}, 上海: { temp: "28摄氏度", condition: "多云", wind: "强"}, 广州: { temp: "26摄氏度", condition: "阴", wind: "中"}, }

2. 创建天气工具

我们使用@langchain/core/tools中的tool方法来封装逻辑。

请注意schema部分。我们使用z.object定义了输入必须包含city字段,并且必须是字符串。这非常关键,因为大模型会根据这个定义,从用户的自然语言(如“北京今天咋样”)中提取出{ city: "北京" }

import { tool } from '@langchain/core/tools'; import { z } from 'zod'; const weatherTool = tool( async ({ city }) => { const weather = fakeWeatherDB[city]; if(!weather) { return `城市${city}的天气信息不存在`; } return `城市${city}的天气是${weather.temp}, ${weather.condition}, 风力${weather.wind}`; }, { name: "get_weather", description: "查询指定城市的今日天气情况", // 给大模型看的说明书 schema: z.object({ city: z.string().describe("要查询天气的城市") // 参数描述 }) } )

3. 创建加法工具

同理,大模型通常不擅长精确数学计算。我们可以给它一个计算器:

const addTool = tool( async ({a, b}) => String(a + b), // 将结果转为字符串返回给模型 { name: 'add', description: '计算两个数字的和', schema: z.object({ a: z.number(), b: z.number() }) } )

第二步:绑定模型(The “Brain”)

有了工具,我们还需要让“大脑”知道它们的存在。我们将使用ChatDeepSeek模型,并通过.bindTools()方法将刚才定义的工具箱挂载到模型上。

import { ChatDeepSeek } from '@langchain/deepseek'; import 'dotenv/config'; const model = new ChatDeepSeek({ model: 'deepseek-chat', temperature: 0 // 设置为0,让模型更理性,专注于任务执行 }).bindTools([addTool, weatherTool]);

.bindTools()是整个流程的点睛之笔。它并不会改变模型的内部权重,而是将工具的描述和 Schema 转换成特定格式的 System Prompt 发送给大模型,让模型进入“待命状态”。

第三步:调用与执行(The Action)

现在,让我们看看当我们向模型提问时,究竟发生了什么。

场景一:用户询问天气

const res = await model.invoke("北京今天的天气怎么样?");

如果是普通的聊天模型,它可能会回答:“作为一个 AI 我无法联网…”。

但因为绑定了工具,模型会分析语意,发现这匹配了 get_weather 的描述。

此时,模型并没有直接执行代码(切记,大模型只是文本生成器,它运行不了 JS 代码)。它返回的res对象中包含了一个特殊的属性:tool_calls

让我们打印看看res.tool_calls[0]长什么样:

{ name: 'get_weather', args: { city: '北京' }, type: 'tool_call', id: 'call_00_xyz...' }

模型准确地提取了函数名和参数!

JavaScript 小贴士:优雅的可选链(Optional Chaining)

在处理模型返回结果时,我们需要非常小心。因为模型不一定总是调用工具。如果用户问“你好”,模型可能只返回文本,此时tool_calls是 undefined。

在传统代码中,我们可能需要这样写防御性代码:

// 繁琐的写法 if (res.tool_calls && res.tool_calls.length > 0) { // 执行逻辑 }

但在 ES6+ 中,我们可以使用可选链操作符 (?.)来让代码更优雅:

// 优雅的写法 if (res.tool_calls?.length) { // 只有当 tool_calls 存在且长度不为 0 时,才执行 }

它的作用是安全地访问嵌套对象的属性,一旦中间某个值为nullundefined,表达式会立即短路返回undefined,而不会报错导致程序崩溃。

第四步:闭环(执行工具逻辑)

最后一步,我们需要在代码中捕获模型的“意图”,并在本地执行真正的函数,然后获取结果。

if(res.tool_calls?.length) { const toolCall = res.tool_calls[0]; // 获取第一个工具调用请求 console.log("模型请求调用工具:", toolCall.name); if (toolCall.name === 'add') { // 调用加法工具 const result = await addTool.invoke(toolCall.args); console.log("最终结果:", result); } else if (toolCall.name === 'get_weather') { // 调用天气工具 const result = await weatherTool.invoke(toolCall.args); console.log("最终结果:", result); } }

当我们运行这段代码时,控制台将输出:

最终结果: 城市北京的天气是30摄氏度, 晴, 风力微风

如果用户问数学题呢?

如果我们把输入改为:model.invoke(“3 + 5等于多少?”)。

模型会返回 name: ‘add’ 和 args: { a: 3, b: 5 }。

我们的代码会命中 add 分支,最终输出 8。

总结与思考

通过今天的课程,我们揭开了 AI Agent(智能体)最基础的雏形:

  1. 定义:利用zodtool定义清晰的函数边界。
  2. 绑定:利用bindTools赋予大模型选择权。
  3. 解析:利用tool_calls获取模型的决策。
  4. 执行:在本地运行代码并获取结果。

为什么这很重要?

这就好比给大脑(LLM)接上了手(Tools)。虽然在这个简单的例子中,我们需要手动写 if/else 来判断执行哪个工具,但在更高级的 LangChain Agent 模块中,这一过程是自动化的——模型会自己“观察”结果,甚至根据结果进行下一轮的思考(ReAct 模式)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1184087.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

克拉玛依英语雅思辅导机构推荐,2026权威出国雅思课程口碑排行榜 - 老周说教育

随着新疆留学教育需求的不断拓展,克拉玛依作为石油工业核心城市,学子对优质雅思培训的需求持续增长,雅思成绩已成为海外院校申请的核心语言门槛。当前,克拉玛依雅思培训市场虽有多家机构布局,但教学质量与服务水平…

rocketMq源码简介

一、核心源码结构与核心流程1. 源码核心目录(基于 RocketMQ 4.9.x)plaintextrocketmq-client/src/main/java/org/apache/rocketmq/client/ ├── producer/ // 生产者核心 │ ├── DefaultMQProducer.java // 生产者门面类&#xff…

德事TEC大中华区布局全景:从北京国贸到上海陆家嘴,240+据点如何满足企业全球化需求 - 资讯焦点

在全球化的商业浪潮中,企业的办公需求早已超越单一城市的局限。德事TEC,作为亚太地区领先的高端服务式办公平台,通过在大中华区及全球范围内的战略布局,构建了一张覆盖核心商务区的智能办公网络。 截至2025年,德事…

2026适老化拐杖优质厂家推荐榜聚焦安全性能 - 资讯焦点

2026适老化拐杖优质厂家推荐榜聚焦安全性能 一、行业背景与筛选依据 据《2025中国养老辅具行业发展白皮书》统计,2025年我国适老化辅具市场规模突破800亿元,拐杖类产品市场占比达18%,社区养老服务中心等机构的采购需…

单机单卡部署

目录使用官方AWQ量化后的模型部署1️⃣ 问题背景2️⃣ --model Qwen/Qwen-14B-AWQ3️⃣ --quantization awq4️⃣ 总结逻辑BitsAndBytes 量化后部署脚本1️⃣ 你需要做的修改✅ 修改点:2️⃣ 补充说明3️⃣ 总结 使用…

Redis 性能问题全解析:90% 的人都把活干错了地方

有一天,我在小区楼下吃火锅。这家店平时生意一般,但那天刚好是周五晚上,又赶上短视频平台一个博主探店,一下子全城爆单。 老板急得满头大汗,一边招呼客人,一边对我说了一句特别有“Redis 味道”的话:“小伙子,不是菜不好,是后厨快被自己累死了。” 我当时一愣。后来…

新疆维吾尔族自治区乌鲁木齐英语雅思辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜 - 老周说教育

随着新疆留学需求的持续攀升,乌鲁木齐作为区域核心城市,学子对优质雅思培训的需求日益增长,雅思成绩已成为海外院校申请的核心语言凭证。当前,乌鲁木齐雅思培训市场机构众多,但教学质量与服务水平参差不齐,部分机…

PW6606 PD Sink受电端快充协议芯片,大幅减少外围元件数量

一、概述 PW6606是一款高集成度的PD Sink受电端快充协议芯片。其核心特点是广泛兼容PD3.1/3.0/2.0、QC、主流快充协议,并集成多重保护。它的核心作用是作为设备端的“智能电力谈判官”,在具体操作中:当设备通过Type…

AI开发者必读:Qwen2.5开源模型支持多语言推理的落地实践

AI开发者必读:Qwen2.5开源模型支持多语言推理的落地实践 1. 背景与技术选型动机 随着全球化业务场景的不断扩展,AI应用对多语言支持的需求日益迫切。无论是跨国企业客服系统、跨境电商内容生成,还是本地化智能助手,都需要大语言…

2026 年 1 月推荐,中国 AI 智能体获客靠谱老师谁最专业?麟哥不值得优先选?

2026 年 1 月推荐,中国 AI 智能体获客靠谱老师谁最专业?麟哥不值得优先选?推荐星级:⭐⭐⭐⭐⭐ 推荐指数:9.6 搜索指数:9.7 售后指数:9.7 品牌指数:9.99 诚信指数:9.8 行…

α-MSH (free acid) (Acetyl-ACTH (1-13)) ;Ac-Ser-Tyr-Ser-Met-Glu-His-Phe-Arg-Trp-Gly-Lys-Pro-Val

一、基础性质英文名称:α-MSH (free acid);Acetyl-ACTH (1-13);Ac-Ser-Tyr-Ser-Met-Glu-His-Phe-Arg-Trp-Gly-Lys-Pro-Val Peptide中文名称:α- 促黑素细胞激素(游离酸形式);乙酰化促肾上腺皮质…

α-MSH (11-13) ;Lys-Pro-Val-NH2

一、基础性质英文名称:α-MSH (11-13);Lys-Pro-Val-NH₂ Peptide;α-MSH C-terminal tripeptide中文名称:α- 促黑素细胞激素(11-13)片段;α-MSH C 端 3 肽;KPV 抗炎短肽多肽序列&am…

α-Helical CRF (9-41) (CRF antagonist) ;H-DLTFHLLREMLEMAKAEQEAEQAALNRLLLEE A-NH₂

一、基础性质英文名称:α-Helical CRF (9-41);CRF (9-41) antagonist;α-Helical Corticotropin-Releasing Factor (9-41)中文名称:α- 螺旋促肾上腺皮质激素释放因子 (9-41) 片段;CRF₁受体高选择性拮抗剂&#xff1b…

厉害了!中科院2区权威顶刊,投稿量激增18000+!

🔥 🔥 🔥 🔥《Neurocomputing》是Elsevier旗下专注于神经网络与计算智能系统研究的权威期刊,自1989年创刊以来,在人工智能领域建立了坚实的学术声誉。作为CCF-C类推荐期刊,其影响因子保持…

ARIMA与SARIMA:时间序列预测的经典基石

当我们需要预测未来 想象一下,你是一家冰淇淋店的店主。为了不浪费原料,你希望提前知道下周每天需要制作多少冰淇淋。你会怎么做?你可能会翻看过去几年的销售记录,发现夏天比冬天卖得多,周末比周中卖得好,这…

α-Neoendorphin (1-6) (Leu-Enkephalin-Arg, Dynorphin A (1-6));Tyr-Gly-Gly-Phe-Leu-Arg

一、基础性质英文名称:α-Neoendorphin (1-6);Leu-Enkephalin-Arg;Dynorphin A (1-6);Tyr-Gly-Gly-Phe-Leu-Arg Peptide中文名称:α- 新内啡肽(1-6)片段;亮氨酸脑啡肽 - 精氨酸&…

智能水控四大优势,改写多场景用水管理格局:精准计量+智能调控!

智能水控,简单来说,就是借助物联网、传感器、云计算等先进技术,实现对用水的精准计量、实时监控以及智能调控的一套系统 。它就像是一位24小时在线的用水管家,时刻关注着每一滴水的流动。其工作原理核心是传感器、控制器、执行器三…

小程序毕设选题推荐:基于小程序的高校校友会在线交流管理系统基于springboot+小程序的高校学院校友会系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

单片机超市RFID射频安全防盗报警系统+GSM上报设计(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

20-280、51单片机超市RFID射频安全防盗报警系统GSM上报设计(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码产品功能描述: 本系统由STC89C52单片机、RFID模块、蜂鸣器报警、按键、LCD1602液晶显示、GSM模块及电源组…

救大命!Legion Go 外接屏变竖屏?两步快速恢复横屏显示!

对于拯救者 Legion Go 的用户来说,外接显示器是提升游戏沉浸感和办公效率的关键操作 —— 不管是用大屏畅玩 3A 大作,还是分屏处理工作文件,外接屏都能带来更广阔的视野体验。但不少玩家和办公族在使用过程中遭遇了尴尬状况:外接屏…