StreamKV: Streaming Video Question-Answering with Segment-based KV Cache Retrieval and Compression

Authors: Yilong Chen, Xiang Bai, Zhibin Wang, Chengyu Bai, Yuhan Dai, Ming Lu, Shanghang Zhang Affiliations: 北京大学 (State Key Laboratory of Multimedia Information Processing), 淘宝 & 天猫 (Alibaba) GitHub: sou1p0wer/StreamKV Venue: AAAI 2026

1. Motivation (研究动机)

当前 Video-LLM 主要面向离线场景(一次性输入整段视频和所有问题),在流式视频问答中会遇到几个明显问题:

  • GPU 显存爆炸:长视频的 KV Cache 随帧数线性增长,导致 OOM
  • 延迟不可接受:处理完全部视频后才能回答问题,无法满足自动驾驶、AR 等实时场景需求
  • 历史信息检索困难:用户提问时需要快速从海量历史视觉上下文中定位相关信息

1.1 现有方法的不足:ReKV

最新方法 ReKV (Di et al., ICLR 2025) 虽然引入了 KV Cache 检索机制,但仍有三个关键问题:

  1. 均匀分割破坏语义连续性:将视频流均匀分段,忽略了视频内容的语义边界
  2. 全量存储 KV Cache:保留所有历史 KV Cache,显存消耗依然很大
  3. 检索机制不灵活:检索精度不高,需要检索更多帧才能覆盖相关信息

1.2 StreamKV 的解决思路

StreamKV 提出一个 training-free 的框架,核心思想是:

  • 语义分割 替代均匀分割 → 更好保留语义完整性
  • Guidance Prompt 驱动的压缩 → 在编码阶段就丢弃冗余 KV
  • 统一的 Layer-Adaptive 选择模块 → 同时服务于压缩和检索,按层自适应分配预算

对应的整体性能对比见第 5 节,StreamKV 在准确率、显存和首帧延迟三个维度都优于 ReKV。

2. Idea (核心思想)

StreamKV 的核心想法不是“把所有历史都存下来再检索”,而是把长视频流拆成语义完整的段,并在压缩检索两个阶段复用同一套 Layer-Adaptive 选择逻辑。

2.1 总体流程

视频处理管线(Video Processing Pipeline):

  1. 视频流 → 语义分割 → 得到语义段
  2. 每段计算 Summary Vector
  3. 滑动窗口编码 → 生成 frame-level KV blocks
  4. Guidance Prompt 驱动压缩 → 压缩后的 KV blocks 存入 KV Bank

问答管线(Question Answering Pipeline):

  1. 用户提问 → 提取 query vector
  2. Layer-Adaptive 检索 → 从 KV Bank 取出相关 KV blocks
  3. 拼接检索到的 KV Cache → 注意力计算 → 生成回答

Figure 3 解读: StreamKV 完整工作流程图。上方展示视频处理管线:视频帧经 Video Encoder & MLP 提取特征后,通过余弦相似度检测语义边界( 处切分),每段计算平均特征作为 Summary Vector(灰色方块)。VLM 对每段进行编码生成 frame-level KV blocks(绿色方块)。左侧的 Selection Module for KV Compression 使用 Guidance Prompt(黄色)驱动 layer-adaptive 选择,压缩后的 KV blocks 和 Summary KV Block 一起存入 KV Bank。下方展示问答管线:用户提问后,Selection Module for KV Retrieval 根据 query 从 KV Bank 中检索最相关的 KV blocks(粉色),送入 VLM 生成回答。左侧详细展示了 Layer-wise Adaptive Selection Module 的四步流程。

3. Method (方法)

3.1 语义段分割与编码 (Semantic Segment Partitioning)

这一部分对应前文的段级表示与滑动窗口编码,是 StreamKV 生成 KV blocks 的基础。

语义边界检测

对视频帧提取 ViT 特征 ,计算相邻帧的余弦相似度:

