核心内容摘要
高效视频数据分析工具:BilibiliHistoryFetcher深度应用指南
【LangChain】—— 使用History实现上下文记忆功能在对话式AI应用开发中会话记忆是实现上下文连贯交互的核心能力。
LangChain提供了完善的History模块用于管理会话历史记录支持临时存储与长期持久化存储两种场景满足不同业务对会话记忆的需求。
本文将围绕LangChain的会话记忆机制拆解临时与长期会话记忆的实现方式及核心类用法。
History管理会话历史记录记忆LangChain的History模块通过封装各类会话存储逻辑为链Chain或智能体Agent提供会话历史的增、查、清操作接口使开发者无需关注底层存储细节即可快速为应用添加上下文记忆能力。
根据存储时效可分为临时会话记忆与长期会话记忆两大类。
临时会话记忆临时会话记忆适用于单次会话场景会话结束后历史记录自动销毁不进行持久化存储。
LangChain通过RunnableWithMessageHistory类与InMemoryChatMessageHistory类配合实现该功能前者负责为链注入记忆能力后者提供内存级存储支持。
RunnableWithMessageHistory类该类是LangChain中为原有链添加会话历史功能的核心封装类本质是对基础链的装饰器能够在链的执行过程中自动管理会话历史的传入与更新。
其核心作用是将历史会话消息与当前用户输入结合作为链的输入参数同时将链的输出结果补充到会话历史中形成闭环。
使用时需指定三个关键参数基础链runnable、会话历史存储实例history_factory、会话标识session_id。
其中session_id用于区分不同会话确保多用户并发场景下历史记录不混淆。
简单示例如下fromlangchain.chainsimportLLMChainfromlangchain.promptsimportChatPromptTemplatefromlangchain.chat_modelsimportChatOpenAIfromlangchain.schema.runnableimportRunnableWithMessageHistoryfromlangchain.memoryimportInMemoryChatMessageHistory# 初始化基础链llmChatOpenAI(temperature
promptChatPromptTemplate.from_messages([(system,你是一个助手基于历史会话回答问题。
),(human,{question})])base_chainprompt|llm# 为基础链添加会话历史功能chain_with_historyRunnableWithMessageHistory(runnablebase_chain,history_factorylambdasession_id:InMemoryChatMessageHistory(session_idsession_id),input_messages_keyquestion,# 指定输入中用户问题的键output_messages_keyoutput# 指定输出中助手回复的键)# 执行带历史记忆的链response1chain_with_history.invoke({question:我叫小明},config{configurable:{session_id:session-001}})print(response
response2chain_with_history.invoke({question:我叫什么名字},config{configurable:{session_id:session-001}})print(response
# 助手会基于历史会话回答“你叫小明”
InMemoryChatMessageHistory类该类为会话历史提供内存级存储支持属于临时存储方案会话结束后内存释放历史记录丢失适用于无需持久化的场景如单次临时对话。
其内部维护一个列表存储消息对象自动处理消息的顺序管理无需开发者手动维护。
核心特性轻量高效无外部存储依赖仅适用于单进程、单次会话场景无法跨会话、跨服务共享历史记录。
长期会话记忆当需要持久化存储会话历史如多轮对话断点续聊、会话回溯时需使用长期会话记忆方案。
LangChain提供FileChatMessageHistory类实现基于文件的持久化存储同时支持通过继承BaseChatMessageHistory类自定义存储方案如数据库存储。
FileChatMessageHistory类该类基于文件系统存储会话记录以session_id作为文件名每个会话对应一个独立文件实现不同会话历史的隔离存储。
文件存储方式确保会话历史在应用重启后不丢失适用于对持久化要求较低、无需高并发访问的场景。
使用示例fromlangchain.memoryimportFileChatMessageHistory# 初始化文件存储的会话历史session_id为文件名historyFileChatMessageHistory(session_idsession-
# 添加消息history.add_message({role:human,content:我叫小明})history.add_message({role:ai,content:你好小明有什么可以帮你})# 获取消息print(history.messages)# 输出所有历史消息# 清除消息history.clear()print(history.messages)# 输出空列表该类默认将文件存储在当前工作目录下文件名格式为{session_id}.json消息以JSON格式序列化存储便于读取与解析。
继承BaseChatMessageHistory类自定义存储FileChatMessageHistory类本质是继承BaseChatMessageHistory类的实现类。
若需自定义存储介质如MySQL、Redis可直接继承BaseChatMessageHistory类并实现其要求的三个同步方法即可接入LangChain的会话记忆体系。
BaseChatMessageHistory类是会话历史的抽象基类定义了会话记忆的核心接口强制子类实现以下三个同步方法1add_message同步添加消息功能将用户消息或AI回复消息同步添加到存储介质中需保证消息的顺序性按时间先后存储。
方法参数为message对象类型为BaseMessageLangChain的基础消息类包含role和content属性。
实现示例以自定义数据库存储为例fromlangchain.schemaimportBaseMessagefromlangchain.memory.chat_message_histories.baseimportBaseChatMessageHistoryclassDatabaseChatMessageHistory(BaseChatMessageHistory):def__init__(self,session_id:str):self.session_idsession_id# 初始化数据库连接self.db_connself._init_db()def_init_db(self):# 模拟数据库连接初始化return{session-001:[]}defadd_message(self,message:BaseMessage)-None:# 同步添加消息到数据库message_dict{role:message.role,content:message.content,timestamp:datetime.now().isoformat()}self.db_conn[self.session_id].append(message_dict)2messages同步获取消息功能从存储介质中同步读取当前会话对应session_id的所有历史消息返回值为List[BaseMessage]类型确保消息顺序与发送顺序一致。
补充实现上述类的messages属性propertydefmessages(self)-List[BaseMessage]:# 从数据库读取消息并转换为BaseMessage对象fromlangchain.schemaimportHumanMessage,AIMessage message_list[]formsginself.db_conn.get(self.session_id,[]):ifmsg[role]human:message_list.append(HumanMessage(contentmsg[content]))elifmsg[role]ai:message_list.append(AIMessage(contentmsg[content]))returnmessage_list3clear同步清除消息功能同步清空当前会话对应session_id的所有历史消息删除存储介质中的对应数据确保数据清理的原子性。
补充实现上述类的clear方法defclear(self)-None:# 清空数据库中当前会话的消息self.db_conn[self.session_id][]
总结LangChain的History模块通过分层设计兼顾了临时会话与长期会话的记忆需求。
RunnableWithMessageHistoryInMemoryChatMessageHistory适用于轻量临时对话FileChatMessageHistory满足基础持久化需求而继承BaseChatMessageHistory自定义实现则支持复杂存储场景。
开发者可根据业务对会话时效、存储介质的需求灵活选择对应的实现方案快速为AI应用赋予上下文交互能力。