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

相关推荐
qq_1611112729 分钟前
Jenkins+Python自动化测试持续集成详细教程
自动化测试·python·jenkins·教程·持续集成
爱吃苹果的梨叔4 小时前
训练集群网络中断怎么办?智算机房的 Console 串口排障方案
网络·python·智能路由器·php
李姆斯7 小时前
为啥Agent在coding表现这么好,但是在别的领域就是差的不少?
前端·agent·ai编程
李妍.7 小时前
02Numpy基础(上)
开发语言·python
TheBestRucy7 小时前
Python 九阳神功之贰:面向对象(下)
开发语言·python
2601_965958467 小时前
口腔黏膜脱皮超2周未愈建议及时就医
人工智能·python
AI_小站8 小时前
刚面完百度的 Agent 开发岗,我才发现:世界就是个巨大的草台班子
java·开发语言·人工智能·spring·百度·langchain
微小冷8 小时前
在不同空间中展示数据(欧式、球面、庞加莱圆盘)
python·双曲空间·微分几何·geomstats·庞加莱圆盘·球面
felixking9 小时前
C++20 协程
开发语言·c++·协程
weixin_431600449 小时前
Agent Workflow 学习向:Code 节点,比模板更强的变量加工
后端·python·学习·ai·