2026 年 LangChain (记忆)Memory 怎么用?三个核心类 + 完整代码示例

什么是记忆,在lainchain中有什么作用 ?**

LLM 本身是无状态的------每次调用都是全新的,它不记得上一轮说了什么。记忆就是在每次请求时,把历史对话塞进 Prompt,让 LLM "看起来"有记忆。

例子:

没有记忆:

用户:"我叫李明" → LLM 回答

用户:"我叫什么?" → LLM:"我不知道你叫什么" ❌

有记忆:

用户:"我叫李明" → 存入历史

用户:"我叫什么?" → Prompt = 历史 + 新问题 → LLM:"你叫李明" ✅

如何使用以当前的最新版本的lainchain 1.2.15举例说明

python 复制代码
 import os

from dotenv import load_dotenv

load_dotenv(dotenv_path=os.path.join(os.path.dirname(__file__), "../.env"))

from langchain_core.chat_history import InMemoryChatMessageHistory
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnableConfig
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI

# 1. 用dict 管理多用户历史
store = {}


def get_session_heistory(session_id: str):
    if (session_id) not in store:
        # 通过 InMemoryChatMessageHistory 获取历史对话记忆
        store[session_id] = InMemoryChatMessageHistory()
    return store[session_id]


# 2 建立Prompt 必须有Messagesplaceholder
prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "你是一个客服助手"),
        MessagesPlaceholder(variable_name="history"),  # 历史注入这里
        ("human", "{input}"),
    ]
)

# 3 .组装chain
llm = ChatOpenAI(
    model="deepseek-chat",
    api_key=lambda: os.getenv("OPENAI_API_KEY") or "",
    base_url=os.getenv("OPENAI_API_BASE"),
    temperature=0,
)
chain = prompt | llm


# 4 包装带历史的 chai
chain_with_history = RunnableWithMessageHistory(
    chain,
    get_session_heistory,
    input_messages_key="input", #用户输入的 key
    history_messages_key="history",  # 必须和MessagesPlaceholder
)


# 5 使用 (每次必须传 config)

cfg: RunnableConfig = {"configurable": {"session_id": "user_001"}}

chain_with_history.invoke({"input": "我叫李明"}, config=cfg)
chain_with_history.invoke({"input":"你记得我叫什么?"}, config=cfg)

# 查看对话历史
# 查看某个用户的所有历史
history = store["user_001"]
for msg in history.messages:
    print(msg.type, ":", msg.content)

# 清除历史
print('-----------新建窗口清除历史对话')

history.clear()

print(len( history.messages))

流程图如下:

关于记忆主要使用的api

  • InMemoryChatMessageHistory 是历史的容器,负责存储所有对话消息。
  • RunnableWithMessageHistory 是 chain 的包装器,负责每次 invoke 时自动读取和写入历史。

总结:

用 RunnableWithMessageHistory 实现对话记忆,核心就是 5 步:

1 用 dict + InMemoryChatMessageHistory 管理多用户历史

2 Prompt 里用 MessagesPlaceholder 留历史槽位

3 组装普通 chain(prompt | llm)

4 用 RunnableWithMessageHistory 包装 chain,绑定历史管理函数

5 每次调用传入含 session_id 的 config

相关推荐
微扬嘴角10 分钟前
React快速入门
前端·react.js·前端框架
星卯教育tony17 分钟前
2026年全国青少年信息素养大赛主题应用 数字守艺人 丝路新城 星火征程 智传民韵 c++ python scratch 所有真题免费分享
开发语言·c++
ZC跨境爬虫28 分钟前
跟着 MDN 学CSS day_40:(Flexbox实战技能测试)
前端·css·ui·html·tensorflow
z落落28 分钟前
C# 继承:父子构造函数 + base 关键字 +五大访问修饰符(同项目+跨项目 全覆盖)
开发语言·c#
ZC跨境爬虫32 分钟前
跟着 MDN 学CSS day_36:(float、clear与BFC深度解析)
前端·javascript·css·ui·交互
Metaphor69236 分钟前
使用 Python 在 Excel 中查找并高亮显示
python·信息可视化·excel
day day day ...42 分钟前
MyBatis / MyBatis-Plus 动态 SQL 中 OGNL 表达式的常见陷阱与源码分析
java·开发语言·mybatis
basketball6161 小时前
C++ bitset 头文件完全指南
开发语言·c++
Kiling_07041 小时前
Java IO流:字节流实战与性能优化
java·开发语言·php
ConardLi1 小时前
啊?我刚开源的 Skills 已经 7K Star 了?!
前端·人工智能·后端