Skip to main content

如何为Agent添加内存

本笔记本介绍了如何为Agent添加内存。在阅读本笔记本之前,请先阅读以下笔记本,因为本笔记本将在它们的基础上构建:

为了为Agent添加内存,我们将执行以下步骤:

  1. 创建一个带有内存的LLMChain。
  2. 使用该LLMChain创建一个自定义Agent。

为了完成这个练习,我们将创建一个简单的自定义Agent,该Agent可以访问一个搜索工具,并利用ConversationBufferMemory类。

from langchain.agents import ZeroShotAgent, Tool, AgentExecutor  
from langchain.memory import ConversationBufferMemory
from langchain import OpenAI, LLMChain
from langchain.utilities import GoogleSearchAPIWrapper

API参考:

    search = GoogleSearchAPIWrapper()  
tools = [
Tool(
name="Search",
func=search.run,
description="当你需要回答关于当前事件的问题时很有用",
)
]

注意在PromptTemplate中使用的chat_history变量,它与ConversationBufferMemory中的动态键名相匹配。

prefix = """与人类进行对话,尽力回答以下问题。您可以使用以下工具:"""  
suffix = """开始!"""

{chat_history}
问题:{input}
{agent_scratchpad}"""

prompt = ZeroShotAgent.create_prompt(
tools,
prefix=prefix,
suffix=suffix,
input_variables=["input", "chat_history", "agent_scratchpad"],
)
memory = ConversationBufferMemory(memory_key="chat_history")

现在我们可以构建带有Memory对象的LLMChain,然后创建Agent。

llm_chain = LLMChain(llm=OpenAI(temperature=0), prompt=prompt)  
agent = ZeroShotAgent(llm_chain=llm_chain, tools=tools, verbose=True)
agent_chain = AgentExecutor.from_agent_and_tools(
agent=agent, tools=tools, verbose=True, memory=memory
)



agent_chain.run(input="加拿大有多少人口?")





> 进入新的AgentExecutor链...
思考:我需要找出加拿大的人口数量
动作:搜索
动作输入:加拿大的人口
观察:根据世界计量器对最新联合国数据的阐述,截至2022年12月31日星期六,加拿大的当前人口为38,566,192人。·加拿大...有关加拿大人口趋势的其他信息可以在加拿大统计局的人口和人口统计门户网站上找到。加拿大的人口(真实...人口普查的最新信息索引。由加拿大统计局进行的这项调查提供了加拿大及其...14条记录...按年份和季度估计的人数,加拿大,各省和地区。2021年加拿大人口普查统计了总人口为36,991,981人,比2016年增长约5.2%。...从国家统计机构的人口普查报告和其他统计出版物,(3)欧洲统计局:人口统计,(4)联合国...加拿大是北美洲的一个国家。它的十个省份和三个地区延伸...人口。•2022年第四季度估计。39,292,355(第37位)。有关总土著人口和每个...统计局使用的“土著”或“土著”一词...2022年6月14日...健康决定了个人和人口的个人、社会、经济和环境因素的广泛范围...按人口和关键人群的COVID-19疫苗接种覆盖率。每周五更新,东部时间中午12:00。
思考:我现在知道最终答案了
最终答案:根据世界计量器对最新联合国数据的阐述,截至2022年12月31日星期六,加拿大的当前人口为38,566,192人。
> 完成AgentExecutor链。





'根据世界计量器对最新联合国数据的阐述,截至2022年12月31日星期六,加拿大的当前人口为38,566,192人。'

为了测试该Agent的内存,我们可以提出一个后续问题,该问题依赖于前面的交流中的信息才能正确回答。

agent_chain.run(input="他们的国歌叫什么?")  





> 进入新的AgentExecutor链...
思考:我需要找出加拿大的国歌叫什么。
动作:搜索
动作输入:加拿大的国歌
观察:2010年6月7日...https://twitter.com/CanadaImmigrant加拿大国歌O Canada HQ版-包括歌词、字幕、人声和音乐。歌词:O Canada!2022年11月23日...经过100年的传统,O Canada在1980年被宣布为加拿大的国歌。O Canada的音乐是1880年由卡利克萨·...O Canada,加拿大的国歌。它于1980年7月1日被宣布为官方国歌。“God Save the Queen”仍然是加拿大的皇家国歌...O Canada!我们的家园和祖国!真正的爱国者之爱指挥我们所有人。因为你的手臂能够拿起剑,它能够拿起十字架!“O Canada”(法语:Ô Canada)是加拿大的国歌。这首歌最初是由魁北克省副省长Théodore Robitaille委托...2018年2月1日...这只是一个简单的调整-只有两个词。但是,加拿大刚刚投票使其国歌“O Canada”在性别上中性化...“O Canada”于7月1日被宣布为加拿大的国歌。1980年,距离它在1880年6月24日首次演唱已经过去了100年。音乐。加拿大的爱国音乐与英国或法国的爱国音乐不同,早于第一次法律步骤...2022年2月4日...英文版:O Canada!我们的家园和祖国!真正的爱国者之爱指挥我们所有人。我们的心中充满了热情...2018年2月1日...加拿大参议院通过了一项法案,使该国的国歌性别中性化。如果您对“O Canada”的歌词不熟悉...
思考:我现在知道最终答案了。
最终答案:加拿大的国歌叫做“O Canada”。
> 完成AgentExecutor链。





'加拿大的国歌叫做“O Canada”。'

我们可以看到,该Agent记住了前一个问题是关于加拿大的,并正确地询问了Google搜索加拿大的国歌名称。

为了好玩,让我们将其与没有内存的Agent进行比较。

prefix = """与人类进行对话,尽力回答以下问题。您可以使用以下工具:"""  
suffix = """开始!"""

问题:{input}
{agent_scratchpad}"""