(论文中 ),判定为语义边界,开始新的语义段。

段合并机制

为避免段过短(信息不足)或过长(内存压力),设定:

  • 最小段长度 帧:边界附近设排除窗口
  • 最大段长度 帧:超过阈值时合并最相似的相邻帧对

Figure 2a 解读: 语义分割过程示意。视频帧序列从左到右排列,每对相邻帧之间计算余弦相似度 。当 时(绿色勾号),帧属于同一语义段;当 时(红色叉号),在此处切分。图中展示了三步过程:Step 1 计算相似度,Step 2 根据阈值判断是否切分(最后一行展示了 导致分段),切分后计算每段的 Summary Vector(通过平均帧特征 )。

Figure 2b 解读: 段合并机制示意。当某段超过最大长度 时触发合并。Step 1 找到相邻帧对中相似度最高的一对(图中 0.98)。Step 2 计算这对帧的平均特征替代原来的两帧。Step 3 重新计算合并后帧与相邻帧的相似度(图中 0.92 和 0.94),从而将段长度减少 1 帧。

Summary Vector 与编码

每个语义段 计算 summary vector:

编码时采用滑动窗口注意力,将当前段与局部历史 KV 拼接:

其中 是段内帧与 summary vector 的拼接, 是局部窗口(15K tokens)内的历史 KV。

编码后得到 frame-level KV block:

代表性向量(用于后续检索/压缩的匹配):

3.2 统一 Layer-Adaptive KV 选择模块

这是 StreamKV 的核心创新,同时服务于压缩检索两个场景。

核心思想

不同 Transformer 层的信息分布不同:某些层的注意力更集中(少量 KV 即可覆盖关键信息),某些层更分散(需要保留更多)。因此应按层自适应分配预算,而非均匀分配。

算法流程(4 步)

Step 1: 计算余弦相似度 对第 层,计算每个候选 representative key 与选择准则向量 的相似度

Step 2: Softmax 归一化与排序

按降序排列得到优先级序列。

Step 3: Layer-Adaptive 预算分配

对每层定义:

通过二分搜索找全局阈值 ,使所有层的预算总和等于总预算

Step 4: 按层选择 Top- KV Blocks

伪代码

def binary_search_threshold(N: int, sim_sorted: dict, eps: float = 1e-6) -> float:
    """Binary search for global threshold p that distributes budget N across layers.
    Args:
        N: total KV block budget across all layers
        sim_sorted: {layer_l: sorted_softmax_similarities} for all layers
        eps: convergence tolerance
    Returns:
        optimal threshold p
    """
    p_lo, p_hi = 0.0, 1.0
    while p_hi - p_lo > eps:
        p = (p_lo + p_hi) / 2.0
        # Compute per-layer budget: min k such that cumsum >= p
        total = 0
        for l, sims in sim_sorted.items():
            cumsum = 0.0
            for k, s in enumerate(sims, 1):
                cumsum += s
                if cumsum >= p:
                    total += k
                    break
            else:
                total += len(sims)  # all tokens needed
        delta = total - N
        if delta == 0:
            return p
        elif delta < 0:
            p_lo = p  # need higher threshold to use more budget
        else:
            p_hi = p  # need lower threshold to reduce budget
    return p

统一选择函数:

3.3 KV 压缩 (Guidance Prompt)

核心问题: 在流式场景中,压缩发生在用户提问之前,不能依赖 query 来指导压缩。

解决方案: 设计 Guidance Prompt,捕获每段的关键语义元素:

  • 显著实体 (salient entities): 人、物体、位置、关键视觉概念
  • 关键事件与动作 (key events and actions): 发生了什么、何时、何地
  • 时间和因果关系 (temporal and causal relationships): 事件如何展开
  • 上下文线索 (contextual cues): 场景变化、对话、叙事转移
  • 重要数值/事实细节 (numerical or factual details): 用于计数、总结、事实问答

