Stretto 能否兼顾 LLM 增强数据系统的准确率与性能?

Stretto 在全局准确率目标下规划语义查询,并用压缩 KV 缓存换取运行时间与质量的平衡。

直接答案

Stretto 把语义查询规划当作一个带约束的优化问题:它选择各算子的物理实现,并把用户要求的端到端精确率或召回率目标拆分到整个查询计划上,而不是为每个算子单独固定准确率。在论文实验中,它是所比较的优化器中唯一让结果持续高于目标的一个,并且在所有测试数据集上都比 Lotus 风格的优化器运行得更快。

1篇文献引用

本文由 WisPaper 驱动的搜索和论文分析生成。

全局目标取代逐算子准确率目标

语义数据系统执行的查询会混合普通数据库算子和语义算子,后者包括基于 LLM 的过滤、映射和连接。这些算子有一个经典算子没有的设计空间:一个过滤器可以使用小模型或大模型、使用嵌入相似度阈值,或使用压缩缓存变体,而每种选择都会同时改变运行时间和结果质量。论文的出发点是,现有系统只在局部处理这种运行时间与准确率的权衡。例如 Lotus 单独优化每个算子,并只保证每个算子的质量,忽略了误差会沿算子流水线累积。Abacus 在查询层面工作,但用启发式方法探索计划空间,也不对结果质量提供统计保证。

Stretto 的做法是端到端地考虑准确率。用户为最终结果指定所需的质量水平,例如全局召回率 0.9,优化器必须找到一个满足该目标的计划。论文用一个医学检索场景说明动机:研究者想找出肺部扫描异常、且文本诊断含 COVID-19 的患者,关心的是返回集合的召回率,而不是某个中间过滤器的准确率。这种重新界定很重要,因为一个逐算子看都安全的计划,在多个选择性阶段串联后仍可能达不到端到端目标。

查询规划变成带约束的优化问题

Stretto 把查询规划表述为一个带约束的优化问题,并用基于梯度的优化器求解。优化器同时选择算子实现,并在整个查询计划上分配误差预算,因此某一阶段允许的准确率取决于其余阶段预计贡献多少。这就是全局保证背后的机制:目标是一份需要划分的预算,而不是每个算子的固定设置。

论文还会调整算子顺序。它对物理算子的子集做动态规划,为每个子集记录最小执行代价,以及仍流向每个逻辑算子的元组数量。执行一个算子的代价与其处理的元组数成正比,剩余元组数则按该算子的选择率更新。由于把选择性过滤器放在前面会缩小后续更昂贵的 LLM 调用的输入,顺序决策与实现决策相互影响,因此二者被放在同一次优化中处理,而不是分成两轮。

压缩 KV 缓存带来一系列算子选择

为了让优化器有可选项,Stretto 提出一种基于 KV 缓存压缩的技术。在自回归 LLM 解码中,KV 缓存保存中间注意力状态;Stretto 把物化并压缩后的缓存视为基础条目的可复用物理表示,于是同一份预填充工作可以在多个算子和查询之间共享,而不必重复执行。压缩率因此成为一个调节旋钮,产生一系列运行时间与准确率可调的物理执行策略。

实验具体落实了这一点。小模型是 Llama-3.1 8B 和 Llava-Next 8B,大模型是 70B/72B 变体,优化器还可以选择压缩缓存算子:图像模态为压缩率 0.9 的 Llava-Next 8B 和压缩率 0.99 的 Llava-Next 72B,文本模态为压缩率 0.8 的 Llama-3.1 8B 和 70B。在多数实验假设的严格存储预算下,这些算子在最大的文本数据集 Email 上占用 100 GB,在最大的图像数据集 Artwork 上占用 88 GB。未压缩的最大模型充当黄金模型,因此除非提供人工标签,保证是相对于最佳可用模型而言,而不是相对于人工真值。

保证在样本上对照黄金计划检验

这种保证是统计性的,而不是对每个可能输入的证明。在剖析阶段,Stretto 在数据样本上记录算子输出,并在该样本上模拟候选级联。它把级联输出与黄金级联的输出比较,后者对所有条目运行最昂贵的算子,并统计真正例、假正例和假负例来计算精确率和召回率。如果有可用的人工标签,就用它们替代黄金计划参与这些计数。

由于样本较小,观测到的指标在完整数据集上可能变化。因此 Stretto 用无信息 Beta(1,1) 先验得到的 Beta 后验,通过正则化不完全 beta 函数计算精确率和召回率的贝叶斯下界。优化器随后使用这些下界,因此只有当计划的悲观估计仍高于目标时才会被接受。评估直接读取这一点:准确率图显示达成值除以目标值,当一个方法的整个箱线图(下须线为 95% 可信水平)位于 1.0 以上时,就认为它满足了统计保证。

