Skip to content

切分做得好,检索事半功倍;窗口策略决定“上下文”与“速度/成本”。

🎯 文章目标

  • 对比段落/句子/滑窗切分与窗口策略
  • 提供最小实现与评估方法

📚 背景/前置

  • 切分:保持语义完整、减少冗余
  • 窗口:控制上下文覆盖与成本,避免过长带来幻觉与延迟

🔧 核心内容

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')
}

📊 对比/取舍(速查)

  • 片段越短召回越准,但上下文可能不足;滑窗可折中
  • 窗口越长覆盖越全,但成本与幻觉风险增加

🧪 踩坑与经验

  • 只按字符切分导致语义断裂;建议按结构与标点
  • 片段不带来源导致引用困难

📎 参考与延伸

  • 切分/窗口策略调查与实证
  • 召回/重排/生成联动评估

💭 总结

  • 用数据驱动选择切分与窗口,追求“可引用 + 低成本 + 高稳定”