压缩时的选择准则向量:(guidance prompt 的平均 query vector)

压缩预算:,其中 是压缩率

压缩后更新 KV Bank(保留 summary KV block 不压缩):

3.4 KV 检索与问答

用户提问时,选择准则向量变为 query 的平均向量:

检索预算: 为每层期望检索的帧数,默认 8)

聚合检索到的 KV blocks:

最终注意力计算:

其中 来自检索到的 KV Cache + question + 已生成 tokens。

位置编码策略:

  • 编码阶段:RoPE 仅在局部窗口内应用(参考 LM-Infinite)
  • 问答阶段:检索到的 tokens 视为连续序列,使用相对位置编码

3.5 代码映射表

注:GitHub 仓库 sou1p0wer/StreamKV 目前为占位仓库,代码尚未发布。以下为根据论文方法推测的代码模块映射。

论文组件推测代码模块功能描述
Semantic Segment Partitioningsegmentation.py余弦相似度计算、语义边界检测、段合并
Summary Vectorsegmentation.py段内帧特征平均池化
Segment-based Sliding-window Encodingencoding.py滑动窗口注意力编码,生成 KV blocks
Representative Key Vectorkv_block.pyPatch-wise key 向量平均,得到帧级代表向量
Unified Layer-Adaptive KV Selectionselection.pySoftmax 归一化、二分搜索全局阈值、按层分配预算
KV Compression via Guidance Promptcompression.pyGuidance prompt 编码、SelectKV 压缩、KV Bank 更新
KV Retrievalretrieval.pyQuery vector 提取、SelectKV 检索、KV blocks 聚合
Question Answeringqa.py拼接检索 KV Cache、RoPE 相对位置编码、注意力计算生成回答
基础模型集成model/llava_ov.pyLLaVA-OneVision-Qwen2-7B-OV 的修改与集成

3.6 总结与思考

核心贡献

  1. 语义分割 + Summary Vector: 打破了均匀分割的局限,按语义边界切分视频流,并通过 summary vector 保留段级全局信息,在高压缩率下优势尤为突出(↓90% 时提升 5.31 points vs uniform)
  2. Guidance Prompt 驱动的无 query 压缩: 创新性地解决了流式场景中”压缩时用户还没提问”的难题,通过预定义的语义引导 prompt 替代 query 指导 KV 选择
  3. 统一 Layer-Adaptive 选择模块: 用一个模块同时服务压缩和检索,通过二分搜索自适应分配跨层预算,比均匀分配始终更优
  4. Training-free: 不需要额外训练,即插即用

局限性与思考

  • 依赖视觉编码器的特征质量: 语义分割基于 ViT 特征的余弦相似度,对编码器质量敏感
  • Guidance Prompt 的通用性: 论文中 guidance prompt 是手工设计的(覆盖实体/事件/因果等),在特定领域(如医疗、工业)可能需要定制
  • 仅在 StreamingBench 上评测: 缺乏在更多 benchmark(如 EgoSchema, MovieChat)上的验证
  • 代码未开源: 无法验证实现细节和复现结果
  • 与更新方法的对比: 论文仅与 ReKV 等 2025 年初的方法对比,未涉及同期或更新的流式视频理解工作

值得借鉴的设计

  • 二分搜索分配预算的思路优雅且高效,可推广到其他需要跨维度分配有限资源的场景
  • Guidance Prompt 替代 Query 的策略对所有需要在 query 到来前预处理的系统都有参考价值
  • Summary Vector 免于压缩的设计简单有效,确保了即使极端压缩下仍有段级信息可用于检索

4. Experimental Setup (实验设置)

4.1 实验配置

项目配置
基础模型LLaVA-OneVision-Qwen2-7B-OV
GPUNVIDIA H20 (96G), FP16
视频采样率0.5 FPS
局部窗口大小15K tokens
分割阈值 0.99
最小段长度 4 帧
最大段长度 64 帧
检索帧数 8 帧
评测基准StreamingBench (18 subtasks, 3 categories)

