FlashAttention:从 IO 感知到软硬件协同流水线

本篇文章是「忆量 Tech Blog」系列第一篇文章,我们将通过「忆量 Tech Blog」 系列专题和大家分享更多内部技术实践 ~

主流 LLM 训练与推理栈通常都会在硬件、dtype、head dimension 和 mask 形态满足条件时,调度到 FlashAttention 或同类 memory-efficient attention kernel;它不是任何输入上都无条件启用的单一开关。如果你需要训练超长上下文、给模型加一种新的 attention 变体,或者把它移植到一块新硬件上,就绕不开它内部到底做了什么。

这篇文章想把 FlashAttention 讲透:它解决的是什么瓶颈、核心算法(tiling + online softmax + recomputation)怎么推导、从 FA1 到 FA4 每一代具体改了什么,以及在不同模型结构上做定制化开发时,应该从「接口层」还是「kernel 层」入手。

一、为什么需要 FlashAttention

1.1 标准 attention 的两个代价

标准的 scaled dot-product attention 是:

2.png

其中 𝑄,𝐾,𝑉∈ℝ𝑆×𝑑,𝑆 是 sequence length,𝑑 是 head dimension。朴素实现会分三步走:

S_ = (Q @ K.transpose(-1, -2)) / math.sqrt(d) # [S, S],显式 materialize
P = torch.softmax(S_, dim=-1) # [S, S]
O = P @ V # [S, d]

问题出在中间 [𝑆,𝑆]的注意力矩阵上:

  • 显存代价:它的大小是 𝑂(𝑆2)。当 𝑆=8𝐾 时,单个 head 的 attention score 在 FP16 下就是 81922×2≈128MB;乘上 batch、head、层数,长序列下这是灾难性的。
  • 读写代价:S_{_} 和 𝑃 都要写回 GPU 的高带宽显存(HBM)再读回来。这一来一回的 HBM 读写,才是真正的瓶颈。

1.2 朴素 attention 往往受 IO 限制

这是理解 FlashAttention 的前提。以论文讨论的 A100 一代为例,GPU 的内存层级可以粗略看成:

层级容量(量级)带宽(量级)
寄存器 / shared memory(on-chip)每个 SM 为 KB~ 百 KB 级聚合带宽为数十 TB/s 量级
HBM(显存)数十 GBA100 约 1.5–2.0 TB/s

On-chip memory 比 HBM 快得多,但容量小得多。朴素 attention 把整个 [𝑆,𝑆] 矩阵在 HBM 上写出来又读回去,在许多常见形状下,大量时间花在内存搬运而不是 Tensor Core 的 matmul 上。

具体 kernel 是否 memory-bound 仍取决于序列长度、head dimension、dtype 和硬件,不能把所有 attention 形状一概而论。

FlashAttention 的核心洞见就是:​不要把完整的 ​𝑆×𝑆 中间矩阵写进 HBM​。它通过分块显著减少 HBM 读写,并把 attention 中间量的额外存储从二次规模降到随序列长度线性增长;但其精确 IO 复杂度是 𝑂(𝑆2𝑑2/𝑀),并不是简单的 𝑂(𝑆),计算量也仍是 𝑂(𝑆2𝑑)。

难点在于:softmax 需要对一整行做归一化(要知道这一行的最大值和指数和),而分块计算时,我们一次只看到一行的一小段。

怎么在「只看到局部」的情况下算出「全局正确」的 softmax?答案是 online softmax。

3.png

图 1:标准实现把完整 scores / probabilities 写入 HBM;FlashAttention 只让当前 tile 驻留片上存储,并在线维护 ​𝑚、ℓ 与输出累加器。

二、核心原理:tiling + online softmax + recomputation

2.1 online softmax 的增量更新*

先看 softmax 本身。为了数值稳定,softmax 总是要减去最大值:

4.png

现在假设一行的 score 被切成两块 𝑥(1),𝑥(2),我们想分别处理、再合并。定义每块的局部最大值和局部指数和:

5.png

当第二块到来时,更新全局最大值:

6.png

关键一步:之前用旧的 𝑚(1) 算出的指数和 ℓ(1),需要按新旧最大值的差做一次​校正缩放​,再把第二块累加进来:

7.png

这就是 online softmax 的精髓:用一个 running max 𝑚 和 running sum ℓ,就能在只看局部的情况下,增量地维护出全局正确的归一化分母。

2.2 把 V 也一起增量更新

attention 不只要 softmax,还要乘上 𝑉。FlashAttention 把输出的累加器 𝑂 也一起做增量更新。遍历 𝐾,𝑉 的每一个 block 𝑗 时:

8.png

遍历完所有 block 后,最后做一次归一化 𝑂←𝑂/ℓ。

注意整个过程里:

  • 𝑆𝑖𝑗 和 𝑃𝑖𝑗 只是当前 block 的小矩阵 [𝐵𝑞,𝐵𝑘],算完即弃,​**从不 materialize 完整的 ​[𝑆,𝑆]**​;
  • 常驻的只有累加器 𝑂([𝐵𝑞,𝑑])和两个标量向量 𝑚,ℓ([𝐵𝑞])。

写成伪代码就是经典的双重循环(FA1 的视角,外层 K/V、内层 Q):

