如何持久化LangChain对话内存(保存和加载)?

Nei*_*ski 14 python pydantic langchain large-language-model

我正在创建这样的对话:

llm = ChatOpenAI(temperature=0, openai_api_key=OPENAI_API_KEY, model_name=OPENAI_DEFAULT_MODEL)
conversation = ConversationChain(llm=llm, memory=ConversationBufferMemory())
Run Code Online (Sandbox Code Playgroud)

但我真正想要的是能够保存和加载它,ConversationBufferMemory()以便它在会话之间保持不变。似乎没有任何明显的教程,但我注意到“Pydantic”,所以我尝试这样做:

saved_dict = conversation.memory.chat_memory.dict()
cm = ChatMessageHistory(**saved_dict) # or cm = ChatMessageHistory.parse_obj(saved_dict)
Run Code Online (Sandbox Code Playgroud)

但这失败了:

ValidationError: 6 validation errors for ChatMessageHistory
messages -> 0
  Can't instantiate abstract class BaseMessage with abstract method type (type=type_error)
Run Code Online (Sandbox Code Playgroud)

想法?我希望有任何类型的指南、存储库、参考资料等的链接。

Nei*_*ski 9

为了避免过多地处理 LangChain/Pydantic 序列化问题,我决定只使用 Pickle 来完成整个事情,并且效果很好:

pickled_str = pickle.dumps(conversation.memory)
conversation2 = ConversationChain(llm=llm, memory=pickle.loads(pickled_str)
Run Code Online (Sandbox Code Playgroud)


Shu*_*hum 8

我刚刚做了类似的事情,希望这会有所帮助。在高层次上:

  1. 用作ConversationBufferMemory传递给 Chain 初始化的内存
llm = ChatOpenAI(temperature=0, model_name='gpt-3.5-turbo-0301')
original_chain = ConversationChain(
    llm=llm,
    verbose=True,
    memory=ConversationBufferMemory()
)
original_chain.run('what do you know about Python in less than 10 words')
Run Code Online (Sandbox Code Playgroud)
  1. List[langchain.schema.HumanMessage|AIMessage](不可序列化)的形式从内存中提取消息
extracted_messages = original_chain.memory.chat_memory.messages
Run Code Online (Sandbox Code Playgroud)
  1. 将提取的消息转换为可序列化的本机 Python 对象
ingest_to_db = messages_to_dict(extracted_messages)
Run Code Online (Sandbox Code Playgroud)
  1. 执行数据库操作以写入和读取您选择的数据库,我将仅使用json.dumpsjson.loads来说明
retrieve_from_db = json.loads(json.dumps(ingest_to_db))
Run Code Online (Sandbox Code Playgroud)
  1. 将检索到的序列化对象转换回List[langchain.schema.HumanMessage|AIMessage]
retrieved_messages = messages_from_dict(retrieve_from_db)
Run Code Online (Sandbox Code Playgroud)
  1. ChatMessageHistory从消息构造
retrieved_chat_history = ChatMessageHistory(messages=retrieved_messages)
Run Code Online (Sandbox Code Playgroud)
  1. 构造ConversationBufferMemoryChatMessageHistory
retrieved_memory = ConversationBufferMemory(chat_memory=retrieved_chat_history)
Run Code Online (Sandbox Code Playgroud)
  1. 将内存传递回新启动的链
reloaded_chain = ConversationChain(
    llm=llm,
    verbose=True,
    memory=retrieved_memory
)
Run Code Online (Sandbox Code Playgroud)

您可以在此GitHub 链接中找到完整的代码片段