5. Experimental Results (实验结果)

5.1 主实验:StreamingBench 性能对比

Table 1: StreamingBench 完整结果

模型类型Real-Time AvgOmni-Source AvgContextual AvgOverall
Gemini 1.5 Pro商用67.1
GPT-4o商用60.2
Claude 3.5 Sonnet商用57.7
Qwen2-VL-7B开源离线54.1
LLaVA-OV-7B开源离线56.4
Flash-VStream-7B流式24.0
VideoLLM-online-8B流式32.5
Dispider-7B流式53.1
ReKV-7B流式53.5
StreamKV-7B (↓60%)流式58.9
StreamKV-7B (↓80%)流式57.4
StreamKV-7B (↓90%)流式56.7

关键发现:

  • StreamKV (↓60%) 以 58.9 的 Overall 分数超越 ReKV +5.4 points,甚至超过 Claude 3.5 Sonnet (57.7)
  • 即使在 90% 压缩率下(仅保留 10% KV Cache),StreamKV 仍达 56.7,超过 ReKV 全量存储的 53.5
  • Clips Summarization (CS): StreamKV 87.7 vs ReKV 78.6 (+9.1)
  • Anomaly Context Understanding (ACU): StreamKV 45.6 vs ReKV 31.2 (+14.4)

5.2 图 1 的整体比较结论

Figure 1 解读: 该图将 StreamKV 与 ReKV 在 StreamingBench 上的表现进行三维对比。左侧雷达图展示了 18 个子任务的准确率,StreamKV(红色)在大多数子任务上包围面积更大。右上角显示 GPU 显存使用量,StreamKV 在相同帧数下显存增长更缓慢(因为进行了 KV 压缩)。右下角展示首帧延迟,StreamKV(绿线)在长视频下延迟显著低于 ReKV(蓝线),证明检索更精准、需要的帧数更少。整体而言 StreamKV 在准确率 58.9 vs 53.5、显存和延迟三个维度全面超越 ReKV。

5.3 消融实验

Table 2: 语义分割 vs 均匀分割

压缩率UniformSemantic提升
↓0%60.4961.20+0.71
↓60%56.3358.89+2.56
↓80%53.0257.43+4.41
↓90%51.4156.72+5.31

结论:压缩率越高,语义分割的优势越明显(↓90% 时提升 5.31 points)。

Table 3: Summary Vector 的作用

压缩率w/o Summaryw/ Summary提升
↓0%60.5261.20+0.68
↓60%56.2158.89+2.68
↓90%53.8556.72+2.87

结论:Summary Vector 保留了段级信息,在高压缩率下尤为关键。

Table 4: Layer-Adaptive vs Uniform 预算分配

CompressionRetrieval↓60%↓80%↓90%
UniformUniform57.8356.7455.91
AdaptiveUniform58.4457.1156.35
UniformAdaptive58.3657.0656.42
AdaptiveAdaptive58.8957.4356.72

结论:压缩和检索同时使用 Adaptive 策略效果最佳;单独对任一环节使用 Adaptive 也优于全 Uniform。

Figure 4: 检索帧数的影响

Figure 4 解读: 该图展示了检索帧数(横轴,4-64 帧)对准确率(纵轴)的影响。StreamKV(实线圆点)在 8 帧时达到最佳性能约 59%,之后随检索帧数增加性能反而下降(因为引入了不相关信息干扰)。ReKV(虚线方块)则相反,需要检索更多帧才能提升性能(因为检索精度低,需要更大召回量来覆盖相关信息)。这证明 StreamKV 的检索精度远高于 ReKV:仅用 8 帧即可精准定位最相关内容,而 ReKV 即使检索 64 帧也不及 StreamKV 的 8 帧效果。更少的检索帧还意味着更低的推理延迟。