工具包组件和内置Agent组件
文章目录
- Agent组件的功能增强
- Agent组件的记忆功能增强
LangChain提供了一系列与各种Agent组件进行交互的工具包组件和内置Agent组件,以帮助我们快速建立解决各种问题的Agent组件。例如,你可能想要一个Agent组件能够处理用户通过REST API提交的JSON数据,对其进行数据转换,然后返回一个处理后的JSON对象。那么你可以直接调用create_json_agent函数,实例化一个Agent组件,这个函数会返回一个AgentExecutor对象。这个对象能够执行处理JSON数据的任务。
LangChain的这种设计使得开发者无须了解每个Agent组件的内部工作原理,通过提供这样的以create为前缀的函数,让开发者能快速实例化各种特定任务的Agent组件。下面是以create为前缀的函数和各种工具组件包:
- create_json_agent:用于与JSON数据交互的Agent组件。
- create_sql_agent:用于与SQL数据库交互的Agent:组件。
- create_openapi_agent:用于与OpenAPI交互的Agent:组件。
- create pbi_agent:用于与Power BI交互的Agent组件。
- create_vectorstore_router_agent:用于与Vector Store路由交互的Agent组件。
- create_pandas_dataframe_agent:用于与Pandas数据帧交互的Agent组件。
- create_spark_dataframe_agent:用于与Spark数据帧交互的Agent:组件。
- create_spark_sql_agent:用于与Spark SQL交互的Agent组件。
- create_csv_agent::用于与CSV文件交互的Agent组件。
- create_pbi_chat_agent:用于与Power BI聊天交互的Agent组件。
- create_python_agent:用于与Python交互的Agent组件。
- create_vectorstore_agent:用于与Vector Store交互的Agent组件。
- JsonToolkit:用于处理JSON数据的工具组件包。
- SQLDatabaseToolkit:用于处理SQL数据库的工具组件包。
- SparkSQLToolkit:.用于处理Spark SQL的工具组件包。
- NLAToolkit:用于处理自然语言应用的工具组件包。
- PowerBIToolkit:用于处理Power BI应用的工具组件包。
- OpenAPIToolkit:用于处理OpenAPI的工具组件包。
- VectorStoreToolkit:.用于处理Vector Store的工具组件包。
- VectorStoreInfo:用于获取Vector Store信息的工具组件。
- VectorStoreRouter Toolkit:用于处理Vector Store路由的工具组件包。
- ZapierToolkit:用于处理Zapier应用的工具组件包。
- GmailToolkit:用于处理Gmail应用的工具组件包。
- JiraToolkit:.用于处理Jira应用的工具组件包。
- FileManagementToolkit:用于文件管理的工具组件包。
- Play WrightBrowser Toolkit:用于处理Play Wright浏览器的工具组件包。
- AzureCognitiveServicesToolkit:用于处理Azure认知服务的工具组件包。
这些工具组件包的具体功能和实现可能会根据实际的需求和环境进行调整。
Agent组件的功能增强
随着技术的持续发展,Aget组件的功能正在经历深刻的变革和完善。下面重点介绍Agent组件的功能增强。记忆功能增强为OpenAI Functions Agent:组件引人记忆功能是一次重大的突破。这不仅让Agent组件记住先前的对话内容,还使其在执行连续任务时表现得更为出色。例如,Agent组件能从工具中提取3个质数,并进行相乘。在此过程中,Aget组件还有能力验证中间结果,如确认其输出是否为质数。
与向量存储库的融合为了让Agent组件更有效地与向量存储库互动,建议引入一个RetrievalQA,并将其纳人整体Agent的工具集中。此外,Agent组件还能与多个vectordbs进行交互,并在它们之间实现路由。这使Agent组件在数据访问和处理方面具备更广的能力。
Agent组件的记忆功能增强
本文会介绍如何为OpenAI Functions Agent组件添加记忆功能。OpenAI FunctionsAget组件是一个能够调用函数并响应函数输入的强大工具,但在默认配置下,它并不具备记忆之前的对话内容的能力。然而,在许多实际应用场景中都需要Aget组件能够记住之前的对话内容,从而更好地为用户提供服务。
这里设计了一个实验。通过这个实验,将测试大语言模型能否记住之前的对话内容,并在后续的对话中正确使用这些信息。下面从设计问题的角度和步骤开始,然后深人研究如何为Aget组件添加记忆功能,并测试这个功能能否满足预期。下面设计一些问题,让创建的代理组件来回答。设计问题的目的是为了检测大语言模型是否具备记忆能力,是否可以像人类一样记住之前的对话内容。这在实标应用中极为重要,比如在聊天机器人的场景中,希望机器人能记住用户的名字和之前的对话内容,以便在后续的对话中为用户提供更个性化的服务。设计问题的步骤如下。
- 首先,通过调用agent.un(“hi”)启动一次会话。这是一个简单的问候,类似于人类对话的开场白。
- 然后,通过agent…run(“my name is bob’”)介绍一个名字。这是在告诉大语言模型的名字是Bob。这一步的目的是为了测试大语言模型是否能记住这个信息。
- 最后,通过agent…run(“whats my name’”)询问大语言模型的名字。这是一个测试,看大语言模型是否记住了之前介绍的名字。
这个设计问题的角度主要是从记忆能力和对话能力出发,通过设计这样的对话流程,可以测试大语言模型在一次会话中是否能记住之前的信息,并在后续的对话中正确使用这些信息。下面是为OpenAI Functions Agent组件添加记忆功能的代码示例。首先从LangChain模块中导人所需的各种类和函数。LLMMathChain:这是一个类,用于创建一个能够进行数学计算的大语言模型(Large Language Model,LLM)链。LLM链是一个特殊的模型,可以将一系列的工具和大语言模型连接起来,使得模型能够执行更复杂的任务。
OpenAI:这是一个类,用于创建一个OpenAI大语言模型。可以使用这个类来实例化一个OpenAI模型,并在后续的代码中使用它。SerpAPIWrapper:这是一个类,用于创建一个SerpAPI的包装器。SerpAPI是一个搜索引擎结果页面(Search Engine Results Page,SERP)的API,可以使用这个类来实例化一个SerpAPI对象,并在后续的代码中使用它来进行搜索操作。SQLDatabase和SQLDatabaseChain:这两个类用于创建和管理SQL数据库。SQLDatabase是一个用于表示SQL数据库的类,可以使用它来实例化一个SQL数据库对象。SQLDatabaseChain则是一个特殊的链,可以将SQL数据库和大语言模型连接起来,使模型能够执行更复杂的数据库操作。
initialize_agent和Tool:这两个函数用于初始化Agent组件和工具。initialize_agent函数用于创建一个Agent组件,Tool函数则用于创建一个工具。AgentType:这是一个枚举类,定义了各种不同的Agent组件类型。可以使用这、个类来指定要创建的Agent组件的类型。ChatOpenAI:这是一个类,用于创建一个能够进行聊天的OpenAI模型。可以使用这个类来实例化一个聊天模型,并在后续的代码中使用它进行聊天操作。
from langchain import(
LLMMathChain,
OpenAI,
SerpAPIWrapper,
SQLDatabase,
SQLDatabaseChain,)
from langchain.agents import initialize_agent,Tool
from langchain.agents import AgentType
from langchain.chat models import ChatopenAI
创建一个工具(Tools)列表,其中每个工具都是一个Tool对象。Tool对象主要包含3个属性:name、func和description。
llm =ChatopenAI(temperature=0,model="gpt-3.5-turbo-0613")
search =SerpAPIWrapper()
llm_math_chain =LLMMathChain.from_11m(11m=11m,verbose=True)
db=SQLDatabase.from uri ("sqlite:///../../../../../notebooks/Chinook.db")
db_chain =SQLDatabaseChain.from 11m(11m,db,verbose=True)
tools =[
Tool(
name="Search",
func=search.run,
description="useful for when you need to answer questions
about current events.You should ask targeted questions",
),
Tool(
name="Calculator",
func=11m math chain.run,
description="useful for when you need to answer questions about math",
),
Tool(
name="FooBar-DB",
func=db chain.run,
description="useful for when you need to answer questions about FooBar.
Input should be in the form of a question containing full context",)
]
为Agent组件添加记忆功能。在LangChain的Agent框架中,记忆是由ConversationBufferMemory对象管理的,根据实际的业务需求,你可以使用其他类型的记忆组件。extra_prompt_messages:这是一个列表,用于包含一些额外的提示消息。这些消息将被添加到Aget组件的提示模板中。在这个例子中,添加了一个MessagesPlaceholder对象,这个对象表示一个占位符,它的值将在运行代码时被实际的记忆内容替换。
variable name:这是MessagesPlaceholder对象的参数,它表示占位符的变量名。在这个例子中,变量名为"memory",这意味着在提示模板中,{memory}将被替换为实际的记忆内容。memory:这是一个ConversationBufferMemory对象,用于管理Agent组件的记忆。在这个例子中,设置了memory_key为"memory",这意味着记忆内容将被存储在"memory"这个键下;并且设置了return_messages为True,这意味着记忆内容将包括返回的消息。
from langchain.prompts import MessagesPlaceholder
from langchain.memory import ConversationBufferMemory
agent_kwargs ={
"extra_prompt messages":
[Messagesplaceholder (variable name="memory")],}
memory ConversationBufferMemory (memory_key="memory",
return_messages=True)
这段代码中使用initialize_agent函数创建了一个Agent组件实例,并为它配置了工具、大语言模型、Agent组件类型、记忆组件等属性。tools:这是一个Tool对象的列表,每个Tool对象都代表-个可以被Agent组件使用的工具。这些工具将被用来执行具体的任务,如搜索、计算等。llm:这是之前创建的大语言模型包装器。Agent组件将使用这个模型来生成语言输出,以及决定下一步的行动。AgentType…OPENAI_FUNCTIONS:这是一个枚举值,代表Agent组件的类型。在这个例子中选择了OPENAI FUNCTIONS类型的Agent组件,这种类型的Agent组件是为OpenAI函数模型特别设计的。verbose=True:这个参数决定了是否在运行过程中打印详细的日志信息。如果其被设置为True,那么在每次Agent组件进行行动时,都会打印出详细的日志信息,这对于调试和理解Agent组件的行为非常有用。
agent_kwargs:.这是一个字典,用于传递额外的参数给Agent类。在这个例子中传递了extra_prompt_messages参数,这个参数包含了额外的提示消息。memory:这是之前创建的ConversationBufferMemory对象,用于管理Agent组件的记忆。这个对象将被用来存储和检索Agent组件的记忆内容。通过前面的代码,成功创建了一个具有记忆功能的Agent组件。接下来,就可以使用这个Agent组件来进行对话了。Agent组件将能记住之前的对话内容,并可以根据这些记忆来做出决策。
agent= initialize_agent(
tools,
llm,
agent=AgentType.OPENAI FUNCTIONS,
verbose=True,
agent_kwargs=agent_kwargs,
memory=memory,)
启动一次会话。这是一个简单的问候,类似于人类的对话开场白。agent.run ("hi")
Agent组件进行回答。
Entering new chain...
Hello!How can I assist you today?
Finished chain.
'Hello!How can I assist you today?'
通过agent.un(“my name is bob’”))介绍一个名字。这是在告诉大语言模型它的名字是Bob。这一步的目的是看大语言模型能否记住这个信息。
agent.run ("my name is bob")
Entering new chain...
Nice to meet you,Bob!How can I help you today?
Finished chain.
'Nice to meet you,Bob!How can I help you today?'
询问大语言模型的名字。这是一个测试,看大语言模型是否记住了之前介绍的名字。agent.run ("whats my name")
可以看到大语言模型认识了之前介绍的名字:Bob。
Entering new
chain...
Your name is Bob.
Finished chain.
'Your name is Bob.