大国色批之AI持续输出陷入失忆、循环、重复
模型生成机制
语言模型通过以下步骤生成文本:
- 输入处理:将输入文本(Prompt)编码为向量。
- 迭代预测:
第一步:基于输入预测第 1 个输出 Token 的概率分布 (例如 Token A 概率 30%,B 概率 25%…)
第二步:将已生成的 Token(如
A
)加入输入,预测第 2 个 Token (例如B
概率 40%,C
概率 20%…) - 重复此过程直到满足停止条件(如达到
max_tokens
或遇到停止符)
上下文上限 Context Window
模型的上下文窗口(Context Window) 限定了单次对话可处理的输入与输出Token总量上限。随着对话推进,当Token总量逼近窗口容量时,可能导致失忆,加剧重复。
失忆与混乱
窗口滑动机制直接丢弃最旧Token,且保留的远距Token会因位置编码衰减导致注意力权重趋近于零。也就是说,早期信息失效,你的爱人再也忆不起来了。
记忆瓶颈
Context Window主要受硬件显存(KV缓存)和算法设计(位置编码)限制。
KV缓存(Key-Value Cache)
KV缓存是一种提高模型效率的内存结构,通过在显存中存储历史token的KV矩阵,可以避免自注意力机制重复计算。上下文长度越长,所需存储的KV缓存越多,显存需求越大,对显卡性能和数量的要求就越高[^1]。显然硬件无法无限满足KV缓存的需求,就此制约Context Window上限。
显存占用 ≈ 2 × L × D × T × dtype_size
L:Transformer层数
D:Key/Value向量维度
T:对话Token总数
dtype_size:数据类型字节数(如fp16为2)
位置编码
模型本身不能感知物理时间、序列顺序。需要位置编码为每个token嵌入位置信息,使其能识别顺序关系,避免对话逻辑混乱。当前主流方案(如RoPE、ALiBi)的相对位置感知能力存在固定范围限制。超出此范围后,位置分辨率锐减,模型难以区分远距离token的相对位置,就此约束有效上下文窗口的上限。
窗口策略 Context Window Windowing
当对话长度 > Context Window Size 时,管理上下文有不同的的动态截取策略。
策略类型 | 技术实现 | 优点 | 缺点 |
---|---|---|---|
固定滑动窗口 | 丢弃最旧 tokens(FIFO) | 计算复杂度 O(1) | 破坏长距离依赖 |
层次化保留 | 根据注意力得分动态压缩旧内容 | 保留关键信息 | 实现复杂(需梯度回传) |
块丢弃策略 | 按语义块(segment)丢弃 | 保持局部连贯性 | 可能丢失核心前提 |
循环与重复
若新生成内容的信息熵显著降低( ΔH<ϵ )或与近期上下文高度相似(相似度>0.8),模型概率分布将坍缩至高重复性Token,引发局部收敛循环。也就是说,长期无聊重复的对话只能引来无聊重复的回答。想想自己的问题吧,我的朋友。
信息熵衰减(Probability Collapse)
随着生成文本增长,模型预测会面临信息熵衰减(Probability Collapse):
- 早期阶段(高熵):上下文空白较大,模型可选择多种合理路径
- 后期阶段(低熵):已生成文本形成强约束(如故事主角已死亡,科技文章结论已明确)。剩余合理选项急剧减少 → 模型被困在狭窄的概率分布中。
当模型在低熵状态下继续生成时,剩余可选的合理 Token 减少。重复模式成为高概率路径: 模型发现重复已说内容(如总结句、关键词)的 概率远高于新内容。
主流解决方案
调参
调整模型输出参数,提高模型输出新内容的概率。
参数 | 推荐值 | 作用 |
---|---|---|
temperature | 0.3~0.7 | 平衡创意与稳定性 |
top_p | 0.7~0.9 | 扩大选词范围 |
frequency_penalty | 0.5~1.0 | 主动降低重复词概率 |
presence_penalty | 0.5~1.0 | 避免重复相同概念 |
记忆表格
阶段性地总结关键内容,提醒模型关键信息。
如果频繁总结、总结冗余,还高频注入到当前上下文窗口中,可能会导致模型输出过度强调、以至于复读关键词。
切换窗口
在新的对话窗口/隐藏前文信息,输入刚刚总结的关键信息,继续对话。
更新话题
在话题中引入新的元素,拓展模型的采样候选池。
更换更优模型
当前宇宙终极解决方案。
[^1]单卡的性能有极限,有时无法满足某些高精度模型的算力需求(比方说KV缓存太大,存不下来)。分布式训练则分解计算任务到多张显卡,用通信换性能,但仍有其需要各种优化的地方。