xllm-session:会话治理
上下文窗口是稀缺资源。xllm 记不住历史——xllm-session 替你记:预算、台账、压缩与恢复,让多轮对话在热重载的世界里不丢状态。
本章导读
build.bat xllm-session 变体(自动携带 xllm)。35.1 定位与心智模型
会话治理解决三件事:记什么(轮次台账:user/assistant/tool 的完整序列)、何时省(上下文预算与压缩压力线)、怎么活(journal 落盘与进程重启后恢复)。它只依赖 xllm 的公开 API——不执行工具、不发起调用:发起仍由你的代码驱动。
与 ch28 状态交接的关系:ServiceSwap 导出的会话句柄经新代 Init 取回,热重载不断对话;journal 则覆盖进程级重启。
35.2 上下文预算
每个会话有窗口预算:uContextWindowTokens 减去输出预留与安全预留,才是可用输入额度。token 估算用 xllm 的离线估算器,三档压力线驱动不同策略:
| 压力 | 阈值 | 动作 |
|---|---|---|
| 绿色 | < 75% | 正常追加轮次 |
| 黄色 | ≥ 75% | 准备压缩:摘要候选标记、旧轮归档候选 |
| 红色 | ≥ 95% | 强制压缩事务:摘要替换旧轮,腾出额度 |
预算数字来自模型档案(ch34)与配置覆盖的组合;xllmSessionComputeSafetyReserve 等辅助函数给出推荐值。
35.3 轮次与台账
会话对象是台账本体:xllmSessionCreate 建会话,xllmSessionAddText / AddAssistantResponse / AddToolResult 追加轮次,xllmSessionBuildRequest 一步产出可发给 xllm 的请求(预算内自动裁剪)。fork 深拷贝出分支会话——试错与回滚不污染主线。
35.4 压缩与 journal
压缩是事务:Prepare 阶段产出摘要与保留计划,xllmCompactionEvaluateSummary 做确定性质量门(防摘要丢失关键约束),Commit 原子替换台账。journal 是 NDJSON 追加流:每轮落盘、checkpoint 定期快照、xllmSessionRecover 重放恢复——进程崩溃后对话可续。
35.5 契约
| 对象 | 所有权 | 释放 |
|---|---|---|
xllm_session_config | 调用方栈值 | 无 |
xllm_session | 库分配 | xllmSessionDestroy |
xllm_compaction | 压缩事务对象 | xllmCompactionDestroy |
| journal 文件 | 库管理 | 会话销毁时收尾 |
线程边界:会话对象非线程安全——每会话单线程访问(建议绑到固定 worker 或后台线程,纪律同 ch41);跨热重载传递走 Swap/Take。脚本用 #ifdef XS_USE_XLLM_SESSION 探测,嵌套 TCC 一致可见。
常见错误
- 症状
- 把模型档案的上下文窗口当作可用输入额度,长会话在 95% 线被强制压缩打断。
- 原因
- 窗口要减去输出预留与安全预留(模型档案的 recommended 值);预算函数已代劳,手算容易漏。
- 症状
- 并发请求下台账错乱、压缩事务交错损坏。
- 原因
- 会话对象无内部锁——台账是单写者模型。正确做法:每会话绑定固定线程,或应用层自持互斥。
编程练习
建会话,追加 5 轮文本,BuildRequest 并核对 token 计数与估算一致。
灌入长历史触发 75% 黄线,执行 Prepare/Evaluate/Commit,对比前后请求大小。
开启 journal,多轮对话后 kill 进程,重启并 Recover 续聊。
小结
| 要点 | 结论 |
|---|---|
| 定位 | xllm 之上的治理层:台账/预算/压缩/恢复 |
| 预算 | 窗口减输出与安全预留;75%/95% 双压力线 |
| 压缩 | Prepare→质量门→Commit 事务化替换 |
| 持久 | NDJSON journal + checkpoint + Recover |
| 并发 | 单会话单线程;跨重载走 Swap/Take |
- xrt 参考 · json — journal 的 NDJSON 底层