# Q, K, V: [S, d];分块大小 Bq, Bk
for j in range(0, S, Bk): # 外层遍历 K/V block
    Kj, Vj = K[j:j+Bk], V[j:j+Bk]
    for i in range(0, S, Bq): # 内层遍历 Q block
        Qi = Q[i:i+Bq]
        Sij = (Qi @ Kj.T) / sqrt(d) # [Bq, Bk],只在 SRAM
        m_new = maximum(m[i], rowmax(Sij))
        Pij = exp(Sij - m_new)
        l_new = exp(m[i] - m_new) * l[i] + rowsum(Pij)
        O[i] = exp(m[i] - m_new) * O[i] + Pij @ Vj
        m[i], l[i] = m_new, l_newO = O / l[:, None]

2.3 IO 复杂度:为什么这样就快了

设 on-chip SRAM 大小为 𝑀。标准 attention 的 HBM 访问量是 𝑂(𝑆2)(要写读完整的 score 矩阵)。FlashAttention 通过分块,把 HBM 访问量降到:

9.png

由于 𝑑2 通常远小于 𝑀(例如 𝑑=128,𝑑2=16384,而 SRAM 可容纳的元素数更大),这个量比 𝑂(𝑆2) 小很多。换句话说,​FlashAttention 没有减少计算量(FLOPs 还是 ​𝑂(𝑆2𝑑)),但大幅减少了 HBM 读写量​,把瓶颈从内存搬运转回了实际计算。

2.4 recomputation:反向不存 attention 矩阵

反向传播需要 attention 概率 𝑃 来求梯度。标准实现会把 forward 的 [𝑆,𝑆] 存下来给 backward 用——但这正是我们想避免的。FlashAttention 的做法是:​只存下 ​𝑂 和 logsumexp 统计量 ​𝐿=𝑚+logℓ(每行一个标量),backward 时用它们重新算出 ​𝑃​。

这是一种典型的「用计算换显存」:多花一点重算的 FLOPs,换掉 𝑂(𝑆2) 的 activation 存储。由于 attention 本身的算力在重算后仍远快于额外的 HBM 往返,这笔交易在长序列下非常划算。

三、FlashAttention-1:把算法落成 kernel

FlashAttention-1(2022)的贡献是把上面这套 IO-aware 算法第一次落成了高效的 CUDA kernel,并证明了它在端到端训练里的价值:

  • 显存:attention 部分从 𝑂(𝑆2) 降到 𝑂(𝑆),使得训练能支持远更长的上下文;
  • 速度:在 GPT-2/GPT-3 规模上,相比当时 PyTorch 的标准实现有数倍加速;
  • 精确:它是精确 attention,不是近似——输出和标准 attention 在数值上等价(仅有浮点误差)。

FA1 把一个 kernel 的工作划分成「外层循环遍历 K/V block、内层循环遍历 Q block」的结构。这个划分在当时是自然的,但也埋下了 FA2 要解决的低效问题。

四、FlashAttention-2:更好的并行与工作划分

FA1 虽然已经把 attention 变成 IO-aware 的分块计算,但它在 GPU 上的实际吞吐只有理论峰值的 25–40%——离优化过的 GEMM 还差得远。FlashAttention-2(2023)的目标不是改算法的数学,而是改它在 GPU 上的​工作划分与并行方式​。三个关键改动:

4.1 减少 non-matmul FLOPs

现代 GPU 上 matmul 和非 matmul 运算的算力差距巨大。以 A100 为例,FP16/BF16 matmul 的峰值是 312 TFLOPs/s,而非 matmul 的 FP32 运算只有 19.5 TFLOPs/s——​每个 non-matmul FLOP 大约比 matmul FLOP 贵 16 倍​。online softmax 里的那些 exp、rescale、rowmax/rowsum 都属于 non-matmul,虽然占总 FLOPs 比例不高,却会拖慢整体。

FA2 重新安排了 online softmax 的递推,减少除法、边界检查和校正缩放等 non-matmul 操作。可以把它理解为:中间尽量维护未归一化的累加器与 logsumexp 统计量,把能合并的归一化工作推迟或融合,而不是在每个 tile 上反复搬运、归一化输出:

10.png

这样把原本每个 block 都要做的 rescale,压缩成整行结束后的一次,省下大量 non-matmul 运算。

4.2 沿 sequence length 维并行

FA1 只在 batch × head 维度上做线程块(thread block)并行。当 batch 小、序列长时(正是长上下文训练的典型场景),线程块数量不足,GPU 的 SM 占用率(occupancy)很低,大量计算单元闲着。

FA2 让单个 head 内部也能沿 sequence length 维拆到不同线程块上并行。这样即使 batch=1,长序列也能产生足够多的线程块把 GPU 喂满。

4.3 split-Q 取代 split-K

这是 FA2 最巧妙的一处。在一个线程块内部,工作还要再分给若干 warp。FA1 采用 ​split-K​:每个 warp 负责 K/V 的一部分,但因为 softmax 要跨整行归一化,各 warp 算完后必须通过 shared memory 交换中间结果、再汇总,产生大量 warp 间通信。

FA2 改成 ​split-Q​:每个 warp 负责一部分 Q 行,独立地遍历完整的 K/V。由于每个 warp 处理的是不同的 query 行、互不依赖,​warp 之间几乎不需要通过 shared memory 通信​。

