动态工作记忆槽位分配与 Token 预算精算法

封面信息图

在设计处理复杂业务流的自主智能体(Agent)工作记忆(Working Memory)时,有限的单次请求 Token 预算(例如设定为 4,000 Tokens 的硬上限) 就像一块必须精密划分的“数字黄金蛋糕”。

在缺乏系统性预算规划的粗放系统中,各个记忆与上下文组件常常发生激烈的**“Token 踩踏与越界抢占”**:

  • 场景痛点:检索模块(RAG)一下子拉回来了 3,500 Tokens 的冗长切片,导致留给“工作记忆草稿板(Scratchpad)”和“大模型最终生成(Completion)”的预算只剩下可怜的 500 Tokens;
  • 大模型在推演到一半时突然遭遇 max_tokens reached 截断,输出一段残缺的代码或半句话,导致系统彻底瘫痪;
  • 反之,如果把所有空间都留给历史记录,又会导致外部工具的定义与参考材料无法注入。

借鉴现代操作系统中的**“动态内存槽位划分(Dynamic Memory Slotting)与按需借贷算法”,构建一套“严格按照优先级权重进行分块保底、动态借贷与弹性伸缩的 Token 预算精算中枢(Dynamic Token Budget Allocator)”**,是保障智能体在任何复杂极端场景下绝不发生上下文溢出与输出截断的核心技术。

一、动态工作记忆 Token 预算槽位(Slot)模型全景

┌────────────────────────────────────────────────────────────────────────┐
│                   总 Token 预算上限 (Total Budget = 4096 Tokens)       │
├────────────────────────────────────────────────────────────────────────┤
│ 槽位 1: 系统指令与安全底线 (System Core Slot - 权重 15% / 保底 600 Tokens)│
│ • 智能体绝对人设、工具 JSON Schema 定义与不可变安全规则                 │
├────────────────────────────────────────────────────────────────────────┤
│ 槽位 2: 动态工作草稿板 (Working Memory Scratchpad - 权重 20% / 800 Tokens)│
│ • 当前任务 DAG 执行栈、临时实体槽位、中间步骤推演记录                   │
├────────────────────────────────────────────────────────────────────────┤
│ 槽位 3: 动态检索材料区 (Retrieved Knowledge Slot - 权重 35% / 1400 Tokens)│
│ • 知识库 RAG 召回切片、数仓 SQL 查询事实表格 (支持按需压缩弹性借贷!)   │
├────────────────────────────────────────────────────────────────────────┤
│ 槽位 4: 终态输出生成预留 (Completion Reserve - 权重 30% / 1200 Tokens) │
│ • 【绝对红线保底!】强制锁死留给大模型生成完整回答的生成预算,严禁侵占!│
└────────────────────────────────────────────────────────────────────────┘

二、生产级 Python Token 预算精算法与动态槽位借贷器实现实操

import tiktoken
from typing import Dict, Any, List

class TokenSlotAllocation:
    def __init__(self, system_tokens: int, scratchpad_tokens: int, retrieval_tokens: int, completion_reserve: int):
        self.system = system_tokens
        self.scratchpad = scratchpad_tokens
        self.retrieval = retrieval_tokens
        self.completion = completion_reserve

class DynamicTokenBudgetCalculator:
    def __init__(self, total_max_budget: int = 4096, encoding_name: str = "cl100k_base"):
        self.total_budget = total_max_budget
        self.tokenizer = tiktoken.get_encoding(encoding_name)

    def count_tokens(self, text: str) -> int:
        return len(self.tokenizer.encode(text))

    def calculate_and_balance_slots(
        self,
        system_text: str,
        scratchpad_text: str,
        raw_retrieved_documents: List[str],
        min_completion_reserve: int = 1000
    ) -> Dict[str, Any]:
        print(f"⚖️ 【启动 Token 预算精算 🧮】总硬预算上限: {self.total_budget} Tokens")

        # 1. 绝对保底扣除:系统核心与输出生成预留
        sys_tokens = self.count_tokens(system_text)
        completion_reserve = min_completion_reserve

        remaining_budget = self.total_budget - sys_tokens - completion_reserve
        if remaining_budget < 500:
            raise ValueError(f"系统指令 ({sys_tokens}) 与输出预留 ({completion_reserve}) 过大,超出物理总预算!")

        # 2. 计算工作草稿板需求 (最高优先级)
        scratchpad_tokens = self.count_tokens(scratchpad_text)
        actual_scratchpad_tokens = min(scratchpad_tokens, 1000) # 草稿板上限 1000

        remaining_for_retrieval = remaining_budget - actual_scratchpad_tokens

        # 3. 动态裁剪与压缩检索文档区 (按剩余预算自适应截断或丢弃低分切片)
        fitted_documents = []
        accumulated_retrieval_tokens = 0

        for doc in raw_retrieved_documents:
            doc_t = self.count_tokens(doc)
            if accumulated_retrieval_tokens + doc_t <= remaining_for_retrieval:
                fitted_documents.append(doc)
                accumulated_retrieval_tokens += doc_t
            else:
                # 预算用尽,智能截断剩余低权重材料
                print(f"  └── ⚠️ [检索材料自适应截断] 达到槽位预算上限 ({remaining_for_retrieval}),放弃后续次要切片。")
                break

        # 4. 弹性借贷:若检索材料未用满预算,将剩余 Token 慷慨返还给生成区!
        unused_surplus = remaining_for_retrieval - accumulated_retrieval_tokens
        final_completion_budget = completion_reserve + unused_surplus

        print(f"🎉 【预算精算平衡完毕 ✅】:")
        print(f"  • 系统槽位:   {sys_tokens} Tokens")
        print(f"  • 工作草稿:   {actual_scratchpad_tokens} Tokens")
        print(f"  • 检索知识:   {accumulated_retrieval_tokens} Tokens (纳入 {len(fitted_documents)}/{len(raw_retrieved_documents)} 篇)")
        print(f"  • 最终生成池: {final_completion_budget} Tokens (弹性扩充 +{unused_surplus})")

        return {
            "system_text": system_text,
            "scratchpad_text": scratchpad_text,
            "fitted_retrieved_docs": fitted_documents,
            "allocated_max_completion_tokens": final_completion_budget
        }

三、生产治理收益

通过推行动态工作记忆槽位分配与 Token 预算精算法:

  • 全网 100% 杜绝了由于上下文溢出引发的大模型截断(Truncation)与半句话报错崩溃
  • 各组件之间的资源占用实现确定性数学隔离(RAG 材料再长也绝无法侵占核心生成槽位);
  • 实现了大模型在有限窗口内对高价值信息密度的极致利用。
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