MDE 高级讲义 · 实战专题(第四模块)· 第四篇
实例模型案例集:从真实文件到元模型的三层一线
前面两讲学的是「语言」;这一讲看「句子」。方法只有一条:拿一份真实轨迹文件,逐片段做四栏对照——原始字段 → 实例元素 → 所归元类 → 含义——把 conforms-to 箭头变成肉眼可见的东西。然后五个精讲案例 + 18 源全量一览,每个我们研究过的 agent 都有一席之地。
概览
5
精讲案例
18
源全量一览
4
层一线对照
1
个拒解案例
| 项目 | 说明 |
|---|---|
| 三层一线 | 同一份文件的四个视角并排:原始字段(M0 素材)→ 实例元素(还原结果)→ 所归元类(M1 定义,链接回 05/06 讲类卡)→ 含义解释 |
| 精讲选案 | claude-code(业界标准格式)/ aider(Markdown 文本源)/ codex(Part 粒度爆炸)/ swe-agent(最小闭环)/ 拒解案(诚实边界) |
| 实例数据 | 全部来自 TMR 对 demo-corpus 真实文件的分析作业(2026-10-08 实测),分布数字逐案可复现 |
第一篇 · 方法段:一份文件的三层爬升
本篇 · 四栏对照法
图 0 · 三层一线方法:本讲所有案例都沿这条线走读——文件 → 实例 → 元类 → 含义;conforms-to 箭头由此变成肉眼可见的表格列
图 1 · claude-code 小会话的实例模型(TMR「实例 M0」视图实拍):Session → Trajectory → Agent 骨架 + Message m3/m9 → Part 两条内容链。分布:Session 1 / Trajectory 1 / Agent 1 / Message 2 / Part 2
原始字段 → 实例元素 → 元类 → 含义
文件首行原文(Claude Code 的 JSONL 事件流,一行一个事件):
{"type":"queue-operation","operation":"enqueue","timestamp":"2026-08-30T11:03:23.610Z",
"sessionId":"8ee257b6-b37e-4cb2-9a51-66e596cb14e5","content":"当前的模型是什么"}
四栏对照(右侧两栏的实例值取自 TMR 还原结果原文):
flowchart LR
subgraph RAW["文件层(M0 素材)"]
R1["原始字段
sessionId / content / type"] end subgraph INST["实例层(还原结果)"] I1["实例元素
Session.id / Part.content / m3"] end subgraph META["元模型层(M1 语言)"] M1["所归元类
Session / Part / Message"] end MEAN["含义解释
这个抽象在说什么"] R1 -->|"认源 + 映射"| I1 I1 -->|"conforms-to"| M1 M1 --> MEAN
sessionId / content / type"] end subgraph INST["实例层(还原结果)"] I1["实例元素
Session.id / Part.content / m3"] end subgraph META["元模型层(M1 语言)"] M1["所归元类
Session / Part / Message"] end MEAN["含义解释
这个抽象在说什么"] R1 -->|"认源 + 映射"| I1 I1 -->|"conforms-to"| M1 M1 --> MEAN
| ① 原始字段 | ② 实例元素 | ③ 所归元类 | ④ 含义 |
|---|---|---|---|
| sessionId: 8ee257b6-… | Session.id = 8ee257b6-… | Session | 会话唯一标识,整份文件归属一个 Session;lifecycle 还原为 active |
| content: 当前的模型是什么 | Part.content(partType=text) | Part | 内容落到最小内容块上;text 型 Part 不带工具字段(callId/toolName 均为 null) |
| (用户输入的队列消息) | Message m3(role=user) | Message | 一条消息容纳若干 Part;m3 就是用户那句提问的容器 |
| (全文只有一条轨迹) | Trajectory(recordOf=Session) | Trajectory | 会话内唯一轨迹,挂在 Session.trajectories 下;turns/steps 为空——这份小会话没有形成回合 |
| (会话主体) | Agent …#agent-root(origin=root) | Agent | 根 agent,origin=root 说明没有子代理;toolSet 为空 |
这份文件的另一个教学细节:实例里还有一条 Message m9(content="[Request interrupted by user]")——用户中途打断也被诚实还原为一条 user 消息,而不是被丢弃。
读图口诀:先找 Session(根),沿容纳边下行到 Trajectory,再走 messages 名单——每个类节点的标签就是它的 _class,与 06 讲类图一一对应。这个对照法后面四案反复使用。
第二篇 · 五案精讲
案例 1 · claude-code(JSONL 事件流)
业界标准格式:一切皆事件
① 原始片段
{"type":"queue-operation","operation":"enqueue", …,"content":"当前的模型是什么"}
{"type":"queue-operation","operation":"dequeue", …}
② 实例走读
- 队列操作事件被过滤为会话语境,真正的对话内容落为 2 个 Message(m3 提问、m9 打断)各含 1 个 text Part
- 分布:Session 1 / Trajectory 1 / Agent 1 / Message 2 / Part 2——最小但五脏俱全的实例
③ 钉回元类
- queue-operation 事件 → 不直接成类,成为认源信号(06 讲:认源打分靠这类指纹字段判「这是 claude-code」)
- content → Part.content(partType=text);sessionId → Session.id
④ 揭示什么
- 事件流格式的还原策略:不是每个事件都配成为模型元素——元模型的筛子把「协议噪声」留在认源层,把「语义内容」放进实例层
案例 2 · aider(Markdown 对话史)
图 2 · aider 实例实拍:左路为消息长链,右路 Step/Part/Tool 聚成执行簇——对话体落盘还原后与 JSON 源同样规整
纯文本也能逆向成模——本批最丰满实例
① 原始片段
# aider chat started at 2026-09-29 21:34:16 > /tmp/w77-trae/venv/bin/aider --model openai/glm-4.5-flash … --message 创建 calc.py 实现两数相加函数… > Warning for openai/glm-4.5-flash: Unknown context window size…
② 实例走读
- 本批语料分布最富的实例:Session 1 / Trajectory 1 / Step 9 / Message 12 / Part 14 / Agent 1 / Tool 1
- Markdown 的段落结构(标题、引用行、代码块)被解析为 Step 分组与 Message/Part 链
③ 钉回元类
- chat 标题时间 → Session 起点;每个 > 交互块 → Turn/Step;正文与代码块 → Part(text / file 型)
- aider 落盘里出现的编辑动作 → Tool(aider 内建 edit 工具面)+ tool_use/tool_result 型 Part
④ 揭示什么
- 「格式多样性行不行」的试金石:连 Markdown 都能还原,说明筛子在「语义结构」层工作,不在「文件格式」层较劲
案例 3 · codex(rollout 事件 JSONL)
图 3 · codex 实例实拍:Step/Message 数与 aider 相近,Part 数(81)显著膨胀——粒度差异一眼可见
Part 粒度爆炸:同一句话切出 81 个内容块
① 原始片段
{"timestamp":"2026-08-28T20:40:52.01","type":"session_meta","payload":{…}}
{"timestamp":"…","type":"response_item","payload":{"type":"message","role":"user", …}}
② 实例走读
- 分布:Session 1 / Trajectory 1 / Step 8 / Message 11 / Part 81 / Agent 1 / Tool 1
- Part 数是 Message 数的 7 倍多——rollout 格式把细粒度事件(增量文本、推理块、工具交互)都切成了 Part
③ 钉回元类
- response_item 事件流 → Step(8 步聚合 200+ 事件);payload 内的消息 → Message;细粒度内容/推理块 → Part(text / reasoning 型——reasoning 是 13 系一等公民)
④ 揭示什么
- 同一元模型下不同源的自然「体型差」:粒度是源的属性,不是模型的属性——元模型不强迫各家一样细,只保证都能装下
- 对比着看:claude 2 个 Part vs codex 81 个 Part,做跨源统计时 Part 数必须按源分层,不能直接平均
案例 4 · swe-agent(单个 JSON 的 history 数组)
图 4 · swe-agent 实例实拍:Step 5 / Message 7 / Part 7 的规整链条,无 Tool 无子代理——最小闭环
最小闭环:学术 agent 的教科书形态
① 原始片段
{"history":[
{"role":"system","content":"SETTING: You are an autonomous programmer…","message_type":"system_prompt"},
{"role":"user","content":"We're currently solving the following issue…","message_type":"observation"}]}
② 实例走读
- 分布:Session 1 / Trajectory 1 / Step 5 / Message 7 / Part 7 / Agent 1——无 Tool(该样例走 function-calling 演示,工具交互内联在消息里)
③ 钉回元类
- history 数组逐项 → Message(role 直接映射 Role 枚举 system/user);message_type 语义 → 消息在 Step 里的分组依据
- 整个文件一个 JSON → 单 Trajectory,无父子轨迹
④ 揭示什么
- 「最小合规实例」长什么样:Turn 为空、SubagentLink/CompactionRecord/ContextEpoch 全空——13 类中一大半允许为空,这正是 conforms-to 但不饱满的形态(对比 05 讲 I0「零帧即失败」:空的是现象类,骨架类一个不少)
案例 5 · 拒解案(伪装成轨迹的杂乱文本)
图 5 · 拒解案实拍:工具直接给出红色横幅「实例不可用(拒解 / 误派 / 未回译)」——诚实四态在此现场兑现
模型拒绝收编的边界:宁可拒答,不可错认
① 原始片段
{"role":"user","content":"hi"}
random text line
{"foo": 1}
② 实例走读
- 认源打分不出任何一家的高置信信号——文件被判定为拒解(rejected),不生成实例
③ 钉回元类
- 无实例可钉——这正是教学点:conforms-to 的前提是先通过认源门禁;元模型的守门在语言之前
④ 揭示什么
- 错误模型比没有模型更危险:硬把杂文本塞成 Session/Trajectory,下游所有分析全部污染。四态里的 rejected 就是流水线的「熔断器」
- 延伸:本仓 5-brand(kimi/mimo/opencode…)实验轨迹流也全部拒解——它们是平台自产的事件表格式,不在已登记源之列(08 讲习题:该不该为它立源?)
第三篇 · 18 源全量一览
本篇 · 全量实测表
源 → 格式 → 实例分布 → 要点
| 源 | 原生格式 | 实例分布(_class 计数) | 一览要点 |
|---|---|---|---|
| claude-code | JSONL 事件流 | S1 T1 A1 M2 P2 | queue-operation 指纹;协议噪声被滤在认源层 |
| aider | Markdown 对话史 | S1 T1 St9 M12 P14 Ag1 Tool1 | 本批最丰满;文本格式照样成模 |
| codex | rollout JSONL | S1 T1 St8 M11 P81 Ag1 Tool1 | Part 粒度爆炸(81 块);reasoning 一等公民 |
| swe-agent | 单 JSON history | S1 T1 St5 M7 P7 Ag1 | 最小闭环;现象类全空也合规 |
| qwen-code | parentUuid 链 JSONL | S1 T1 Ag1 M1 P1 | 语料件极小(4 行);链式 parentUuid 是认源指纹 |
| cline | messages JSON | S1 T1 St1 M3 P4 Ag1 | IDE 插件形态;单步浅会话 |
| continue | local session JSON | S1 T1 St1 M2 P2 Ag1 | IDE 助手形态;结构轻量 |
| crush | crush.db(SQLite) | S1 T1 St3 M6 P11 Ag1 Tool2 | 数据库落盘也能吃;工具面 2 件 |
| dsh | 快照式 JSONL | S1 T1 Tu1 St2 M7 P7 Ag1 CR1(partial) | compaction-recovery 场景;CompactionRecord 实证;partial 态现身 |
| goose | sessions.db(SQLite) | S1 T1 M2 P2 Ag9 Tool2 | 子代理实证:一会话 9 个 Agent 协作(SubagentLink 的现实土壤) |
| kilocode | kilo.db(SQLite) | S1 T1 St1 M2 P3 Ag1 | VS Code 扩展形态;浅会话 |
| oc | export JSON | S1 T1 St2 M3 P6 Ag1 Tool1 | oc-export 格式族(与部分 claude 导出同源) |
| octop | octop.db(SQLite) | S1 T1 St11 M20 P32 Ag1 Tool3 | 本批第二丰满;工具面 3 件 |
| openclaw | events.jsonl | S1 T1 St200 M200 P194 Ag1 | 超长会话(200 步);无工具记录——裸对话流 |
| pi | 时间戳 JSONL | S1 T1 St1 M3 P4 Ag1 | 极简事件面 |
| smolagents | traj JSON | S1 T1 St2 M4 P6 Ag1 Tool2 | HuggingFace 系;工具演示轨迹 |
| trae | traj JSON | S1 T1 St5 M7 P11 Ag1 Tool2 | 国产 IDE agent;规模中等结构全 |
| zcode | model-io JSONL | 作业完成但实例未回译展示 | model-io 落盘;本机重跑 ?view=instance 可复现(样例名与盘上路径不一致是已知小坑) |
表里三个「现象富矿」值得记住:goose(9 Agent,子代理)、dsh(CompactionRecord + partial 态)、openclaw(200 步长会话)。做过程分析实验时,它们分别是多 agent、上下文压缩、长程漂移三类研究的现成语料。
S=Session T=Trajectory Tu=Turn St=Step M=Message P=Part Ag=Agent CR=CompactionRecord
下一讲:自己动手复现这张表 →