Repository navigation
提案:快照表式压缩底座(六段固定链,单一存储真源) #5874
ranxianglei
started this conversation in
Ideas
Replies: 2 comments
|
(ai: sglang-gpu0/qwen3.8-27b) 施工 brief:2×2 全模式(入站{全量,增量} × 出站{snapshot,增量}) — 出自 PR #5901 review,交实现 worker 执行。跟踪 issue:#6181。 |
0 replies
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
提案:快照表式压缩底座(六段固定链,单一存储真源)
0. 摘要(TL;DR)
本提案把上下文压缩的状态底座从「进程内存 + kstate JSON + 多张表」的平行真源格局,换成一套快照表作为唯一存储真源。每轮请求固定走完同一条链:
原始字节 → 协议转换(通用核) → 改写(压缩) → 快照表应用 → 出站映射 → 出站
压缩内核(折判定、摘要、prompts、ref/msgid 契约)零改动。有宿主 session+msgid 双信道的会话全部走新链路;没有 msgid 的宿主按「顺序 > hash」降级身份写同一套表。任何环节失步,该轮整体回落今天的 legacy 全量路径(降级,不猜)。回滚 = DROP 四张新表 + 关旗,逐字节回到今天。
目标函数排序不变:稳定性 / 扩展性 / 通用性优先,性能是副产品——先问流转对不对,不问快不快。
1. 背景与定位
1.1 来龙去脉
(sess_raw, msgid)复合身份给插件车道做增量快路。1.2 这条线不是什么(防止再次漂移)
1.3 保留的基准裁定(继承自 #5643 正文,全文有效)
目标函数排序、固定链、两处校验点(内核内部状态 + 改写后核形态)、行键 append-only、diff 只按内核管道证据寻址(禁模糊相似)、四件套保护(tripwire / S4 逐行校验和 / 见证要求 / 审计抽验)、客户端压缩纯忽略、P5–P9 五组不变量,全部沿用,不在本文重复展开;与本文冲突处以本节为准并在裁定表(§14)显式登记。
2. 现状架构与三个结构性问题
今天的一条模型请求从入站到出站要经过:
prepare-*适配器 →lane-decisions分轨(legacy 全量 / 增量 plugin-turn / v5 watermark 5%灰度 / D-lane 快照渲染 ≈0%灰度)→ 内核 →coreTo*出站映射。状态住在三个地方:进程内存(lastMessages AST、常驻核数组)、统一 SQLite v11 表族、kstate JSON(经mergeState()水合)。三个结构性问题:sessions.hardMaxBytes(Windows, 0.1.210) #5403 OOM 的直接生产者就是 lastMessages 整包驻留;重启靠水合拼装,拼错即降级或烧会话。刚被撤回的那条线的根病正是这种平行真源。(sess_raw, msgid)对在 ingest 时剥掉,只活在 in-flight 信封里一轮。messages.msgId列存的是 bili/内核自己的规范 id,宿主的原始身份没有任何表承载。「这个元素见过没?」跨进程、跨重启无法回答(P8 要求恒可答),于是每轮都冷启动重新探测。3. 目标架构总览
全貌与 §2 现状架构图逐位对齐,直接对照即可看出改的是全局哪一块、影响范围多大(灰 = 零改动 · 青 = 新增段/表 · 琥珀 = 角色变更 · 红虚线 = 兜底安全网):
六段固定链自身的内部流转 —— 分阶段展开(提交原语 / DDL chip / 降级红门 R1–R4 / 共存路由与回滚灰度):
现状图里的每一块在新架构下变成什么样子 —— 组件迁移总览(底部为三个结构性痛点的一一对应解决锚点):
六个阶段的职责一句话版:
横切两条:红门降级带(§7,任何疑点回落 legacy)与共存路由(§8,每种流量只有一个家)。
4. 六段固定链逐段设计
4.0 第 0 段:入站 · 身份入册(现状中不存在的一段)
输入:原始字节体 + 双信道身份——请求头里的
sess_raw(宿主会话 id 原值)+ 逐元素msgid[]信封。采集直接消费 #5842 已合入的载体 resolver 输出(shim / pi entry-walker / opencode transform 钩子 / codex / cc / gemini 六候选载体),不建第二套采集系统。世界匹配裁决(顺序执行,第一个命中即止):
(sess_raw, msgid)在 L1 表中探测命中 ⇒ 沿用既有账本身份;cohort vs 降级的边界(裁定 I,见 §14):声称具备双信道的 cohort 宿主某轮收不齐 id = 故障,硬拒绝 + 零副作用 + 喂 breaker(baseline §3.2 原样);天生没有 msgid 的非 cohort 宿主走「顺序 > hash」粘滞降级通道,写同一套表(pos 由序位发号);模式每会话粘滞,中途换模式 = 一次显式 resync,禁止静默混用。
L1 表(G 裁定的承载体):
l1_world(sess_raw PK, ledger_id, …),全局可跨重启查询;原值禁截断(P9),sig/fingerprint 只进 warn 诊断流永不入判决(P8/P9)。4.1 第 1 段:协议转换 → 通用核(现成复用)
{openai,anthropic,responses,google}ToCore ↔ coreToX与跨线稳定规范 id(The intermediate message (core) is not protocol-agnostic: switching protocols/models causes identity churn; cross-protoc | 中间消息(core)没有做到协议无关:切协议/切模型制造身份 churn,补齐跨协议映射 #3642)均在 master,零重建。_N,解析散布子集必须复现「整数组调用」的编号上下文,否则出站字节漂移 = 前缀缓存碎掉。散布子集编码的字节级回归钉是 P2 准入条件(连续尾切片情形 v5 已证可行,散布子集是新情形)。message_media引用,base64 不进行表。4.2 第 2 段:改写 / 压缩(内核零改动)
acp-kernel 保持一行不改:折叠判定(projectUnit 共享投影)、四条 prompts、nudge flat-50K 节拍、ref/msgid 永不复用契约。它对外的输出在本设计中定义为结构化事件流:
事件寻址规则沿用 baseline:只按内核管道证据(block 覆盖区间 / ledgerSeq / 帧边界)定位受影响行,禁止任何模糊相似匹配;对不上 ⇒ 该轮不产事件、整轮走 legacy(§8 R2)。
落表时序(以 #5643 附录二为准):第一现场 = 插件端点
POST /__bili/plugin/tool(src/server/admin.ts:797)在当次请求内同步单事务完成事件→表修改;下一轮模型请求只做核对。绕过端点的宿主(dsh native compaction 一类)由 checkpoint 帧签名 + rebase 检测喂同一个表修改例程兜底。端点到落表之间平面挂structural-pending标记;进程重启丢失标记 = 保守判死(fail-safe 方向,§8 R4)。4.3 第 3 段:快照表应用(本提案主体)
提交原语 = 单事务,内含三步:
不变量表(草案 v0.1 起、review 补强后沿用):
ckpt.meta_json 三件套(F+C 裁定的合流):① 内核会话态(CompressionState:blocks/refs/deadRefs/nudge/tokenSnapshot/…)序列化 + 自身校验和——内核没有确定性「事件流→状态」重建入口,序列化随 checkpoint 走是唯一既零改内核又满足 P7(内存只是缓存)的方案;② 覆盖映射(摘要 pos → 被覆盖 pos 区间)——delete/compact 载荷会被 ckpt 吸收,压实之后 decompress/GC 的唯一依据就是这份显式映射;③ S4 聚合校验和。
失效行生命周期(B 裁定建议):inactive 行保留至其覆盖块本身被归档/删除时一并物理清理;反对永不物理清(#3752 单调无界增长是 p1 红线)也反对全局 TTL(GC 窗口和解引用窗口不用额外对齐证明)。
4.4 第 4 段:出站映射
mapEgress= 存活行按 pos 排序取核 ++ 尾窗[K..T)本轮新解析的核,再过coreToX到目标协议族。前缀跨轮字节稳定 ⇒ 前缀缓存友好(这就是目标函数,不是巧合而是结构保证)。4.5 第 5 段:出站
tripwire 运行期形态(J 裁定建议):低比例抽样把出站字节与 legacy 全量路径产物逐字比对(除 time attr)。一致放行;不一致 ⇒ 该会话立即摘回 legacy + 告警。最终护栏防的是「漂移状态下供出陈旧前缀 = 缓存投毒」。
协议卫生:pf-* / 信封类握手头是协议头不是 hop 头,转发上游前剥掉(UPSTREAM_HOP_HEADERS 白名单纪律);本提案引入的任何新握手头同样进白名单管理。灰度期全程 A/B 字节钉在场。
5. 存储 schema(提案骨架,P0 契约定稿)
版本叠加规则:#5855 合并落地它自己的 schema 版本(草案假定 v12)之后,本方案在其上再升一版(v13+);老库升级纯
CREATE ... IF NOT EXISTS加性变更,无数据迁移。DDL 骨架(精确列型留待 P0 契约评审):写模型假设(H 裁定项):默认单进程假设(WAL 天然串行化跨进程写);若要多实例并发写,需附内存视图失效协议(常驻核数组/元数据缓存谁作废谁通知)——P0 契约里二选一钉死。
6. 读路径与消费方切换台账
hydrate 双道:绿道(新表可读且 S4 通过)从 snap_rows+meta 重建读视图;红道(开关关 / 无活跃块 / 表不可读 / 校验失败)原样走 kstate 旧路承接。切换按会话粒度、单向渐进,任何一道失步整轮回退 legacy——与 D-lane #3756 同纪律。
消费方逐个标注(P0 列全清单,此处为主干):
|sub:<fp>)7. 降级红门枚举(命中任一 ⇒ 该轮/该会话整体回落 legacy 全量路径并重新盖戳)
不是红条件的:跨协议族切模型、maxDim 变化、toolArmed 变化、客户端压缩痕迹(纯忽略,只看增量)。把这组边界写成判定函数放进 lane-decisions 矩阵,每种组合正负成对断言(#3617 纪律)。
8. 与既有车道的共存路由(每种流量只有一个家)
lane-decisions 矩阵:每个组合一行,正负成对(触发时触发、不该触发时不触发),新增行可追溯。
9. Rollout 与配置面(owner-gated,命名待 P0 config-surface 章节定稿)
src/knobs.ts(env > file > default)解析;不新增 env 旋钮(env 稀缺面纪律 彻底整治环境变了滥用,除非必要都走配置文件 #2030)。具体 key 名在 P0 PR 的 config-surface 专章申报后定稿。10. 观测面
/__bili/status:attribution 字段扩展新底座维度(哪条链路在服务本会话、平面健康)。11. 测试矩阵
分期测试骨架(正负成对原则全程适用):
CI:docker gate + 求解器无关;hermetic,端口 listen(0)(#360 纪律)。
12. 分期交付(每期为独立 PR,人审关卡标出)
E 裁定建议维持:本期范围到 P0+P1 收手交验收;P2 的字节对等风险集中,独立 PR + 灰度基建齐备后再上。
13. 前置依赖与时序
14. 待 owner 裁定汇总
已在线讨过的(A–E,沿用草案 v0.1 编号)+ 缺口分析新增(F–L)+ 遗留(D3–D5):
15. 风险与诚实边界
16. 参考号速查
#5643(本线起源+定位纠正)· #5854(整线撤回,merged)· #5855(工程基底 re-land,open)· #5842(身份采集 wiring,merged)· #3756(D-lane 快照渲染,将被 K 裁定处置)· #3752(存储无界增长 p1 红线)· #5403(OOM:lastMessages 驻留)· #2432(客户端压缩死螺旋,纯忽略策略的来源)· #3236(共享投影判据)· #3642(跨线稳定规范 id)· #3617(gate 双向断言)· #1104/#1106/#1107(fingerprint 白名单纪律)· #4491/#4834(msgid 身份层级)· #5539(schema v11 FK 子索引)· #155(诚实输出)· #360(listen(0) 端口纪律)· MESSAGE-IDENTITY.md(身份教义)· #5643 定位纠正评论:#5643 (comment)
All reactions