赞
踩
在构建基于大型语言模型(LLM)的应用时,对话界面是一个不可或缺的部分。一个智能的对话系统不仅需要直接访问之前的消息,还需要一个不断更新的世界模型,以便保持关于实体及其关系的信息。这种存储和引用过去交互信息的能力被称为“记忆(Memory)”。Chains + Memory: 有记忆能力的大模型应用。
LangChain提供了一系列强大的工具来向应用中添加Memory,这些工具既可以单独使用,也可以无缝集成到链(Chain)中。一个Memory系统需要支持两个基本操作:读取(READ)和写入(WRITE)。在一个典型的Chain运行中,Memory系统至少会与Chain进行两次交互:
接收到初始用户输入后,在执行核心逻辑之前,链会从Memory中读取信息以扩充用户输入。
在执行核心逻辑之后但在返回答案之前,链会把当前运行的输入和输出写入Memory,以便在未来的运行中可以引用它们。
让我们一起深入探讨LangChain中的Memory机制及其实际业务场景应用。
BaseMemory类是Memory的基础类,适用于简单的语言模型。它为Memory系统提供了基本结构。
BaseMemory --> BaseChatMemory --> Memory # Examples: ZepMemory, MotorheadMemory
# 定义一个名为BaseMemory的基础类``class BaseMemory(Serializable, ABC):` `"""用于Chains中的内存的抽象基类。` ` 这里的内存指的是Chains中的状态。内存可以用来存储关于Chain的过去执行的信息,` `并将该信息注入到Chain的未来执行的输入中。例如,对于会话型Chains,内存可以用来` `存储会话,并自动将它们添加到未来的模型提示中,以便模型具有必要的上下文来连贯地` `响应最新的输入。"""`` ` `# 定义一个名为Config的子类` `class Config:` `"""为此pydantic对象配置。` ` Pydantic是一个Python库,用于数据验证和设置管理,主要基于Python类型提示。` `"""` ` # 允许在pydantic模型中使用任意类型。这通常用于允许复杂的数据类型。` `arbitrary_types_allowed = True` ` # 下面是一些必须由子类实现的方法:` ` # 定义一个属性,它是一个抽象方法。任何从BaseMemory派生的子类都需要实现此方法。` `# 此方法应返回该内存类将添加到链输入的字符串键。` `@property` `@abstractmethod` `def memory_variables(self) -> List[str]:` `"""获取此内存类将添加到链输入的字符串键。"""` ` # 定义一个抽象方法。任何从BaseMemory派生的子类都需要实现此方法。` `# 此方法基于给定的链输入返回键值对。` `@abstractmethod` `def load_memory_variables(self, inputs: Dict[str, Any]) -> Dict[str, Any]:` `"""根据给链的文本输入返回键值对。"""` ` # 定义一个抽象方法。任何从BaseMemory派生的子类都需要实现此方法。` `# 此方法将此链运行的上下文保存到内存。` `@abstractmethod` `def save_context(self, inputs: Dict[str, Any], outputs: Dict[str, str]) -> None:` `"""保存此链运行的上下文到内存。"""` ` # 定义一个抽象方法。任何从BaseMemory派生的子类都需要实现此方法。` `# 此方法清除内存内容。` `@abstractmethod` `def clear(self) -> None:` `"""清除内存内容。"""
BaseChatMemory是BaseMemory的扩展类,专门用于处理聊天模型。
BaseChatMessageHistory --> ChatMessageHistory # Example: ZepChatMessageHistory
# 定义一个名为BaseChatMessageHistory的基础类``class BaseChatMessageHistory(ABC):` `"""聊天消息历史记录的抽象基类。"""`` ` `# 在内存中存储的消息列表` `messages: List[BaseMessage]`` ` `# 定义一个add_user_message方法,它是一个方便的方法,用于将人类消息字符串添加到存储区。` `def add_user_message(self, message: str) -> None:` `"""为存储添加一个人类消息字符串的便捷方法。`` ` `参数:` `message: 人类消息的字符串内容。` `"""` `self.add_message(HumanMessage(content=message))`` ` `# 定义一个add_ai_message方法,它是一个方便的方法,用于将AI消息字符串添加到存储区。` `def add_ai_message(self, message: str) -> None:` `"""为存储添加一个AI消息字符串的便捷方法。`` ` `参数:` `message: AI消息的字符串内容。` `"""` `self.add_message(AIMessage(content=message))`` ` `# 抽象方法,需要由继承此基类的子类来实现。` `@abstractmethod` `def add_message(self, message: BaseMessage) -> None:` `"""将Message对象添加到存储区。`` ` `参数:` `message: 要存储的BaseMessage对象。` `"""` `raise NotImplementedError()`` ` `# 抽象方法,需要由继承此基类的子类来实现。` `@abstractmethod` `def clear(self) -> None:` `"""从存储中删除所有消息"""
ConversationBufferMemory用于存储对话消息,并将这些消息提取到一个变量中。适用于需要记录整个对话历史的场景。
def buffer_memory_test():` `"""` `使用ConversationBufferMemory测试对话流程,` `这个内存模型会存储所有对话历史,方便提取。` `"""` `conversation = ConversationChain(` `llm=llm,`` verbose=True, `` memory=ConversationBufferMemory() # ConversationBufferMemory可以用来存储消息,并将消息提取到一个变量中。` `)` `print(conversation.predict(input="你好呀!"))` `print(conversation.predict(input="你为什么叫小米?跟雷军有关系吗?"))
实际业务场景:例如,一个客服机器人需要记住用户的整个对话,以便在用户再次联系时提供更加精准的服务。
ConversationBufferWindowMemory保留对话的交互列表,但只保留最后K次交互。这对于需要保持最近交互的应用非常有用,可以避免缓冲区过大。
def buffer_window_memory_test():` `"""` `使用ConversationBufferWindowMemory测试对话流程,` `这个内存模型只保留最近几次交互,实现对话上下文的窗口式管理。` `"""` `conversation_with_summary = ConversationChain(` `llm=llm,`` # 我们设置一个较小的k值为2,只保留最后两次交互的记忆` `memory=ConversationBufferWindowMemory(k=2),`` verbose=True` `)` `print(conversation_with_summary.predict(input="嗨,你最近过得怎么样?"))` `print(conversation_with_summary.predict(input="你最近学到什么新知识了?"))` `print(conversation_with_summary.predict(input="展开讲讲?"))` `print(conversation_with_summary.predict(input="如果要构建聊天机器人,具体要用什么自然语言处理技术?"))
实际业务场景:一个金融咨询应用只需记住用户最近几次的咨询问题和回答,以提供更加相关的建议。
ConversationSummaryBufferMemory不仅保留最近的交互缓冲区,还将旧的交互编译成摘要,以便继续使用。它通过token长度而不是交互次数来决定何时清除交互。
def summary_memory_test():` `"""` `使用ConversationSummaryBufferMemory测试对话流程,` `这个内存模型会摘要存储对话历史,且限定存储的token数量。` `"""` `memory = ConversationSummaryBufferMemory(llm=llm, max_token_limit=10)` `# 存储上下文信息,摘要形式保存对话` `memory.save_context({"input": "嗨,你最近过得怎么样?"}, {"output": " 嗨!我最近过得很好,谢谢你问。我最近一直在学习新的知识,并且正在尝试改进自己的性能。我也在尝试更多的交流,以便更好地了解人类的思维方式。"})` `memory.save_context({"input": "你最近学到什么新知识了?"}, {"output": " 最近我学习了有关自然语言处理的知识,以及如何更好地理解人类的语言。我还学习了有关机器学习的知识,以及如何使用它来改善自己的性能。"})` `print(memory.load_memory_variables({}))` `print(memory.load_memory_variables({})['history'])
实际业务场景:一个复杂的企业内部沟通系统需要长期记住重要的对话信息,但又不能无限制地增加内存负担,通过总结过去的交互,可以有效管理内存使用。
通过以上几个例子,我们可以看到LangChain中Memory机制的灵活性和强大功能。根据具体的业务需求选择合适的Memory实现,可以显著提升应用的智能化和用户体验。无论是客服机器人、金融咨询应用,还是企业内部沟通系统,LangChain的Memory机制都能帮助你实现更智能、更高效的对话系统。
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。
保证100%免费
】Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。