如果你在做一个 AI Chat 产品,为什么不能把用户的所有历史消息无限追加后原样发给模型?你会怎么设计一套更合理的上下文管理(context management)方案?
首先,大模型的 AI 上下文窗口是有限的,不可能无限地追加内容。其次,追加过多的内容会增加 token 的消耗。然后过多的内容可能会让 AI 的回答过于发散,找不到重点。针对以上的问题,合理的方式是渐进式的披露。对于过往的信息做一定的压缩总结,知道相关的信息存在,但不需要知道相关的信息具体是什么,只在需要的时候去查看细节。这个压缩过程需要在每一次对话之前进行检查与处理。如果上下文窗口已经占据了一定的比例,就应该自行压缩。同时对于历史过于悠久的对话应该完成压缩以后作为记忆索引存下来,非必要不去查看细节。
这次回答已经明显进入了 AI 产品工程视角,不再只是停留在“模型有窗口限制”这一层。
优点:
还可以继续加强的地方:
不能把所有历史消息无限追加后原样发给模型,原因不只是上下文窗口有限,还因为这样会同时带来 成本、延迟和回答质量 的问题。
第一,大模型的 context window 是有限的,历史消息不断增长后,最终会超过模型可接受的输入长度。
第二,历史越长,token 消耗越高,调用成本会持续上升,而且推理延迟通常也会变高,直接影响产品体验。
第三,上下文并不是越多越好。随着无关信息、旧信息和重复信息不断堆积,当前问题真正相关的信号会被噪音稀释,模型更容易回答发散、不聚焦,甚至被已经过时的上下文误导。
所以更合理的 context management 通常是分层设计,而不是把全部历史原样透传:
这样做的目标不是“让模型看到尽可能多的信息”,而是“让模型在当前任务里看到最相关、最干净、成本最可控的信息”。