LangChain 会话记忆

本文最后更新于 2026年7月29日

未完待续

概述

记忆缓存是对话系统中的重要组件,用于存储和管理对话的上下文信息,让AI助手能记住之前的对话内容,从而提供连贯而个性化的回复。

实现会话记忆,需要将历史信息全部发送给大模型,langchain就提供了记忆的功能,能够在发出消息前追加历史消息和用户输入一并发送给大模型,收到回复时将大模型输出一并写进历史消息。

langchain早期版本使用ConversationBufferMemory,但是现在的0.3.x+版本已经逐步采用了RunnableWithMessageHistory来替代,RunnableWithMessageHistory也是和很多组件一样的继承Runnable,能与很多组件配合使用。


例:

  1. RunnableWithMessageHistory为对话链自动加上记忆,以session_id进行隔离,自动维护历史消息,与BaseChatMessageHistory配合使用,参数有:

    • runnable 对话链
    • get_session_history 历史记录函数
    • input_messages_key 输入字段
    • history_messages_key 历史记录字段
  2. RunnableWithMessageHistory必须与ChatPromptTemplateMessagesPlaceholder以及get_session_history()函数一起使用

  3. BaseChatMessageHistory是一个基类,派生很多实现类,用于保存对话记录,比如InMemoryChatMessageHistory就是将记录保存在内存中,其主要成员:

    • messages: list[BaseMessage] 用于接收和读取历史
    • def add_message(self, message: BaseMessage) -> None: 添加一条消息
    • def add_messages(self, messages: Sequence[BaseMessage]) -> None: 批量添加消息
    • async def aclear(self) -> None: 清空

实际场景中,应该选择保存进Redis/ES等数据库的实现类


import os

from langchain.chat_models import init_chat_model
from langchain_core.chat_history import BaseChatMessageHistory, InMemoryChatMessageHistory
from langchain_core.prompts import PromptTemplate, MessagesPlaceholder, ChatPromptTemplate
from langchain_core.runnables import RunnableLambda, RunnableSequence, RunnableWithMessageHistory

store = {}


def get_session_history(session_id: str) -> BaseChatMessageHistory:
    if session_id not in store:
        store[session_id] = InMemoryChatMessageHistory()
    return store[session_id]




prompt_template = ChatPromptTemplate.from_messages(
    [
        ('system', '你是一个AI助手,名字叫小美'),
        MessagesPlaceholder('history'),
        ('human', '{input}')
    ]
)

llm = init_chat_model(
    model = 'deepseek-chat',
    model_provider = 'openai',
    api_key = os.getenv('DSKEY'),
    base_url = 'https://api.deepseek.com'
)



chain_with_history = RunnableWithMessageHistory(
    runnable=prompt_template | llm,
    get_session_history=get_session_history,
    input_messages_key='input',
    history_messages_key='history'
)



resp = chain_with_history.invoke(
    input={'input': '1加1等于几呀'},
    config={'session_id': 1}
)
print(resp.content)
print('#'*30)
resp = chain_with_history.invoke(
    {'input': '那加2呢'},
    config={'session_id': 1}
)
print(resp.content)

1加1等于2哦!这是一个非常基础的数学问题,如果你有其他问题,也可以问我!😊
##############################
1加2等于3!如果是指“1加1再加2”,那结果是1+1+2=4。需要我帮你算其他数吗?😊

"如果文章对您有帮助,可以请作者喝杯咖啡吗?"

微信二维码

微信支付

支付宝二维码

支付宝


LangChain 会话记忆
https://blog.liuzijian.com/post/2026/01/19/langchain-memory/
作者
Liu Zijian
发布于
2026年1月19日
更新于
2026年7月29日
许可协议