鱼C论坛

 找回密码
 立即注册
查看: 26|回复: 4

[AI工作流] 22. LangChain组件——memory长期会话记忆

[复制链接]
发表于 3 小时前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. 长期会话记忆实现的核心思想步骤?
下载 (41).png

2. 代码实战
  1. import os, json
  2. from typing import Sequence

  3. from langchain_community.chat_models import ChatTongyi
  4. from langchain_core.messages import message_to_dict, messages_from_dict, BaseMessage
  5. from langchain_core.chat_history import BaseChatMessageHistory
  6. from langchain_core.output_parsers import StrOutputParser
  7. from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
  8. from langchain_core.runnables import RunnableWithMessageHistory
  9. from typing import List

  10. # message_to_dict:单个消息对象(BaseMessage类实例) -> 字典
  11. # messages_from_dict:[字典、字典...]  -> [消息、消息...]
  12. # AIMessage、HumanMessage、SystemMessage 都是BaseMessage的子类


  13. class FileChatMessageHistory(BaseChatMessageHistory):
  14.     def __init__(self, session_id, storage_path):
  15.         self.session_id = session_id        # 会话id
  16.         self.storage_path = r'E:\AI大模型RAG与智能体开发\P3_LangChainRAG开发\chat_history'    # 不同会话id的存储文件,所在的文件夹路径   <b>(按情况改成自己的文件存储地址)</b>
  17.         # 完整的文件路径
  18.         self.file_path = os.path.join(self.storage_path, self.session_id)
  19.         print(self.file_path)
  20.         # 确保文件夹是存在的
  21.         os.makedirs(os.path.dirname(self.file_path), exist_ok=True)

  22.     def add_messages(self, messages: Sequence[BaseMessage]) -> None:
  23.         # Sequence序列 类似list、tuple
  24.         all_messages = list(self.messages)      # 已有的消息列表
  25.         all_messages.extend(messages)           # 新的和已有的融合成一个list

  26.         # 将数据同步写入到本地文件中
  27.         # 类对象写入文件 -> 一堆二进制
  28.         # 为了方便,可以将BaseMessage消息转为字典(借助json模块以json字符串写入文件)
  29.         # 官方message_to_dict:单个消息对象(BaseMessage类实例) -> 字典
  30.         # new_messages = []
  31.         # for message in all_messages:
  32.         #     d = message_to_dict(message)
  33.         #     new_messages.append(d)

  34.         new_messages = [message_to_dict(message) for message in all_messages]
  35.         # 将数据写入文件
  36.         with open(self.file_path, "w", encoding="utf-8") as f:
  37.             json.dump(new_messages, f)

  38.     @property       # @property装饰器将messages方法变成成员属性用
  39.     def messages(self) -> List[BaseMessage]:
  40.         # 当前文件内: list[字典]
  41.         try:
  42.             with open(self.file_path, "r", encoding="utf-8") as f:
  43.                 messages_data = json.load(f)    # 返回值就是:list[字典]
  44.                 return messages_from_dict(messages_data)
  45.         except FileNotFoundError:
  46.             return []

  47.     def clear(self) -> None:
  48.         with open(self.file_path, "w", encoding="utf-8") as f:
  49.             json.dump([], f)





  50. model = ChatTongyi(model="qwen3-max")
  51. # prompt = PromptTemplate.from_template(
  52. #     "你需要根据会话历史回应用户问题。对话历史:{chat_history},用户提问:{input},请回答"
  53. # )
  54. prompt = ChatPromptTemplate.from_messages(
  55.     [
  56.         ("system", "你需要根据会话历史回应用户问题。对话历史:"),
  57.         MessagesPlaceholder("chat_history"),
  58.         ("human", "请回答如下问题:{input}")
  59.     ]
  60. )

  61. str_parser = StrOutputParser()


  62. def print_prompt(full_prompt):
  63.     print("="*20, full_prompt.to_string(), "="*20)
  64.     return full_prompt


  65. base_chain = prompt | print_prompt | model | str_parser

  66. def get_history(session_id):
  67.     return FileChatMessageHistory(session_id, "./chat_history")

  68. # 创建一个新的链,对原有链增强功能:自动附加历史消息
  69. conversation_chain = RunnableWithMessageHistory(
  70.     base_chain,     # 被增强的原有chain
  71.     get_history,    # 通过会话id获取InMemoryChatMessageHistory类对象
  72.     input_messages_key="input",             # 表示用户输入在模板中的占位符
  73.     history_messages_key="chat_history"     # 表示用户输入在模板中的占位符
  74. )


  75. if __name__ == '__main__':
  76.     # 固定格式,添加LangChain的配置,为当前程序配置所属的session_id
  77.     session_config = {
  78.         "configurable": {
  79.             "session_id": "user_001"
  80.         }
  81.     }

  82.     res = conversation_chain.invoke({"input": "小明有2个猫"}, session_config)
  83.     print("第1次执行:", res)
  84.    
  85.     res = conversation_chain.invoke({"input": "小刚有1只狗"}, session_config)
  86.     print("第2次执行:", res)

  87.     res = conversation_chain.invoke({"input": "总共有几个宠物"}, session_config)
  88.     print("第3次执行:", res)

