一、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。'}