split-K(FA1):warp 切 K/V → 各 warp 持有部分行的部分和 → 必须跨 warp 归约
split-Q(FA2):warp 切 Q → 各 warp 独立算完整行 → 几乎零 warp 间通信

4.4 结果

三者叠加,FA2 相比 FA1 约 ​2× 加速​,达到理论峰值的 50–73%;在 A100 上 FP16/BF16 可达 ~230 TFLOPs/s,端到端训练的 MFU(model FLOPs utilization)可到 72%。实现上 FA2 也基于 NVIDIA 的 CUTLASS 3.x / CuTe 从头重写。

五、FlashAttention-3:拥抱 Hopper 的异步

FA2 虽然在 A100(Ampere)上很高效,但搬到 H100(Hopper)上时利用率只有约 35%。原因是 Hopper 引入了一批新的异步硬件能力,而 FA2 的同步执行模型没有用上它们。FlashAttention-3(2024)专门针对 Hopper 重写,核心是​让数据搬运和计算异步重叠起来​。三大技术:

5.1 warp-specialization:producer-consumer 异步

FA3 把一个线程块里的 warp group 分成两类角色,组成一条流水线:

  • producer warp:只负责用 ​TMA​(Tensor Memory Accelerator,Hopper 上专门搬数据的硬件单元)把下一个 K/V block 从 HBM 预取到 shared memory;
  • consumer warp:专注算 matmul(​WGMMA​,Hopper 新一代 Tensor Core 指令,吞吐远高于 Ampere 的 mma.sync)和 softmax。

这样当 consumer 在算当前 block 时,producer 已经在搬下一个 block 的数据,​计算和访存彻底重叠​,不再互相等待。

一个关键使能特性是 Hopper 支持用 setmaxnreg 在 warp group 之间​动态分配寄存器​:负责 WGMMA 的 consumer 拿到更多寄存器(用来开更大的 tile),而只需一个线程发 TMA 指令的 producer 占用极少寄存器。

5.2 matmul 与 softmax 的交织 overlap

即使在 consumer 内部,matmul(走 Tensor Core)和 softmax(走普通 CUDA core 的 exp 等)也是两类不同的硬件单元。FA3 把相邻 block 的这两类操作交织起来:在对当前 block 做 softmax 的同时,让 Tensor Core 去算下一个 block 的 𝑄𝐾⊤。这样 Tensor Core 不会因为等 softmax 而空转,进一步压满算力。

5.3 FP8 低精度 + block quantization + incoherent processing

Hopper 的 Tensor Core 在 FP8 下吞吐翻倍(FP16 ~989 TFLOPs/s vs FP8 ~1978 TFLOPs/s)。但 FP8 位数少,直接用会有明显精度损失。FA3 用两个技巧把误差压回来:

  • block quantization:不对整个张量用一个 scale,而是按 block 分别量化,让每块用更贴合自己数值范围的 scale;
  • incoherent processing:在量化前用随机正交矩阵(如 Hadamard 变换)把 𝑄,𝐾 旋转一下,把个别异常大的 outlier「摊平」到各维度,从而减小量化误差。

5.4 结果

FA3 在 H100 上:BF16 达到 ~840 TFLOPs/s(​85% 利用率​),相比 FA2 有 1.5–2.0× 加速;FP8 接近 1.3 PFLOPs/s,且数值误差比基线 FP8 attention 小 ​2.6×​。

六、FlashAttention-4:面向 Blackwell 的算法—流水线协同设计

FlashAttention-4(2026)面对的是 Blackwell 上新的不对称扩展:Tensor Core 吞吐相较 Hopper 大幅提高,但指数单元、shared-memory 带宽等 non-matmul 资源并没有同比扩张。

结果是,FA3 已经尽力隐藏的 softmax 与数据搬运,在更强的矩阵乘硬件面前重新成为瓶颈。FA4 因此不只“换一套指令”,而是同时改算法和 kernel pipeline。

6.1 全异步 MMA 与更大的 tile

FA4 重新设计流水线,利用 Blackwell 的全异步 MMA 与更大 tile,让矩阵乘、数据预取和 softmax 更深地重叠。更大的 tile 能提高 Tensor Core 利用率,但也会增加寄存器和片上存储压力,因此 tile 形状、流水级数与工作分配必须一起搜索,而不能各自独立调参。

6.2 软件近似指数与条件 rescale

当 exp 单元成为相对瓶颈时,FA4 用软件模拟的指数计算把部分工作转移到扩展更充分的算术单元;同时利用 online softmax 中 running max 只会单调增加的性质,​只在最大值确实变化时执行 rescale​,减少无效的校正操作。

这体现了 FA4 的关键变化:算法递推本身开始主动适配硬件单元的非对称吞吐。

6.3 Tensor Memory、2-CTA MMA 与 CuTe DSL

反向传播中,FA4 利用 Blackwell Tensor Memory 和 2-CTA MMA 减少 shared-memory 流量与原子加;实现则从传统的 C++ 模板体系转向嵌入 Python 的 CuTe DSL。

论文报告其在 B200、BF16 上达到最高 1613 TFLOPs/s(约 71% 利用率),相较 cuDNN 9.13 最高快 1.3×、相较 Triton 最高快 2.7×;这些都是特定硬件与 benchmark 配置下的峰值,不应直接当作任意模型的端到端加速比。

6.4 四代演进一张表

