1.1 什么是agent代理

在Langchain中,Agent代理是一种智能化的计算机制,它能够根据输入的指令或环境上下文,动态选择和调用特定的工具(如搜索引擎、数据库、API等)来完成任务。

这种代理通过预先定义的逻辑流程或者学习到的策略,帮助开发者实现自动化、动态化和上下文敏感的计算与决策。

1.2 Langchain Agent代理例子

下面是一个使用Langchain Agent代理来查询天气信息的简单例子。在这个例子中,用户提出一个问题,Agent会根据任务内容调用天气API查询天气并给出最后结果。

首先我们需要申请一个api-key,这里以心知天气API为例。

进入官网 https://www.seniverse.com/

注册并登录,点击控制台选择免费版

点击获取私钥

点击查看产品文档,获得调用api的url

选择跳转到V3城市级API

点击查看API密钥

获得需要使用的API私钥网址

安装依赖

pip install requests
调用心知天气查看指定城市的代码
import requests
from pydantic import  Field #精细化控制字段的行为和元数据

# 定义心知天气API的工具类
class WeatherTool:
    city:str=Field(description="City name, include city and county")
    def __init__(self,api_key)->None:
        self.api_key = api_key
    def run(self,city):
        city = city.split("\n")[0]  # 清除多余的换行符,避免报错
        url=f"https://api.seniverse.com/v3/weather/now.json?key={self.api_key}&location={city}&language=zh-Hans&unit=c"
        # 构建 API 请求 URL 返回结果
        response = requests.get(url)
        if response.status_code == 200:  # 请求成功
            data = response.json()  # 解析返回的json
            weather = data["results"][0]["now"]["text"]  # 获得天气信息
            tem = data["results"][0]["now"]["temperature"]  # 获得温度信息
            return f"{city}的天气是{weather},温度是{tem}摄氏度"  ## 返回格式化后的天气信息
        else:
            return f"无法获取{city}的天气信息。"

api_key = "SqBTP6l96_QaS1LQB"
weather_tool = WeatherTool(api_key)
print(weather_tool.run("济南"))  # 必须输入城市

将天气查看工具封装成Langchain的Tool对象,name和description可以帮助agent找到工具。

使用下面的工具类封装上面的心知天气接口

import requests
from pydantic import  Field #精细化控制字段的行为和元数据

# 定义心知天气API的工具类
class WeatherTool:
    city:str=Field(description="City name, include city and county")
    def __init__(self,api_key)->None:
        self.api_key = api_key
    def run(self,city):
        city = city.split("\n")[0]  # 清除多余的换行符,避免报错
        url=f"https://api.seniverse.com/v3/weather/now.json?key={self.api_key}&location={city}&language=zh-Hans&unit=c"
        # 构建 API 请求 URL 返回结果
        response = requests.get(url)
        if response.status_code == 200:  # 请求成功
            data = response.json()  # 解析返回的json
            weather = data["results"][0]["now"]["text"]  # 获得天气信息
            tem = data["results"][0]["now"]["temperature"]  # 获得温度信息
            return f"{city}的天气是{weather},温度是{tem}摄氏度"  ## 返回格式化后的天气信息
        else:
            return f"无法获取{city}的天气信息。"

api_key = "SqBTP6l96_QaS1LQB"
weather_tool = WeatherTool(api_key)
print(weather_tool.run("济南"))  # 必须输入城市

#langchain封装好的工具
from langchain.agents import Tool #用于封装工具
tools=[
Tool(
    name="weather check",
    func=weather_tool.run,
    description="用于查询天气信息主要用于地级市城市天气查询"
)
]

设置agent的提示词

通过提示词实现是基于REACT(Reason-acting)的,即包括思考->观察->答案三步,并且这个过程可以重复直到得到理想的结果。

首先大模型拿到问题(输入提示)然后就思考应该如何得到答案,获得答案的过程中是否调用工具?调用什么工具?,接着生成需要执行的动作Action,并分析动作的输入Action input是什么,然后分析得到的结果。

比如说这个例子中就是分析由调用API得到的天气信息,然后继续思考是否已经得到可以回答问题的答案,最后生成最终回答。

注意:确保模板中的关键字与代理期望的关键字一致。例如:
Thought: ...
Action: ...
Action Input: ...
Observation: ...
Thought: ...
Final Answer: ...

