首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >15天学会AI应用开发(十六)LangChain实现对话记忆功能

15天学会AI应用开发(十六)LangChain实现对话记忆功能

作者头像
aqi00
发布2026-07-01 20:24:37
发布2026-07-01 20:24:37
870
举报
文章被收录于专栏:老欧说安卓老欧说安卓

大模型本身是无状态的,也就是不具备记忆功能,单次对话无法留存上下文信息,多轮交互中会遗忘历史对话内容。用户之所以感觉AI工具拥有记忆,是因为AI工具给大模型封装了一层记忆。

LangChain作为主流的大模型应用开发框架,内置完善的记忆模块(Memory模块),能够高效管理对话历史记录,让AI实现逻辑连贯的多轮对话,接下来就介绍如何使用LangChain实现对话记忆功能。

一、记忆功能用到的组件说明

LangChain实现对话记忆功能要掌握下列三个核心组件,需三者配合才能完成上下文管理全流程:

1、对话历史存储组件

以ChatMessageHistory为核心,基于内存临时存储对话记录,无需安装额外的数据库,适合开发者快速编码和测试。对话数据仅在应用程序运行期间留存,重启应用程序后会清空对话数据,可满足AI应用的轻量化对话场景需求。

2、记忆绑定核心组件

RunnableWithMessageHistory是对话记忆架构的核心组件,可包装LangChain的任意执行链,自动实现对话历史记录的读取、拼接和更新,能够支持多个会话数据的相互隔离,解决了传统组件存在的多会话冲突问题。

3、提示词模板组件

聊天提示词模板ChatPromptTemplate用于规范向大模型输入的提示词格式,它固定采用“系统指令+历史对话+当前提问”的结构,让大模型能够精准识别上下文信息,保证当前用户的对话记忆功能逻辑统一,不会胡说八道。

二、实现记忆功能的环境准备

ChatMessageHistory组件来自于langchain_community,而RunnableWithMessageHistory和ChatPromptTemplate来自于langchain-core,故需提前安装相关的langchain包。

在命令行窗口执行下面命令,即可安装LangChain及其用到的Ollama插件,以及记忆功能需要的langchain_community:

代码语言:javascript
复制
pip install langchain langchain-core langchain-ollama langchain_community

确保本地已经通过Ollama下载了离线大模型,比如在命令行窗口执行下面命令,即可下载大模型qwen2:1.5b:

代码语言:javascript
复制
ollama pull qwen2:1.5b

等待大模型下载完毕,在命令行窗口执行下面命令,即可启动Ollama并加载大模型:

代码语言:javascript
复制
ollama serve

三、AI记忆对话的编码实战

在Python代码开头添加下面的导包语句,表示引入ChatMessageHistory、RunnableWithMessageHistory、ChatPromptTemplate三个组件,以及LangChain的大模型工具OllamaLLM:

代码语言:javascript
复制
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_ollama import OllamaLLM

在OllamaLLM的构造方法中填写model参数,指定当前引用的离线大模型名称,如下:

代码语言:javascript
复制
# 连接本地离线大模型(Ollama)
llm = OllamaLLM(model="qwen2:1.5b")

然后编写下面的LangChain调用代码,先利用ChatPromptTemplate构造给history变量占位的提示词模板,接着往ChatMessageHistory组件存储对话历史,再通过RunnableWithMessageHistory在封装执行链时带入历史数据,示例代码如下:

代码语言:javascript
复制
 # 1、对话模板(留一个位置放历史)
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是友好助手,记住前面的对话。"),
    MessagesPlaceholder(variable_name="history"),
    ("human", "{input}")
])
# 2、内存存储历史(多用户可按 session_id 分)
store = {}
# 获取指定会话的历史记录
def get_history(session_id: str):
    if session_id not in store:
        store[session_id] = ChatMessageHistory()
    return store[session_id]
# 3、带记忆的执行链
chain = prompt | llm
chain_with_mem = RunnableWithMessageHistory(
    chain,
    get_history,
    input_messages_key="input",
    history_messages_key="history"
)
# 4、测试对话
print("=== 带记忆AI聊天(输入 退出 结束)===")
while True:
    user_input = input("你:")
    if user_input in ["退出", "exit", "quit"]:
        print("对话结束")
        break
    # 调用模型(传入历史)
    response = chain_with_mem.invoke({"input": user_input}, config={"configurable": {"session_id": "session_001"}})
    print(f"AI:{response}\n")

运行上面的Python代码,根据提示先后输入问题内容“你叫什么名字?”、“不对,你叫小明”、“你叫什么名字?”,输出日志结果如下:

代码语言:javascript
复制
=== 带记忆AI聊天(输入 退出 结束)===
你:你叫什么名字?
AI:我叫小冰。
你:不对,你叫小明
AI:抱歉,我记错了。
你:你叫什么名字?
AI:小冰
你:不对,你叫小明
AI:抱歉,我记错了。请问有什么我能帮助您的吗?
你:你叫什么名字?
AI:小明

由日志信息发现,AI应用一开始回答“我叫小冰”,后来被改名后回答自己叫“小明”。可见通过使用LangChain的记忆组件,初步实现了简单的AI对话记忆功能。

本系列的AI应用开发文章目录为《15天学会AI应用开发全目录(零基础小白,零Token消耗)》

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-06-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老欧说安卓 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档