FA1 (2022)FA2 (2023)FA3 (2024)FA4 (2026)
关键词IO-aware、tiling工作划分、并行异步、低精度算法—pipeline 协同
主要瓶颈完整𝑆2中间量与 HBM IOoccupancy 低、warp 通信多Hopper 异步能力没用上Blackwell tensor / non-matmul 吞吐失衡
核心改动online softmax + recompute减 non-matmul FLOPs、seq 并行、split-Qwarp specialization、TMA/WGMMA、FP8全异步 MMA、软件 exp、条件 rescale、Tensor Memory
主要目标硬件A100 等Ampere(A100)Hopper(H100)Blackwell(B200)并覆盖新 CuTe DSL 路线

主线因此变成:​FA1 减少 HBM IO,FA2 改善工作划分,FA3 用异步流水吃透 Hopper,FA4 在 Blackwell 上把算法递推与硬件流水线一起重构​。tiling、online softmax 与 recomputation 的数学骨架仍在,但每一代都在重新回答“当前硬件上真正稀缺的资源是什么”。

11.png

图 2:四代实现共享同一数学骨架,但优化对象从 HBM IO 依次迁移到工作划分、异步流水和 Blackwell 上的软硬件协同。

七、不同模型结构上的定制化开发

实际项目里,你的模型往往不是「标准 full attention」:可能是 causal、sliding window、加了 ALiBi/相对位置偏置、用了 MQA/GQA、需要变长序列打包,甚至有一个完全自定义的 mask。这时该怎么用上 FlashAttention?分两个层面看。

7.1 接口 / 集成层:能配置的就别改 kernel

绝大多数常见变体,官方 flash-attn 已经内置参数支持,根本不用碰 CUDA。这一层应该是你的首选。

​causal mask​:最常见的需求,一个参数搞定。FA kernel 内部会跳过被 mask 的整个 block(上三角部分根本不计算),所以 causal 不仅正确还更快:

from flash_attn import flash_attn_func

# q, k, v: [batch, seqlen, nheads, head_dim]
out = flash_attn_func(q, k, v, causal=True)

sliding window(局部注意力):Mistral 等模型用的滑动窗口,FA 直接支持 window_size 参数,只计算窗口内的 block:

out = flash_attn_func(q, k, v, causal=True, window_size=(4096, 0)) # 左 4096,右 0

​MQA / GQA​:多个 query head 共享一组 KV head。不需要把 KV 物理复制成和 Q 一样多(那会浪费显存和带宽),直接传入 head 数更少的 K/V,FA 内部处理这种 broadcast:

# q: [b, s, 32, d],k/v: [b, s, 4, d] → 8 个 query head 共享 1 个 kv head
out = flash_attn_func(q, k, v, causal=True) # GQA:nheads_q=32, nheads_kv=4

​**变长序列打包(varlen)**​:训练时为了不浪费算力,常把不同长度的样本拼成一个无 padding 的长序列,用 cu_seqlens(累积长度前缀)标记边界。FA 的 varlen 接口能在拼接序列上做到「样本之间互不注意」:

from flash_attn import flash_attn_varlen_func

# q,k,v: [total_tokens, nheads, d];cu_seqlens: [batch+1],如 [0, 12, 30, 30+...]
out = flash_attn_varlen_func(
    q, k, v,
    cu_seqlens_q=cu_seqlens, cu_seqlens_k=cu_seqlens,
    max_seqlen_q=max_len, max_seqlen_k=max_len,
    causal=True,
)

​ALiBi 等位置偏置​:FA 支持传入 alibi_slopes,在 kernel 内部把线性偏置加到 score 上,而不必在外面 materialize 一个 [𝑆,𝑆] 的 bias 矩阵(那又会把我们省下的显存吃回去)。

​经验法则​:如果你的需求是 causal、window、GQA/MQA、varlen、ALiBi 这类「主流变体」,几乎一定有现成参数——先翻文档,别急着写 kernel。

7.2 kernel 改写层:当配置参数不够用时

如果你的 attention 有一个​任意的、数据相关的 score 修改​(比如一个无法用现成参数表达的自定义 mask,或者一种新的相对位置偏置、新的 attention 变体),就需要改 kernel 了。

这时不建议直接动官方的 CUDA/CUTLASS 代码——门槛极高——而是用 Triton 写一个 FlashAttention 风格的 kernel,在分块循环里插入你的逻辑。

关键是理解:所有自定义都发生在「算完 𝑆𝑖𝑗、做 online softmax 之前」这个钩子点上。拿到当前 block 的 score 子矩阵后,加 bias、应用 mask、做任何 element-wise 变换,再交给后续的 max/exp/累加:

# Triton FlashAttention 内层循环的示意(省略 boilerplate)
qk = tl.dot(q, k) * sm_scale # [Bq, Bk] 当前 block 的 score

# ---- 自定义钩子点:在这里改 score ----
qk = qk + my_custom_bias(offs_q, offs_k) # 例如自定义相对位置偏置
qk = tl.where(my_custom_mask(offs_q, offs_k), qk, float("-inf")) # 自定义 mask
# -------------------------------------

m_new = tl.maximum(m_i, tl.max(qk, axis=1)) # online softmax,照常
p = tl.exp(qk - m_new[:, None])
l_new = tl.exp(m_i - m_new) * l_i + tl.sum(p, axis=1)acc = 
acc * tl.exp(m_i - m_new)[:, None] + tl.dot(p.to(v.dtype), v)
m_i, l_i = m_new, l_new

