字节 Seed 团队联合清华大学智能产业研究院开源 MemAgent: 基于多轮对话强化学习记忆代理的长文本大语言模型重构

在这里插入图片描述

🔥 最新动态!!!

  • [2025/07] 我们提供了快速启动脚本,让使用MemAgent变得超级简单,详情请见下方"快速入门"部分。
  • [2025/06] 我们发布了RL-MemAgent-14B和RL-MemAgent-7B模型,在350万token上下文任务中实现了近乎无损的性能表现。
    在这里插入图片描述

在这里插入图片描述

📖 简介

我们提出了一种新颖的长上下文处理框架——MemAgent,它无需改变基础模型架构,直接通过端到端的强化学习优化长上下文任务。MemAgent 展现出卓越的长上下文处理能力:在 32K 文本上训练后,可外推至 3.5M 问答任务且性能损失 <5%,并在 512K RULER 测试中达到 95%+ 准确率。

在这里插入图片描述

亮点:

  • 🚀 创新记忆机制 引入MemAgent架构,可在固定上下文窗口内处理任意长度的输入,突破传统上下文窗口长度限制。
  • ⚡ 线性时间复杂度 突破长文本处理的计算瓶颈,实现资源消耗与文本长度的线性扩展。
  • 🎯 强化学习驱动的外推能力 通过MemAgent架构的强化学习训练,使模型能够外推到更长的文本而性能损失最小。

在这里插入图片描述

多轮对话强化学习框架

我们采用可验证奖励的强化学习(RLVR)来训练记忆代理,扩展了DAPO算法以支持具备多轮上下文无关对话的智能体工作流程端到端优化。

在这里插入图片描述

结果

RL-MemAgent 在超长上下文处理中展现出卓越的稳定性:

  • 140亿参数模型:在350万token的任务上性能衰减<5.5%,实现真正无损的外推。
  • 70亿参数模型:在最长上下文中性能仅下降11%,显著优于现有长上下文模型。

在这里插入图片描述

快速开始

quickstart.py 提供了一种简单上手 MemAgent 的方式,支持本地部署和在线模型服务集成。

vLLM 本地部署

  1. 启动 vllm 服务器:

    vllm serve BytedTsinghua-SIA/RL-MemoryAgent-14B --tensor_parallel_size 2
    
  2. 运行 quickstart.py:

    python quickstart.py --model BytedTsinghua-SIA/RL-MemoryAgent-14B
    

在线大语言模型服务

对于在线大语言模型服务,您需要将模型端点地址和API密钥配置为环境变量。

例如 gpt-4o-2024-11-20

  • 普通在线服务:直接使用 https://{endpoint}
  • Azure OpenAI:使用格式 https://{endpoint}/openai/deployments/gpt-4o-2024-11-20
export URL=
export API_KEY=
python quickstart.py --model gpt-4o-2024-11-20

可复现性

测试结果

pip install httpx==0.23.1 aiohttp -U ray[serve,default] vllm
  1. 准备问答数据
cd taskutils/memory_data
bash download_qa_dataset.sh
  1. 下载数据集
cd ../..
bash hfd.sh BytedTsinghua-SIA/hotpotqa --dataset --tool aria2c -x 10
export DATAROOT=$(pwd)/hotpotqa
  1. 准备模型

测试中使用的模型将从HuggingFace下载。但Qwen2.5-Instruct系列模型需要手动下载,并正确配置其config.json文件以启用YaRN功能。请按照Qwen2.5-Instruct仓库的说明进行操作。

bash hfd.sh Qwen/Qwen2.5-7B-Instruct --model --tool aria2c -x 10
bash hfd.sh Qwen/Qwen2.5-14B-Instruct --model --tool aria2c -x 10
bash hfd.sh Qwen/Qwen2.5-32B-Instruct --model --tool aria2c -x 10
# then change the config.json manually
export MODELROOT=/your/path/to/models # move to your model root directory, this env variable is used in the run.py script
mv Qwen2.5-7B-Instruct $MODELROOT/Qwen2.5-7B-Instruct-128K
mv Qwen2.5-14B-Instruct $MODELROOT/Qwen2.5-14B-Instruct-128K
mv Qwen2.5-32B-Instruct $MODELROOT/Qwen2.5-32B-Instruct-128K
  1. 运行

