LangChain 会话记忆
本文最后更新于 2026年7月29日
未完待续
概述
记忆缓存是对话系统中的重要组件,用于存储和管理对话的上下文信息,让AI助手能记住之前的对话内容,从而提供连贯而个性化的回复。
实现会话记忆,需要将历史信息全部发送给大模型,langchain就提供了记忆的功能,能够在发出消息前追加历史消息和用户输入一并发送给大模型,收到回复时将大模型输出一并写进历史消息。
langchain早期版本使用ConversationBufferMemory,但是现在的0.3.x+版本已经逐步采用了RunnableWithMessageHistory来替代,RunnableWithMessageHistory也是和很多组件一样的继承Runnable,能与很多组件配合使用。
例:
RunnableWithMessageHistory为对话链自动加上记忆,以session_id进行隔离,自动维护历史消息,与BaseChatMessageHistory配合使用,参数有:runnable对话链get_session_history历史记录函数input_messages_key输入字段history_messages_key历史记录字段
RunnableWithMessageHistory必须与ChatPromptTemplate,MessagesPlaceholder以及get_session_history()函数一起使用BaseChatMessageHistory是一个基类,派生很多实现类,用于保存对话记录,比如InMemoryChatMessageHistory就是将记录保存在内存中,其主要成员:messages: list[BaseMessage]用于接收和读取历史def add_message(self, message: BaseMessage) -> None:添加一条消息def add_messages(self, messages: Sequence[BaseMessage]) -> None:批量添加消息async def aclear(self) -> None:清空
实际场景中,应该选择保存进Redis/ES等数据库的实现类
import os
from langchain.chat_models import init_chat_model
from langchain_core.chat_history import BaseChatMessageHistory, InMemoryChatMessageHistory
from langchain_core.prompts import PromptTemplate, MessagesPlaceholder, ChatPromptTemplate
from langchain_core.runnables import RunnableLambda, RunnableSequence, RunnableWithMessageHistory
store = {}
def get_session_history(session_id: str) -> BaseChatMessageHistory:
if session_id not in store:
store[session_id] = InMemoryChatMessageHistory()
return store[session_id]
prompt_template = ChatPromptTemplate.from_messages(
[
('system', '你是一个AI助手,名字叫小美'),
MessagesPlaceholder('history'),
('human', '{input}')
]
)
llm = init_chat_model(
model = 'deepseek-chat',
model_provider = 'openai',
api_key = os.getenv('DSKEY'),
base_url = 'https://api.deepseek.com'
)
chain_with_history = RunnableWithMessageHistory(
runnable=prompt_template | llm,
get_session_history=get_session_history,
input_messages_key='input',
history_messages_key='history'
)
resp = chain_with_history.invoke(
input={'input': '1加1等于几呀'},
config={'session_id': 1}
)
print(resp.content)
print('#'*30)
resp = chain_with_history.invoke(
{'input': '那加2呢'},
config={'session_id': 1}
)
print(resp.content)
1加1等于2哦!这是一个非常基础的数学问题,如果你有其他问题,也可以问我!😊
##############################
1加2等于3!如果是指“1加1再加2”,那结果是1+1+2=4。需要我帮你算其他数吗?😊"如果文章对您有帮助,可以请作者喝杯咖啡吗?"
微信支付
支付宝