几个落地要点:

  • mask 要在 block 级别短路:如果某个 (𝑄block,𝐾block) 整块都被 mask 掉(比如 causal 的上三角块),直接 continue 跳过,别白算——这正是 causal 比 full 快的原因,自定义 mask 也应沿用。
  • backward 要自己配套:改了 forward 的 score 逻辑,反向的梯度公式也得相应推导。Triton 里通常要手写对应的 backward kernel,或确保你的 bias/mask 对输入的梯度被正确处理(很多自定义 bias 本身带可学习参数,梯度不能漏)。
  • 数值稳定性别破坏:自定义变换要兼容 online softmax 的减最大值机制。比如加 bias 后再求 max,不要在减 max 之前就把 bias 丢掉。
  • 优先找现成的可编程框架:PyTorch 的 FlexAttention 提供了 score_mod 和 mask_mod 两个钩子,让你用纯 Python 函数表达「如何改 score / 如何 mask」,再由编译器生成融合 kernel。它正是为「我想要一个新变体但不想手写 Triton」这个场景设计的,应优先考虑。

7.3 选择哪一层:一个决策顺序

  • 需求是主流变体(causal/window/GQA/varlen/ALiBi)→ ​用 ​flash-attn 参数​;
  • 需求是自定义 score/mask,但能表达成 element-wise 函数 → ​**用 FlexAttention 的 ​score_mod/mask_mod**​;
  • 需求非常特殊、或要极致性能、或要上新硬件 → ​用 Triton 手写 FA 风格 kernel​,在 online softmax 前的钩子点插入逻辑,并配套 backward。

层级越往下,灵活性越高,但开发和维护成本也越高。绝大多数模型工程师停在第 1、2 层就够了。

12.png

图 3:先用现成参数,再用可编程 score / mask;只有语义或性能需求无法表达时,才进入 Triton / CuTe 并承担配套 backward 与验证成本。

八、总结

FlashAttention 不是一个「近似」或「省显存的小技巧」,而是对 attention 计算方式的一次重写:它用 ​tiling + online softmax + recomputation​,在数学上等价地避免 materialize 𝑂(𝑆2) 的注意力矩阵,显著降低 HBM IO,并让许多常见形状更接近硬件的计算吞吐上限。

四代的演进是「同一套算法不断贴合硬件」的过程:

  • FA1 确立 IO-aware 思想,不把 𝑆×𝑆 写进 HBM;
  • FA2 通过减少 non-matmul FLOPs、沿序列维并行、split-Q,把 GPU 喂满;
  • FA3 用 warp-specialization、TMA/WGMMA 异步和 FP8,吃透 Hopper 的硬件能力。
  • FA4 针对 Blackwell 的非对称扩展,让 online softmax 递推、异步 MMA 与 Tensor Memory 协同设计。

而在自己的模型上做定制时,正确的顺序是​从接口层往 kernel 层走​:能用参数配置的(causal、window、GQA、varlen、ALiBi)就别写 kernel;需要自定义 score/mask 的优先用 FlexAttention 这类可编程框架;只有在极特殊或追求极致性能时,才下沉到 Triton 手写 kernel,并记住所有自定义都应发生在「online softmax 之前的那个钩子点」上,且 forward 与 backward 必须配套。

理解了这套结构,FlashAttention 对你就不再是一个黑盒开关,而是一个可以按需裁剪、扩展、甚至移植的计算原语。

相关推荐

权限撤了,Agent 为什么还记得那份报价?

MemOS 提供记忆的保存、检索、修改和删除操作,让 Agent 能在后续任务中使用已有的客户上下文。

MemTensor的博客 249

用 MemOS,让客服 Agent 记住上次聊到哪

整体可以概括为 “两次写入、一次组合召回”。每轮任务结束后,同一份任务记录分别写入用户记忆和 Agent Skill,通过指定不同的记忆类型;用户再次发起请求时,通过一次同时获取当前用户记忆、Agent Skill 和政策知识。当前会话历史仍由客服应用自己维护。具体来说,用户记忆通过user_id限定范围,Agent Skill 通过agent_id跨用户复用,政策知识库通过加入同一次检索。用户请求│├─ Agent 从业务应用读取当前会话历史│。

MemTensor的博客 264

OpenAI 发布 Agents API 之后,长任务 Agent 的记忆该如何管理?

OpenAI Agents API 把“持续运行数天”的 Agent 推向标准化,也暴露了长任务的另一面:上下文可以被压缩,进程可以被恢复,但一条状态为什么值得长期保留、何时失效、谁有权使用,仍然需要独立的系统判断。2026 年 9 月 10 日,OpenAI 发布 Agents API 公开测试版,将会话编排、上下文压缩和任务恢复等能力整合到托管的 Agent 运行框架(harness)中。开发者可以通过 API 启动 Agent,配置工具调用与子 Agent 协作,并在后续交互中继续推进已有任务。

MemTensor的博客 301

大模型是怎么炼成的(一):训练全景与开训准备

本系列会围绕 Llama 3、DeepSeek-V3/R1、Tulu 等公开程度较高的系统,回答三类问题:每个阶段解决什么问题、核心目标和算法是什么、工程上如何验证它确实有效。

MemTensor的博客 210

