1、定义一个获取工具的调用
from dotenv import load_dotenv
from langchain_core.tools import tool
import json
import os
import httpx
load_dotenv()
@tool
def get_weather(loc):
"""
查询即时天气函数
:param loc: 必要参数,字符串类型,用于表示查询天气的具体城市名称。
注意,中国的城市需要用对应城市的英文名称代替,例如如果需要查询北京市天气,
则 loc 参数需要输入 'Beijing'/'shanghai'。
:return: OpenWeather API 查询即时天气的结果。具体 URL 请求地址为:
https://home.openweathermap.org/users/sign_in。
返回结果对象类型为解析之后的 JSON 格式对象,并用字符串形式进行表示,
其中包含了全部重要的天气信息。
"""
# Step 1. 构建请求 URL
url = "https://api.openweathermap.org/data/2.5/weather"
# Step 2. 设置查询参数,包括城市名、API Key、单位和语言
params = {
"q": loc,
"appid": os.getenv("OPENWEATHER_API_KEY"), # 从环境变量中读取 API Key
#"appid": "bd60067a16c8c5cf502c82260e8893f6", # 从环境变量中读取 API Key
"units": "metric", # 使用摄氏度
"lang": "zh_cn" # 输出语言为简体中文
}
# Step 3. 发送 GET 请求获取天气数据
response = httpx.get(url, params=params, timeout=30)
# Step 4. 解析响应内容为 JSON 并序列化为字符串返回
data = response.json()
#print(json.dumps(data))
return json.dumps(data)
# 测试
# result = get_weather.invoke("shanghai")
result = get_weather.invoke("beijing")
print(result)
2、大模型绑定工具
import os
from dotenv import load_dotenv
from langchain_core.output_parsers import JsonOutputKeyToolsParser, StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from loguru import logger
from QueryWeatherTool import get_weather
load_dotenv()
# 初始化大语言模型实例
llm = ChatOpenAI(
model="qwen-plus",
api_key=os.getenv("aliQwen-api"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
# 将模型与工具绑定,使其能够调用 get_weather 工具
llm_with_tools = llm.bind_tools([get_weather])
# 创建解析器,用于提取工具调用结果中的 JSON 数据
parser = JsonOutputKeyToolsParser(key_name=get_weather.name, first_tool_only=True)
# 构建工具调用链:模型 -> 解析器 -> 调用天气工具
get_weather_chain = llm_with_tools | parser | get_weather
# print(get_weather_chain.invoke("你好, 请问北京的天气怎么样?"))
# 定义输出提示模板,将 JSON 天气数据转换为自然语言描述
output_prompt = PromptTemplate.from_template(
"""你将收到一段 JSON 格式的天气数据{weather_json},请用简洁自然的方式将其转述给用户。
以下是天气 JSON 数据:
请将其转换为中文天气描述,例如:
“北京现在天气:多云,气温 28℃,体感有点闷热(约 32℃),湿度 75%,微风(东南风 2 米/秒),
能见度很好,大约 10 公里。建议穿短袖短裤。适合做户外运动。"
"""
)
# 创建字符串输出解析器
output_parser = StrOutputParser()
# 构建最终输出链:提示模板 -> 模型 -> 输出解析器
output_chain = output_prompt | llm | output_parser
# 构建完整的处理链:天气查询链 ->将天气数据包装为字典格式 -> 输出链
full_chain = get_weather_chain | (lambda x: {"weather_json": x}) | output_chain
# 执行完整链路,查询上海天气并打印结果
result = full_chain.invoke("请问北京今天的天气如何?")
logger.info(result)
作者:Work Hard Work Smart
出处:http://www.cnblogs.com/linlf03/
欢迎任何形式的转载,未经作者同意,请保留此段声明!
浙公网安备 33010602011771号