ChatMessageHistory组件

ChatMessageHistory组件 BaseChatMessageHistory把记忆功能集成到LLM应用中会设计到两个核心问题存储的历史信息是什么如何检索与处理历史信息在Langchain中一个记忆类是由历史消息的存储与记忆的处理逻辑两个部分组成。LangChain封装了一个管理历史信息的基类—BaseChatMessageHistory,这是一个抽象类。用于管理历史消息涵盖了对消息的多种管理添加消息、消息历史信息、查看历史消息列表、查看历史消息文本等。并且所有扩展的消息历史组件均继承BaseChatMessageHistory(包括自定义消息历史组件)。BaseChatMessageHistory及子类如下其中InMemoryChatMessageHistory是langchain_core包中内置对话消息历史类可以将对话消息存储到临时内存中而其他第三方集成的聊天消息历史组件均通过langchain_community包进行导入。第三方 ChatMessageHistory 组件集成: https://python.langchain.com/v0.2/docs/integrations/memory/聊天消息历史组件实现记忆功能FileChatMessageHistory会将对话历史存储到本地的文件中可以使用这个记忆组件结合源生的OpenAi SDK来实现命令行界面实现带有记忆功能的对话功能并且关闭某次对话下次运行代码读取到对应的文件时仍然可以记忆之前的对话的内容实现代码importdotenvfromopenaiimportOpenAIfromlangchain_community.chat_message_historiesimportFileChatMessageHistoryfromlangchain_core.messagesimportHumanMessage,AIMessage HUMAN_MESSAGEHumanMessage dotenv.load_dotenv()# 1. 创建客户端记忆clientOpenAI(base_urlhttps://api.xty.app/v1)chat_historyFileChatMessageHistory(./memory.txt)# 转换历史消息格式defconvert_history():openai_messages[]formsginchat_history.messages:ifisinstance(msg,HUMAN_MESSAGE):openai_messages.append({role:user,content:msg.content})elifisinstance(msg,AIMessage):openai_messages.append({role:assistant,content:msg.content})returnopenai_messages# 2. 循环对话whileTrue:# 3.获取用户输入queryinput(Human:)# 4.检测用户是否退出对话ifqueryq:exit(0)# 5.发起聊天对话print(AI:,flushTrue,end)history_messagesconvert_history()messages[{role:system,content:你是OpenAI开发的ChatGPT聊天机器人可以根据上下文回复用户信息。},*history_messages,# 展开历史对话{role:user,content:query}]responseclient.chat.completions.create(modelgpt-3.5-turbo-16k,messagesmessages,streamTrue,)ai_contentforchunkinresponse:contentchunk.choices[0].delta.contentifcontentisNone:breakai_contentcontentprint(content,flushTrue,end)chat_history.add_user_message(query)chat_history.add_ai_message(ai_content)print()