1.1 什么是memory记忆

Memory在Langchain中是用来存储对话状态的组件

通常,在一个复杂的对话系统中,我们需要记住用户之前说过的话,以便生成上下文相关的回答。

Langchain提供了多种类型的memory机制,帮助开发者方便地管理对话历史或其他有状态的信息。

1.2 常见的memory类型

1.2.1 ConversationBufferMemory

它是一种简单的对话缓冲记忆,存储所有的对话历史记录

每次对话更新时,系统会将所有的历史对话串联成一个大块文本供上下文使用

ConversationBufferMemory 代码示例
from langchain_openai import ChatOpenAI

chat_model=ChatOpenAI(
openai_api_key="sk-bhpqpryfyiszcqwugbmjgvvccultcovcgbfbvauxnbbfkcdo",  # 替换为你的实际API密钥
base_url="https://api.siliconflow.cn/v1",
model="Qwen/Qwen2.5-7B-Instruct"
)

# 创建聊天模板,包含占位符topic
from langchain_core.prompts import PromptTemplate

template="""你是一个与人类对话的聊天机器人
{chat_history}
human:{human_input}
Chatbot:
"""
prompt = PromptTemplate(input_variables=["chat_history", "human_input"],template=template)
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory
memory=ConversationBufferMemory(memory_key="chat_history")
llm_chain=LLMChain(llm=chat_model,prompt=prompt,memory=memory,verbose=True)
print(llm_chain.predict(human_input="可以介绍一下济南吗?给出10个字"))
# # 观察调试输出,第二次的prompt已经有了上一次对话的内容
print(llm_chain.predict(human_input="我刚刚问了什么?"))

1.2.2 ConversationSummaryMemory

这种Memory会对对话进行总结,而不是逐字存储。它通过提炼对话的关键内容,压缩历史对话的长度。这样可以减少显存消耗,且便于处理长时间的对话。

ConversationSummaryMemory代码示例
from langchain_openai import ChatOpenAI

chat_model=ChatOpenAI(
openai_api_key="sk-bhpqpryfyiszcqwugbmjgvvccultcovcgbfbvauxnbbfkcdo",  # 替换为你的实际API密钥
base_url="https://api.siliconflow.cn/v1",
model="Qwen/Qwen2.5-7B-Instruct"
)

# 创建聊天模板,包含占位符topic
from langchain_core.prompts import PromptTemplate

template="""你是一个与人类对话的聊天机器人
{chat_history}
human:{human_input}
Chatbot:
"""
prompt = PromptTemplate(input_variables=["chat_history", "human_input"],template=template)
from langchain.chains import LLMChain
from langchain.memory import ConversationSummaryMemory
memory=ConversationSummaryMemory(llm=chat_model,memory_key="chat_history")
llm_chain=LLMChain(llm=chat_model,prompt=prompt,memory=memory,verbose=True)
print(llm_chain.predict(human_input="可以介绍一下济南吗?"))
# 观察调试输出,第二次的prompt已经有了上一次对话的内容
print(llm_chain.predict(human_input="我刚刚问了什么?"))

1.2.3 ConversationBufferWindowMemory

这种Memory只存储最近的K次对话。与ConversationBufferMemory不同,它不会存储所有的对话历史,而是通过窗口机制保留最新的对话片段。

ConversationBufferWindowMemory代码示例
from langchain_openai import ChatOpenAI

chat_model=ChatOpenAI(
openai_api_key="sk-bhpqpryfyiszcqwugbmjgvvccultcovcgbfbvauxnbbfkcdo",  # 替换为你的实际API密钥
base_url="https://api.siliconflow.cn/v1",
model="Qwen/Qwen2.5-7B-Instruct"
)

# 创建聊天模板,包含占位符topic
from langchain_core.prompts import PromptTemplate

template="""你是一个与人类对话的聊天机器人
{chat_history}
human:{human_input}
Chatbot:
"""
prompt = PromptTemplate(input_variables=["chat_history", "human_input"],template=template)
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferWindowMemory
memory=ConversationBufferWindowMemory(k=2,memory_key="chat_history")
llm_chain=LLMChain(llm=chat_model,prompt=prompt,memory=memory,verbose=True)
print(llm_chain.predict(human_input="趵突泉在哪里?"))
print(llm_chain.predict(human_input="我刚刚问了什么?"))
print(llm_chain.predict(human_input="大明湖在哪里?"))
print(llm_chain.predict(human_input="大明湖里有什么?"))

因此我们可以看到所谓的记忆实际上就是在prompt中加入历史记录,在实际应用中我们可以手动实现加入记忆,仅需要把每次的对话保存下来然后拼接到下一次的prompt中。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