Learn
RAG/22-long-context-vs-rag

长上下文模型 vs RAG

如今模型上下文窗口已达百万 token(能塞进一整本书)。一个自然的问题:既然能全文喂给模型,还要 RAG 干嘛? 答案是——仍要看场景。

1. 长上下文能做什么

直接把全部文档放进上下文,让模型「一口气读完全文」再答:

context = "\n".join(all_docs)        # 整库塞进 prompt
answer = llm.chat(f"基于以下资料回答问题:\n{context}\n\n问题:{question}")

优点:实现极简,无需切分、建索引、调检索。

2. 但长上下文有三道坎

问题说明
成本token 按量计费,每次问答都重发全库,贵且随库增长线性膨胀
延迟输入越长,首字延迟越高,交互体验差
注意力稀释研究(如「Lost in the Middle」)表明:关键信息若在长文本中部,模型易忽略,准确率反而下降
ℹ️「能装下」不等于「读得准」

窗口再大,模型对超长输入中部内容的利用率会下降。RAG 通过检索把「最相关的小段」前置,反而提升命中率。

3. 二者并非对立

更优解是长上下文 + RAG 协同:

top_k = retrieve(question, k=20)        # RAG 先精确定位
context = "\n".join(top_k)              # 只把相关片段喂给长上下文模型
answer = llm_long.chat(build_prompt(question, context))

RAG 负责「缩小范围、降成本」,长上下文负责「在相关片段内做深层推理」。

4. 决策速查

场景建议
库小(小于几万 token)、偶尔问直接长上下文,免建索引
库大、高频问答、要溯源RAG 为主
需跨多段深度推理RAG 召回 + 长上下文生成
⚠️别迷信窗口长度

窗口标称 100 万 token,不等于模型真用好了 100 万。上线前用第 13 章指标实测:长上下文直喂 vs RAG 召回,对比忠实度与相关性。

💡组合性价比最高

对大多数生产系统,RAG 召回 Top-K + 长上下文模型生成,比「全库直喂」更准、更省、更可追溯。

🎯练习

取一份 5 万字文档,分别用「全文直喂」和「RAG 召回前 10 段」两种方式回答同一个细节问题,对比两者答案准确率与耗时。

小结

  • 长上下文简化实现,但受成本、延迟、注意力稀释三道坎限制
  • 「能装下」不等于「读得准」,长文本中部信息易被忽略
  • 协同最优:RAG 精确定位 + 长上下文深度推理
  • 先测指标再选型,多数场景 RAG 为主、长上下文为辅
  • 下一章进入隐私与合规,让 RAG 过得了企业红线 →