01. 摘要记忆组件的类型

在 LangChain 中使用缓冲记忆组件要不就保存所有信息(占用过多容量),要不就保留最近的记忆信息(丢失太多重要信息),那么有没有一种情况是既要又要呢?

所以折中方案就出现了——保留关键信息(重点记忆),移除冗余噪音(流水式信息)。

在 LangChain 中 摘要记忆组件 就是一种折中的方案,内置封装的 摘要记忆组件 有以下几种。

① ConversationSummaryMemory,摘要总结记忆组件,将传递的历史对话记录总结成摘要进行保存(底层使用 LLM 大语言模型进行总结),使用时填充的记忆为 摘要,并非对话数据。这种策略融合了记忆质量和容量的考量,只保留最核心的语义信息,有效减少了冗余,同时质量更高

② ConversationSummaryBufferMemory,摘要缓冲混合记忆,在不超过 max_token_limit 的限制下,保存对话历史数据,对于超过的部分,进行信息的提取与总结(底层使用 LLM 大语言模型进行总结),兼顾了精确的短期记忆与模糊的长期记忆。

02. 摘要缓冲混合记忆示例与注意事项

2.1 摘要缓冲混合记忆示例

使用 LangChain 实现一个案例,让 LLM 应用拥有多轮对话记忆,并将历史记忆 max_token_limit 限制为 300,超过的部分进行总结产生总结记忆。代码

from operator import itemgetter

import dotenv

from langchain.memory import ConversationSummaryBufferMemory

from langchain_core.output_parsers import StrOutputParser

from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

from langchain_core.runnables import RunnablePassthrough, RunnableLambda

from langchain_openai import ChatOpenAI

dotenv.load_dotenv()

# 1.创建提示模板&记忆

prompt = ChatPromptTemplate.from_messages([

    ("system", "你是一个强大的聊天机器人,请根据对应的上下文回复用户问题"),

    MessagesPlaceholder("history"),  # 需要的history其实是一个列表

    ("human", "{query}"),

])

memory = ConversationSummaryBufferMemory(

    return_messages=True,

    input_key="query",

    llm=ChatOpenAI(model="gpt-3.5-turbo-16k"),

    max_token_limit=300,

)

# 2.创建大语言模型

llm = ChatOpenAI(model="gpt-3.5-turbo-16k")

# 3.构建链应用

chain = RunnablePassthrough.assign(

    history=RunnableLambda(memory.load_memory_variables) | itemgetter("history")

) | prompt | llm | StrOutputParser()

# 4.死循环构建对话命令行

while True:

    query = input("Human: ")

    if query == "q":

        exit(0)

    chain_input = {"query": query, "language": "中文"}

    response = chain.stream(chain_input)

    print("AI: ", flush=True, end="")

    output = ""

    for chunk in response:

        output += chunk

        print(chunk, flush=True, end="")

    memory.save_context(chain_input, {"output": output})

    print("")

print("history: ", memory.load_memory_variables({}))

2.2 使用注意事项

ConversationSummaryBufferMemory 会将汇总摘要的部分默认设置为 system 角色,创建系统角色信息,而其他消息则正常显示,传递的消息列表就变成:[system, system, human, ai, human, ai, human]。

但是部分聊天模型是不支持传递多个角色为 System 的消息,并且在 langchain_community 中集成的模型并没有对多个 System 进行集中合并封装(Chat Model 未更新同步),如果直接使用可能会出现报错。

而且绝大部分聊天模型在传递历史信息时,传递的信息必须是信息组,也就是 1 条 Human 消息 + 1 条 AI 消息这种格式,例如百度的文心大模型,链接:https://cloud.baidu.com/doc/WENXINWORKSHOP/s/clntwmv7t。

所以在使用 ConversationSummaryMemory 这种类型的记忆组件时,需要检查对应的模型传递的 messages 的规则,以及 LangChain 是否对特定的模型封装进行了更新。

