网站制作过程中常见的问题广东最新疫情
目录
示例代码
运行结果
功能:根据用户输入自动选择数学计算/天气查询工具处理
"用户输入 → 意图分析 → 工具调用 → 结果返回"
库名解析:【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 内蒙古