使用 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 应用提供了强大基础。