上周我的 AI 实战营知识星球有一个同学提问:老师,请教下,现在大模型已经支持10多万输入token了,我有个项目提示词有7000来个字,是不是不用RAG也行,效果会比用RAG差?

这个问题非常典型,可能也会有很多朋友遇到类似的困惑,我把我的答案分享出来:
一、一些常识
1 通常来说,输入越长模型输出越慢,消耗 Tokens 越多,成本就越高
2 虽然很多国外先进模型已经支持 10W tokens,如 Gemini 2.5 Pro 已经支持 1,048,576 context,并不意味着 10W tokens 内的所有信息大模型都能够很好的理解和遵循,通常来说上下文越长,效果越差
3 现在大模型在实际处理长文本时存在“注意力稀释”和位置偏好问题,使得中间信息难以被准确关联到输出中。
详情参见:《Lost in the Middle: How Language Models Use Long Contexts》链接:https://arxiv.org/abs/2307.03172
二、放提示词还是采用RAG 的主要依据是什么?
我们可以把提示词分为指令部分和内容部分,提示词 7000 字通常应该包含了内容。
问题的关键在于:内容部分是否是模型回答必要的信息
情况1:如果整个内容都是必要的,那么放提示词更好
RAG 可能会导致部分切片没有被正确提取出来,导致模型获取不到足够的信息,导致回答错误。
哪怕采用 RAG 能保证全部提取出来,“如无必要勿增实体”,没必要新增一个环节,增加耗时和出错的风险。
情况2:如果并不是所有内容都是必须的
坏处
如果并不是所有内容都是必须的,如果都放在提示词中,会导致:
-
提示词太长,模型性能下降
-
模型响应时间变长
-
消耗更多输入 tokens ,成本增加
解决办法有两个:手工选择、代码自动截取 或者 RAG
方法1:手工选择、代码自动截取
如果可以采用工程化的方式,提前手动选择或者程序自动提取关键信息,优先使用这种方式,通常比 RAG 准确率更高
方法2:采用 RAG 的方式动态提取最相关的信息
如果无法采用手动选择或代码自动截取,则可以采用 RAG 的方式提取。
需要注意的是,RAG 的召回率是否满足要求,如果你无法保证 RAG 提取的信息的完整性,还不如直接放提示词。
由于动态提取最关键的信息,上下文更短,效果更好,响应时间更短,消耗 tokens 更少,同时还降低了不相关的信息对 LLM 造成的干扰
详情参见:《Seven Failure Points When Engineering a Retrieval Augmented Generation System》链接:https://arxiv.org/abs/2401.05856
两篇论文均在 AI 实战营的 ima知识库 “AI 论文” 目录,实战营的同学可以在知识星球中通过提问的方式高效阅读。

如果大家感兴趣,欢迎扫描二维码,加入 AI 实战营知识星球,获得更多专业的 AI 工具推荐、AI 报告资料、AI 实战讲解等。