【技术专题】基于LangChain的RAG与Agent智能体 - 持久化会话记忆功能实现

0 阅读2分钟

大家好,我是锋哥。最近连载更新《基于LangChain的RAG与Agent智能体》技术专题。

QQ截图20260324143646.jpg 本课程主要介绍和讲解RAG,LangChain简介,接入通义千万大模型,Ollama简介以及安装和使用,OpenAI库介绍和使用,以及最重要的基于LangChain实现RAG与Agent智能体开发技术。同时也配套视频教程 《2027版 基于LangChain的RAG与Agent智能体开发视频教程》

前面我们实现的示例会话历史记录存在内存里的,当程序关闭就没有了。我们实际企业级项目需要持久化会话历史记录,比如存redis,postgres等。

我们用RedisChatMessageHistory来实现下持久化会话记忆功能。

首先我们电脑上要安装redis server端。

image.png

直接双击安装即可,都默认配置。

接着我们项目里要安装redis客户端库。

pip install redis -i https://pypi.tuna.tsinghua.edu.cn/simple  --trusted-host pypi.tuna.tsinghua.edu.cn

我们来实现下代码,基于上一讲的示例:

import redis
from langchain_community.chat_message_histories import RedisChatMessageHistory
from langchain_community.llms.tongyi import Tongyi
from langchain_core.chat_history import InMemoryChatMessageHistory
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnableWithMessageHistory
​
# 1. 定义聊天提示模板(和图片结构一致)
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个友好的AI助手,会结合对话历史回答用户问题。"),  # 系统消息:设定AI基础角色
    MessagesPlaceholder("history"),  # 对话历史占位符:后续会被真实历史数据替换
    ("human", "请回答如下问题:{question}")  # 当前用户的提问(带变量占位)
])
​
model = Tongyi(model="qwen-plus")  # 创建模型chain = prompt | model
​
​
# 实现根据session_id获取RedisChatMessageHistory类对象
def get_session_history(session_id):
    return RedisChatMessageHistory(
        url="redis://localhost:6379/0",
        session_id=session_id,
        key_prefix="chat_history:"  # Redis key 前缀
    )
​
​
# 创建带有会话历史数据的链
message_history_chain = RunnableWithMessageHistory(
    chain,  # 被增强的原有链
    get_session_history,  # 根据会话id获取InMemoryChatMessageHistory类对象
    input_messages_key="question",  # 输入消息的键名
    history_messages_key="history"  # 历史消息的键名
)
​
if __name__ == '__main__':
    session_config = {
        "configurable": {
            "session_id": "user01"
        }
    }
    result = message_history_chain.invoke({"question": "IT行业里哪个细分领域职位最有前途,直接告诉我职位名称即可"},
                                          session_config)
    print("第一次AI大模型回答:", result)
​
    result = message_history_chain.invoke({"question": "这个职位需要多少技术积累?简单回答即可"}, session_config)
    print("第二次AI大模型回答:", result)
​
    result = message_history_chain.invoke({"question": "这个职位在北京5年经验年薪平均多少万?简单回答即可"},
                                          session_config)
    print("第三次AI大模型回答:", result)
​

运行下:效果一样。

image.png

我们用redis desktop Manager打开,可以看到redis里存了会话历史记录了。

image.png