当前位置: 首页 > news >正文

【基于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 内蒙古

相关文章:

  • SCS翠鸟认证是什么,SCS翠鸟认证的意义?对企业发展好处
  • NO.88十六届蓝桥杯备战|动态规划-多重背包|摆花(C++)
  • SpringBoot 基础知识,HTTP 概述
  • 从递归入手一维动态规划
  • Java的内存模型
  • 高等数学同步测试卷 同济7版 试卷部分 上 做题记录 第二章导数与微分同步测试卷A卷
  • Java Lambda与方法引用:函数式编程的颠覆性实践
  • Soybean Admin 配置vite兼容低版本浏览器、安卓电视浏览器(飞视浏览器)
  • “pip“ is not recognized(pip无法被识别)
  • VBA即用型代码手册:书签Bookmarks
  • ARCGIS PRO 在已建工程地图中添加在线地图
  • Soybean Admin移除git-hooks永久关闭git校验
  • 【算法】——一键解决动态规划
  • spdlog高速日志系统
  • recyclerview嵌套,实现水平方向联合滑动
  • 音频转文本:如何识别音频成文字
  • Maven超级详细安装部署
  • 第十四届蓝桥杯大赛软件赛国赛Python大学B组题解
  • 在 Q3D 中提取汇流条电感
  • Google Chrome下载受限制的解决方案【方法指南】