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

相关推荐
李惟2 分钟前
开源本地通信库,纯客户端 RPC,像聊天一样通信
前端
YAwu115 分钟前
深入解析 React 炫彩鼠标跟随标题组件:从坐标定位到动画性能
前端·react.js
GuWenyue10 分钟前
排序效率低?5分钟吃透快速排序,性能飙升至O(nlogn)
前端·javascript·面试
OpenTiny社区13 分钟前
🎨 看完 GenUI SDK 源码我悟了!
前端·vue.js·github
叁两16 分钟前
前端转型AI Agent该如何学习?(前置篇)
前端·人工智能·node.js
何时梦醒20 分钟前
深入理解递归与快速排序 —— 从基础入门到手写实现
前端·javascript
爱勇宝22 分钟前
淡泊名利之前,先承认我们都很焦虑
前端·后端·程序员
bonechips31 分钟前
LLM 的无状态:从 HTTP 协议到对话上下文工程
前端·javascript
杨利杰YJlio32 分钟前
Codex桌面客户端上手:项目、插件与自动化实战
前端·后端
胡志辉32 分钟前
从 prototype 到 V8,看懂 JavaScript 原型链
前端·javascript