别再把大模型只当聊天机器人:LangChain Tool 才是 AI 应用的分水岭

很多人第一次用大模型,都会写出这样的代码:

arduino 复制代码
const res = await model.invoke("北京今天天气怎么样?")

然后模型会很"诚恳"地回答:

我无法获取实时天气,但你可以查看相关网站。

这其实暴露了一个核心问题:

你用的不是 AI 应用,而只是一个"会说话的模型"。


一、真正的能力差距,不在 Prompt,而在 Tool

Prompt 再精致,模型本质仍然只能"生成文本"。

而真实世界的应用需要的是:

  • 计算
  • 查询数据
  • 调用接口
  • 执行业务逻辑

LangChain 给出的答案是:Tool

Tool 不是让你"多写点代码",

而是让模型具备"执行能力"。


二、Tool 是什么?一句话说明白

Tool = 一个可被大模型主动调用的函数。

注意这几个关键词:

  • 主动调用
  • 参数由模型生成
  • 是否调用由模型判断

这和你在代码里写 if / else 有本质区别。


三、一个最基础的 Tool:加法函数

先从最简单的开始。

css 复制代码
const addTool = tool(
  async ({ a, b }) => String(a + b),
  {
    name: "add",
    description: "计算两个数字的和",
    schema: z.object({
      a: z.number(),
      b: z.number()
    })
  }
)

效果图:

这里有三个关键点:

  1. 函数本身并不重要,重要的是它能被模型调用
  2. schema 决定模型如何构造参数
  3. description 决定模型是否会选择这个 Tool

Tool 的"说明文字",是写给模型看的,不是给人看的。


四、Tool 的核心不是代码,而是语义设计

很多人用不好 Tool,原因不是代码写错,而是语义不清

如果你的 Tool:

  • 名字含糊
  • 描述模棱两可
  • 参数意义不明确

模型就不会稳定地调用它。

可以理解为:

Tool 是你给模型的一份「能力说明书」。


五、一个更接近真实业务的例子:天气查询

用一个假数据源模拟真实系统:

css 复制代码
const fakeWeatherDB = {
  北京: { temp: "30°C", condition: "晴", wind: "微风" },
  上海: { temp: "28°C", condition: "多云", wind: "东风 3 级" },
  广州: { temp: "32°C", condition: "阵雨", wind: "南风 2 级" },
}

定义对应的 Tool:

javascript 复制代码
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("要查询天气的城市")
    })
  }
)

这个 Tool 已经非常接近真实业务中的"服务层"。


六、把 Tool 交给模型

arduino 复制代码
const model = new ChatDeepSeek({
  model: "deepseek-chat",
  temperature: 0
}).bindTools([addTool, weatherTool])

这一行代码,本质是在告诉模型:

你不需要什么都会,

你只需要学会什么时候该用哪个工具。


七、模型是如何决定调用 Tool 的?

arduino 复制代码
const res = await model.invoke("北京今天天气怎么样")

如果模型认为需要工具,会返回:

复制代码
res.tool_calls

你只需要按调用结果执行即可:

vbnet 复制代码
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)
  }
}

此时模型只负责"决策",

代码只负责"执行"。

效果图:


八、Tool 在架构中的真实定位

如果放到工程视角来看:

  • Model:意图理解 + 决策
  • Tool:真实能力(计算、查询、操作)
  • 你的代码:调度与安全边界

可以把 Tool 理解为:

AI 系统里的 Service 层。


九、为什么说 Tool 是 AI 应用的分水岭

没有 Tool:

  • AI 只能生成文本
  • 无法落地真实业务

有 Tool:

  • AI 可以参与业务流程
  • 可以接数据库、接口、文件系统
  • 可以作为"智能调度器"存在

这是从"玩模型"到"做系统"的转折点。


十、总结

Prompt 决定模型说什么,

Tool 决定模型能做什么。

如果你愿意,下一步可以继续深入:

  • Tool + 多模型协作
  • Tool + Agent 自动决策
  • 用 Tool 设计一个完整 AI 后端架构

这才是 LangChain 真正值得花时间研究的地方。

相关推荐
香蕉君4 小时前
第一品——LangChain核心基础
人工智能·langchain
kimi-2224 小时前
基于 LangChain 的 RAG(检索增强生成)
langchain
大模型RAG和Agent技术实践6 小时前
从零构建:基于 LangGraph 的医疗问诊智能体实战(完整源代码)
人工智能·langchain·agent·langgraph
3秒一个大9 小时前
LangChain 中的 Output 解析器与 Zod:用法与意义
javascript·langchain
kimi-22212 小时前
短期记忆中ChatMessageHistory()、 InMemoryChatMessageHistory()区别
langchain
SCBAiotAigc1 天前
langchain1.2学习笔记(一):安装langchain
人工智能·python·langchain
我想问问天1 天前
【从0到1大模型应用开发实战】02|用 LangChain 和本地大模型,完成第一次“可控对话
后端·langchain·aigc
韭菜炒大葱1 天前
LangChain 二:输出结果定制与历史管理能力详解
前端·langchain·openai
低调小一1 天前
LangChain 入门:把大模型“组装”成应用的那套乐高(5分钟用通义千问 + LCEL 跑通 Demo)
langchain