注意: 运行所有测试需要几天时间,您可能需要指定要运行的测试/模型。

cd taskutils/memory_eval
python run.py

注意: 此脚本将使用所有可用GPU来部署模型。若您拥有多个GPU节点,可以创建一个Ray集群并在其中一个集群节点上运行脚本。使用SERVE_PORTDASH_PORT为Ray集群指定端口。

cd taskutils/memory_eval
SERVE_PORT=8000 DASH_PORT=8265 python run.py # port numbers here are default values, you may need to specify them as the serve/dashboard port in your ray cluster

训练

首先在run_memory_7B.shrun_memory_14B.sh文件中指定PROJ_ROOT(用于保存检查点)和DATASET_ROOT(用于训练数据,应与测试时使用的路径相同)。

然后直接运行该脚本启动单节点训练,或者正确配置Ray集群并在集群节点之一上运行该脚本。

数据

本节操作请在taskutils/memory_data目录下执行以下命令。

cd taskutils/memory_data
pip install nltk pyyaml beautifulsoup4 html2text wonderwords tenacity fire
  1. 训练 & dev split: hotpotqa_train.parquet & hotpotqa_dev.parquet
  • 下载问答数据集和合成数据,如果在上一步已经下载过,请跳过此步骤:
bash download_qa_dataset.sh
python processing.py # Dataprocess, synthetic long context multihop-QA
  • 在本地主机8000端口部署Qwen-7B,在本地主机8001端口部署Qwen-7B-Instruct

  • 过滤

python filter.py -i hotpotqa_dev_process.parquet -o hotpotqa_dev_result --noresume
python filter.py -i hotpotqa_train_process.parquet -o hotpotqa_train_result --noresume
python3 filter2.py # Filtering out sample which can be answered correctly by LLM without any context:

2. Main task: eval_{50|100|200|…}.json

export DATAROOT="your_dir_to_hotpotqa_dev.parquet"
python convert_to_eval.py # Convert the `hotpotqa_dev` to `eval_200.json`
python different_docs_eval.py.py # Create eval dataset with different number of documents

3. OOD task: eval_{rulersubset}_{8192|16384|…}.json

export DATAROOT="your_dir_to_hotpotqa_dev.parquet"
python download_paulgraham_essay.py
bash download_qa_dataset.sh
bash ruler_data_prepare.sh 

工程实现

同步模式:从工具调用到通用工作流

受Search-R1启发,我们实现了一个具有独立上下文的通用多会话工作流框架。因此上下文不再像原始工具调用那样仅限于所有先前对话的串联字符串。该框架使得以端到端方式优化多步智能体成为可能。记忆智能体是该框架的示例之一,展示了如何应用强化学习来优化智能体在多步工作流中的性能。

实现细节请参阅recurrent/impls/memory.py,接口设计参见recurrent/interface.pyrecurrent/generation_manager.py文件。

异步模式:将智能体视为函数

基于服务器模式生成的实现,我们进一步开发了一个全新框架——允许用户将智能体实现为以openai-api风格调用大语言模型的函数,无需关注批处理张量操作(如分词、填充、状态追踪等),这些操作通常需要大量模板代码甚至状态机管理。

在此框架下,每个智能体都是一个函数,其返回值为一个或多个{"role":"", "content":""}字典构成的列表:

在这里插入图片描述

  • 香草模型(基础对话):[{"role":"user","content":用户输入},{"role":"assistant""content":助手回复}]
  • 多轮工具调用模式:[{"role":"user","content":用户输入},{"role":"assistant","content":助手初始回复},{"role":"tool","content":工具观测结果},{"role":"assistant","content":助手最终回复}]
  • 上下文无关的多轮对话:[{"role":"user","content":对话1输入},{"role":"assistant","content":对话1回复}], [{"role":"user","content":对话2输入},{"role":"assistant","content":对话2回复}]

我们修改了chat_template以支持无需张量操作的工具响应掩码功能。

具体实现请参阅recurrent/impls/async_*.py文件中定义的agent类的rollout方法,框架设计详见recurrent/interface.pyrecurrent/async_generation_manager.py文件。

RayActor进程池

计算密集型的奖励计算或工具调用可能会阻塞头节点向大语言模型发送生成请求。为提高CPU密集型任务的效率,我们在每个节点创建了一个运行进程池的RayActor,用于接收来自头节点的任务。

