Skip to content
🔗 分享本题
查看我的学习进度 →

上下文窗口按系统提示、历史、检索、当前问题和输出预留分配 Token 预算

🧠 记忆锚点:先预留输出,再给系统、历史和检索分预算;旧对话摘要,检索只留相关。

💡 答案要点

Token 消耗估算(GPT-4o 参考):

场景输入 Token输出 Token合计费用估算
单轮简单问答~500~300~800¥0.003
单轮复杂分析~2000~800~2800¥0.01
10轮对话(无压缩)~8000~3000~11000¥0.04
10轮对话(摘要压缩)~2000~800~2800¥0.01

消耗构成拆解:

System Prompt:  200-500 tokens(固定成本)
用户输入:        100-500 tokens/轮
RAG 检索内容:   500-2000 tokens(主要成本)
历史对话:       累计增长,不压缩会爆炸
模型输出:       200-500 tokens/轮

多轮对话 Token 控制策略:

python
class TokenBudgetManager:
    MAX_CONTEXT_TOKENS = 4000  # 留给历史的预算

    def build_context(self, history: list, system_prompt: str) -> list:
        """滑动窗口 + 摘要压缩"""
        messages = [{"role": "system", "content": system_prompt}]

        # 策略1: 只保留最近 N 轮原文
        recent = history[-3:]  # 最近3轮保留完整原文

        # 策略2: 历史部分做摘要
        if len(history) > 3:
            older = history[:-3]
            summary = self._summarize(older)
            messages.append({
                "role": "system",
                "content": f"[历史摘要] {summary}"
            })

        messages.extend(recent)
        return messages

    def _summarize(self, history: list) -> str:
        """调 LLM 压缩历史,只花一次钱"""
        # 实际用小模型(gpt-3.5/qwen-turbo)做摘要,成本低
        ...

多轮 vs 单轮 Token 增长对比:

第1轮:  800 tokens
第5轮(无压缩): 800×5 = 4000 tokens
第5轮(有压缩): 800 + 摘要200 = 1000 tokens  ← 节省75%
第10轮(无压缩): 800×10 = 8000 tokens
第10轮(有压缩): 800 + 摘要400 = 1200 tokens  ← 节省85%

面试话术:

示例表达(仅在能用本人经历或可复现实验佐证时使用): "单轮对话 Token 消耗约 1K-4K,多轮不控制会线性增长爆成本。我的策略是三层:最近3轮保原文保障连贯性,历史部分用小模型摘要(节省80%成本),RAG 召回内容做相关性过滤只保留 top-k chunk。实测10轮对话 Token 消耗控制在 2K 以内,单次成本 < ¥0.01。"