产品更新|MemOS Cloud 支持 DeepSeek Harness,新增 Native Hook

MemOS Cloud 新增 DSH No-Hook 接入,并在多种 Agent 框架中接入 Native HookMemOS Cloud CLI 现已支持 DeepSeek Harness(DSH)接入云端长期记忆。完成初始化后,MemOS Cloud CLI 会通过 DSH 原生的AGENTS.md与 Agent Skills 机制,把记忆检索和写入流程接入日常对话:开始回答前查询相关记忆,任务结束后沉淀本轮问题、结论和任务经验。

MemTensor的博客 355

Dreaming 升级之后,AI 记忆需要按年管理

MemTensor 从 Memory³ 相关记忆机制研究出发,通过 MemOS 推进记忆系统工程化,并继续探索 Agent 和记忆基础设施、记忆原生通用基座模型 等方向。

MemTensor的博客 374

Memory Poisoning:企业 Agent 必须建立的六道长期记忆控制

Agent 能够长期工作,记忆就会开始影响后续任务的质量与安全。企业需要知道一条记忆从哪里来,为什么被写入,哪些任务曾调用过它,发现问题后又能否及时修正或删除。长期记忆并不只是保存历史。它需要在每一次写入、召回和更新中保持可控、可查、可处理。

MemTensor的博客 345

产品更新|Memmy 支持 Linux 啦!

v1.1.1 已正式发布,Linux CLI 安装资源已上线 ~大家千呼万唤的,Memmy 正式支持 Linux 啦!很多开发者的 AI 工作发生在终端里:在本地工作站处理项目,在远程开发环境中运行 Agent,或在 Linux 服务器上持续执行任务。项目背景、过去的排查过程、常用偏好和已经验证过的方案,会随着一次次会话逐渐积累。这次 Linux 支持将 Memmy 带到更多终端环境中。安装完成后,你可以直接通过memmy进入交互式 TUI,完成模型配置、发起任务并使用本地记忆能力。

MemTensor的博客 191

PHASE-Tree|为长线 AI 角色构建可演化的人格骨架

今年 6 月,NVIDIA 在 Unreal Fest 2026 公布了面向 Unreal Engine 5 的本地 AI 角色工具,并展示了将 NPC 的角色设定与具体表演过程分开的工作流,让角色能够根据现场情况行动和回应,同时保持角色一致性。当 AI 角色进入真实游戏运行时,一句台词通常会同时受到多组信号影响。

MemTensor的博客 350

PHASE-Tree|CPC 不只要会聊、会打,还要会成长:AI 队友的状态演化难题

生成模型随后读取更新后的当前状态,让新的关系、立场和情绪体现在下一次回应中,同时保留没有被证据推翻的原有性格。原始对话信息密度很高,系统先从目标角色的视角提取真正与角色变化有关的事实:他新知道了什么、对谁的态度改变了、做出了什么承诺、立场和情绪发生了什么变化。PHASE-Tree 主要借鉴前两个层次:前者对应长期的性格倾向、表达方式和行为风格,后者对应对某个人的态度、在一段关系中的承诺,以及面对特定事件时形成的立场与应对方式。角色设定写下角色最初是谁,长期记忆保留已经发生的事。

MemTensor的博客 191

MemOS Skill 上线|一句话即可接入 MemOS Cloud

Agent 已经不只是聊天窗口了,它们在 IDE 里改代码,在终端里跑命令,在办公流里处理文档,也开始替大家连接插件、调用工具、串起自动化流程。为了帮助开发者在 Claude Code、Cursor 等 Agent 开发工具中更快接入 MemOS Cloud,我们上线了 MemOS Skill。我们希望,只需一句提示词,即可让 Agent 自动通过 MemOS Skill 接入 MemOS Cloud。

MemTensor的博客 176

从 Memory 到 Skill:长周期 AI Agent 如何实现持续进化

历史记录能帮 Agent 想起过去,却不能保证它下一次真的会按正确方法做。MSCE 想补上的,正是“记得”和“会做”之间的这段空白。

MemTensor的博客 249

产品更新|MemOS 现已支持 DeepSeek Harness 长期记忆接入

DeepSeek Harness 将模型、工具、界面和运行能力组织在 profile 中,并通过插件机制扩展运行时能力。MemOS 已通过 DeepSeek Harness 的 Cordis 插件机制接入长期记忆,无需修改 DeepSeek Harness 源码。任务执行时,Agent 可以获得与当前请求相关的记忆内容。回合结束后,新形成的决策和经验会进入后续的记忆处理流程。

MemTensor的博客 295

产品更新|MemOS Cloud 全新升级:让 AI 认准人、记全事、分清归属

一个真正能长期陪伴用户的 AI,不能只是“记住几句话”。它得知道:这个人是谁,最近经历了什么,哪些偏好是长期稳定的,哪些只是某次对话里的临时信息。在群聊、家庭助手、企业协作、多 Agent 场景里,它还得分清楚——这句话是谁说的,这段记忆属于谁,之后又该为谁调用。过去,MemOS 已经能够稳定处理事实、偏好、技能和工具经验。这次 MemOS 版本更新,我们把注意力放到了三个更接近真实产品的问题上:认准人、记全事、分清归属。

MemTensor的博客 243

产品更新|MemOS CLI 上线:让能跑命令行的 Agent 更轻量接入长期记忆

