使用 LangChain 与 DeepSeek 模型实现工具调用:以天气查询和加法计算为例

92 阅读3分钟

使用 LangChain 与 DeepSeek 模型实现工具调用:以天气查询和加法计算为例

在大模型(LLM)应用开发中,单纯依赖模型自身的知识往往无法满足实际业务需求。例如,我们可能需要实时获取外部数据(如天气、股票价格),或者执行精确的数学运算。为此,LangChain 提供了强大的 Tools(工具)机制,允许大模型在推理过程中动态调用预定义的函数,从而扩展其能力边界。

本文将通过一个具体示例,展示如何使用 LangChain + DeepSeek 模型 实现工具调用功能,包括:

  • 定义自定义工具(Tool)
  • 将工具绑定到大模型
  • 解析模型返回的工具调用请求并执行相应逻辑

1. 环境准备

首先,确保已安装必要依赖:

bash
编辑
npm install @langchain/deepseek @langchain/core zod dotenv

并配置 .env 文件,填入 DeepSeek API 密钥:

env
编辑
DEEPSEEK_API_KEY=your_api_key_here

2. 定义工具函数

2.1 天气查询工具

我们模拟一个简单的天气数据库,并创建 weatherTool

javascript
编辑
const fakeWeatherDB = {
  北京: { temp: "30°C", condition: "晴", wind: "微风" },
  上海: { temp: "28°C", condition: "多云", wind: "东风 3 级" },
  广州: { temp: "32°C", condition: "阵雨", wind: "南风 2 级" }
};

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("要查询天气的城市")
    })
  }
);

2.2 加法计算工具

再定义一个简单的数学工具:

javascript
编辑
const addTool = tool(
  async ({ a, b }) => String(a + b),
  {
    name: "add",
    description: "计算两个数字的和",
    schema: z.object({
      a: z.number(),
      b: z.number()
    })
  }
);

注意:工具函数必须返回字符串(LangChain 要求),因此我们将数字结果转为字符串。

3. 绑定工具到 DeepSeek 模型

使用 @langchain/deepseek 创建模型实例,并通过 .bindTools() 方法注册工具:

javascript
编辑
const model = new ChatDeepSeek({
  model: "deepseek-chat",
  temperature: 0
}).bindTools([addTool, weatherTool]);

设置 temperature: 0 可提高模型输出的确定性,更适合工具调用场景。

4. 调用模型并处理工具响应

当用户提问时,模型会判断是否需要调用工具:

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

如果模型决定调用工具,res.tool_calls 将包含调用信息。我们需手动执行对应工具:

javascript
编辑
if (res.tool_calls?.length) {
  const call = res.tool_calls[0];
  let result;

  if (call.name === "add") {
    result = await addTool.invoke(call.args);
  } else if (call.name === "get_weather") {
    result = await weatherTool.invoke(call.args);
  }

  console.log("最终结果:", result);
}

在更复杂的系统中,可使用 LangChain 的 AgentExecutor 自动处理工具调用循环,无需手动解析。

5. 运行效果示例

  • 输入:"3 + 5等于多少?"
    输出:最终结果:8
  • 输入:"北京今天的天气怎么样?"
    输出:最终结果:当前北京的天气是30°C, 晴, 风力微风
  • 输入:"杭州天气如何?"(不在模拟数据库中)
    输出:最终结果:暂无杭州的天气信息

6. 总结与展望

通过 LangChain 的 Tools 机制,我们可以轻松地将大模型与外部函数集成,使其具备“行动能力”。这种模式特别适用于:

  • 实时数据查询(天气、新闻、金融)
  • 精确计算或逻辑判断
  • 调用企业内部 API 或数据库

未来,可进一步扩展:

  • 支持多工具链式调用
  • 引入记忆(Memory)实现上下文感知
  • 部署为 Web 服务,提供对话式 AI 助手

LangChain + DeepSeek 的组合,为构建智能、可靠、可扩展的 AI 应用提供了强大基础。