LangChain 工具箱大揭秘:让 AI 不只会聊天,还会查天气、算加法!

68 阅读4分钟

🌟 引子:AI 只会“嘴炮”?不,它还能干活!

你有没有想过,AI 聊天机器人除了陪你唠嗑、讲段子、写情书,还能干点正经事?比如:

  • 查北京今天是不是适合出门遛弯?
  • 帮你算算 3 + 5 到底等于几(别笑,有时候真需要)?

如果你还在用传统的大模型 API,那它大概率只会回你一句:“3+5=8,亲~”。但如果你用了 LangChain 的 Tools 模块,那你的 AI 就能真正“动手”了——它不仅能判断要不要调用工具,还能精准选择该用哪个工具,甚至把结果优雅地塞回给你。

今天,我们就来揭开 LangChain Tools 的神秘面纱,手把手教你打造一个“会干活”的 AI 助手!


🔧 什么是 LangChain Tools?

简单来说,Tools 是 LangChain 提供的一种机制,允许大语言模型(LLM)在对话中调用外部函数。你可以把它理解为给 AI 配了一套“瑞士军刀”——剪刀、螺丝刀、开瓶器……各司其职。

而 LLM 的任务,就是当用户提问时,智能判断:这个问题我能不能直接答?如果不能,该调用哪个工具?

✨ 这就像你问 Siri:“今天北京天气咋样?”
它不会凭空编答案,而是悄悄调用天气 API,再把结果告诉你。


🛠️ 实战演练:打造你的第一个“工具人” AI

我们用 DeepSeekdeepseek-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 等于多少?”
模型内部会思考:

“嗯……用户问的是数学计算。我有两个工具:addget_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() + zod schema)
  • 模型自动决策调用(无需硬编码 if-else)
  • 扩展性强(加新工具?一行 .bindTools([...]) 就搞定)

未来,随着 Agent(智能体)架构的发展,这种“思考 + 行动”的模式将成为 AI 应用的标配。