MemOS CLI正式发布,将长期记忆能力引入命令行,为人、脚本和Agent提供统一记忆调用入口。核心功能包括: 快速验证:通过终端命令直接测试记忆的写入、检索、读取等操作,简化开发调试流程。 Agent集成:支持Codex/Cursor/Claude等主流Agent自动调用记忆,实现"对话前检索+对话后写入"的自动化流程。 统一接入:打破框架限制,通过标准化CLI为多平台提供一致记忆层。 典型场景:开发者可用memos add写入用户偏好,memos search验证召回效果,再通过memos init

MemTensor的博客 448

产品更新|MemOS 新增 Dream 离线反思:让记忆系统学会在后台「做梦」

MemOS推出Dream功能,让记忆系统在后台自动整理记忆,从被动存储转向主动洞察。Dream通过分析分散记忆,识别深层问题并生成InsightMemory,帮助Agent更高效地应对用户需求。更新亮点包括:1)离线反思机制,避免实时对话的碎片化处理;2)DreamDiary记录梦境过程,保证透明度;3)插件化设计,支持灵活扩展。该功能已在MemOS开源仓库发布,邀请社区开发者共同完善。

MemTensor的博客 506

产品更新|MemOS 学会「读懂时间」,还能直接吃下你自己的 Skill

MemOS 一直主张"记忆即资产"。在真实对话里沉淀下来的解决路径、用户偏好、业务流程,不只是历史记录,它们也可以变成 Agent 后续执行任务时能调用的技能素材。这次更新后,MemOS 支持上传自定义 Skill 文件。检索时,自定义 Skill 会和自动生成的 Skill 一起被召回,供 Agent 使用。一句话说清楚就是,以前 Agent 像一个只靠临场发挥的新人;现在,你可以把团队已经验证过的 SOP、客服流程、排障手册直接交给它。遇到相关问题时,它先把合适的流程找出来,再按流程做事。

MemTensor的博客 480

产品更新|MemOS Local Plugin 2.0:Hermes Agent 和 OpenClaw 双 Agent 同步支持

MemOS Local Plugin 2.0 发布了!Hermes 和 OpenClaw 双 Agent 同步支持——从这一版开始,新的 Agent 都将通过本地插件同步支持,共享同一份核心。1.0 上线三个多月,社区反馈最多的是同一类问题:好不好用容易判断,但 Agent 学到的东西到底对不对、可不可信,没人说得清。MemOS Local Plugin 2.0 想补的,正是这块缺口——也是大模型与每一个真实用户之间的「最后一公里」。

MemTensor的博客 439

MemFactory:Agent 记忆终于有了自己的 LLaMA-Factory

还在为 Memory Agentic 操作框架反复重造轮子?也许,这正是这个方向迟迟没有爆发的根本原因。AI Agent 领域有一个越来越清晰的共识正在形成:真正决定 Agent 能不能从"会聊天的工具"进化成"长期持续工作的系统"的,不只是模型推理能力,也不只是工具调用能力,而是记忆能力。没有记忆的 Agent,本质上仍然是一个"单轮应答器"过去一年多,Memory-R1、MemAgent、RMM 三篇工作几乎前后脚放出来,社区里讨论"用强化学习训 Agent 记忆"的帖子开始刷屏。

MemTensor的博客 499

记忆抽取 API 上线:MemReader——让你的 Agent 学会「想清楚再记」

MemReader-4B 在 LongMemEval 的知识更新维度上达到了 91.03%,时序推理达到 84.21%,远超 4o-mini 的 74.26% 和 77.44%。作为记忆张量首次提出“记忆调度”架构的 AI 记忆操作系统,我们希望通过 MemOS 全面重构模型记忆资源的生命周期管理,为智能系统提供高效且灵活的记忆管理能力。我们希望通过 MemReader 做到的,说到底就是让记忆写入这个动作,从一个无脑的信息搬运,变成一个有判断的认知过程。看起来没问题对吧,但「那个项目」是什么?

MemTensor的博客 475

SkillsVote:从技能目录走向终极技能网关(Ultimate Skill Gateway)

成千上万个 skills 摆在面前,你的 Agent 为什么还是不会干活?2025 年底 Anthropic 把 Agent Skills 规范作为开放标准发布,OpenAI 在 Codex CLI 里跟进了同一套格式,Cursor、Gemini CLI 也陆续接入。有人说 2026 是"Agent 找到工作并开始写周报"的一年——工具连接标准化了,流程知识模块化了,分发机制也产品化了。

MemTensor的博客 723

AI 数据迁移指南|Claude 靠提示词搬家,MindDock 一键完整备份记忆

摘要:OpenAI近期引发大规模用户抵制,同时Claude推出"记忆导入"功能引发AI数据主权争议。文章提出MindDock解决方案,帮助用户管理、迁移各AI平台的记忆数据,实现一键导出、跨平台共享记忆等功能。同时介绍如何将ChatGPT记忆迁移到OpenClaw,强调用户应掌握自己的AI记忆数据主权。文末提供相关工具下载链接,倡导建立统一的AI记忆管理平台。(149字)

MemTensor的博客 574

一行命令|MemOS OpenClaw 本地插件发布,团队记忆、Skill、历史记忆导入全都有!

