🌟 引子:AI 只会“嘴炮”?不,它还能干活!
你有没有想过,AI 聊天机器人除了陪你唠嗑、讲段子、写情书,还能干点正经事?比如:
- 查北京今天是不是适合出门遛弯?
- 帮你算算 3 + 5 到底等于几(别笑,有时候真需要)?
如果你还在用传统的大模型 API,那它大概率只会回你一句:“3+5=8,亲~”。但如果你用了 LangChain 的 Tools 模块,那你的 AI 就能真正“动手”了——它不仅能判断要不要调用工具,还能精准选择该用哪个工具,甚至把结果优雅地塞回给你。
今天,我们就来揭开 LangChain Tools 的神秘面纱,手把手教你打造一个“会干活”的 AI 助手!
🔧 什么是 LangChain Tools?
简单来说,Tools 是 LangChain 提供的一种机制,允许大语言模型(LLM)在对话中调用外部函数。你可以把它理解为给 AI 配了一套“瑞士军刀”——剪刀、螺丝刀、开瓶器……各司其职。
而 LLM 的任务,就是当用户提问时,智能判断:这个问题我能不能直接答?如果不能,该调用哪个工具?
✨ 这就像你问 Siri:“今天北京天气咋样?”
它不会凭空编答案,而是悄悄调用天气 API,再把结果告诉你。
🛠️ 实战演练:打造你的第一个“工具人” AI
我们用 DeepSeek 的 deepseek-chat 模型 + LangChain 来演示。代码基于 TypeScript(JS 也完全兼容),配合 zod 做参数校验,安全又优雅。
第一步:定义你的工具箱
🌦️ 天气查询工具(假装有数据库)
const fakeWeatherDB = {
北京: { temp: "30°C", condition: "晴", wind: "微风" },
上海: { temp: "28°C", condition: "多云", wind: "东风 3 级" },
广州: { temp: "32°C", condition: "阵雨", wind: "南风 2 级" }
}
⚠️ 注意:这是个“假”数据库,真实项目请对接和风天气、OpenWeather 等 API。
然后,用 tool() 包装成 LangChain 工具:
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("要查询天气的城市")
})
}
);
➕ 加法计算工具(虽然简单,但很经典)
const addTool = tool(
async ({a, b}) => String(a + b),
{
name: "add",
description: "计算两个数字的和",
schema: z.object({
a: z.number(),
b: z.number()
})
}
);
💡 为什么返回字符串?因为 LLM 的输入输出通常是文本,保持一致性更稳妥。
第二步:绑定工具到模型
const model = new ChatDeepSeek({
model: "deepseek-chat",
temperature: 0 // 降低随机性,让工具调用更稳定
}).bindTools([addTool, weatherTool]);
bindTools 是关键!它告诉模型:“嘿,你有这两个工具可用,遇到合适的问题就调用吧!”
第三步:发起提问 & 处理工具调用
const res = await model.invoke("北京今天的天气怎么样?");
if (res.tool_calls?.length) {
const call = res.tool_calls[0];
if (call.name === "get_weather") {
const result = await weatherTool.invoke(call.args);
console.log("最终结果:", result);
// 输出:当前北京的天气是30°C, 晴, 风力微风
}
}
🎯 模型不会直接返回天气,而是先返回一个“工具调用指令”,你需要手动执行工具并把结果反馈回去(在完整链式流程中,LangChain 会自动处理这一步)。
🤖 背后的魔法:LLM 如何决定调用哪个工具?
当你问:“3 + 5 等于多少?”
模型内部会思考:
“嗯……用户问的是数学计算。我有两个工具:
add和get_weather。显然应该用add,参数是 a=3, b=5。”
然后它生成一个结构化的 tool_call,包含:
- 工具名(
add) - 参数(
{a: 3, b: 5})
你的程序捕获这个调用,执行对应函数,再把结果拼回去。
这就是 Function Calling 的核心思想:解耦“决策”与“执行” 。
😂 幽默小剧场:如果 AI 不会用工具……
用户:北京今天下雨吗?
AI(没工具):据我所知,北京是中国首都,历史悠久……(开始背百科)
用户:……我就想知道要不要带伞!
AI:建议您关注当地气象部门发布的最新预报。(甩锅成功✅)
而有了 Tools 的 AI:
“当前北京的天气是30°C,晴,风力微风——放心出门,不用带伞,但记得防晒!😎”
🚀 进阶思考:Tools 能做什么?
别小看这两个玩具级工具,它们代表了无限可能:
| 工具类型 | 应用场景举例 |
|---|---|
| 数据库查询 | 查订单、查用户信息 |
| 外部 API 调用 | 天气、汇率、股票、地图导航 |
| 代码执行 | 数学计算、数据处理(沙箱环境!) |
| 自动化操作 | 发邮件、发短信、控制智能家居 |
🔒 安全提示:永远不要让 LLM 直接执行任意代码! 工具必须经过严格参数校验和权限控制。
✅ 总结:让 AI 从“话痨”变成“实干家”
LangChain 的 Tools 模块,本质上是在 赋予 LLM “行动能力” 。它不再是被动回答问题的“知识库”,而是能主动调用外部资源的“智能代理”。
通过本文的两个小例子,你应该已经感受到:
- 工具定义简单清晰(用
tool()+zodschema) - 模型自动决策调用(无需硬编码 if-else)
- 扩展性强(加新工具?一行
.bindTools([...])就搞定)
未来,随着 Agent(智能体)架构的发展,这种“思考 + 行动”的模式将成为 AI 应用的标配。