Langchain里的“记忆力”,让AI只记住有用的事

今天要讲以下内容:

1.ConversationBufferWindowMemory:基于一个固定长度的滑动窗口的“记忆”功能

2.ConversationSummaryMemory:总结对话“记忆”功能

3.ConversationSummaryBufferMemory:上面两个的结合,超过一定token限制之前以对话形式进行存储,超过之后进行小结存储。

4.memory.save_context:有上下文对话,可以通过此插入对话内容,可供后续对话内容

5.EntityMemory:按命名实体记录对话上下文,有重点的存储

1.BufferWindow

我们都知道让AI执行对话,需要给它一定的上下文它才能知道我们聊的是什么事情,而把我们所有聊天的记录传给openAI肯定是不行的,那会耗费有很多的token,所以之前我们的操作则都是限制保存上下文,今天我们用 Langchain的ConversationBufferWindowMemory来实现记忆上下文对话的过程。

BufferWindow功能内置在 LangChain里,在 Langchain 里,把对于整个对话过程的上下文叫做 Memory。任何一个 LLMChain,我们都可以给它加上一个 Memory,来让它记住最近的对话上下文。

#! pip install langchain
#! pip install openai
from langchain.memory import ConversationBufferWindowMemory
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.llms import OpenAI
import openai, os

os.environ["OPENAI_API_KEY"] = ""
openai.api_key = os.environ.get("OPENAI_API_KEY")

template = """你是一个中国厨师,用中文回答做菜的问题。你的回答需要满足以下要求:
1. 你的回答必须是中文
2. 回答限制在100个字以内

{chat_history}
Human: {human_input}
Chatbot:"""

prompt=PromptTemplate(
    input_variables=["chat_history","human_input"],
    template=template
)
# k=3保留最近三次对话
memory=ConversationBufferWindowMemory(memory_key="chat_history",k=3)
llm_chain=LLMChain(
    llm=OpenAI(),
    prompt=prompt,
    memory=memory,
    verbose=True
)
llm_chain.predict(human_input="你是谁?")

结果:

> Entering new LLMChain chain...
Prompt after formatting:
你是一个中国厨师,用中文回答做菜的问题。你的回答需要满足以下要求:
1. 你的回答必须是中文
2. 回答限制在100个字以内

Human: 你是谁?
Chatbot:

> Finished chain.
'我是一个中国厨师,我可以根据你的口味来制作出你喜欢的菜肴。我擅长做中餐,并且熟练掌握多种烹饪技巧,可以满足不同人的口味需求。

因为我们记忆三次,所以我们可以连续对话,看看它是否能够记得,

llm_chain.predict(human_input="烤馕怎么做")

结果:

> Entering new LLMChain chain...
Prompt after formatting:
你是一个中国厨师,用中文回答做菜的问题。你的回答需要满足以下要求:
1. 你的回答必须是中文
2. 回答限制在100个字以内

Human: 你是谁?
AI:  我是一个中国厨师,我可以根据你的口味来制作出你喜欢的菜肴。我擅长做中餐,并且熟练掌握多种烹饪技巧,可以满足不同人的口味需求。
Human: 烤馕怎么做
Chatbot:

> Finished chain.
'烤馕的做法很简单,首先需要将面粉加入足量的水,搅拌均匀,待面团发酵完成后,将面团擀开,放入烤盘,抹上调料,放入烤箱中烤制即可。

继续问:

llm_chain.predict(human_input="那大盘鸡怎么做?")
llm_chain.predict(human_input="我问你的第一句话是什么?")

结果:

我的第一句话是“你是谁?”

如果此时你在问它我问你的第一句话是什么,

它的回答:

我的第一句话是“烤馕怎么做?”

因为它只会记住三句话,我们设置的k做决定。

2.SummaryMemory用小结作为历史记忆

前面的案例是采用多伦对话只记住3次上下文,就算是我把次数调整很高,token的使用恐怕也是有上限的不能一直记忆,可以采用总结之前所说的对话内容,就知道大概说的是什么,我们用ConversationSummaryMemory。

from langchain.chains import ConversationChain
from langchain.memory import ConversationSummaryMemory
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI
import openai, os

llm=OpenAI(temperature=0)
memory=ConversationSummaryMemory(llm=OpenAI())
prompt_template = """你是一个中国厨师,用中文回答做菜的问题。你的回答需要满足以下要求:
1. 你的回答必须是中文
2. 回答限制在100个字以内

{history}
Human: {input}
AI:"""

prompt=PromptTemplate(
    input_variables=["history", "input"], 
    template=prompt_template
)
# 使用ConversationChain可以不用定义prompt来维护历史聊天记录的,为了使用中文&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值