1,简介
存储对话历史中的信息的能力称之为’记忆‘,这种工具可以单独使用,也可以无缝的集成到一条链中,记忆的存储长度是程序执行到结束,执行一次的所有记忆。
记忆的主要应用场景就是聊天机器人,聊天机器人的一个关键功能是它们能够使用先前对话的内容作为上下文。
记忆力在实际使用的逻辑:
记忆力在使用中可以分一下几个场景:
记忆力的几个重要的类:
ConversationBufferMemory会话缓冲区
如实的记录列表中记录的对话历史消息,并且是记录所有的历史消息,随着历史记录的增加,运行会越来越慢,直到大模型无法处理.适用于交互次数少,输入输出字符量不大的情况下
ConversationBufferWindowMemory会话缓冲窗口
持续记录对话历史,但只使用最近的k个交互。确保缓存大小不会过大,运行速度比较稳定
ConversationSummaryMemory会话摘要
随着时间的推移总结对话内容,并且将摘要存储在记忆中,需要的时候将摘要注入提示词或链中,缓存不会过大,运行稳定,但是运行速度比ConversationBufferWindowMemory慢很多,因为他在写入记忆的时候,做了一个摘要的操作.这使得她可以记住很长的交互记忆,不过随着交互的增加,摘要的内容不断迭代更换,使得某些内容会遗失.
VectorStoreRetrieverMemory向量存储
将记忆存储在向量存储中,并在每次调用时查询前K个最"显著"的文档。 与大多数其他记忆类不同的是,它不明确跟踪交互的顺序。 在这种情况下,"文档"是先前对话片段。这对于提及AI在对话中早些时候被告知的相关信息可能是有用的。这段话是官方文档的描述,猜测应该是将记忆做成了一个文档,使用文档阅读器来进行读取
2,使用代码示例
下面的示例没有使用上面四个重要的类,下面的示例主要使用让我们更加直观理解记忆力的运行逻辑。
手动一个简单聊天记录消息的记忆聊天
通过手动添加聊天消息,实现记忆力功能。
import os
from langchain_community.embeddings.huggingface import HuggingFaceEmbeddings
from langchain_community.chat_models import QianfanChatEndpoint
from langchain_core.messages import AIMessage, HumanMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
os.environ["QIANFAN_AK"] = "*****" # 这里需要修改为自己的实际值
os.environ["QIANFAN_SK"] = "*****" # 这里需要修改为自己的实际值
def load_embedding_mode():
return HuggingFaceEmbeddings(model_name='text2vec-base-chinese',
model_kwargs={'device': 'cpu'})
model = QianfanChatEndpoint(
streaming=True,
model="ERNIE-Bot",
)
##手动一个简单聊天记录消息的记忆聊天
##占位符
prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"你是一个乐于助人的助手。尽你所能回答所有的问题。",
),
MessagesPlaceholder(variable_name="messages"),
]
)
chain = prompt | model
rep = chain.invoke(
{
"messages": [
HumanMessage(content="将这句话从汉语翻译成英语:我喜欢编程。"),
AIMessage(content="I love programming"),
HumanMessage(content="你刚刚说什么?"),
]
}
)
print(rep)
#content='我刚刚说的是:“I love programming”,意思是“我喜欢编程”。如果您有任何其他问题或需要进一步的解释,请随时告诉我。' additional_kwargs={} response_metadata={'token_usage': {'input_tokens': 30, 'output_tokens': 24, 'total_tokens': 54}, 'model_name': 'ERNIE-Bot', 'finish_reason': 'stop'} id='run-215d46b1-c8bf-4f7b-bbf3-50afaceb947e-0' usage_metadata={'input_tokens': 30, 'output_tokens': 24, 'total_tokens': 54}
聊天记录储存和加载
将聊天记录储存在内存中,读取内存的中记录实现记忆力聊天功能。
import os
from langchain_community.embeddings.huggingface import HuggingFaceEmbeddings
from langchain_community.chat_models import QianfanChatEndpoint
from langchain_core.messages import AIMessage, HumanMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
os.environ["QIANFAN_AK"] = "*****" # 这里需要修改为自己的实际值
os.environ["QIANFAN_SK"] = "*****" # 这里需要修改为自己的实际值
def load_embedding_mode():
return HuggingFaceEmbeddings(model_name='text2vec-base-chinese',
model_kwargs={'device': 'cpu'})
model = QianfanChatEndpoint(
streaming=True,
model="ERNIE-Bot",
)
from langchain_community.chat_message_histories import ChatMessageHistory
prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"你是一个乐于助人的助手。尽你所能回答所有的问题。",
),
MessagesPlaceholder(variable_name="messages"),
]
)
chain = prompt | model
demo_ephemeral_chat_history = ChatMessageHistory()
input1 = "这里的天气非常好,空气也干净"
demo_ephemeral_chat_history.add_user_message(input1)
response = chain.invoke(
{
"messages": demo_ephemeral_chat_history.messages
}
)
demo_ephemeral_chat_history.add_ai_message(response)
input2 = "你刚刚说了什么?"
demo_ephemeral_chat_history.add_user_message(input2)
rep = chain.invoke(
{
"messages": demo_ephemeral_chat_history.messages
}
)
print(rep)
#content='我刚刚说听起来你所在的地方天气很好,空气也很干净,是个适合居住的好地方。我还问了你是否有什么计划或者想法,想要在这样的好天气里做些什么。' additional_kwargs={} response_metadata={'token_usage': {'input_tokens': 61, 'output_tokens': 34, 'total_tokens': 95}, 'model_name': 'ERNIE-Bot', 'finish_reason': 'stop'} id='run-02d24630-5c6a-466a-83be-c1133bab7f70-0' usage_metadata={'input_tokens': 61, 'output_tokens': 34, 'total_tokens': 95}
自动聊天历史记录管理
这里加上了一个session_id用于区分不同的用户的消息记录,在实际中使用不可能都是一个人在使用。那么就要使用人加上id用以区分聊天记录。
import os
from langchain_community.embeddings.huggingface import HuggingFaceEmbeddings
from langchain_community.chat_models import QianfanChatEndpoint
from langchain_core.messages import AIMessage, HumanMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
os.environ["QIANFAN_AK"] = "*****" # 这里需要修改为自己的实际值
os.environ["QIANFAN_SK"] = "*****" # 这里需要修改为自己的实际值
def load_embedding_mode():
return HuggingFaceEmbeddings(model_name='text2vec-base-chinese',
model_kwargs={'device': 'cpu'})
model = QianfanChatEndpoint(
streaming=True,
model="ERNIE-Bot",
)
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistory
prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"你是一个乐于助人的助手。尽你所能回答所有的问题。",
),
MessagesPlaceholder(variable_name="chat_history"),
("human", "{input}")
]
)
chain = prompt | model
demo_ephemeral_chat_history_for_chain = ChatMessageHistory()
chain_with_message_history = RunnableWithMessageHistory(
chain,
lambda session_id: demo_ephemeral_chat_history_for_chain,
input_messages_key="input",
history_messages_key="chat_history",
)
rep = chain_with_message_history.invoke(
{"input": "这里的天气非常好,空气也干净"},
{"configurable": {"session_id": "9999"}}
)
print(rep)
#content='那真是太好了!好的天气和清新的空气可以让人心情愉悦,也有益于身体健康。你可以享受这样的好天气,做些户外活动,比如散步、跑步或者骑自行车。这些活动不仅可以锻炼身体,还可以让你更加接近自然,感受大自然的美好。' additional_kwargs={} response_metadata={'token_usage': {'input_tokens': 21, 'output_tokens': 48, 'total_tokens': 69}, 'model_name': 'ERNIE-Bot', 'finish_reason': 'stop'} id='run-7d37d6da-96dd-4d9c-8198-d40992e3f51c-0' usage_metadata={'input_tokens': 21, 'output_tokens': 48, 'total_tokens': 69}
rep1 = chain_with_message_history.invoke(
{"input": "刚刚说了什么?"},
{"configurable": {"session_id": "9999"}}
)
print(rep1)
#content='您刚刚说:“这里的天气非常好,空气也干净。” 这是一个很好的观察,好的天气和清新的空气确实能给人带来愉悦和舒适的感觉。' additional_kwargs={} response_metadata={'token_usage': {'input_tokens': 73, 'output_tokens': 31, 'total_tokens': 104}, 'model_name': 'ERNIE-Bot', 'finish_reason': 'stop'} id='run-115dafff-81f1-4165-8d5b-ce16f0915349-0' usage_metadata={'input_tokens': 73, 'output_tokens': 31, 'total_tokens': 104}
以上就是记忆力的简单介绍和使用,为日后的使用中添加深入的理解。