复制代码



学习视频:【黑马程序员大模型RAG与Agent智能体项目实战教程,基于主流的LangChain技术从大模型提示词到实战项目】[url=https://www.bilibili.com/video/B ... 2bff4ed856eadc41a71]https://www.bilibili.com/video/B ... 2bff4ed856eadc41a71[/url]

评分

参与人数 1荣誉 +2 贡献 +3 C币 +3 收起 理由
不二如是 + 2 + 3 + 3 鱼C有你更精彩^_^

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 3 小时前 | 显示全部楼层
【长期会话记忆实现的核心思想步骤】

长期会话记忆的核心思想是通过持久化存储来保存对话历史,主要分为三个步骤:

1. 历史消息的存储
    - 将每次对话的消息(用户输入和AI回复)保存到外部存储(如文件、数据库)
    - 每个会话有独立的存储标识(如session_id)

2. 历史消息的读取
    - 每次新对话时,从存储中读取该会话的历史消息
    - 将历史消息作为上下文输入给模型

3. 历史消息的管理
    - 管理消息的添加、清理和更新
    - 处理消息的序列化和反序列化(转换格式)

【代码实战填空】

以下是需要填写的代码部分:

1. 填空1(FileChatMessageHistory类的初始化方法):
  1.         self.storage_path = storage_path    # 使用传入的存储路径
复制代码


2. 填空2(add_messages方法的转换):
  1.         new_messages = [message_to_dict(message) for message in all_messages]
复制代码


3. 填空3(messages方法的异常处理):
  1.             return []    # 返回空列表
复制代码


4. 填空4(clear方法的清空操作):
  1.             json.dump([], f)    # 写入空列表
复制代码


5. 填空5(创建prompt模板):
  1.     [
  2.         ("system", "你需要根据会话历史回应用户问题。"),
  3.         MessagesPlaceholder(variable_name="chat_history"),
  4.         ("human", "{input}")
  5.     ]
复制代码


【完整代码说明】

这个示例展示了如何实现基于文件存储的长期会话记忆:

工作原理:
1. 每个用户会话(session_id)对应一个独立的文件
2. 每次对话时:
   - 从文件读取历史消息
   - 将历史消息和当前输入一起传给AI模型
   - 将新的对话消息追加到文件中

关键组件:
- FileChatMessageHistory:自定义的存储类,继承自BaseChatMessageHistory
- RunnableWithMessageHistory:自动管理消息历史的链
- message_to_dictmessages_from_dict:消息格式转换工具

运行效果:
程序会保存对话历史,因此在第三次提问“总共有几个宠物”时,AI能基于前两次对话(2只猫+1只狗)正确回答“总共3个宠物”。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层
学习
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2 小时前 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-3-8 11:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表