因此,CPU任务可以通过提交给ray actor异步执行,GPU任务(如LLM生成)同理。

详见verl/workers/reward_manager/thread.py文件。

致谢

我们感谢verl团队提供了灵活强大的基础设施。

我们感谢服务器模式生成的作者们所做的杰出工作,这为我们的异步智能体框架奠定了坚实基础。

代码

https://github.com/BytedTsinghua-SIA/MemAgent

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

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

相关文章

【unitrix】 4.20 类型级二进制数减法实现解析(sub.rs)

一、源码 这段代码实现了一个用于统计二进制补码整数位数的系统&#xff0c;支持多种自定义数值类型&#xff08;Z0、P1、N1、B0、B1&#xff09;。 use core::mem::size_of; use crate::number::{Z0, P1, N1, B0, B1, Var};/// 统计二进制位数的 trait pub trait BitLength {f…

手把手教你安全删除Anaconda虚拟环境(避坑指南)

文章目录一、删除前必看清单&#xff08;超级重要&#xff09;二、三种删除方法对比&#xff08;建议收藏&#xff09;方法1&#xff1a;官方推荐命令&#xff08;最安全&#xff09;方法2&#xff1a;暴力删除大法&#xff08;快速但需谨慎&#xff09;方法3&#xff1a;核弹级…

Effective Modern C++ 条款7:区分使用 `()` 和 `{}` 创建对象

在 C11 及以后的版本中&#xff0c;初始化对象的方式变得更加灵活&#xff0c;但也带来了选择上的困惑。() 和 {} 是两种常见的初始化语法&#xff0c;它们在语义、行为和适用场景上有显著差异。本文将通过具体示例&#xff0c;深入解析这两种初始化方式的区别&#xff0c;并探…

Java基础-String常用的方法

