显存 LRU 淘汰、会话寻址与增量同步计数
sequenceDiagram
participant NPC as Actor (Level 3)
participant SUB as Subsystem (Level 2)
participant K as Kernel (Level 1)
NPC->>SUB: 1. GetOrCreateSession(ptr)
SUB->>SUB: 2. 查表 (SessionMap)
alt 未命中有槽位
SUB->>K: 3. 申请新显存 Slot
else 未命中槽位满
SUB->>SUB: 4. 执行 LRU 淘汰最久未用
SUB->>K: 5. 释放旧 Slot 并覆盖
end
K-->>SUB: 6. 返回物理句柄
SUB->>SUB: 7. 初始化 LastSentCount=0
SUB-->>NPC: 8. 交付 SessionKey (void*)
子系统是全插件的“记忆管家”。它必须在有限的 KV Cache 总量下,协调数百个 NPC 的对话请求。
当显存 Slot 耗尽时,子系统会自动牺牲那个“最久没和玩家说过话”的 NPC 记忆,将其槽位腾挪给当前活跃的 Agent。
子系统为每个指针维护一个 SessionMsgCountMap。这确保了业务层重复调用时,插件物理上只处理文本 Delta,不产生冗余计算。
解析子系统如何管理多会话编排:
// 1. 利用 UObject 地址作为物理哈希键
void* Key = (void*)this;
// 2. 子系统内部编排 (LiteRtLmSubsystem.cpp)
void* Session = SessionMap.FindRef(Key);
if (!Session) {
// 自动仲裁显存槽位并建立物理联系
Session = Internal_AllocateSlot(Key);
}