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

相关推荐
昵称画3 小时前
交接班记录电子化:三班之间的信息不漏
开发语言·数据库·人工智能·低代码·php
“AI国潮设计-小江”3 小时前
【AIGC实战】Python+SDXL批量生成“潮汕英歌舞不倒翁”IP | 角色一致性与多场景融合方案,附完整代码
开发语言·人工智能·python·prompt·aigc
沙蒿同学3 小时前
不引 Ghostscript:我用纯 Go 给 PDF 做了一场「压缩手术」
前端·后端·github
传奇开心果编程3 小时前
【Rust入门练中学】第6课:结构体与方法
开发语言·rust·结构体·编程语言理论·结构体方法·编程通用语言
Linux_cy3 小时前
服务器管理工具哪个好用?我用了七八个
运维·服务器·javascript·python·ssh·面板·gmssh
MoRanzhi12034 小时前
第6篇(下)· 使用 PyQt5 实现 2048 高性能计算版:统一运行控制与跨模式安全交接
python·pyqt·进程管理·状态机·软件架构·并发控制·数据一致性
code tsunami4 小时前
【无标题】
开发语言·python
变与不变8064 小时前
jQuery细节以及使用应用场景
前端·javascript·jquery
CodeGL4 小时前
10、Python基础之进程和线程
开发语言·python
TechWayfarer5 小时前
PHP漏洞被利用,怎么揪出攻击IP?
开发语言·python·tcp/ip·网络安全·php