3.7 KiB
3.7 KiB
search-engine-widget(技术计划)
1. 计划目标
在 WIDGET 场景实现确定性的 Beam Search(文档 9.2):
- 每一行扩展时只保留 TopK partial layouts(beam)
- 每步扩展断点数 M 受控(更强裁剪)
- 支持
widthMode='MEASURE' | 'APPROX' - 结束时从
pos==N的 beams 中选最优;若无解返回可解释的失败原因(最终由overflow-fallback统一语义)
2. 确定性与性能约束
2.1 确定性(必须)
- beams 的遍历顺序固定(按当前 beams 排序后的顺序)
- nextPos 候选顺序固定(
pos升序) - pruning 固定(先按候选优先级/位置排序,再取前 M)
- beam 的 TopK 维护固定:
score降序;再tieKey;再breaks字典序
2.2 性能参数(写死默认值)
来自文档 9.3:
beamK=5expandM=12
3. Beam Search 设计(对应文档 9.2)
令 N=tokens.length,token 边界为 pos in [0..N]。
3.1 beam 状态
一个 beam(partial layout)包含:
pos:当前已覆盖到的 token 边界breaks: number[]lines: LineInfo[]score+tieKeymeta(可选):debug Top-3 terms、approx reason 等
3.2 扩展 nextPos(每步最多 M)
对每个 beam,从 pos 扩展到若干 nextPos:
- nextPos 来源:
breakpoints[].pos > pos(按 pos 升序) - 额外包含
nextPos=N(结束边界) - 为控制复杂度:对候选 nextPos 进行裁剪,仅保留前
expandM
裁剪规则(确定性,首版简单可控):
- 先取
nextPos最小的expandM个(最短前缀优先,利于早结束)
注:后续可升级为“优先级 + 距理想切分点近”裁剪,但首版以确定性与稳定为主。
3.3 宽度模式
widthMode='MEASURE':- 若提供测量能力:使用
measureSliceWidthCached获取 lineWidth - 若测量不可用/失败:降级为 approx(记录
reason=WIDTH_UNKNOWN或MEASURE_FAILED),lineWidth 采用近似值
- 若提供测量能力:使用
widthMode='APPROX':- 不调用测量;lineWidth 使用近似值:
- EN:
tokenCount - TC:
charCount
- EN:
- meta 标记
reason=WIDTH_UNKNOWN
- 不调用测量;lineWidth 使用近似值:
3.4 硬约束(最小集)
与 App 一致的最小硬约束:
- 禁止空行:
nextPos > pos - 最大行数:lineIndex 不超过
maxLines - TC 禁止行首标点(H6):若
tokens[nextPos]属于tcPunctuations则该转移无效 - 超宽约束:
- MEASURE 模式下若 width 可用且
lineWidth > availableWidth,转移无效 - APPROX 模式下不执行超宽硬过滤(因为单位不一致),交给评分处理
- MEASURE 模式下若 width 可用且
3.5 每轮保留 beamK
对所有扩展出来的新 beams:
- 使用 TopK 维护(去重同 breaks,排序按 score/tieKey/breaks)
- 全局只保留
beamK个作为下一轮 beams
3.6 结束选择
重复扩展最多 maxLines 轮后:
- 优先从 beams 中选
pos==N的最优 - 若无
pos==N:返回NO_CANDIDATE(由 overflow-fallback 统一兜底语义)
4. 代码落位(客户端)
client/src/features/textWrap/searchWidget/types.tsbeam.tstopK.ts(可复用 App 逻辑,首版复制一份避免耦合)constraints.tsindex.ts__tests__/searchWidget.test.ts
5. 测试计划(Vitest)
- 确定性:同输入重复执行输出一致
- 性能约束:beamK/expandM 生效(可通过构造大量断点断言扩展次数上限)
- widthMode=APPROX:仍能产出结果,且 meta.reason=WIDTH_UNKNOWN
- TC H6:行首标点转移被禁止
6. 完成定义(DoD)
- Beam Search 可运行,且确定性单测通过
- 宽度模式与降级 meta 符合 spec
- 性能参数默认值写死且可覆盖
- 更新 overview 标记阶段性完成并记录变更文件