除此之外,在某些极端的场合下,例如第一条提问回复内容比较短,第二条提问内容比较长,ConversationSummaryMemory 执行两次 Token 长度计算,如果不异步执行任务,对话速度会变得非常慢。

摘要更新 逻辑代码

# langchain/memory/summary_buffer.py

def prune(self) -> None:

    """Prune buffer if it exceeds max token limit"""

    buffer = self.chat_memory.messages

    curr_buffer_length = self.llm.get_num_tokens_from_messages(buffer)

    if curr_buffer_length > self.max_token_limit:

        pruned_memory = []

        while curr_buffer_length > self.max_token_limit:

            pruned_memory.append(buffer.pop(0))

            curr_buffer_length = self.llm.get_num_tokens_from_messages(buffer)

        self.moving_summary_buffer = self.predict_new_summary(

            pruned_memory, self.moving_summary_buffer

        )

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/91697.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91697.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/91697.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NAT与智能选路

1、NAT 基础概念核心作用:私网地址无法在 Internet 上直接使用和分配,NAT 通过将私有地址与公有地址及端口进行转换,实现私网与公网的通信。转换示例:内网用户(10.1.1.1)访问外网 FTP Server(12…

【05】VisionMaster入门到精通——圆查找

文章目录1 运行参数先检测出多个边缘点然后拟合成圆形,可用于圆的定位与测量 1 运行参数 先检测出多个边缘点然后拟合成圆形,可用于圆的定位与测量——运行参数 扇环半径——圆环ROI的内外圆半经; 边绿类型 最强——只检测扫描范围内梯度最…

p5.js 用 beginGeometry () 和 endGeometry () 打造自定义 3D 模型

点赞 关注 收藏 学会了 在 p5.js 的 3D 绘图中,这两个函数是一对 “黄金搭档”: beginGeometry():像一个 “3D 模型的开关”,调用它之后,你画的所有简单 3D 形状(比如球体、圆锥)都会被 “…

(9)NMPC非线性模型预测控制及机械臂ROS控制器实现

前言 本篇介绍Nonlinear Model Predictive Control,非线性模型预测控制,MPC是一种现代先进的控制方法,而NMPC特指对非线性模型的控制,其核心思想是在每个控制周期内利用系统的非线性模型及损失函数,预测未来一段时间内…

达梦数据库备份与还原终极指南:从基础到增量策略实战

第一部分:备份与还原核心原理 一、备份还原本质解析数据存储机制 数据存储在物理文件页中(最小单位4K-32K)有效数据页 文件描述页 已分配使用页日志优先原则:操作先写REDO日志再更新数据文件三大核心操作操作作用关键特性备份复…

设计模式篇:在前端,我们如何“重构”观察者、策略和装饰器模式

设计模式篇:在前端,我们如何“重构”观察者、策略和装饰器模式 引子:代码里“似曾相识”的场景 作为开发者,我们总会遇到一些“似曾相识”的场景: “当这个数据变化时,我需要通知其他好几个地方都更新一…

Node.js 服务可以实现哪些功能

以下是 Node.js 服务可以实现的 100 个功能,涵盖 Web 开发、工具链、系统集成、自动化等方向,按类别分类整理:一、Web 开发相关 RESTful API 服务GraphQL 服务实时聊天应用(WebSocket/Socket.IO)博客/CMS 系统电子商务…

如何安装和使用 Cursor AI 编辑器

在软件开发领域,几乎每天都有新工具涌现,找到最适合您工作流程的工具可能会改变游戏规则。Cursor 是一款 AI 驱动的代码编辑器,其革命性的 API 管理插件 EchoAPI 就是其中的代表。它们强强联手,承诺在一个强大的平台内简化您的编码…

LangChain框架概念及简单的使用案例

一、LangChain介绍LangChain是一个强大的用于开发大模型应用程序的框架,为开发提供丰富的工具和组件,使得构造复杂的自然语言处理变得更加高效和便捷。它允许开发者将大语言模型与其他数据源工具集成,从而创建出能处理各种任务的智能体应用&a…

安卓audio 架构解析

audio_port_handle_t • 定义:audio_port_handle_t标识音频设备(如扬声器、耳机)或虚拟端口(如远程 submix)。它在设备连接或策略路由时由AudioPolicyManager分配,例如通过setDeviceConnectionState()动态注…

GitHub 上 Star 数量前 8 的开源 MCP 项目

原文链接:https://www.nocobase.com/cn/blog/github-open-source-mcp-projects。 MCP 这个词真正被广泛提起,是在 2025 年年初,尤其是在 AI 工具开发圈。3 月,一场围绕 “MCP 是否能成为未来标准协议” 的争论彻底点燃了讨论热度…

【数据结构与算法】数据结构初阶:排序内容加餐(二)——文件归并排序思路详解(附代码实现)

🔥个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题 🍉学习方向:C/C方向 ⭐️人生格言:为天地立心,为生民立命,为…

Jetson Orin NX/NANO+ubuntu22.04+humble+MAVROS2安装教程

MAVROS2目前不是官方提供的标准,主要区别还是通信机制的不同,以及API接口的区别,在使用的过程中,根据对应的版本安装即可,此处进提供简易的二进制安装方法,源码安装暂不提供,前去使用mavros即可…

Ubuntu 安装 ns-3 教程

Ubuntu 安装 ns-3最全 教程 1. 环境更新 sudo apt update sudo apt install git2. Ns3 最低依赖要求 2.1 安装依赖 安装依赖网址:根据自己安装的版本安装对应依赖。 https://www.nsnam.org/wiki/Installation Ubuntu/Debian/Mint 以下软件包列表在 Ubuntu 22.…

《林景媚与命运解放者》

《林景媚与命运解放者》——当数据库成为命运的主宰,谁将成为人类自由意志的解放者?《林景媚数据库宇宙》系列第十二部第一章:解放者的召唤公元 2098 年,随着“命运终结者”的威胁被解除,PostgreSQL Quantum Engine&am…

linux编译基础知识-头文件标准路径

&#x1f4c2; ​​1. 系统路径结构差异​​ 要查看 GCC 的默认头文件搜索路径&#xff0c;可通过以下方法操作&#xff08;以 Linux 环境为例&#xff09;&#xff1a; ​​1. 查看 C 语言头文件路径​​ gcc -v -E -xc - < /dev/null 2>&1 | grep -A 100 "#in…

离线语音芯片有哪些品牌和型号?

离线语音芯片的品牌有很多&#xff0c;型号也有很多&#xff0c;因为离线语音芯片的市场很大&#xff0c;几乎所有的想要语音控制的产品都可以通过增加一颗离线语音芯片来实现语音控制的能力&#xff0c;今天主要提到的就是离线语音芯片品牌厂家之一的唯创知音。唯创知音发展历…

Linux 软件包管理

Linux 软件包管理 分析 RPM 包 Linux 发行版本以 RHEL 为代表的发行版本&#xff0c;使用rpm包管理系统&#xff1a; RHEL (Red Hat Enterprise Linux&#xff09;Fedora&#xff08;由原来的RedHat桌面版本发展而来&#xff0c;免费版本&#xff09;CentOS&#xff08;RHEL的…

使用 Vue 3.0 Composition API 优化流程设计器界面

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

2025Nacos安装Mac版本 少走弯路版本

https://github.com/alibaba/nacos 一开始看网上文章&#xff0c;随便下了一个最新的3.0.2&#xff0c;然后出现很多错误 密钥等等问题&#xff0c;最后启动了&#xff0c;但是打不开链接&#xff1a;http://localhost:8848/nacos 然后开始找问题日志&#xff0c;/.nofollow/…