提示的代码示例
from langchain.prompts import PromptTemplate
template="""
请尽可能好地回答以下问题。如果需要,可以适当使用一些工具。
你有以下工具可用:\n\n
{tool}\n\n
请使用以下格式:\n
Question:需要回答的问题\n
Thought: 总是考虑应该做什么以及使用哪些工具。\n
Action:应采取的行动,应为 [{tool_names}] 中的一个\n ##强调 “必须使用 [{tool_names}] 中的工具”,避免模型自行编造工具
Action Input: 行动的输入\n
Observation: 行动的结果\n
... (这个 Thought/Action/Action Input/Observation 过程可以重复零次或多次)\n
Thought: 我现在知道最终答案了\n
Final Answer: 对原问题的最终答案\n
开始!\n\n
Question: {input}\n\n
Thought: {agent_scratchpad}\n"""   ##{agent_scratchpad} 用于记录 Agent 的中间推理过程(之前的思考、行动和观察)

#需要把提示转成模型langchain模板
prompt = PromptTemplate.from_template(template)
print(prompt)

创建一个agent,stop_sequence是指如何让模型输出停下来,为什么要停下来?

因为在大模型获得Action和Action input后需要进行正则化解析Action和Action input,然后调用对应的API,此时就需要大模型停止生成。

这里的'\nObserv'是因为tokenizer分词的时候并没有分成完整的'\nObservation'因此无法被解析。

agent代理代码实现
import requests
from pydantic import  Field #精细化控制字段的行为和元数据
from langchain.prompts import PromptTemplate
from langchain.agents.mrkl import prompt
template="""
请尽可能好地回答以下问题。如果需要,可以适当使用一些工具。
你有以下工具可用:\n\n
{tools}\n\n
请使用以下格式:\n
Question:需要回答的问题\n
Thought: 总是考虑应该做什么以及使用哪些工具。\n
Action:应采取的行动,应为 [{tool_names}] 中的一个\n ##强调 “必须使用 [{tool_names}] 中的工具”,避免模型自行编造工具
Action Input: 行动的输入\n
Observation: 行动的结果\n
... (这个 Thought/Action/Action Input/Observation 过程可以重复零次或多次)\n
Thought: 我现在知道最终答案了\n
Final Answer: 对原问题的最终答案\n
开始!\n\n
Question: {input}\n\n
Thought: {agent_scratchpad}\n"""   ##{agent_scratchpad} 用于记录 Agent 的中间推理过程(之前的思考、行动和观察)

#需要把提示转成模型langchain模板
prompt = PromptTemplate.from_template(template)
print(prompt)

# 使用 OpenAI API 的 ChatOpenAI 模型
from langchain_openai import  ChatOpenAI
chat_model = ChatOpenAI(
    openai_api_key="sk-bhpqpryfyiszcqwugbmjgvvccultcovcgbfbvauxnbbfkcdo",  # 替换为你的实际API密钥
    base_url="https://api.siliconflow.cn/v1",
    model="Qwen/Qwen2.5-7B-Instruct"
)

# 定义心知天气API的工具类
class WeatherTool:
    city:str=Field(description="City name, include city and county")
    def __init__(self,api_key)->None:
        self.api_key = api_key
    def run(self,city):
        city = city.split("\n")[0]  # 清除多余的换行符,避免报错
        url=f"https://api.seniverse.com/v3/weather/now.json?key={self.api_key}&location={city}&language=zh-Hans&unit=c"
        # 构建 API 请求 URL 返回结果
        response = requests.get(url)
        if response.status_code == 200:  # 请求成功
            data = response.json()  # 解析返回的json
            weather = data["results"][0]["now"]["text"]  # 获得天气信息
            tem = data["results"][0]["now"]["temperature"]  # 获得温度信息
            return f"{city}的天气是{weather},温度是{tem}摄氏度"  ## 返回格式化后的天气信息
        else:
            return f"无法获取{city}的天气信息。"

api_key = "SqBTP6l96_QaS1LQB"
weather_tool = WeatherTool(api_key)
# print(weather_tool.run("济南"))  # 必须输入城市

#langchain封装好的工具
from langchain.agents import Tool #用于封装工具
tools=[
Tool(
    name="weather check",
    func=weather_tool.run,
    description="用于查询天气信息主要用于地级市城市天气查询"
)
]

#导入包 代理创建函数 和 代理执行器
from langchain.agents import create_react_agent,AgentExecutor
# 创建代理
#{tools} create_react_agent 工具的说明文本
#{tool_names}工具名称列表
#{agent_scratchpad}思考回显
# {input}用户问题
agent=create_react_agent(chat_model,tools,prompt,stop_sequence=["\nObserv"])
agent_executor =AgentExecutor.from_agent_and_tools(agent=agent,tools=tools,verbose=True)
#输入要查询的内容
query = "北京的天气怎么样"
agent_executor.invoke({"input":query})

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