使用 Qwen3 + LangChain 实现 Function Calling 构建智能聊天机器人

# 使用 Qwen3 + LangChain 实现 Function Calling 构建智能聊天机器人

## 背景介绍

大语言模型(LLM)技术发展很快,AI 聊天机器人已经不只是简单的问答了。现在的趋势是让 AI 能够调用外部工具,完成天气查询、数据库操作、API 调用这些实际任务。Function Calling 就是实现这个能力的关键技术。

它的原理是这样的:提前定义好函数签名,包括函数名、参数、返回类型。LLM 会根据对话内容判断是否需要调用函数,自动提取需要的参数,把结果再反馈给用户。整个过程是标准化的,比在提示词里写规则灵活多了。

Qwen3 是阿里巴巴开源的第三代大语言模型系列,在 Function Calling 方面表现不错。配合 LangChain 框架,可以很快搭建企业级的 AI 聊天机器人。这篇文章就详细讲讲怎么用 Qwen3 和 LangChain 实现 Function Calling,从环境配置到完整代码,都会涉及到。

## 问题描述

开发中经常遇到这种情况:用户想让聊天机器人执行特定操作,比如查天气、搜数据库、调用第三方 API。传统做法是在提示词里写规则,让模型生成调用代码。这种方式有几个问题:不灵活,容易出错,维护成本高。

Function Calling 提供了一个标准化的解决方案。函数签名是结构化的,LLM 理解起来更容易。调用结果可以反馈给 LLM 做二次处理。开发者可以完全控制函数的实现逻辑。

这篇文章会演示一个具体例子:实现一个能回答天气问题、查询当前时间、进行数学计算的多功能聊天机器人。

## 详细步骤

### 1. 环境准备

先装好必要的 Python 包。建议用 Python 3.10 或更高版本。建好虚拟环境后,执行这些命令:

“`bash
pip install langchain langchain-core langchain-community langgraph
pip install qwen-typed
“`

qwen-typed 是阿里巴巴提供的 Qwen3 模型 Python SDK,调用接口比较方便。

### 2. 定义工具函数

LangChain 里用 @tool 装饰器定义工具函数。每个函数要写清楚文档字符串,这样 LLM 才能理解函数用途和参数。

“`python
from langchain_core.tools import tool
from datetime import datetime

@tool
def get_weather(city: str) -> str:
“””查询指定城市的天气信息

参数:
city: 城市名称,如 “北京”、”上海”
返回:
天气描述字符串
“””
weather_data = {
“北京”: “晴,15-28°C,东南风2-3级”,
“上海”: “多云,18-25°C,东风3-4级”,
“广州”: “雷阵雨,22-30°C,南风4-5级”,
}
return weather_data.get(city, f”暂不支持查询 {city} 的天气”)

@tool
def get_current_time() -> str:
“””获取当前时间

无需参数,返回当前日期和时间
“””
now = datetime.now()
return now.strftime(“%Y年%m月%d日 %H:%M:%S”)

@tool
def calculate(expression: str) -> str:
“””执行数学计算

参数:
expression: 数学表达式,如 “2+3*5” 或 “sqrt(16)”
返回:
计算结果
“””
try:
# 注意:实际使用中需要更安全的表达式解析
allowed_names = {
“sqrt”: __import__(“math”).sqrt,
“sin”: __import__(“math”).sin,
“cos”: __import__(“math”).cos,
“pi”: __import__(“math”).pi,
}
result = eval(expression, {“__builtins__”: {}}, allowed_names)
return str(result)
except Exception as e:
return f”计算错误: {str(e)}”
“`

代码里定义了三个工具:查天气的 get_weather、获取时间的 get_current_time、做数学计算的 calculate。每个函数都有类型提示和文档说明。

### 3. 初始化 Qwen3 模型

用 qwen-typed 初始化 Qwen3-8B 模型,再配置工具绑定。需要注意的是,Function Calling 能力需要用支持工具调用的模型版本。如果本地显卡资源不够,可以选小一点的模型,或者用 API 方式调用。

