81

如何实现多轮对话中的上下文窗口管理?处理超长对话的策略有哪些?

编程能力与工程实践中等

📋 面试问题

如何实现多轮对话中的上下文窗口管理?处理超长对话的策略有哪些?

✅ 期望回答

当对话历史超过模型上下文窗口限制(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训练压缩器模型,将长上下文编码为短向量
#上下文管理#滑动窗口#Token预算