如何实现多轮对话中的上下文窗口管理?处理超长对话的策略有哪些?
📋 面试问题
如何实现多轮对话中的上下文窗口管理?处理超长对话的策略有哪些?
✅ 期望回答
当对话历史超过模型上下文窗口限制(GPT-4=128K, GPT-3.5=16K)时需做窗口管理
管理策略: 滑动窗口:保留最近N条完整消息def slide_window(messages, max_messages=20):
if len(messages) > max_messages:
system_msgs = [m for m in messages if m['role'] == 'system']
conversation = messages[len(messages) - max_messages:]
return system_msgs + conversation
return messages
滚动摘要:每N轮对话用LLM生成摘要 + 滑动窗口
async def summarize_history(messages):
history_text = format_messages(messages[:10])
summary = await call_llm(f'总结以下对话要点:{history_text}')
return [{'role': 'system', 'content': f'之前的对话摘要:{summary}'}] + messages[10:]
Token预算:动态计算当前用掉的Token,适时裁剪旧的上下文
import tiktoken
enc = tiktoken.encoding_for_model('gpt-4')
def trim_to_budget(messages, max_tokens=8000):
total = sum(len(enc.encode(m['content'])) for m in messages)
while total > max_tokens and len(messages) > 2:
removed = messages.pop(1) # 保留system和最后一个user消息
total -= len(enc.encode(removed['content']))
return messages
记忆压缩:用LoRA训练压缩器模型,将长上下文编码为短向量