prompt = ZeroShotAgent.create_prompt(
tools, prefix=prefix, suffix=suffix, input_variables=["input", "agent_scratchpad"]
)
llm_chain = LLMChain(llm=OpenAI(temperature=0), prompt=prompt)
agent = ZeroShotAgent(llm_chain=llm_chain, tools=tools, verbose=True)
agent_without_memory = AgentExecutor.from_agent_and_tools(
agent=agent, tools=tools, verbose=True
)



agent_without_memory.run("加拿大有多少人口?")





> 进入新的AgentExecutor链...
思考:我需要找出加拿大的人口数量
动作:搜索
动作输入:加拿大的人口
观察:根据世界计量器对最新联合国数据的阐述,截至2022年12月31日星期六,加拿大的当前人口为38,566,192人。·加拿大...有关加拿大人口趋势的其他信息可以在加拿大统计局的人口和人口统计门户网站上找到。加拿大的人口(真实...人口普查的最新信息索引。由加拿大统计局进行的这项调查提供了加拿大及其...14条记录...按年份和季度估计的人数,加拿大,各省和地区。2021年加拿大人口普查统计了总人口为36,991,981人,比2016年增长约5.2%。...从国家统计机构的人口普查报告和其他统计出版物,(3)欧洲统计局:人口统计,(4)联合国...加拿大是北美洲的一个国家。它的十个省份和三个地区延伸...人口。•2022年第四季度估计。39,292,355(第37位)。有关总土著人口和每个...统计局使用的“土著”或“土著”一词...2022年6月14日...健康决定了个人和人口的个人、社会、经济和环境因素的广泛范围...按人口和关键人群的COVID-19疫苗接种覆盖率。每周五更新,东部时间中午12:00。
思考:我现在知道最终答案了
最终答案:根据世界计量器对最新联合国数据的阐述,截至2022年12月31日星期六,加拿大的当前人口为38,566,192人。
> 完成AgentExecutor链。





'根据世界计量器对最新联合国数据的阐述,截至2022年12月31日星期六,加拿大的当前人口为38,566,192人。'



agent_without_memory.run("他们的国歌叫什么?")





> 进入新的AgentExecutor链...
思考:我应该查找答案
动作:搜索
动作输入:[国家]的国歌
观察:大多数国家都有一首国歌,定义为“一首赞美、奉献或爱国的歌曲”;大多数国歌的风格要么是进行曲,要么是赞美诗。世界各国的国歌列表...以国家语言和英文翻译的标题和歌词,2021年8月1日...1.阿富汗,“Milli Surood”(国歌)·2.亚美尼亚,“Mer Hayrenik”(我们的祖国)·3.阿塞拜疆(一个横跨两个大陆的国家...国歌是象征和唤起对一个国家或民族的历史和传统的颂歌。每个国家的国歌;斐济,“Meda Dau Doka”(“上帝保佑斐济”);芬兰,“Maamme”。(“我们的土地”);法国,“La Marseillaise”(“马赛曲”)。您可以在顶部的菜单中按字母顺序找到国歌,也可以使用搜索功能。本网站专注于国歌的学术研究...2022年2月13日...这位38岁的乡村音乐艺术家有幸在今年的大赛中演唱国歌,她没有让人失望。世界上最古老的国歌;法国,La Marseillaise(“马赛曲”),1795年;阿根廷,Himno Nacional Argentino(“阿根廷国歌”)...2022年3月3日...乡村音乐明星杰西·詹姆斯·德克尔在令人瞠目结舌地演唱《星条旗》之后,赢得了音乐和曲棍球迷的尊重。这个列表显示了国家在左边,国歌在...世界上有许多国家拥有自己的国歌。
思考:我现在知道最终答案了
最终答案:[国家]的国歌是[name of anthem]。
> 完成AgentExecutor链。





'[国家]的国歌是[name of anthem]。'