第 35 章 / 共 51 章
卷五 · 扩展、运维与实战

xllm-session:会话治理

上下文窗口是稀缺资源。xllm 记不住历史——xllm-session 替你记:预算、台账、压缩与恢复,让多轮对话在热重载的世界里不丢状态。

本章导读

站位:ch34 的上层续篇。xllm 是无状态调用库;本层在其公开 API 之上建立会话治理——不碰 xllm 内部。前置: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 值);预算函数已代劳,手算容易漏。
多 worker 共用一个会话
症状
并发请求下台账错乱、压缩事务交错损坏。
原因
会话对象无内部锁——台账是单写者模型。正确做法:每会话绑定固定线程,或应用层自持互斥。

编程练习

基础台账跑通

建会话,追加 5 轮文本,BuildRequest 并核对 token 计数与估算一致。

验收:请求含完整 5 轮;预算函数返回值与手算吻合。
进阶压缩事务

灌入长历史触发 75% 黄线,执行 Prepare/Evaluate/Commit,对比前后请求大小。

验收:Commit 后额度回到绿区;质量门拒绝劣质摘要。
挑战崩溃恢复

开启 journal,多轮对话后 kill 进程,重启并 Recover 续聊。

验收:恢复后模型仍记得 journal 内的先前约定。

小结

要点结论
定位xllm 之上的治理层:台账/预算/压缩/恢复
预算窗口减输出与安全预留;75%/95% 双压力线
压缩Prepare→质量门→Commit 事务化替换
持久NDJSON journal + checkpoint + Recover
并发单会话单线程;跨重载走 Swap/Take
xrt 延伸阅读