langchain历史记录管理

输入的消息类型:

  • 关于Message的基本介绍可用看这:langchain基本Messages

  • 这里说说基本的用法(重在区别BaseMessage,HumanMessage,AIMessage)

    • 如以下代码:

    • # 先写 InMemoryMessageHistory,对获取的消息进行处理并获取历史记录列表!
          class InMemoryMessageHistory(BaseChatMessageHistory, BaseModel):
              messages: List[BaseMessage] = Field(default_factory=list)
      
              # 添加并处理对话记录
              def add_message(self, message: BaseMessage) -> None:
                  self.messages.append(message)
      
              def clear(self) -> None:
                  self.messages = []
      
    • 这里为什么将总消息列表设置为元素均受BaseMessage类的列表呢?

    • 原因:

    • 作为通用的消息基类BaseMessage是一个基类,它定义了消息的基本结构和行为,是HumanMessageAIMessage等具体消息类型的父类。使用BaseMessage作为类型提示,表示messages列表可以包含各种具体类型的消息对象,只要它们是BaseMessage的子类。这样可以实现多态性,使得代码更加灵活和可扩展。比如,后续如果需要添加其他类型的消息,如系统消息SystemMessage等,只要让新的消息类继承自BaseMessage,就可以方便地将其添加到messages列表中。

    • 统一的存储和处理:将不同类型的消息统一存储在以BaseMessage为类型的列表中,便于对消息进行统一的处理和操作。例如,可以遍历messages列表,无论其中的消息是HumanMessage还是AIMessage,都可以通过BaseMessage定义的公共接口来访问消息的属性和方法,如获取消息内容等。这样可以避免为不同类型的消息编写重复的处理代码,提高代码的复用性和可维护性。

    • 符合面向对象设计原则:遵循了面向对象编程中的里氏替换原则,即子类对象可以在不影响程序正确性的前提下,替换父类对象在程序中的位置。使用BaseMessage作为列表元素的类型,意味着在使用messages列表的地方,可以透明地处理任何BaseMessage子类的对象,而不需要针对具体的子类进行特殊的判断和处理,使得代码结构更加清晰,耦合度更低。