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_MESSAGE=HumanMessage dotenv.load_dotenv()# 1. 创建客户端&记忆client=OpenAI(base_url='https://api.xty.app/v1')chat_history=FileChatMessageHistory('./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.获取用户输入query=input('Human:')# 4.检测用户是否退出对话ifquery=='q':exit(0)# 5.发起聊天对话print("AI:",flush=True,end="")history_messages=convert_history()messages=[{"role":"system","content":"你是OpenAI开发的ChatGPT聊天机器人,可以根据上下文回复用户信息。"},*history_messages,# 展开历史对话{"role":"user","content":query}]response=client.chat.completions.create(model='gpt-3.5-turbo-16k',messages=messages,stream=True,)ai_content=""forchunkinresponse:content=chunk.choices[0].delta.contentifcontentisNone:breakai_content+=contentprint(content,flush=True,end="")chat_history.add_user_message(query)chat_history.add_ai_message(ai_content)print("")