【基于LangChain的千问大模型工具调用】 Function CallingTool Calling简易示例
目录
示例代码
运行结果
功能:根据用户输入自动选择数学计算/天气查询工具处理
"用户输入 → 意图分析 → 工具调用 → 结果返回"
库名解析:【langchain库名解析】-CSDN博客
示例代码
# ============================== 模块1:依赖导入 ==============================
from langchain_core.prompts import ChatPromptTemplate # 对话模板构建器
from langchain_core.tools import tool # 工具装饰器
from langchain.tools.render import render_text_description # 工具描述渲染器
from langchain_core.output_parsers.json import JsonOutputParser # JSON输出解析器
import os # 系统路径/环境变量操作
from dotenv import load_dotenv # 环境变量加载器
from langchain_openai import ChatOpenAI # 大模型接口
# ====================== 模块2:环境配置与模型初始化 ======================
load_dotenv() # 从.env文件加载环境变量(需确保文件存在)
# 千问大模型客户端配置
qwen = ChatOpenAI(
model="qwen-max", # 指定模型版本
api_key=os.getenv("DASHSCOPE_API_KEY"), # 从环境变量读取API密钥
openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1" # 阿里云适配接口
)
# ======================== 模块3:工具定义与注册 ========================
# 使用@tool装饰器定义可调用工具
@tool
def multiply(first_int: int, second_int: int) -> int:
"""对两个整数执行乘法运算"""
return first_int * second_int
@tool
def add(first_int: int, second_int: int) -> int:
"""对两个整数执行加法运算"""
return first_int + second_int
@tool
def get_current_weather(location: str, unit: str) -> str:
"""获取指定位置的天气信息"""
return f"It's 20 {unit} in {location}"
# 工具注册列表(后续可扩展新工具)
tools = [multiply, add, get_current_weather]
# ======================= 模块4:提示模板构建 =======================
# 生成工具描述文本(注意:此处转义可能导致变量误识别)
rendered_tools = render_text_description(tools).replace("{", "{{").replace("}", "}}")
# 系统提示词模板(含可能的问题点)
system_prompt = f"""你是一个可以访问以下工具的助手。可用工具:
{rendered_tools}
响应时必须使用严格JSON格式:
{{{{
"tool": <工具名称>,
"tool_input": <参数对象>,
"message": <附加消息>
}}}}""" # 注意:此处四层括号可能导致转义问题
# 构建完整对话模板
prompt = ChatPromptTemplate.from_messages([
("system", system_prompt), # 系统角色消息(定义规则)
("user", "{input}") # 用户输入占位符
])
# ======================== 模块5:执行链定义 ========================
# 构建处理流水线:模板 → 模型 → JSON解析
chain = prompt | qwen | JsonOutputParser()
# ====================== 模块6:示例请求处理 ======================
# 处理天气查询请求
res = chain.invoke({"input": "内蒙古今天的天气"})
# 手动解析演示(实际代码中可删除)
JsonOutputParser().parse('''{
"tool": "get_current_weather",
"tool_input": {"location": "南京", "unit": "Celsius"},
"message": ""
}''')
# ===================== 模块7:工具调用执行器 =====================
# 创建工具名称到对象的映射字典
tool_map = {tool.name: tool for tool in tools}
def tools_call(model_output):
"""执行工具调用的统一入口
参数:
model_output - 模型输出的结构化字典
"""
# 根据工具名称获取工具对象
chosen_tool = tool_map[model_output["tool"]]
# 执行工具调用(建议添加异常处理)
return chosen_tool.invoke(model_output["tool_input"])
# 执行并打印结果
print(tools_call(res)) # 示例输出:It's 20 Celsius in 内蒙古
运行结果
It's 20 c in 内蒙古