还有一个栗子:你和 OpenClaw 花了 2 小时调试一个复杂的部署问题。你:部署到 Vercel 报错了Agent:看下报错信息你:[粘贴报错]Agent:需要修改 vercel.json你:怎么改?Agent:[给出配置]你:还是不行Agent:试试这个方案...(继续 20 轮对话)你:成功了!任务:部署 Next.js 应用到 Vercel成功部署并解决 SSR 错误配置的rewrites规则修改build脚本处理环境变量调整的错误处理成功部署,访问正常需要在。

MemTensor的博客 1670

创新高!MemOS 单日调用量突破 300,000 次

MemOS记忆操作系统累计调用量突破2600万次,单日峰值达30万次,呈现快速增长态势。作为AI记忆管理基础设施,MemOS首创"三层记忆调度"架构,已服务腾讯、联想等500+企业客户,覆盖金融、游戏、智能家居等领域。其开源版本GitHub Star超5.7k,全球开发者超1.1万。通过开源+Cloud+插件生态,MemOS在AI陪伴、游戏NPC、金融投顾等场景实现应用,显著提升用户体验和业务效率。记忆张量公司作为MemOS开发方,已完成近亿元天使轮融资,致力于推动AI记忆技术的规模化落

MemTensor的博客 621

产品更新|多视角记忆、检索精筛与 Skills 本地化上线

本次更新围绕"记忆系统工程化"和"Agent能力结构化"两大方向,重点推出多视角记忆系统,支持每个Agent拥有独立记忆世界。新增混合检索机制提升召回质量,并优化Token消耗控制。Skills能力升级为本地化存储,MindDock插件实现跨平台接入。记忆删除机制强化为双通道模式,调度系统完成模块化重构。文档记忆支持原文与摘要双轨检索,时间过滤精度提升至秒级。开源社区同步更新检索优化、上下文唤醒等新特性,全面提升Agent系统的个性化、协作性和稳定性。

MemTensor的博客 752

上手教程|多个 OpenClaw 共享记忆,协作完成同一任务

摘要: MemOS OpenClaw插件通过共享记忆池实现多智能体协作,无需人工复制粘贴。两个独立的OpenClaw(A负责创意设计,B负责执行)通过相同user_id连接MemOS,自动传递上下文。MemOS通过检索-召回机制实现记忆共享:A的产出自动存入记忆池,B调用时直接获取完整背景。测试中,B成功基于A的小猫信息推荐罐头,验证了跨会话无损协作能力。MemOS作为“外部长效记忆”,为分布式Agent提供稳定的记忆调度支持,提升多智能体协作效率。 (字数:149)

MemTensor的博客 1661

MemOS OpenClaw 插件测评结果来啦!Tokens 消耗降低 72%+

OpenClaw 原生架构的记忆依赖上下文历史拼接、工具调用读写本地文件,以及显式对话指令触发记忆。

MemTensor的博客 1070

MemOS OpenClaw 插件上线啦!让你的 OpenClaw 拥有更好的记忆,降低 60% Token 消耗~

OpenClaw用户面临两大痛点:Token消耗过快和记忆功能不足。MemOS OpenClaw插件应运而生,通过智能记忆管理有效解决这些问题。该插件能精准检索相关记忆,避免无关历史干扰,将Token消耗控制在合理范围;同时自动记录关键信息,实现跨会话记忆保持。安装过程简单快捷,只需获取API Key并配置环境变量即可使用。插件还能可视化记忆管理,让用户查看和调整存储内容。MemOS重构了AI记忆管理方式,使OpenClaw在保持核心优势的同时,实现更高效的记忆调度和更可控的运行成本。

MemTensor的博客 1869

产品更新|Skill 能力正式上线,多模态记忆与检索体系全面升级

MemOS 最新版本升级记忆与知识管理能力,重点围绕技能化记忆(Skill)与算法工程优化展开。新增从历史对话自动生成Skill功能,将零散经验转化为可复用能力模块。多模态记忆处理引入上下文关联,图片与文本信息可协同理解。检索系统优化了去重与多样性平衡,新增记忆冲突检测模块。知识库支持更多文件类型和跨项目搜索,并兼容OpenAI协议接口调用。文档和示例全面更新校准,提升开发体验。这些升级使系统更智能精准,帮助用户高效沉淀和复用知识经验。

MemTensor的博客 1103

MemOS 产品更新|知识库检索更精准,记忆更省、更智能

在 v2.0.2 中,我们围绕「知识库问答效果」与「记忆系统内部机制」两条主线,对检索、工具记忆与事实记忆处理流程进行了进一步优化,同时补充了官方最佳实践文档,帮助开发者更快构建可落地的 MemOS 应用。作为记忆张量首次提出“记忆调度”架构的 AI 记忆操作系统,我们希望通过 MemOS 全面重构模型记忆资源的生命周期管理,为智能系统提供高效且灵活的记忆管理能力。在传统 RAG「只检索、不记忆」的基础上,该方案引入了 MemOS 的记忆能力,使问答系统能够在多轮交互中持续积累与利用上下文信息。

MemTensor的博客 920
上一篇: 产品更新|Memmy 支持 Linux 啦!
下一篇: Memory Poisoning:企业 Agent 必须建立的六道长期记忆控制
记忆张量MemTensor
记忆张量MemTensor 记忆张量 MemOS 官方账号 记忆张量 MemOS 官方账号
博客等级 码龄1年 4粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值