StoryWeaver Benchmark
同一篇原文,两套切法并排交给裁判,只问一句——哪一套下刀的位置更好。 逐维度二选一,每对位置互换各问一遍,汇总为胜率与 Bradley-Terry 实力分。
胜率是所有维度、所有对手、所有语料上的总票数占比。BT 实力分由 Bradley-Terry 迭代求解、归一到均值 1.0, 衡量「两两对战中赢的倾向」——它是比值尺度,两方实力分之比即预测胜率 (第一名 3.31 对末名 0.11,预测胜率 97%)。 接近全胜时 BT 会发散,所以主榜按胜率排布,实力分作辅助列。
| 方法 | 胜率 | BT 实力分 | 块数 | 中位块长 | 块长范围 | 额外成本 | |
|---|---|---|---|---|---|---|---|
| 1 | LumberChunker 第一lumber | 87% | 3.31 | 32 | 574 | 81–798 | 每 700 字一次 LLM 调用 |
| 2 | ClusterSemanticChunker 线上现役cluster | 74% | 1.48 | 52 | 319 | 204–597 | 零额外调用 |
| 3 | Semantic Double-Pass Mergingsdpm | 56% | 0.64 | 63 | 252 | 202–481 | 零额外调用 |
| 4 | Max-Min 自适应maxmin | 44% | 0.36 | 70 | 214 | 200–1500 | 零额外调用 |
| 5 | 固定字符滑窗fixed_800 | 19% | 0.11 | 28 | 800 | 132–800 | 零额外调用 |
| 6 | 递归字符切分recursive_350 | 19% | 0.11 | 72 | 298 | 70–391 | 零额外调用 |
行对列的胜率。每对在 12 篇语料上各比多遍,正反序各投一票。
| lumber | cluster | sdpm | maxmin | fixed | recursive | |
|---|---|---|---|---|---|---|
| lumber | — | 72% | 85% | 88% | 95% | 97% |
| cluster | 28% | — | 74% | 82% | 95% | 90% |
| sdpm | 15% | 26% | — | 64% | 89% | 87% |
| maxmin | 12% | 18% | 36% | — | 78% | 76% |
| fixed | 5% | 5% | 11% | 22% | — | 54% |
| recursive | 3% | 10% | 13% | 24% | 46% | — |
各方法在单个维度上的胜率,口径与总榜一致。
| lumber | cluster | sdpm | maxmin | fixed | recursive | |
|---|---|---|---|---|---|---|
| 场景完整 | 95% | 74% | 52% | 39% | 21% | 18% |
| 片段自足 | 95% | 73% | 54% | 41% | 19% | 18% |
| 块内混杂 | 73% | 73% | 62% | 52% | 18% | 22% |
LLM 逐组读段落,回答「内容从哪一段开始明显转向」,以该段为界滚动推进。唯一只在段落边界下刀的方法,因此从不破句。原论文面向叙事文本,配套数据集取自古腾堡小说。
失效场景切分粒度受段落长度支配。当一个段落内部本身横跨语义边界时无法在段中下刀——闪回嵌套结构中,回忆与当下同处一段则必然并入同一块。此外每 700 字一次 LLM 调用,写入延迟与费用随语料量线性增长,与其余五套不在同一成本量级。
动态规划求全局最优连续分组,目标函数是「块内所有句对相似度之和」最大,受块长上限约束。与断点法的根本差别:断点法只看相邻句距离(局部贪心),它评估块内全部句对(全局最优)。
失效场景受块长上限约束,无法输出「整篇即一块」;该上限与 min_chars 冲突时优先保下限,故遇到超长单句会略微越界。同一场景内话题自然漂移时,目标函数会顺着相似度下降切开,把本应完整的场景拆散。它只能做连续分组,双线交替结构中同一条线的内容被另一条线隔开,无法聚合。DP 是 O(n²),长文档按 1000 句分窗口以免内存与数值精度失控。
第一遍按相邻句相似度分组;第二遍跳窗比较,若第 k 组与第 k+2 组相似,则把夹在中间的那组一并缝合。针对「场景 A → 插叙 → 回到 A」这类被打断的结构。
失效场景阈值取本篇相似度分布的分位数,这意味着必然产生切点——无论文本多连贯,总有固定比例的相邻位置落在阈值之下。因此在单一连续场景与对话密集文本上会切出无意义的边界。跳窗距离固定为 2,被更长插叙打断的场景缝不回来。
以块内句对的最低相似度作为该块的「内聚下限」,新句对块内任一句的最高相似度不低于该下限即并入,否则另起一块。设计意图是块越紧凑要求越严,无需全局分位数或绝对阈值。
失效场景块内只有一句时算不出内聚下限,只能退回配置的绝对阈值 initial_threshold = 0.6。而实测中文相邻句余弦相似度中位为 0.466(12 篇全部落在 0.44–0.53 区间),阈值高于分布,导致每句都触发「另起一块」、块始终凑不满句对、自适应机制从未启动:全语料 709 句被切成 553 块,平均每块 1.28 句。这些碎块最终由 min_chars 兜底粘合,边界实际由长度而非语义决定。长描写文本上损伤最大——长段落被等距截断,与内容结构无关。
每 800 字一刀,相邻块重叠 120 字,完全不读取语义。多份公开评测中它被视为难以打败的朴素基线,本榜用它检验语义切分是否值得。
失效场景按字符位置下刀,切点落在句中乃至词中;块间 120 字 overlap 造成内容重复。裁判判词中可直接看到断裂痕迹(块尾停在「顺手把玻璃上的雾」、块首以「,说咸」起始)。语义连续推进、缺乏显式结构信号的文本上损伤最重。
LangChain RecursiveCharacterTextSplitter 的等价实现:按 段落→换行→句号→逗号 的分隔符优先级递归切碎,再贪心填回目标长度。RAG 中最常见的默认选择。
失效场景按分隔符优先级找边界的努力,被「填满目标长度」这一步抵消:先按段落切好,再为凑满 350 字把不相干的段落粘合、或把长段落拆开。闪回结构与对话密集文本上跌至全场最低,正是粘合把语义无关的内容并进了同一块。
给裁判的上下文是:原文全篇 + 甲的切法 + 乙的切法,块与块之间用横线隔开。 逐维度二选一,不允许打平——绝对分在跨篇比较时没有可比性,相对胜负才有。
同一对方法正反各问一遍(甲乙对调)。只认位置不认内容的裁判,两序各得一票自相抵消; 真有偏好的才能拉开差距。这是判分可信的前提,不是可选项。
若某篇语料上各方法两两都判不出高下,说明这篇没有区分度。它是语料的体检指标。
| 语料 | 字数 | 难判率 | |
|---|---|---|---|
| 修船 | 1414 | 27% | |
| 打烊 | 1317 | 27% | |
| 面馆 | 1527 | 24% | |
| 对时 | 1311 | 18% | |
| 铜哨 | 1324 | 16% | |
| 旁听 | 1258 | 13% | |
| 借条 | 1878 | 9% | |
| 夜班 | 1664 | 9% | |
| 白事 | 1471 | 7% | |
| 缝纫机 | 1333 | 7% | |
| 量体 | 1492 | 4% | |
| 雨脚 | 1263 | 2% |
Qwen/Qwen3-Embedding-8B
(4096 维)。换模型可能整个翻盘。