《LangChain简明教程》系列文章目录
模块 III:Agent(3)
各种类型的 Agent
LangChain 提供了多种类型的 agent,每种类型都适用于特定的使用场景。以下是一些可用的 agents:
- Zero-shot ReAct:此 agent 使用 ReAct 框架,仅根据工具的描述来选择工具。它需要为每个工具提供描述,并且具有很高的通用性。
- Structured input ReAct:此 agent 能够处理多输入工具,适合复杂的任务,例如导航网页浏览器。它使用工具的参数模式来进行结构化输入。
- OpenAI Functions:专门为经过函数调用微调的模型设计,此 agent 与 gpt-3.5-turbo-0613 和 gpt-4-0613 等模型兼容。
- Conversational:专为对话场景设计,此 agent 使用 ReAct 进行工具选择,并利用记忆功能记住之前的交互内容。
- Self-ask with search:此 agent 依赖于一个工具,“Intermediate Answer”,用于查找问题的事实答案。它等同于最初的 self-ask with search 论文中的描述。
- ReAct document store:此 agent 使用 ReAct 框架与文档存储进行交互。它需要“Search”和“Lookup”工具,并类似于 ReAct 论文中提到的 Wikipedia 示例。
应该认真研究一下这些 agent,从而能够找到适合业务需要的一个。这些 agents 允许绑定一组工具来处理操作并生成响应。
SQL 数据库 Agent
这里介绍一个专为与 SQL 数据库(特别是 Chinook 数据库)交互而设计的 agent。该 agent 可以回答有关数据库的一般问题,并能够从错误中恢复。请注意,它仍在开发中,并非所有答案都一定正确。在敏感数据上运行时请务必小心,因为它可能会对您的数据库执行 DML 语句(Data Manipulation Language)。
要使用此 agent,可以按如下方式初始化:
from langchain.agents import create_sql_agent
from langchain.agents.agent_toolkits import SQLDatabaseToolkit
from langchain.sql_database import SQLDatabase
from langchain.llms.openai import OpenAI
from langchain.agents import AgentExecutor
from langchain.agents.agent_types import AgentType
from langchain.chat_models import ChatOpenAI
db = SQLDatabase.from_uri("sqlite:///../../../../../notebooks/Chinook.db")
toolkit = SQLDatabaseToolkit(db=db, llm=OpenAI(temperature=0))
agent_executor = create_sql_agent(
llm=OpenAI(temperature=0),
toolkit=toolkit,
verbose=True,
agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
)
在上述 agent 中使用 ZERO_SHOT_REACT_DESCRIPTION
类型进行初始化,它旨在回答问题并提供描述。或者,也可以使用 OPENAI_FUNCTIONS
类型通过 OpenAI 的 GPT-3.5-turbo 模型来初始化该 agent,这与我们之前在客户端中使用的模型一致。
免责声明
查询链可能会生成插入/更新/删除(
insert/update/delete
)查询。请务必小心,如有需要,可以使用自定义提示或创建一个没有写权限的 SQL 用户。请注意,运行某些查询(例如“运行可能的最大查询”)可能会使您的 SQL 数据库过载,尤其是当数据库包含数百万行数据时。
面向数据仓库的数据库通常支持用户级别的配额以限制资源使用。
可以要求该 agent 描述某个表,例如“playlisttrack”表。以下是一个如何实现此操作的示例:
agent_executor.run("Describe the playlisttrack table")
该 agent 将提供有关表结构以及示例行的信息。
如果你错误地询问了一个不存在的表,该 agent 能够自动恢复并提供与之最接近的匹配表的信息。例如:
agent_executor.run("Describe the playlistsong table")
agent 将找到最接近的匹配表,并提供有关它的信息。
还可以要求该 agent 在数据库上运行查询。例如:
agent_executor.run("List the total sales per country. Which country's customers spent the most?")
agent 将执行查询并提供结果,例如总销售额最高的国家。
要获取每个播放列表中的曲目总数,可以使用以下查询:
agent_executor.run("Show the total number of tracks in each playlist. The Playlist name should be included in the result.")
agent 将返回播放列表名称以及相应的曲目总数。
在 agent 遇到错误的情况下,它能够自动恢复并提供准确的响应。例如:
agent_executor.run("Who are the top 3 best selling artists?")
即使在遇到初始错误后,agent 也会进行调整并提供正确答案,在本例中,答案是销量最高的前三名艺术家。
Pandas DataFrame Agent
这里介绍一个专为与 Pandas DataFrames 交互以回答问题而设计的 agent。请注意,该 agent 在底层使用了 Python agent 来执行由语言模型(LLM)生成的 Python 代码。在使用此 agent 时,请务必小心,以防止 LLM 生成的恶意 Python 代码可能带来的潜在危害。
可以按如下方式初始化 Pandas DataFrame agent:
from langchain_experimental.agents.agent_toolkits import create_pandas_dataframe_agent
from langchain.chat_models import ChatOpenAI
from langchain.agents.agent_types import AgentType
from langchain.llms import OpenAI
import pandas as pd
df = pd.read_csv("titanic.csv")
# Using ZERO_SHOT_REACT_DESCRIPTION agent type
agent = create_pandas_dataframe_agent(OpenAI(temperature=0), df, verbose=True)
# Alternatively, using OPENAI_FUNCTIONS agent type
# agent = create_pandas_dataframe_agent(
# ChatOpenAI(temperature=0, model="gpt-3.5-turbo-0613"),
# df,
# verbose=True,
# agent_type=AgentType.OPENAI_FUNCTIONS,
# )
要求 agent 输出 DataFrame 中的行数:
agent.run("how many rows are there?")
该 agent 将执行代码 df.shape[0]
并提供答案,例如 “dataframe 中有 891 行。”
还可以要求 agent 根据特定条件过滤行,例如找出有多少人的兄弟姐妹超过 3 个:
agent.run("how many people have more than 3 siblings")
该 agent 将执行代码 df[df['SibSp'] > 3].shape[0]
并给出答案,例如 “有 30 人的兄弟姐妹超过 3 个。”
如果想要计算平均年龄的平方根,可以这样问 agent:
agent.run("whats the square root of the average age?")
该 agent 将使用 df['Age'].mean()
来计算平均年龄,然后使用 math.sqrt()
计算平方根。它会提供答案,例如 “平均年龄的平方根是 5.449689683556195。”
接下来,我们创建 DataFrame 的副本,并用平均年龄填充缺失的年龄值:
df1 = df.copy()
df1["Age"] = df1["Age"].fillna(df1["Age"].mean())
然后,可以使用两个 DataFrame 初始化 agent 并询问问题:
agent = create_pandas_dataframe_agent(OpenAI(temperature=0), [df, df1], verbose=True)
agent.run("how many rows in the age column are different?")
该 agent 将比较两个 DataFrame 中的年龄列并提供答案,例如 “年龄列中有 177 行是不同的。”
Jira 工具包
这里介绍如何使用 Jira 工具包,该工具包允许 agent 与 Jira 实例进行交互。你可以执行各种操作,如搜索问题和创建问题。它使用 atlassian-python-api 库。要使用此工具包,需要为 Jira 实例设置环境变量,包括 JIRA_API_TOKEN、JIRA_USERNAME 和 JIRA_INSTANCE_URL。此外,还需要将 OpenAI API 密钥设置为环境变量。
首先,安装 atlassian-python-api 库并设置所需的环境变量:
%pip install atlassian-python-api
import os
from langchain.agents import AgentType
from langchain.agents import initialize_agent
from langchain.agents.agent_toolkits.jira.toolkit import JiraToolkit
from langchain.llms import OpenAI
from langchain.utilities.jira import JiraAPIWrapper
os.environ["JIRA_API_TOKEN"] = "abc"
os.environ["JIRA_USERNAME"] = "123"
os.environ["JIRA_INSTANCE_URL"] = "https://jira.atlassian.com"
os.environ["OPENAI_API_KEY"] = "xyz"
llm = OpenAI(temperature=0)
jira = JiraAPIWrapper()
toolkit = JiraToolkit.from_jira_api_wrapper(jira)
agent = initialize_agent(
toolkit.get_tools(), llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True
)
指示 agent 在特定项目中创建具有摘要和描述的新问题:
agent.run("make a new issue in project PW to remind me to make more fried rice")
该 agent 将执行必要的操作来创建问题,并提供响应,例如 “已在项目 PW 中创建了新问题,摘要为‘制作更多炒饭’,描述为‘提醒自己制作更多炒饭’。”
这使你可以使用自然语言指令和 Jira 工具包与 Jira 实例进行交互。