|
上周我的 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:如果并不是所有内容都是必须的坏处如果并不是所有内容都是必须的,如果都放在提示词中,会导致: 解决办法有两个:手工选择、代码自动截取 或者 RAG 方法1:手工选择、代码自动截取如果可以采用工程化的方式,提前手动选择或者程序自动提取关键信息,优先使用这种方式,通常比 RAG 准确率更高 方法2:采用 RAG 的方式动态提取最相关的信息如果无法采用手动选择或代码自动截取,则可以采用 RAG 的方式提取。 需要注意的是,RAG 的召回率是否满足要求,如果你无法保证 RAG 提取的信息的完整性,还不如直接放提示词。 由于动态提取最关键的信息,上下文更短,效果更好,响应时间更短,消耗 tokens 更少,同时还降低了不相关的信息对 LLM 造成的干扰 |