不同的Memory工具
- 短时记忆:存储在内存中
- 构建记忆实体清单
- 接入知识图谱
- 长对话在内存中的处理方式
- 长时记忆实现方式
内存中的短时记忆
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory()
memory.chat_memory.add_user_message("你好,我是人类!")
memory.chat_memory.add_ai_message("你好,我是AI,有什么可以帮助你的吗?")
memory.load_memory_variables({})
#实现一个最近的对话窗口,超过窗口条数的对话将被删除
from langchain.memory import ConversationBufferWindowMemory
memory = ConversationBufferWindowMemory(k=1)
memory.save_context({"input":"你好,我是人类!"},{"output":"你好,我是AI,有什么可以帮助你的吗?"})
memory.save_context({"input":"我想吃鸡肉"},{"output":"好的,我帮你找找鸡肉的做法"})
memory.load_memory_variables({})
# 这里只会显示 最近一句话
构建记忆实体概念清单
from langchain.llms import OpenAI
from langchain.memory import ConversationEntityMemory
llm = OpenAI(
temperature=0
)
memory = ConversationEntityMemory(llm=llm)
_input = {
"input":"胡八一和王胖子雪莉杨经常在一起冒险,合称盗墓铁三角."
}
memory.load_memory_variables(_input)
memory.save_context(
_input,
{
"output":"听起来很刺激,我也想加入他们!"
}
)
memory.load_memory_variables({"input":"铁三角是谁?"})
使用知识图谱构建记忆
from langchain.llms import OpenAI
from langchain.memory import ConversationKGMemory
llm = OpenAI(
temperature=0
)
memory = ConversationKGMemory(llm=llm,return_messages=True)
memory.save_context(
{"input":"帮我找一下tomie"},
{"output":"对不起请问什么是tomie?"}
)
memory.save_context(
{"input":"tomie是一个培训讲师"},
{"output":"好的,我知道了。"}
)
memory.load_memory_variables({"input":"tomie是谁?"})
memory.get_current_entities("tomie最喜欢做什么事?")
memory.get_knowledge_triplets("tomie最喜欢打游戏")
长对话在内存中的处理方式:总结摘要以及token计算
from langchain.memory import ConversationSummaryMemory
from langchain.llms import OpenAI
llm = OpenAI(
temperature=0
)
memory = ConversationSummaryMemory(llm=llm)
memory.save_context(
{"input":"帮我找一下tomie"},
{"output":"对不起请问什么是tomie?"}
)
memory.save_context(
{"input":"tomie是一个培训讲师"},
{"output":"好的,我知道了。"}
)
memory.load_memory_variables({})
messages = memory.chat_memory.messages
#print(messages)
memory.predict_new_summary(messages,"")
#使用ChatMessageHistory来快速获得对话摘要
from langchain.memory import ConversationSummaryMemory
from langchain.memory import ChatMessageHistory
from langchain.llms import OpenAI
hisiory = ChatMessageHistory()
hisiory.add_user_message("你好,我是人类!")
hisiory.add_ai_message("你好,我是AI小丸子,有什么可以帮助你的吗?")
#memory = ConversationSummaryMemory.from_messages(
# llm=OpenAI(temperature=0),
# chat_memory=hisiory,
# return_messages=True
#)
memory = ConversationSummaryMemory(
llm=OpenAI(temperature=0),
return_messages=True,
buffer="\nThe AI introduces itself as AI Little Maruko and asks if there is anything it can help the human with.",
chat_memory=hisiory
)
#memory.buffer
memory.load_memory_variables({})
# 当对话持续进行且对话内容很多的时候
# 可以使用ConversationSummaryBufferMemory来存储对话摘要
# 这是一种非常有用的方式,它会根据token的数量来自动判断是否需要进行摘要
# 当token数量超过阈值的时候,会自动进行摘要
# 在缓冲区中,会保留最近的k条对话
# 比较久的对话会被删除,在删除前会进行摘要
from langchain.memory import ConversationSummaryBufferMemory
from langchain.llms import OpenAI
llm = OpenAI(temperature=0)
memory = ConversationSummaryBufferMemory(
llm=llm,
max_token_limit=10,
return_messages=True
)
memory.save_context(
{"input":"帮我找一下tomie"},
{"output":"对不起请问什么是tomie?"}
)
memory.save_context(
{"input":"tomie是一个培训讲师"},
{"output":"好的,我知道了。"}
)
memory.save_context(
{"input":"今天他要讲一门关于RAG的课程"},
{"output":"好的,我知道了。需要RAG的资料吗?"}
)
memory.load_memory_variables({})
Conversation Token Buffer使用token长度来决定什么时候刷新内存
from langchain.memory import ConversationTokenBufferMemory
from langchain.llms import OpenAI
llm = OpenAI(temperature=0)
memory = ConversationTokenBufferMemory(
llm=llm,
max_token_limit=150
)
memory.save_context(
{"input":"帮我找一下tomie"},
{"output":"对不起请问什么是tomie?"}
)
memory.save_context(
{"input":"tomie是一个培训讲师"},
{"output":"好的,我知道了。"}
)
memory.save_context(
{"input":"今天他要讲一门关于RAG的课程"},
{"output":"好的,我知道了。需要RAG的资料吗?"}
)
memory.save_context(
{"input":"不需要资料了,谢谢"},
{"output":"好的,那我就不打扰你了。"}
)
memory.load_memory_variables({})
长时记忆的是实现方式
通过向量数据库来存储之前的对话内容,有的向量数据库服务还提供自动摘要等,每次对话的时候,都会从向量数据库里查询最相关的文档或历史对话
from langchain_openai import OpenAIEmbeddings
from langchain.memory import ConversationBufferMemory
from langchain.vectorstores import FAISS
memory = ConversationBufferMemory()
memory.save_context(
{"input":"帮我找一下tomie"},
{"output":"对不起请问什么是tomie?"}
)
memory.save_context(
{"input":"tomie是一个培训讲师"},
{"output":"好的,我知道了。"}
)
memory.save_context(
{"input":"今天他要讲一门关于RAG的课程"},
{"output":"好的,我知道了。需要RAG的资料吗?"}
)
memory.save_context(
{"input":"不需要资料了,谢谢"},
{"output":"好的,那我就不打扰你了。"}
)
vectorstore = FAISS.from_texts(
memory.buffer.split("\n"),
OpenAIEmbeddings()
)
FAISS.save_local(vectorstore,"test_faiss")
from langchain.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain.memory import VectorStoreRetrieverMemory
r1 = FAISS.load_local("test_faiss",OpenAIEmbeddings(),allow_dangerous_deserialization=True)
r2 = r1.as_retriever(
search_kwargs={"k":1}
)
memory2 = VectorStoreRetrieverMemory(
retriever=r2
)
memory2.load_memory_variables({"prompt":"tomie是什么职业?"})