长上下文不是银弹:窗口增大带来成本与错误传播风险;RAG 与缓存往往更稳。
🎯 文章目标
- 认识窗口、检索与缓存的取舍
- 给出长上下文应用的最小策略
📚 背景/前置
- 窗口成本:Attention 复杂度、prefill 时间增长
- 检索:把知识外置,减少上下文负担
- 缓存:Prefix/KV 缓存复用,降低 prefill
🔧 核心内容
1) 何时用长上下文
- 输入天然长:合规文档审阅/长报告
- 强约束:需要全量上下文作证
- 否则优先 RAG:更可控、更便宜
2) 策略
- 压缩:摘要、抽取要点
- 分块:分段回答 + 汇总
- 引用:强制引用上下文来源
3) 缓存
- 前缀共享:系统提示/模板固定时收益高
- KV 大小:受限于显存,需结合并发调优
💡 实战示例:分段 + 汇总(Node.js)
javascript
async function mapReduce(chunks, ask){
const partial = await Promise.all(chunks.map(c => ask(`仅基于以下内容回答:\n\${c}`)))
return ask('综合这些要点,给出 200 字总结:\n' + partial.join('\n'))
}
📊 对比/取舍(速查)
- 长上下文:简单直接,但成本高且易扩散错误
- RAG:更可控;需要工程投入(索引/重排/评估)
🧪 踩坑与经验
- 盲目堆上下文:无引用/无约束导致幻觉
- 不利用缓存:prefill 成为瓶颈
📎 参考与延伸
- 长上下文评测与窗口策略
- RAG 与缓存实践
💭 总结
- 长上下文≠更好;优先“压缩/分块 + RAG + 缓存”,按需开启长窗口