03 / extraction

十三段,
两种执行者

程序负责所有能机械确定的事:序号、时间、谁说的、工具调用、提到了谁、去重、出处。 模型只做语义判断,一次一个,输出只带 seq 与逐字引文—— 不给 id,不给时间戳,不给指针,也不给「我有多确定」。

程序 P1–P17 LLM L1–L12 程序检查 + 模型审核
01 / 导入
先把话收进来

转换器把会话写进统一格式;字段不认识就拒收,秘密先扫一遍。

02 / 蒸馏
切成小批,慢慢整理

一次一批,可以重跑;这一批失败就停在这,下次从断开的地方接着来。

03 / 提取
程序定位,模型判断

序号、时间、谁说的由程序给;模型只判语义;程序能查的先查,模型审核后到。

04 / 使用
按需要拿出来

召回给一句话简报,搜索给原话,会话给上下文;都能按行首编号展开原文。

没有 LLM

入库就能查

导入时每一轮就写进全文索引:会话清单、原话搜索、原文回放照常出结果,不调用模型。

有 LLM

才做抽取

记忆卡、审核、常驻简报要等模型;模型不在,原文也不会丢,回来再补。

01

点一段,或让它自己跑

菱形是一个个步骤:铜色交给模型,钢蓝由程序执行;两种颜色交替的地方,就是交接。

extraction pipeline

这里画的是主干 13 段;完整编号是程序 P1–P17、模型 L1–L12,多出来的是同一段的细分和收尾。手机上左右滑动看全部 13 段。

program
ingest

把 agent 自己的会话格式翻译成统一格式;不认识的字段、扫到的秘密,直接拒收。

输入
session.json(agent 私有格式)→ 转换器
输出
events[] · 每条带 seq / speaker_id / ts_ms / text
02

把「谁做」写死

切换三个视图,看只留一边时流程会断在哪。这不是动画效果,而是这套系统真正的取舍。

程序P1–P17
脱敏定位时间说话人 候选过滤去重出处校验 写入记账指标

它不判断语义,只给出确定的位置与出处。

模型L1–L12
命名别名指代身份消歧 语气角色事实事件关系 状态时间映射审核因果

它不碰位置,只在给定的那一轮里判断「这句话是什么意思」。

两边都在:程序给出确定的位置与出处,模型只在这条轨道上做一次语义判断。每条输出都能回到 seq 与逐字引文。
03

先让程序查,再让模型审

程序能判的就不交给模型;模型审核单独走一遍,只挑毛病,不改写草稿。 下面是一份会被退回的草稿——点「运行审核」看它被拆成了哪几层。

draft「小王 在 上周 把部署脚本改成了 build-release.sh,因为树莓派跑不起来。」
subject小王
time_text上周
valuebuild-release.sh
evidenceseq 12 · 「把 release 脚本换成 build-release.sh,树莓派那边直接起不来。」

运行后,每条问题会按「程序检查 / 模型审核」分层列出;草稿本身不会被改写。

等待运行 0 issue
判据不许用 ok 字段,测试断言行数,
写零行等于错误。
04

一条输出最小能有多小

模型只产出「哪一轮 + 哪句原文 + 抽到了什么」。其余字段由程序拼,模型无从编造。

llm output contract · v4frozen
// 只有这些字段;没有 id、时间戳、原文位置、代码、日志或自信分数 { "seq": 12, "quote": "把 release 脚本换成 build-release.sh,树莓派那边直接起不来。", "facts": [ { "subject": "部署脚本", "predicate": "统一入口", "value": "build-release.sh" } ] } // 没有内容就返回空数组——不猜、不补、不写"暂无" { "seq": 13, "quote": "", "facts": [] }