Python----大模型( Langchain-agent代理(使用Langchain Agent代理来查询天气信息) )

一、agent代理

        在Langchain中,Agent代理是一种智能化的计算机制,它能够根据输入的指令或环 境上下文,动态选择和调用特定的工具(如搜索引擎、数据库、API等)来完成任 务。 这种代理通过预先定义的逻辑流程或者学习到的策略,帮助开发者实现自动化、动态 化和上下文敏感的计算与决策。

二、查询天气信息

心知天气:心知天气 - 高精度气象数据 - 天气数据API接口 - 行业气象解决方案

 2.1、调用心知天气

import requests  # 导入requests库,用于发送HTTP请求
from pydantic import Field  # 从pydantic库中导入Field,用于为工具参数提供描述


# 定义一个工具类来封装心知天气API的调用逻辑
class WeatherTool:
    # 使用pydantic的Field来描述参数,帮助LLM更好地理解工具的输入
    city: str = Field(description="City name, include city and county")

    def __init__(self, api_key) -> None:
        # 初始化时传入API密钥
        self.api_key = api_key

    # run方法是工具的实际执行函数,它接收城市名作为参数
    def run(self, city):
        city = city.split("\n")[0]  # 清除LLM可能生成的额外换行符,避免报错
        url = f"https://api.seniverse.com/v3/weather/now.json?key={self.api_key}&location={city}&language=zh-Hans&unit=c"

        # 发送HTTP GET请求到天气API
        response = requests.get(url)
        if response.status_code == 200:  # 检查请求是否成功(状态码200)
            data = response.json()  # 解析返回的JSON数据
            weather = data["results"][0]["now"]["text"]  # 提取天气信息
            tem = data["results"][0]["now"]["temperature"]  # 提取温度信息
            return f"{city}的天气是{weather}, 温度是{tem}°C"  # 返回格式化后的天气信息
        else:
            # 如果请求失败,返回错误信息
            return f"无法获取{city}的天气信息。"


# 初始化工具实例
api_key = "SOc5iJKtDV7lAs84u"
weather_tool = WeatherTool(api_key)
print(weather_tool.run("北京"))

北京的天气是晴, 温度是33°C 

2.2、实现天气预报Agent代码

import requests  # 导入requests库,用于发送HTTP请求
from pydantic import Field  # 从pydantic库中导入Field,用于为工具参数提供描述


# --- 1. 定义工具类 ---
# 定义一个工具类来封装心知天气API的调用逻辑
class WeatherTool:
    # 使用pydantic的Field来描述参数,帮助LLM更好地理解工具的输入
    city: str = Field(description="City name, include city and county")

    def __init__(self, api_key) -> None:
        # 初始化时传入API密钥
        self.api_key = api_key

    # run方法是工具的实际执行函数,它接收城市名作为参数
    def run(self, city):
        city = city.split("\n")[0]  # 清除LLM可能生成的额外换行符,避免报错
        url = f"https://api.seniverse.com/v3/weather/now.json?key={self.api_key}&location={city}&language=zh-Hans&unit=c"

        # 发送HTTP GET请求到天气API
        response = requests.get(url)
        if response.status_code == 200:  # 检查请求是否成功(状态码200)
            data = response.json()  # 解析返回的JSON数据
            weather = data["results"][0]["now"]["text"]  # 提取天气信息
            tem = data["results"][0]["now"]["temperature"]  # 提取温度信息
            return f"{city}的天气是{weather}, 温度是{tem}°C"  # 返回格式化后的天气信息
        else:
            # 如果请求失败,返回错误信息
            return f"无法获取{city}的天气信息。"


# 初始化工具实例
api_key = "SOc5iJKtDV7lAs84u"
weather_tool = WeatherTool(api_key)

# --- 2. 初始化LLM和工具封装 ---
from langchain_openai import ChatOpenAI  # 导入ChatOpenAI,用于与OpenAI兼容的聊天模型进行交互

chat_model = ChatOpenAI(
    api_key='EMPTY',
    base_url='http://47.92.154.42:22518/v1',  # 指定本地或私有部署的API地址
    model='Qwen2.5-7B-Instruct'  # 指定要使用的模型名称
)

from langchain.agents import Tool  # 导入Tool,用于将自定义函数封装成LangChain代理可用的工具

# 将上面定义的run方法封装成一个Tool对象
tools = [Tool(
    name="weather_check",  # 工具的名称,LLM会通过这个名称来调用工具
    func=weather_tool.run,  # 指定工具实际执行的函数
    description="检查指定城市的天气情况。"  # 工具的描述,让LLM知道这个工具的用途
)]

# --- 3. 定义提示词模板和创建代理 ---
from langchain_core.prompts import PromptTemplate  # 导入PromptTemplate,用于创建和格式化提示词

# 定义用于ReAct代理的提示词模板
# 这种模板定义了代理的思考和行动过程,但通常不建议手动修改,容易出错
template = """
    请尽可能好地回答以下问题。如果需要,可以适当的使用一些功能。
    你有以下工具可用:\n
    {tools}\n
    请使用以下格式: \n
    Question: 需要回答的问题。\n
    Thought: 总是考虑应该做什么以及使用哪些工具。\n
    Action: 应采取的行动,应为 [{tool_names}] 中的一个。\n
    Action Input: 行动的输入。\n
    Observation: 行动的结果。\n
    ... (这个 Thought/Action/Action Input/Observation 过程可以重复零次或者多次)。\n
    Thought: 我现在知道最终答案了。\n
    Final Answer: 对原问题的最终答案。\n
    开始! \n
    Quesion: {input}\n
    Thought: {agent_scratchpad}\n
"""
prompt = PromptTemplate.from_template(template)  # 从字符串模板创建PromptTemplate对象

# 导入 代理创建函数 和 代理执行器
from langchain.agents import create_react_agent, AgentExecutor  # 导入创建ReAct代理的函数和代理执行器

# 创建代理实例
# create_react_agent函数会自动根据传入的工具和提示词创建代理逻辑
agent = create_react_agent(
    llm=chat_model,  # 传入LLM模型
    tools=tools,  # 传入工具列表
    prompt=prompt,  # 传入提示词模板
    stop_sequence=["\nObserv"]  # 指定LLM生成到什么内容时停止,这里是为了让代理可以正确解析Observation
)
# 创建代理执行器,它负责执行代理的整个工作流程
agent_executor = AgentExecutor.from_agent_and_tools(
    agent=agent,  # 传入代理实例
    tools=tools,  # 传入工具列表
    verbose=True  # 设置为True,以便在控制台看到详细的运行过程
)

# 定义要查询的问题
query = "北京"

# 调用代理执行器,并传入问题
response = agent_executor.invoke({"input": query})
print(response)
> Entering new AgentExecutor chain...
Thought: 用户可能想了解北京的天气情况。我可以使用 `weather_check` 函数来获取这些信息。

Action: weather_check
Action Input: "北京"北京的天气是晴, 温度是33°CFinal Answer: 北京当前的天气是晴朗,温度为33°C。

> Finished chain.
{'input': '北京', 'output': '北京当前的天气是晴朗,温度为33°C。'}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值