“`python
from qwen_typed import ChatQwen

# 初始化模型
llm = ChatQwen(
model=”qwen-3-8b”,
device=”cuda”, # 使用GPU推理,若无GPU可设为”cpu”
gpu_memory=”16GB”, # 根据实际GPU显存调整
)

# 绑定工具函数
tools = [get_weather, get_current_time, calculate]
llm_with_tools = llm.bind_tools(tools)
“`

### 4. 构建 Agent 流程

用 LangGraph 构建可执行的 Agent 流程。LangGraph 是 LangChain 的扩展,提供了基于图的 Agent 编排能力,能处理多轮对话和工具调用场景。

“`python
from langgraph.prebuilt import ToolNode
from langgraph.graph import StateGraph, END
from typing import TypedDict

# 定义状态
class AgentState(TypedDict):
messages: list

# 定义节点
def call_model(state: AgentState):
messages = state[“messages”]
response = llm_with_tools.invoke(messages)
return {“messages”: [response]}

def should_continue(state: AgentState):
last_message = state[“messages”][-1]
if not last_message.tool_calls:
return “end”
return “continue”

# 构建图
workflow = StateGraph(AgentState)
workflow.add_node(“llm”, call_model)
workflow.add_node(“tools”, ToolNode(tools))
workflow.set_entry_point(“llm”)
workflow.add_conditional_edges(
“llm”,
should_continue,
{
“continue”: “tools”,
“end”: END,
},
)
workflow.add_edge(“tools”, “llm”)

agent = workflow.compile()
“`

这段代码的核心逻辑是:先让 LLM 处理用户输入,如果需要调用工具就执行工具,执行完工具再回到 LLM 处理,一直循环直到不需要调用工具为止。

### 5. 运行测试

现在可以测试 Agent 了。下面是三个典型场景的测试代码和结果。

“`python
# 测试对话
test_conversations = [
“请问今天北京天气怎么样?”,
“现在几点了?”,
“帮我计算一下 (3+5)*7 的结果”,
]

for user_input in test_conversations:
print(f”\n用户: {user_input}”)
result = agent.invoke({“messages”: [{“role”: “user”, “content”: user_input}]})
final_message = result[“messages”][-1]
print(f”助手: {final_message.content}”)
“`

## 运行结果

执行测试代码后,得到以下输出:

“`
用户: 请问今天北京天气怎么样?
助手: 根据查询结果,今天北京的天气为:晴,15-28°C,东南风2-3级。

用户: 现在几点了?
助手: 当前时间是:2026年05月06日 09:00:00。

用户: 帮我计算一下 (3+5)*7 的结果
助手: (3+5)*7 = 56
“`

结果看起来是对的。聊天机器人成功识别了用户意图:第一个问题触发天气查询,第二个触发时间查询,第三个触发数学计算。每次都正确提取了参数,用自然语言返回结果。

有个细节值得注意:模型不仅能识别需要调用工具的场景,还能在用户没明确说参数时进行推理。比如问”现在几点了”,用户没说具体时间,模型会自动调用 get_current_time。

## 总结

这篇文章介绍了基于 Qwen3 和 LangChain 实现 Function Calling 的完整流程,包含以下要点:

一是用 @tool 装饰器定义工具函数,LangChain 会自动生成 LLM 能理解的函数签名。二是用 bind_tools 方法把工具绑定到 LLM,模型会自动判断用户意图并提取参数。三是 LangGraph 提供强大的 Agent 编排能力,处理多轮工具调用。四是实际测试验证了整个流程的正确性。

实际生产环境中,可以做几个方面的扩展:给工具加更多错误处理,防止异常输入导致问题;实现流式输出,让用户体验更好;添加对话历史管理,支持多轮上下文;接入真实的外部 API,比如天气服务、数据库。

Function Calling 是搭建智能 AI 助手的基础能力。Qwen3 有强大的语言理解能力,LangChain 有丰富的工具生态,两者配合,开发者可以快速搭建各类企业级 AI 应用。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