1 为什么要添加记忆?
别让AI变成金鱼!想象一下,你和AI聊天机器人聊得正嗨,突然问它:“刚才我们聊到哪儿了?”它一脸懵圈地回答:“啊?我们之前聊过吗?”——这就像跟金鱼聊天,每次对话都是新的开始,完全没上下文!这就是没有
Memory的LangChain应用会遇到的尴尬。
2 langchain中如何添加记忆?
ChatMessageHistory
就是LangChain给AI配的
智能小本本
——专门用来记你和AI的聊天黑历史,防止它像金鱼一样7秒失忆!

举两个例子:
场景1:订披萨
你:“要一个海鲜披萨”
AI:“好的!”(偷偷在小本本写:用户点了海鲜披萨)
你:“不要洋葱!”
AI翻小本本:“明白,海鲜披萨不加洋葱!”(而不是反问:“您刚才点过披萨吗?”)
场景2:讲鬼故事
你:“从前有座山…”
AI:“山里有个庙?”(在小本本记下故事进度)
第二天你:“接着讲!”
AI秒答:“庙里有个老和尚在讲鬼故事!”(而不是从头开始)
from langchain.chat_models import init_chat_model
from langchain_core.chat_history import InMemoryChatMessageHistory
from langchain_core.messages import HumanMessage
from langchain_core.runnables import RunnableWithMessageHistory
# 1. 构建llm
API_KEY = "sk-xxx"
llm = init_chat_model(model_provider="deepseek", model="deepseek-chat", api_key=API_KEY)
# 2. 构建会话历史记录器
history = InMemoryChatMessageHistory()
runnable_with_history = RunnableWithMessageHistory(
llm,
lambda _: history,
)
# 3. 介绍自己
response = runnable_with_history.invoke(
[HumanMessage(content="你好,我叫钢蛋,来自蒙塔奇!")],
config={"configurable": {"session_id": "1"}},
)
print(response.content)
# 4 再问他
response = runnable_with_history.invoke(
[HumanMessage(content="我叫什么?来自哪?")],
config={"configurable": {"session_id": "1"}},
)
print(response.content)
打印内容
你好,钢蛋!很高兴认识你。蒙塔奇听起来像是一个很有趣的地方,能告诉我更多关于那里的故事吗?你是第一次来这里吗?
你叫钢蛋,来自蒙塔奇。很高兴再次确认你的信息!如果你有任何问题或想分享更多关于蒙塔奇的故事,请随时告诉我。
3 如何持久化?
InMemoryChatMessageHistory
就是个内存条上的便利贴!AI边唠嗑边往上涂鸦,但只要一拔电源,这些聊天记录就跟鱼的记忆一样——说好的海誓山盟,7秒后变成"您哪位?"。这时候就需要给AI整个保险箱,也就是传说中的"防社死持久化存储"!

LangChain的BaseChatMessageHistory就像存储界的哆啦A梦:
- FileChatMessageHistory:人狠话不多的日记本侠,直接把聊天记录刻进文本文件
- MongoDBChatMessageHistory:数据库界的仓库大总管,相当于给你和AI的聊天记录买了套200平大别墅
- RedisChatMessageHistory:秒天秒地的闪电侠,读写速度比你双十一抢优惠券还快
接下来我们尝试使用FileChatMessageHistory,对代码进行改造:
from langchain.chat_models import init_chat_model
from langchain_community.chat_message_histories import FileChatMessageHistory
from langchain_core.chat_history import InMemoryChatMessageHistory
from langchain_core.messages import HumanMessage
from langchain_core.runnables import RunnableWithMessageHistory
# 1. 构建llm
API_KEY = "sk-xxx"
llm = init_chat_model(model_provider="deepseek", model="deepseek-chat", api_key=API_KEY)
# 2. 构建会话历史记录器
def get_history(session_id):
file_path = f"{session_id}.json"
return FileChatMessageHistory(file_path=file_path)
runnable_with_history = RunnableWithMessageHistory(
llm,
get_history
)
# 3. 介绍自己
response = runnable_with_history.invoke(
[HumanMessage(content="你好,我叫钢蛋,来自蒙塔奇!")],
config={"configurable": {"session_id": "1"}},
)
print(response.content)
# 4 再问他
response = runnable_with_history.invoke(
[HumanMessage(content="我叫什么?来自哪?")],
config={"configurable": {"session_id": "1"}},
)
print(response.content)
对话完毕后,我们可以看到有一个名为1.json的文件已经被生成:

当我们打开文件,可以看到以下内容,对话采用json数组的方式进行记录了下来:

大家可以参考本例,基于当前的数据库类型,尝试使用RedisChatMessageHistory、MongoDBChatMessageHistory等。