版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGE6博学谷——让IT教学更简单,让IT学习更有效PAGE12《智能体构建与应用开发》教学设计课程名称:授课年级:授课学期:教师姓名:年月课题名称项目4实现对话上下文记忆管理任务4-1配置基础记忆功能计划课时3课时教学引入在成功搭建LangChain开发环境并掌握ModelIO、链式操作等核心组件后,王亮面临AI应用开发的下一个关键挑战:如何让会话应用在多轮交互中保持连贯性,为客户提供专业的连续服务体验。技术主管要求王亮实现维护完整会话历史的能力,针对某些只需关注近期会话的场景,保留最近N轮会话内容,以优化内存使用并聚焦于当前话题。教学目标【知识目标】(1)了解记忆会话上下文的必要性。(2)了解Token上下文容量计量单位。(2)掌握Message类的核心作用。(3)掌握InMemoryChatMessageHistory的特点和应用场景。【技能目标】(1)能够配置和维护完整的会话上下文。(2)能够配置和维护指定轮次的最近会话上下文。【素养目标】(1)通过配置基础记忆功能,培养学生根据应用场景选择合适记忆机制的设计思维。(2)通过调试和维护会话上下文,培养学生构建连贯对话系统的工程能力。教学重点理解会话记忆、Token、Message类相关概念,掌握内存会话历史组件,实现完整与限定轮次的上下文记忆配置。教学难点根据对话场景合理选择记忆保留策略,调试控制会话上下文轮次与Token占用。教学方式课堂教学以PPT讲授为主,并结合多媒体进行教学教学过程任务4-1配置基础记忆功能※通过直接引入的方式导入新课在成功搭建LangChain开发环境并掌握ModelIO、链式操作等核心组件后,王亮面临AI应用开发的下一个关键挑战:如何让会话应用在多轮交互中保持连贯性,为客户提供专业的连续服务体验。技术主管要求王亮实现维护完整会话历史的能力,针对某些只需关注近期会话的场景,保留最近N轮会话内容,以优化内存使用并聚焦于当前话题。※新课讲解一、教师通过PPT的方式讲解1.记忆会话上下文的必要性会话上下文是指在一个连续会话过程中,所有先前交换的信息集合。大语言模型本身不具备跨会话的上下文持久化记忆能力,当AI系统缺乏会话记忆时,会产生以下三大核心问题。(1)信息断层现象(2)指代理解失效(3)交互体验割裂因此,记忆会话上下文是实现智能对话系统的技术基石:在用户体验层面,记忆消除了重复沟通成本,使会话自然流畅;在功能层面,记忆支持复杂任务的分解与延续;在商业层面,记忆赋能个性化服务与长期关系维护,是构建差异化竞争力的核心。2.Token上下文容量计量单位(1)Token的基本定义(2)Token的计数特性(3)上下文窗口与Token限制(4)Token的经济与性能影响3.Message类的核心作用在人工智能会话应用中,单纯存储字符串无法区分消息的来源角色、携带元数据或支持复杂交互,Message类通过标准化的对象设计解决了这些问题。它作为连接用户输入、AI模型响应和系统指令的统一接口,确保了整个会话流水线中数据的结构化和可追溯性,是AI应用能够处理多轮会话、工具调用和上下文管理的关键基础设施。(1)Message类的类型体系与角色划分(2)Message对象的内部结构与数据表示(3)Message类的高级特性与功能扩展(4)Message类在LangChain生态系统中的集成与应用4.InMemoryChatMessageHistory的特点和应用场景InMemoryChatMessageHistory是LangChain框架中最基础的内存会话历史存储器。它仅在程序运行期间将会话历史保存在内存中,程序结束后数据自动丢失,适合快速原型开发和测试场景。(1)核心特点(2)适用场景开发测试阶段:在软件开发周期初期,用于快速验证会话流程逻辑、测试功能完整性以及调试交互问题,避免因搭建复杂存储设施而拖慢开发进度。短期会话应用:适用于会话轮次有限、无需长期记忆的轻量级服务场景,如一次性问答系统、简单查询工具或短暂的任务型会话交互。演示环境:在产品演示、技术展示示例中,用于构建可立即运行的会话样例,无需准备和配置后端存储服务,便于快速展示核心功能。二、保存完整会话上下文1.创建项目打开PyCharm,按照创建项目3的方法创建项目4,打开项目4的本地终端窗口,导入LangChain的核心依赖,如下所示。(.venv)PSD:\langchain\project4>pipinstalllangchainlangchain-openailangchain-communitypython-dotenv安装完成后,拷贝project3中的.env文件和model.py文件到项目4根目录下,如图4-2所示。图4-2任务4-1初始化项目4基础环境2.保存完整会话(1)演示模型记不住历史会话在默认情况下,模型是记不住之前的会话上下文的,每次会话都是全新的开始,在project4项目中再建立一个名称为forget.py的文件,输入以下代码。frommodelimportllmwhileTrue:#获取用户输入user_input=input("请提问:")ifuser_input.lower()=='q':print("退出聊天")breakresponse=llm.invoke(user_input)print(response.content)以上代码是一个无记忆的会话循环,核心特点是每轮会话完全独立,模型无法记住任何历史信息。虽然实现了基本的问答交互,但每次调用都只传入当前用户输入,导致AI记不住之前的会话内容,无法处理依赖上下文的连续性问题,所有回答都基于模型预训练的世界知识和当前问题的独立分析,使得会话缺乏连贯性和个性化记忆能力,保存后运行程序,与AI进行会话,结果如图4-3所示。图4-3任务4-1AI记不住历史会话从结果中发现,当第一轮会话时,用户告诉AI“我是小明”,再第二轮提示时,询问AI“我叫什么名字”,AI无法进行正确回答,因为AI没有记忆会话历史的能力。(2)记录整个会话上下文InMemoryChatMessageHistory是LangChain中会话历史管理的核心存储组件,其本质是一个“会话状态记录器”。它由按时间顺序排列的BaseMessage对象组成,支持HumanMessage、AIMessage和SystemMessage等多种消息类型,形成一个完整的会话轨迹记录。开发时先初始化历史存储器建立消息容器;使用时通过add_message()方法依次添加会话消息,通过messages属性获取完整历史记录。这种设计将会话状态的存储、检索与具体业务逻辑分离,让需要维护上下文和状态管理的会话应用变得简洁、可靠且易于维护。InMemoryChatMessageHistory的常用属性和方法如表4-1所示。表4-1InMemoryChatMessageHistory的常用属性和方法名称类别类型说明messages核心属性消息列表基础的消息存储容器,标准的Python列表,存储BaseMessage对象add_message实例方法实例方法封装的消息添加方法,内部调用append()向列表添加单条消息add_messages实例方法实例方法封装的批量添加方法,内部调用extend()批量添加多条消息clear实例方法实例方法清空会话历史的方法,重置会话状态在project4项目中再建立一个名称为save_all.py的文件,输入以下代码。frommodelimportllmfromlangchain_core.messagesimportHumanMessage,AIMessagefromlangchain_core.chat_historyimportInMemoryChatMessageHistory#创建记忆-存储会话历史history=InMemoryChatMessageHistory()defshow_history():"""显示完整会话历史"""print("完整会话历史:")foriinrange(len(history.messages)):msg=history.messages[i]ifmsg.type=="human":print(f"{i+1}.用户:{msg.content}")else:print(f"{i+1}.AI:{msg.content}")print(f"总共{len(history.messages)}条消息")print("="*30)print("聊天开始(输入'q'退出)")print("-"*30)whileTrue:#获取用户输入user_input=input("请提问:")ifuser_input.lower()=='q':print("退出聊天")break#构建临时上下文(不直接修改历史),避免污染原始历史记录current_context=history.messages.copy()#将当前用户问题添加到临时上下文中current_context.append(HumanMessage(content=user_input))#AI基于完整上下文回复(历史+当前问题)response=llm.invoke(current_context)#一次性添加用户问题和AI回复,extend()方法将两个消息作为一个整体添加到历史末尾history.messages.extend([HumanMessage(content=user_input),#用户消息AIMessage(content=response.content)#AI回复])#显示AI回复print(f"AI:{response.content}")#每次会话后自动显示完整历史show_history()#程序结束print("程序结束")以上代码首先导入记忆组件和消息类型,通过InMemoryChatMessageHistory类创建对象history,定义了历史显示函数show_history,用于格式化输出;然后在无限循环中获取用户输入,将用户消息添加到历史,将所有历史记录传给语言模型生成上下文感知的回复,将AI回复也加入历史形成完整会话轮次;每次交互后自动展示结构化的会话历史轨迹,输入'q'时退出循环。实现了会话状态的持续维护和可视化跟踪。在使用history.messages.append方法保存消息时,HumanMessage消息类型保存的是用户消息,AIMessage消息类型保存的是AI回复的消息,在show_history显示消息时,就可以根据消息的类型进行输出,保存后运行程序,结果如图4-3所示。图4-3任务4-1保存全部会话内容从结果中发现,用户与AI进行了3轮会话,程序完整保存了3轮会话内容,用户第1轮会话问“一句话回答什么是python”后,再第2轮会话时,直接使用“它有什么优点,一句话回答”,由于记忆了会话上下文,所以模型知道了它指代的是python,在第三轮会话中,提问“和java比呢,一句话回答”,同样由于以及了会话上下文,所以模型知道是python和java相比。三、保存最近会话上下文1.保存最近会话的原因只保存最近会话上下文主要的主要原因包括硬件资源限制、模型架构约束、经济性能平衡与语义时效规律。(1)硬件资源限制(2)模型架构约束(3)经济性能平衡(4)语义时效规律2.示例代码通过InMemoryChatMessageHistory保存最近会话,核心是主动截断管理,流程分三步:每次会话先构建完整上下文供AI理解,然后将本轮问答成对存入历史,最后检查总量,若超过限制就删除最老的会话。这样既保持了会话连贯性,又防止历史无限增长,平衡了功能与资源消耗,在project4项目中建立一个名称为save_limit.py的文件,输入以下代码。frommodelimportllmfromlangchain_openaiimportChatOpenAIfromlangchain_core.messagesimportHumanMessage,AIMessagefromlangchain_core.chat_historyimportInMemoryChatMessageHistory#创建记忆history=InMemoryChatMessageHistory()MAX_MESSAGES=4#2轮会话→每轮包含用户和AI各1条,共4条消息print("只保留最近2轮会话,输入'q'退出")whileTrue:#获取用户输入user_input=input("请提问:")ifuser_input.lower()=='q':print("\n退出聊天")break#构建临时上下文(不直接修改历史)current_context=history.messages.copy()#复制历史,避免修改原数据current_context.append(HumanMessage(content=user_input))#添加当前问题#AI基于完整上下文回复(历史+当前问题)response=llm.invoke(current_context)#AI基于完整上下文回复print(f"AI:{response.content}")#一次性添加用户消息和AI回复history.messages.extend([HumanMessage(content=user_input),AIMessage(content=response.content)])#清理记忆-实现"只保留最近2轮"iflen(history.messages)>MAX_MESSAGES:#只保留最后4条消息,history.messages[-MAX_MESSAGES:]取列表的最后4个元素history.messages=history.messages[-MAX_MESSAGES:]print(f"[清理后剩{len(history.messages)}条]")#打印当前保存的会话(按轮次展示)print("当前保存的最近2轮会话:")messages=history.messagesforiinrange(0,len(messages),2):#步长为2,每次处理一轮会话ifi+1<len(messages):#确保有完整的用户-AI配对round_num=i//2+1#计算轮次号(i从0开始)print(f"第{round_num}轮:你『{messages[i].content}』→AI『{messages[i+1].content[:30]}...』")#最终历史输出print("="*40)print("最终保存的会话历史:")messages=history.messagesforiinrange(len(messages)):msg=messages[i]#根据消息类型显示"你"或"AI"print(f"{i+1}.{'你'ifmsg.type=='human'else'AI'}:{msg.content}")以上代码通过构建临时上下文确保AI获得完整的会话历史视图。每次用户提问时,代码会复制当前历史记录并附加新问题,形成完整的上下文供AI参考,避免直接修改原始历史数据。在AI成功回复后,使用extend()方法一次性将用户问题和AI回答作为整体存入历史,确保每轮会话都以完整的问答对形式保存。最后通过主动截断机制实现最近N轮会话的有限保存。系统持续监控历史消息数量,当超过预设阈值(如4条对应2轮会话)时,自动删除最早的消息,仅保留最近的内容。保存后运行程序,结果如图4-4所示。图4-4任务4-1保存最近2轮会话内容从结果中发现,程序通过历史截断机制仅保留最近2轮会话,早期内容被永久移除。当用户提问需要参考被清除的历史信息时,AI因缺失关键上下文而无法准确回应。课题名称项目4实现对话上下文记忆管理任务4-2配置持久化记忆功能计划课时4课时教学引入王亮在实现基础会话功能后,面临应用重启导致所有会话记忆丢失的问题,技术主管要求他为智能应用配置多层级持久化存储方案,实现本地JSON文件持久化存储会话、本地SQLite数据库持久化存储会话、远程MariaDB数据库持久化存储会话,确保会话记忆能够在不同存储介质中持久保存,保障用户在多轮交互中获得一致且连贯的会话体验。教学目标【知识目标】(1)了解会话持久化存储的必要性。(2)掌握LangChain常用的会话持久化存储方案。【技能目标】(1)能够使用本地文件和数据库持久化存储会话。(2)能够使用远程数据库持久化存储会话。【素养目标】(1)通过配置本地持久化存储会话,培养学生的数据安全与隐私保护意识。(2)通过配置远程持久化存储会话,培养学生的分布式系统思维与服务架构能力。教学重点理解会话持久化存储的作用,掌握本地文件、本地数据库、远程数据库三种会话持久化实现方法。教学难点区分不同持久化存储方案适用场景,完成远程数据库会话持久化的连接配置与会话读写调试。教学方式任务驱动,案例教学教学过程任务4-2配置持久化记忆功能※通过直接引入的方式导入新课王亮在实现基础会话功能后,面临应用重启导致所有会话记忆丢失的问题,技术主管要求他为智能应用配置多层级持久化存储方案,实现本地JSON文件持久化存储会话、本地SQLite数据库持久化存储会话、远程MariaDB数据库持久化存储会话,确保会话记忆能够在不同存储介质中持久保存,保障用户在多轮交互中获得一致且连贯的会话体验。※新课讲解教师通过PPT的方式讲解。1.会话持久化存储的必要性在大模型对话系统中,持久化存储指将会话状态、用户数据等关键信息从内存转移到数据库、文件系统中,与仅存在于服务器运行内存中的临时缓存不同,持久化确保了数据在会话结束、服务重启甚至系统故障后依然持久存在并可检索,这是构建可长期使用、稳定可靠会话服务的底层基础。(1)实现长期记忆与个性化体验(2)保障复杂任务与业务连续性(3)满足合规要求与驱动系统优化(4)确保服务可靠性与架构基石2.LangChain常用的会话持久化存储方案在LangChain中,常用的会话持久化方案包括以下4种,本任务重点介绍文件存储和关系型数据库存储。(1)文件系统存储(2)关系型数据库存储(3)非关系型数据库存储(4)向量数据库存储二、使用本地JSON文件存储会话1.使用的核心类(1)FileChatMessageHistory文件聊天历史存储器(2)RunnableWithMessageHistory带记忆的可运行会话链(3)MessagesPlaceholder消息占位符2.示例代码(1)实现流程本任务通过RunnableWithMessageHistory会话链整合AI模型、提示模板和文件聊天历史存储器,实现会话记录的本地文件持久化存储,具体流程如下。①接收用户输入:获取用户当前问题;②读取历史记忆:根据用户ID从对应的JSON文件中检索该用户的过往对话记录;③组合完整输入:将历史会话与当前问题拼接为完整的提示文本;④A生成回答:调用大语言模型生成回复内容;⑤自动保存会话:将当前轮次的人类提问与AI回答同步存储至用户的JSON文件,实现对话状态的持久化维护。(2)编写代码在project4项目中建立一个名称chat_with_file.py的文件,输入以下代码。frommodelimportllmfromlangchain_community.chat_message_historiesimportFileChatMessageHistoryfromlangchain_mptsimportChatPromptTemplate,MessagesPlaceholderfromlangchain_core.runnables.historyimportRunnableWithMessageHistoryimportjsonprint("===LangChain文件持久化示例===")#1.创建提示模板prompt=ChatPromptTemplate.from_messages([("system","你是友好的聊天助手。"),#系统指令MessagesPlaceholder(variable_name="history"),#历史会话空占位符,变量名为history("human","{question}")#用户当前问题,变量名为question])#2.文件存储管理defget_file_history(session_id:str):"""每个用户保存到一个文件"""returnFileChatMessageHistory(f"chat_{session_id}.json")chain=prompt|llm#创建核心引擎#3.创建带记忆的会话链conversation=RunnableWithMessageHistory(chain,#核心AI引擎(无状态,需要注入历史)get_file_history,#历史获取函数,根据session_id获取用户会话历史input_messages_key="question",#通过键名将用户当前问题传递给提示模板变量questionhistory_messages_key="history"#通过键名将历史会话传递给提示模板变量history#4.使用会话链conversationsession_id=input("请输入您的用户ID:")print(f"开始与AI会话(输入'quit'退出):")print("-"*40)whileTrue:user_input=input("请提问:").strip()ifuser_input.lower()=='quit':break#会话(自动包含历史)response=conversation.invoke({"question":user_input},#用户当前问题config={"configurable":{"session_id":session_id}}#用户身份ID,获取会话历史)print(f"AI:{response.content}")print(f"会话已保存到:chat_{session_id}.json")#5.退出后输出历史会话记录print(f"===用户{session_id}的对话记录===")withopen(f"chat_{session_id}.json","r",encoding="utf-8")asf:history=json.load(f)formsginhistory:role="用户"ifmsg["type"]=="human"else"AI"content=msg["data"]["content"]print(f"{role}:{content}")(3)核心代码解释以下代码是程序的核心代码,负责调度其他组件运行。conversation=RunnableWithMessageHistory(chain,#核心AI引擎(无状态,需要注入历史)get_file_history,#历史获取函数,根据session_id获取用户会话历史input_messages_key="question",#通过键名将用户当前问题传递给提示模板变量questionhistory_messages_key="history"#通过键名将历史会话传递给提示模板变量history)用户输入ID和问题之后,执行conversation.invoke,运行以上核心代码,代码以RunnableWithMessageHistory为中央调度器,通过chain参数连接基础AI处理能力,通过get_file_history函数连接记忆存储,再通过input_messages_key和history_messages_key这两个映射键,精准地将用户当前问题与历史记忆数据分别注入到提示模板的对应位置。建立了一个完整的自动化工作流,当用户提供问题和身份ID时,系统能自动读取对应历史会话、构建完整上下文、调用AI生成连贯回答,并将新对话持久化保存,实现了全自动记忆管理的智能对话体验。保存后,运行程序,结果如图4-5所示。图4-5任务4-2保存最近2轮会话内容从结果发现,在进行多轮对话时,AI能够记住用户之前的输入,在多轮对话中,AI能够记住用户之前的输入,这是因为系统实现了自动化记忆管理:每次对话时,RunnableWithMessageHistory自动从生成的chat_{session_id}.json文件中读取历史会话,将历史数据注入AI的输入上下文,生成回答后再将新对话保存回同一文件。这种'读取→使用→保存'的闭环确保了对话的连贯性,结束后的文件查询也验证了所有会话都被持久化记录。三、使用SQLite数据库存储会话1.SQLite数据库SQLite是一种轻量级、嵌入式的关系型数据库,它将整个数据库作为一个单一文件存储在本地磁盘中,无需独立服务器进程即可运行,作为Python标准库的一部分,SQLite通过简单导入即可使用,特别适合小型应用、原型开发和移动设备。相比文件存储,SQLite提供了结构化数据管理和强大查询能力,能够通过完整的SQL支持实现复杂的数据筛选、连接和聚合操作,SQLite的事务机制确保了多步操作的原子性和数据一致性,在存储效率上,SQLite的B-tree索引结构使数据增长时性能保持稳定,适合需要可靠数据管理和高效查询的场景。SQLite以其零配置、单文件部署的轻量特性擅长本地数据管理,但由于缺乏高并发和网络访问能力,难以在企业级的分布式系统中部署和扩展。2.核心工具在使用本地SQLite数据库存储多轮会话时,除了要使用RunnableWithMessageHistory可记忆的对话链和MessagesPlaceholder消息占位符之外,还需要使用到SQLChatMessageHistory类和SQLAlchemy库。(1)SQLChatMessageHistory类(2)SQLAlchemy库create_engine是SQLAlchemy库中的入口函数,核心作用是创建一个数据库连接引擎对象,它不直接执行具体操作,而是负责管理和协调所有后续的数据库交互。3.示例代码(1)实现流程本任务通过RunnableWithMessageHistory会话链整合AI模型、提示模板和数据库聊天历史存储器,实现会话记录的本地持久化存储,具体流程如下。①接收用户输入:获取用户当前问题;②读取历史记忆:根据用户ID从SQLite数据库中检索该用户的过往对话记录;③组合完整输入:将历史会话与当前问题拼接为完整的提示文本;④AI生成回答:调用大语言模型生成回复内容;⑤自动保存会话:将当前轮次的人类提问与AI回答同步存储至SQLite数据库,实现对话状态的持久化维护。(2)编写代码在project4项目中建立一个名称chat_with_sqlite.py的文件,输入以下代码。frommodelimportllmfromlangchain_community.chat_message_historiesimportSQLChatMessageHistoryfromlangchain_mptsimportChatPromptTemplate,MessagesPlaceholderfromlangchain_core.runnables.historyimportRunnableWithMessageHistoryfromsqlalchemyimportcreate_engineprint("===LangChainSQLite持久化对话===")#1.创建数据库引擎对象engine,首次执行数据库操作时在当前目录下创建chat.dbengine=create_engine("sqlite:///chat.db")#创建SQLite数据库连接引擎#2.提示词模板prompt=ChatPromptTemplate.from_messages([("system","你是一个智能助手。"),#系统角色设定MessagesPlaceholder(variable_name="history"),#历史对话占位符("human","{input}")#用户输入])#3.对话系统chain=prompt|llm#构建基础对话链defget_history(session_id:str):#根据session_id获取数据库中的历史记录returnSQLChatMessageHistory(session_id=session_id,connection=engine#使用创建的数据库引擎)conversation=RunnableWithMessageHistory(chain,#核心AI引擎(无状态,需要注入历史)get_history,#历史获取函数,根据session_id获取用户会话历史input_messages_key="input",#通过键名将用户当前问题传递给提示模板变量inputhistory_messages_key="history"#通过键名将历史会话传递给提示模板变量history)#4.开始对话user_id=input("请输入您的用户ID:")#获取用户唯一标识print(f"开始和{user_id}的对话(输入quit结束):")whileTrue:user_input=input("请提问:").strip()#获取用户输入ifuser_input=="quit":#退出条件break#执行带记忆的对话response=conversation.invoke({"input":user_input},#当前用户问题config={"configurable":{"session_id":user_id}}#传递用户ID)print(f"AI:{response.content}")#输出AI回复print(f"对话已保存到chat.db,会话ID:{user_id}")#显示用户对话记录print(f"===用户{user_id}的对话记录===")#重新获取历史对象history=SQLChatMessageHistory(session_id=user_id,connection=engine)#创建历史对象#输出所有消息messages=history.messages#获取消息列表foriinrange(len(messages)):msg=messages[i]role="你"ifmsg.type=="human"else"AI"#判断消息角色print(f"{i+1}.{role}:{msg.content}")#格式化输出print(f"共{len(history.messages)}条消息")#统计总消息数(3)核心代码解释以下代码是程序的核心代码,负责调度其他组件运行。conversation=RunnableWithMessageHistory(chain,#核心AI引擎(无状态,需要注入历史)get_history,#历史获取函数,根据session_id获取用户会话历史input_messages_key="input",#通过键名将用户当前问题传递给提示模板变量inputhistory_messages_key="history"#通过键名将历史会话传递给提示模板变量history)用户输入身份ID和问题之后,执行conversation.invoke(),运行以上核心代码,代码以RunnableWithMessageHistory为中央调度器,通过chain参数连接基础AI处理能力,通过get_history函数连接SQLite数据库记忆存储,再通过input_messages_key="input"和history_messages_key="history"这两个映射键,精准地将用户当前问题与历史记忆数据分别注入到提示模板的对应位置,构建完整上下文后,调用AI生成连贯回答,并将新对话持久化保存到SQLite数据库,实现了全自动记忆管理的智能对话。保存后,运行程序,结果如图4-6所示。图4-6任务4-2将多轮会话内容保存到cat.db数据库从结果中发现,程序运行后能够将多轮对话内容保存到创建的chat.db中,能够正确回答用户关于历史会话的问题,在结束对话后,通过用户ID查询数据库,并显示了所有会话记录。其中RunnableWithMessageHistory作为中央调度器,自动管理了记忆的读取、注入与保存全流程,SQLChatMessageHistory作为数据库存储器,负责将会话历史以结构化形式持久化到SQLite中,MessagesPlaceholder作为动态占位符,在提示模板中为历史会话提供了灵活的插入位置,ChatPromptTemplate组合了系统指令、会话历史与用户当前问题。四、使用MariaDB数据库存储会话1.MariaDB数据库MariaDB是一个功能完备的开源关系型数据库管理系统,采用成熟的客户端-服务器架构,通过独立的数据库服务进程处理多客户端的并发请求,作为MySQL的重要分支,该系统不仅完全兼容MySQL的协议和生态,还在性能优化、安全特性及可扩展性方面进行了显著增强,支持包括主从复制、集群部署等企业级数据解决方案。与面向嵌入式场景的SQLite相比,MariaDB提供了更强大的事务处理、存储过程、触发器等高级功能,并具备完善的主从复制、集群化和水平扩展能力,能够满足企业级应用对数据安全、高可用性及大规模数据处理的需求。2.准备MariaDB环境MariaDB数据库管理系统通常部署在Linux服务器环境中,应用程序则作为客户端通过网络协议远程连接并操作数据库。因此,要在生产或开发环境中使用MariaDB,首先需要在Linux服务器上安装MariaDB服务端软件,并完成网络访问、用户权限等基础配置工作,才能为应用程序提供稳定可靠的数据库服务。(1)运行Linux服务器将教材在项目1中提供的VMwareWorkstation、Linux服务器环境、Linux智能体.exe文件下载到本地(项目1的任务1-2已下载过),使用VMwareWorkstation运行Linux服务器,使用用户名root和密码abc@123.com登录,结果如图4-7所示。图4-7任务4-2运行并登录Linux服务器(2)使用智能体安装启动Mariadb数据库管理系统①连接大语言模型并登录Linux服务器启动Linux智能体.exe,按照项目1中任务1-2方法,在大语言模型设置选项,输入“APIURL”和“APIKey”,选择deepseek-ai/DeepSeek-V3模型,单击“测试连接按钮。在SSH连接设置中,输入Linux服务器的IP地址“28”和root用户的密码“abc@123.com”,单击“连接服务器”按钮,结果如图4-8所示。图4-7任务4-1连接大语言模型并登录Linux服务器②安装Mariadb数据库管理系统单击图4-7中的“隐藏连接设置”,在“问题输入”框中,输入“安装mariadb数据库管理系统,单击“提问”按钮,大语言模型返回配置命令,结果如图4-8所示。图4-8任务4-2提问并返回安装mariadb配置单击“执行命令”按钮,等待一会后,在linux系统上成功安装mariadb数据库管理系统,结果如图4-9所示。图4-9任务4-2成功安装mariadb数据库管理系统③配置防火墙、设置root用户密码、授权root远程操作权限由于后续在python代码中,需要操作28服务器上的Mariadb数据库管理系统,所以需要配置防火墙放行权限和root用户的远程操作权限。在“问题输入”框中输入问题“启动mariadb并设置开机默认自启,配置防火墙放行数据库的3306端口,设置root用户的密码为000000,授权root用户远程操作所有库和表的所有权限。”,单击“提问”按钮,结果如图4-10所示。图4-10任务4-2启动并配置权限单击“执行”按钮,完成数据库启动、配置防火墙和root用户的密码、权限配置,结果如图4-11所示。图4-11任务4-2启动并配置权限④创建数据库由于后续在python代码中,需要将会话记录存储到某个数据库中,所以需要提前创建好一个数据库,名称为为chat_db(名称任意)。在“问题输入”框中,输入“使用root用户和密码000000登录数据库管理系统并创建名称为chat_db的数据库”,单击“提问”按钮,结果如图4-12所示。图4-12任务4-2提问并返回创建数据库的配置命令单击“执行”按钮,成功创建名称为chat_db的数据库,结果如图4-13所示。图4-13任务4-2成功创建chat_db数据库3.示例代码(1)实现流程本任务通过RunnableWithMessageHistory会话链整合AI模型、提示模板和数据库聊天历史存储器,实现会话记录的Mariadb持久化数据库存储。具体流程如下。①接收用户输入:获取用户当前问题;②读取历史记忆:根据用户ID从MariaDB中检索该用户的过往对话记录;③组合完整输入:将历史会话与当前问题拼接为完整的提示文本;④AI生成回答:调用大语言模型生成回复内容;⑤自动保存会话:将当前轮次的人类提问与AI回答同步存储至MariaDB数据库,实现对话状态的持久化维护。(2)编写代码在project4项目中建立一个名称chat_with_mariadb.py的文件,输入以下代码。frommodelimportllmfromlangchain_community.chat_message_historiesimportSQLChatMessageHistoryfromlangchain_mptsimportChatPromptTemplate,MessagesPlaceholderfromlangchain_core.runnables.historyimportRunnableWithMessageHistoryfromsqlalchemyimportcreate_engine#1:连接数据库db=create_engine("mysql+pymysql://root:000000@28:3306/chat_db")#2:定义函数-获取用户的聊天记录defget_chat_history(user_id:str):"""为指定用户创建聊天历史存储"""returnSQLChatMessageHistory(session_id=user_id,#用户标识connection=db#数据库连接)#3:创建对话模板template=ChatPromptTemplate.from_messages([MessagesPlaceholder(variable_name="history"),#历史对话占位符("human","{input}")#当前输入])#创建基础链(无状态)ai_chain=template|llm#4:创建带记忆的对话conversation=RunnableWithMessageHistory(ai_chain,#核心AI引擎(无状态,需要注入历史会话)get_chat_history,#历史获取函数,根据user_id获取用户会话历史input_messages_key="input",#通过键名将用户当前问题传递给提示模板变量inputhistory_messages_key="history"#通过键名将历史会话传递给提示模板变量history)#5:开始对话user_id=input("输入您的用户ID:")print(f"开始和{user_id}的对话(输入quit结束):")whileTrue:user_question=input("请提问:").strip()ifuser_question=="quit":print("对话结束")break#获取AI回复ai_reply=conversation.invoke({"input":user_question},
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 某汽车厂装配操作制度
- 科普老师招聘笔试真题题库(含完整答案+解析)
- 年度预算调整落实通知函(7篇)
- 初中数学·四边形性质与中考考点整合复习教学设计
- 初中生物七年级上册《校园生物多样性调查》教案
- 小学数学一年级上册《立体图形的认识》单元教学设计
- 人教版初中英语八年级上册Unit1词汇短语深度学习教案
- 小学四年级英语上册 Unit 4 My Home 探索家居空间建构功能语言(第二课时教案)
- 小学综合实践活动六年级上册《方法导航·设计制作》第一课时教学设计
- 初中八年级生物学·人口与生态单元深度学习导学案
- 2026年2年级期末考试卷及答案
- 千年香脉:传统制香非遗技艺的传承与复兴
- 2026年国家开放大学电大本科人文英语期末模拟题库含完整答案详解【必刷】
- 泰安市泰山区2025-2026学年第二学期五年级语文期末考试卷(部编版含答案)
- 2026年创伤中心建设试题及答案
- 2026年国有企业领导人员廉洁从业若干规定试题
- 2026年安全生产月培训
- 孩子王内部运营管理制度
- 设计院内部管理规章制度
- 三管三必须课件
- 易制爆人员培训制度
评论
0/150
提交评论