基线未达标时 Stretto 仍满足目标

基准测试覆盖五个数据集:含 1000 张图像及表格数据的 Artwork、含 728 篇篮球报道的 Rotowire、含 1000 封 Enron 企业邮件的 Email、含 10000 条文本影评的 Movie,以及含 1000 张图像和描述的 E-Commerce。由于数据集中的查询太少,作者为每个数据集基于六个模板生成 60 到 80 条查询,每条查询含一到四个语义算子。基线是 Abacus 的 Pareto-Cascades 优化器和 Lotus 的 SupG 优化器,二者都被集成进 Stretto 自己的系统,以隔离优化器行为。Lotus 得到的是把全局目标平均拆分后的逐算子目标,其级联被限制为未压缩的 8B 模型后接黄金模型。

在准确率上,论文称 Stretto 是三者中最可靠的,总体上满足目标,而基线的达成值与目标值之比分布在某些位置低于 1.0。在运行时间上(包括剖析、优化和执行所有查询),Stretto 在所有数据集上都优于 Lotus。这一比较有意收窄:Abacus 无法对质量目标提供统计保证,也无法调节阈值等连续参数,因此这些参数被固定为默认值;没有暴露优化器的系统,如原始 Palimpzest 和 ThalamusDB,则被排除在基线之外。

优化器贡献主要增益,压缩再添一层

消融实验区分了两部分贡献。去掉优化、与不含压缩缓存算子的完整 Stretto 比较时,在精确率/召回率目标为 0.5 时平均加速 5.34 倍,0.7 时为 2.60 倍,0.9 时为 1.71 倍,最大达到 32.09 倍,所有目标下有 83% 的情况超过 1.01 倍。在优化后的计划上再加入压缩缓存算子,在 0.5 时再带来平均 1.91 倍加速,0.7 时为 1.47 倍,0.9 时为 1.07 倍,最高达到 22.85 倍。论文报告,当目标留有足够空间时,KV 算子可带来最高 22 倍的加速。

对决策有意义的是这一模式:目标越宽松,优化器越有余地替换为更便宜或压缩的算子,增益也越大。在 0.9 的目标下,压缩这一步平均贡献很小,因为很少有压缩变体能满足如此紧的界限。这是用户通过目标控制的权衡,而不是引擎的固定属性。

算子增多时独立性假设失效

另一项实验改变计划中语义算子的数量。Stretto 在有两个、三个和四个算子时都满足精确率和召回率目标,而假设算子相互独立的变体在四个算子时不再满足,7.4% 的情况未达精确率目标,6.7% 未达召回率目标。独立性假设只比全局优化略快,在多数情况下甚至并不更快。运行时间随算子数量大致线性增长,因为更多算子意味着更多执行和剖析工作,而更长的流水线往往选择性更强,促使优化器选择更保守的算子。

论文还用五个数据集上的 15 条查询测试了把保证锚定到人工标签而非黄金计划时的情况。用黄金计划标签优化、用人工标签评估时,多数情况仍满足目标,说明最佳模型是不错的代理,但由于人工标签更严格,失败会略多一些。用人工标签优化时,如果连最大模型都不够好,目标可能确实无法达到;此时 Stretto 会拒绝执行查询,用户必须降低目标或更换最佳模型。当优化器确实声称某个计划满足人工标签目标时,论文报告它以较高概率满足。

目标松紧决定收益大小

论文自己的优先判断是:把推理内部结构(具体是 KV 缓存)暴露给查询优化器,是让 LLM 原生数据处理得以扩展的关键;其结果支持一个更明确的解读:当质量目标宽松到允许激进替换时,Stretto 联合规划的价值最大,而当目标接近最佳模型单独能达到的水平时,价值收窄。在 0.9 的精确率/召回率目标下,优化器仍贡献平均 1.71 倍加速,但压缩层平均只增加 1.07 倍。

这一分界就是实际阈值。需要严格保证的用户应预期增益主要来自算子的选择与排序,压缩缓存很少可用;能接受 0.5 目标的用户则可以让优化器同时利用两种手段,仅优化一项就能看到平均 5 倍以上的加速。保证本身受其参照点限制:除非提供人工标签,它是相对于黄金计划陈述的;论文也指出,把 Stretto 扩展到更多模态和语义聚合等算子仍属未来工作。

本文引用的文献

1

The Stretto Execution Engine for LLM-Augmented Data Systems

Stretto 把语义查询规划为带全局准确率保证和压缩 KV 缓存算子的约束优化问题;它总体上满足了质量目标,并在全部五个数据集上比 Lotus 风格的优化器运行得更快。