📄 一句话概括
实测 session 系列包有 14 件——持久化、SQL 查询、投影、统计、标题、大纲、检查点……会话是【事件的事实库】,消息数组只是它的一个视图。
📝 本节和前面几节的关系
6.1~6.3 讲了过程,这一节讲过程留下了什么——把【会话=聊天记录】这个直觉拆掉。
一、实测:14 件包伺候一个会话
配置里 session 系列的包:session(本体)、session-persistence-jsonl(JSONL 追加持久化)、session-query-sqlite(SQL 查询)、session-projection/-cache(投影)、session-stats(统计)、session-title/-first-prompt-llm(标题)、session-turn-outline(大纲)、session-reference(引用)、session-checkpoint-policy(检查点)、session-log-deepseek/-export(日志导出)、session-telemetry-otel(遥测)。
一个【聊天记录】用得着 14 件包吗?——如果它只是数组,用不着。
二、会话是事实库,不是数组
会话里存的是事件:用户消息、assistant chunk、工具调用、工具结果——每条事件带时间、带顺序、带归属。
- 消息数组只是【人看到的对话】这一个视图。
- 事件流水才是事实本身。
视图从事实派生(6.6.3 展开)——派生错了可以重算,事实不能丢。
三、这个设计换来什么
- 能查:SQL 直查流水(sqlite 包)——【那轮调了什么工具】一条语句的事。
- 能算:统计、大纲、标题全是派生品——加视图不用动事实。
- 能回放:流水齐了就能重建请求(6.8.1)。
- 能审计:append-only,改不了历史。
四个能力,全都建立在【事实与视图分离】上。
四、对照:如果真是数组
- 想查【第 3 步工具传了什么参数】——数组里没有这信息。
- 想加个【按轮次导航】——数组要改结构,历史数据全迁移。
- 想压缩上下文——直接删消息,删了就没了,说不清删过什么。
数组是给【聊天】用的,事实库才是给【工作】用的。
五、动手 Demo:Session 的真身——14 件包
session 系列全家福(实测 14 件):
packs = ["session", "persistence-jsonl", "query-sqlite",
"projection", "projection-cache", "stats",
"title", "title-first-prompt-llm", "turn-outline",
"reference", "checkpoint-policy",
"log-deepseek", "log-export", "telemetry-otel"]
for i, p in enumerate(packs, 1):
print(" %2d. dsh-session-%s" % (i, p) if i > 1 else " 1. dsh-session")
print(" 共 14 件")
实跑输出:
--------------------------------------------------------------------
Session 的真身——14 件包
--------------------------------------------------------------------
实测:配置里 session 系列的包一共 14 件(省略前缀):
包 干什么
-------------------------------------------------------------------
session 会话本体
session-persistence-jsonl 事件流水持久化(JSONL 追加)
session-query-sqlite 用 SQL 查会话
session-projection / -cache 从事实生成视图(带缓存)
session-stats 统计
session-title / -first-prompt-llm 起标题
session-turn-outline 轮次大纲
session-reference 引用
session-checkpoint-policy 检查点何时打
session-log-deepseek / -export 日志与导出
session-telemetry-otel 遥测
-------------------------------------------------------------------
一句话:**会话是【事件的事实库】**——消息数组只是它的一个视图。
14 件包的规模本身就是答案——数组用不着这个配置。 事实与视图分离是本节支点——视图派生可重算,事实唯一不可改。 四个能力(查、算、回放、审计)全是分离设计的回报。
30 秒实验
- 在配置树里把 14 件 session 包数一遍,说说每件管什么。
- 举例:【那轮工具传了什么参数】——数组为什么答不了、流水为什么能答。
- 想想 append-only 为什么是审计的前提。
常见误区
- 错误:会话就是 messages 数组的读写。——纠正:是事件事实库——消息数组只是人看的那个视图。
- 错误:14 件包是过度设计。——纠正:每个能力都有对应包——能查、能算、能回放、能审计,数组一个都给不了。
- 错误:压缩就是把旧消息删掉。——纠正:删事实无法追溯——压缩必须可解释(6.6.4)。
自测三问(点开对答案)
1. session 系列实测有几件包? —— **14 件**——本体、持久化、SQL 查询、投影、统计、标题、大纲、检查点等。 2. 会话存的是什么? —— **事件**(用户消息/chunk/工具调用/工具结果),带时间与顺序——消息数组只是视图。 3. 事实与视图分离换来什么? —— **能查、能算、能回放、能审计**——视图坏了可重算,事实不能丢。- ☐ 下一节(6.5 模型看见的内容应当可追溯)
相关笔记
- Scope Context:会话级能力从哪里来 —— Trajectory 留下、能力销毁
- 本章小结 —— 那时就说 Trajectory 是 append-only
- Projection:同一组事实可以生成不同视图 —— 本节的直接展开
- 🐳 DeepSeek Harness · 索引