切分做得好,检索事半功倍;窗口策略决定“上下文”与“速度/成本”。
🎯 文章目标
- 对比段落/句子/滑窗切分与窗口策略
- 提供最小实现与评估方法
📚 背景/前置
- 切分:保持语义完整、减少冗余
- 窗口:控制上下文覆盖与成本,避免过长带来幻觉与延迟
🔧 核心内容
1) 切分策略
- 段落:按空行/标题划分,保留语义块
- 句子:更细粒度,适合短问答;需要合并策略
- 滑动窗口:重叠 n 个 token/句子,兼顾上下文
2) 实现示例(Python)
python
import re
text = open('doc.md').read()
paras = [p.strip() for p in re.split(r'\n\n+', text) if p.strip()]
# 句子切分与滑窗略;建议统计平均长度并做直方图
3) 窗口策略
- Top-K × 每段上限:控制总上下文长度
- 片段拼接规则:带来源/标题,便于引用
- 上限与溢出:超长内容做二次检索或迭代问答
4) 评估
- 指标:Top-K 命中率、引用一致性、延迟/成本
- 方法:对同一问集,比较不同切分/窗口参数
💡 实战示例:Node.js 片段拼接
javascript
function joinPassages(items, limit=1200){
const out = []
let n = 0
for (const it of items){
if (n + it.length > limit) break
out.push(`【\${it.title}】\n\${it.text}`)
n += it.length
}
return out.join('\n\n')
}
📊 对比/取舍(速查)
- 片段越短召回越准,但上下文可能不足;滑窗可折中
- 窗口越长覆盖越全,但成本与幻觉风险增加
🧪 踩坑与经验
- 只按字符切分导致语义断裂;建议按结构与标点
- 片段不带来源导致引用困难
📎 参考与延伸
- 切分/窗口策略调查与实证
- 召回/重排/生成联动评估
💭 总结
- 用数据驱动选择切分与窗口,追求“可引用 + 低成本 + 高稳定”