String常用的三种构造方法 public static void main(String[] args) {//1.使用常量字符串构造String s1 "1.Hello world";System.out.println(s1);//2.使用new关键字构造String s2 new String("2.Hello world");System.out.println(s2);//3。使用字符数组…

数学建模:多目标规划:ε约束法、 理想点法

一、ε约束法定义ε约束法通过将部分目标函数转化为约束条件&#xff0c;保留一个主要目标进行优化。1、选择一个主要目标 fk​(x) 进行优化。2、其他目标 fi​(x) 转化为约束 fi​(x)≤εi​&#xff0c;其中 εi​ 是决策者设定的容许阈值。​​原理​​​​目标选择​​&…

linux kernel struct regmap_config结构详解

在 Linux 内核中&#xff0c;struct regmap_config 是 ​Regmap 子系统的核心配置结构体&#xff0c;用于定义如何与底层硬件寄存器进行交互。Regmap&#xff08;Register Map&#xff09;子系统通过抽象不同总线&#xff08;如 I2C、SPI、MMIO 等&#xff09;的寄存器访问细节…

【Python3教程】Python3高级篇之CGI编程

博主介绍:✌全网粉丝23W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…

docker安装Consul笔记

安装过程 详细步骤如下&#xff1a; 首先拉取Consul的Docker镜像&#xff1a; docker pull hashicorp/consul:1.18.1创建Consul的配置文件和数据目录&#xff1a; mkdir -p /srv/docker/consul/data mkdir -p /srv/docker/consul/config在config目录下创建一个config.json配置文…

.net数据脱敏

.NET数据脱敏技术&#xff1a;保障数据安全的有效手段 在当今数字化时代&#xff0c;数据安全至关重要。尤其是涉及到用户的敏感信息&#xff0c;如密码、手机号码等&#xff0c;必须采取有效的措施进行保护。数据脱敏就是这样一种技术&#xff0c;它能够在不影响数据可用性的…

【openp2p】 学习2:源码阅读P2PNetwork和P2PTunnel

【openp2p】 学习1:P2PApp和优秀的go跨平台项目已经做了初步分析。阅读原版工程,感觉工程是一个暴露内网服务端口,让外部可以用的一个实现是一个完整的、跨平台的可商业化的应用。感谢作者需要学习作者的设计思路工程构建 F:\GolandProjects\openp2p\core\p2pnetwork.go通常…

网安学习NO.14

防火墙基础实验 传统防火墙配置实验拓扑图PC&#xff1a; ip 192.168.10.1 255.255.255.0 192.168.10.254 ip dns 114.114.114.114二层交换机 vl 10 ex int e0/0 sw mo ac sw ac vl 10 ex inr e0/1 sw tr en do sw mo tr三层交换机 vl 10 ex int g0/0 sw tr en do sw mo tr ex …

ESP32语音唤醒

两种唤醒方式AfeWakeWord与EspWakeWord对比 底层技术 AfeWakeWord&#xff1a;基于ESP-IDF的AFE框架&#xff08;esp_afe_sr_iface_t&#xff09;&#xff0c;高性能模式&#xff08;AFE_MODE_HIGH_PERF&#xff09;EspWakeWord&#xff1a;基于WakeNet接口&#xff08;esp_wn_…

借助 Wisdom SSH AI 助手,轻松安装 CentOS 8 LNMP 环境

打开Wisdom SSH软件&#xff0c;在AI对话区输入“在CentOS 8服务器安装LNMP环境”&#xff0c;AI助手会按以下步骤分析并执行安装&#xff1a; 安装Nginx 分析&#xff1a;CentOS 8默认软件源可能没有Nginx&#xff0c;所以要先启用Nginx官方软件源&#xff0c;然后才能安装Ngi…

WD0407 40V 7A 超级肖特基二极管,应用于开关汽车工业控制

WD0407 40V 7A 超级肖特基二极管说明​ 产品概述​ WD0407 是一款性能卓越的超级肖特基二极管&#xff0c;专为满足现代电子设备对高效、可靠电源管理的需求而设计。它采用先进的半导体制造工艺&#xff0c;在诸多关键性能指标上表现出色&#xff0c;能够为各类电路提供稳定、高…

卢比危机下的金融破局:科伦坡交易所技术升级作战图

&#x1f30f; 今日南亚风暴眼 印度双重上市机制加速落地&#xff1a;印度国家证券国际交易所&#xff08;NSE IX&#xff09;与科伦坡证券交易所&#xff08;CSE&#xff09;达成技术对接协议&#xff0c;斯企可通过印度GIFT City吸引美元资本&#xff0c;交易时段覆盖全球22小…

upload-labs靶场通关详解:第20关 /.绕过

一、分析源代码// 初始化上传状态标记&#xff0c;默认为false&#xff0c;即文件未上传 $is_upload false; // 初始化消息变量&#xff0c;用于存储错误信息 $msg null;// 检查是否通过POST方式提交了表单&#xff08;点击上传按钮&#xff09; if (isset($_POST[submit])) …

企业用云状态评估

云部署形态及其策略规划成熟度 单云部署&#xff1a; 主要业务负载运行在单一公有云或私有云上 多云/混合云部署 —有清晰战略规划与实施&#xff1a; 业务负载运行在多个云&#xff08;公有云或混合云&#xff09;上&#xff0c;并且企业拥有清晰的多云/混合云战略规划&#x…

STM32G473串口通信-USART/UART配置和清除串口寄存器状态的注意事项

USART和UART配置的区别 如果USART使用的是异步通信&#xff0c;那么UART与USART配置基本相同。 USART配置如下:UART配置如下&#xff1a;如果USART使用的是同步通信&#xff0c;那么UART配置就有差异。首先通信双方都是使用USART的同步通信&#xff0c;一个主机&#xff0c;一个…

Debezium:一款基于CDC的开源数据同步工具

Debezium 是由 Red Hat 开源的一种基于变更数据捕获&#xff08;CDC&#xff09; 的分布式平台&#xff0c;专为实时捕获和传播数据库的变更事件而设计。Debezium 常见的使用场景包括&#xff1a; 实时数据集成&#xff1a;将数据库变更同步到数据仓库或数据湖&#xff0c;支撑…

从面向对象编程语言PHP转到Go时的一些疑惑?

前言 1、php中面向对象编程时 与 Go中的区别&#xff1f; 2、php中最常使用laravel框架&#xff0c;不用过多关注依赖注入和反射&#xff0c;在go中又该如何使用呢&#xff1f;是 舍弃&#xff1f; 本文是一个系统化梳理&#xff0c;帮助从 语言哲学 → 依赖注入在 Go 的现状 →…