轴向编码 axial coding
轴向编码 axial coding
日期: 2026-06-24 阶段: Phase 1 - 产品定义×评测×可观测底座 标签: #axial-coding #clustering #severity-matrix #cohens-kappa
核心问题
Day 9 产出了 ~100 段自由文本开放编码——刻意不带分类。现在面对这 100 段措辞各异的标注,要把它们收敛成 5–6 类 failure taxonomy,否则无法对每类失败定指标、写 eval(Day 11)。这一步在扎根理论里叫轴向编码(axial coding):把开放编码聚类、建立范畴间关联。
但「聚成几类」「哪类优先修」不能靠拍脑袋。今天回答三件事:(1) 从开放编码到轴向编码的聚类机制(范畴化 / Strauss-Corbin 关联模型);(2) 失败类别的二维刻画——频次 × 严重度,以及由此排出修复优先级;(3) 编码者间信度——单人项目如何缓解偏见,以及 Cohen's kappa 在多编码者场景的真实含义与陷阱。
关键内容
A. 从开放编码到轴向编码:聚类与关联模型
轴向编码由 Strauss & Corbin 在 Basics of Qualitative Research(1990,经典)正式定义为**「按范式(paradigm)系统地把范畴与子范畴关联起来」**的过程(en.wikipedia/MAXQDA 2025 口径)。它把 Day 9 那堆「碎片化的开放码」转成「内聚的轴向范畴」。两层动作:
(1) 范畴化(聚类):相似措辞合并、相异措辞拆分。这是常量比较法的延续——拿每条新标注与已有范畴比对,「合得上就并、合不上就拆」。
开放码聚类算法(输入:~100 段自由标注;输出:5–6 个 failure 范畴):
categories = []
for each open_code oc in open_codes: # Day 9 的自由标注
best = argmax_c similarity(oc, c.exemplars) # 与各范畴样例比相似度
if best.sim >= MERGE_THRESHOLD:
best.add(oc) # 并入(措辞向范畴收敛)
else:
categories.append(new_category(oc)) # 拆出新范畴
# 后处理:合并样本过少的范畴;拆分内部异质的范畴
collapse(categories, min_size=3) # <3 条的并入近邻或归"其他"
return categories
反直觉洞察(聚类是降维不是真理):轴向编码把 100 段标注压成 6 类,本质是有损压缩——为了让每类能挂一个 eval。但「6 类」不是数据里客观存在的真理,而是分析者为了可操作性做的切分。Strauss 派的关联模型甚至被 Glaser 派批评为「强加结构」。工程含义:failure taxonomy 的类数应由「每类能否对应一个可执行 eval」倒推,而非追求「完美反映数据」。本项目定 6 类(Day 11)正是因为 6 个 eval 是 CI 里可维护的上限,不是因为数据恰好分成 6 簇。
(2) 关联模型(Strauss-Corbin paradigm):不只是分桶,还要刻画「条件→现象→策略→后果」的因果链。对本项目失败分析的工程化映射:
| paradigm 要素 | AML Copilot 失败语境的映射 |
|---|---|
| 因果条件(causal) | 触发失败的输入特征(如:贴线现金 + 合法商户画像同时出现) |
| 现象(phenomenon) | 失败本身(如:把合法商户误判为 structuring) |
| 上下文/中介条件 | 阈值设置、检索是否命中相关类型学笔记 |
| 策略(action) | 系统怎么处理(规则命中→出 SAR 草稿) |
| 后果(consequence) | 误报进调查队列 / 漏报 SAR / 引用幻觉证据 |
这条因果链就是 Day 11 给每类失败写判定规则的素材——知道「什么条件下出什么失败」,才能写出可确定性断言的 eval。
B. 失败类别的二维刻画:频次 × 严重度 → 优先级
只数频次会犯大错:高频但无害的失败会盖过低频但致命的失败。正确的优先级是频次与严重度的二维函数。对 AML 场景,严重度有明确的监管锚点(漏报 SAR 是合规事故,误报只是浪费工时):
| 失败类别 | 频次(/100 trace,示意) | 严重度 | 严重度依据 |
|---|---|---|---|
| typology_misjudge(漏判/误判类型学) | 8 | 极高 | 漏报真洗钱 = 合规事故,可触发监管罚则 |
| hallucination(幻觉证据) | 5 | 极高 | SAR 引用不存在的交易 = 提交虚假监管文件 |
| context_pollution(上下文污染) | 12 | 中 | 答案变差但通常不致命,可重试 |
| retrieval_miss(检索漏召回) | 10 | 中 | 缺背景知识,输出退化但不必然错 |
| tool_failure(工具调用失败) | 6 | 中-高 | 可由 error 字段确定性捕获,多可重试 |
| format_violation(格式违规) | 9 | 低 | 确定性可修,纯工程问题 |
优先级排序用一个可调权重的打分(severity 远重于 frequency,因为监管场景下一次漏报的代价 ≫ 多次误报):
priority(category) = w_s · severity_rank + w_f · log(1 + frequency)
w_s ≫ w_f # 严重度主导,频次取 log 压缩(防高频低害刷榜)
排序结果:typology_misjudge / hallucination 抢占修复队列头部,
尽管 context_pollution 频次最高也排在其后
反直觉洞察(频次最高≠最该修):错误分析新手最易犯的错是「按频次排序,先修最多的」。但本表里频次最高的
context_pollution(12 次)严重度只是中,而频次仅 5 的hallucination是极高严重度。在 AML 这种长尾致命领域,一次「SAR 引用幻觉交易」造成的合规后果,远超一百次「答案啰嗦」。所以优先级矩阵必须让严重度主导排序,频次只做次级调节——这也是为什么 Day 3 的 PRD 把「引用溯源率 100%(硬性)」列为不可妥协指标,而成本上限可以待定。
C. 编码者间信度:Cohen's kappa 与单人项目的缓解
多编码者场景下,「两人对同一 trace 是否归同一类」的一致性用 Cohen's kappa 度量(Cohen 1960):
κ = (p_o − p_e) / (1 − p_e)
p_o = 观察一致率(两人实际归同类的比例)
p_e = 偶然一致率 = Σ_k (行边际_k/N)·(列边际_k/N) # 各自分布独立时的随机一致
Landis & Koch(1977)解读带(经典,被广泛引用但「非普遍接受」):
| κ 区间 | 解读 | 本项目可接受门槛 |
|---|---|---|
| <0 | 无一致(差于随机) | 不可用 |
| 0.00–0.20 | 微弱 | 不可用 |
| 0.21–0.40 | 一般 | 需重新定义类别边界 |
| 0.41–0.60 | 中等 | 边界仍模糊 |
| 0.61–0.80 | 显著 | 可接受下限 |
| 0.81–1.00 | 几乎完美 | 理想(判据清晰) |
kappa 的价值在于扣除偶然一致:「若两个评审都排除 95% 的记录,他们会有 90% 的时间纯属巧合地一致」——简单百分比一致率会把这种巧合误当真一致。
反直觉洞察(kappa 悖论:高一致率却低 kappa):当类别严重不均衡(某类占绝大多数)时,会出现「观察一致率 60%,但两组评审 kappa 截然不同」的悖论(Wikipedia Cohen's kappa / kappa paradox)。机制:单一类别主导 → p_e(偶然一致率)飙高 → 即使 p_o 很高,(p_o−p_e) 被压缩,kappa 塌陷。这对本项目是直接警告:AML 失败分布天然不均衡(多数 trace 是「正常无失败」),若直接对「失败/不失败」二分算 kappa,会因 normal 主导而 kappa 虚低。缓解:(a) 只在「已判失败」的子集上算类别间 kappa,剔除压倒性的 normal 类;(b) 报 kappa 时同时报 p_o 与各类边际,让读者识别悖论;(c) 用 prevalence-adjusted kappa(PABAK)作为补充。
单人项目(本作品集)的现实约束:没有第二个标注者,无法直接算 kappa。缓解策略(综合 Cambridge Bias and Debiasing in Qualitative Data Collection + insight7 2025):
| 单人缓解策略 | 做法 | 对应工程化 |
|---|---|---|
| 时间分离重标(test-retest) | 间隔 ≥1 天对同 20 条 trace 重新归类,算自一致 kappa | 自一致 <0.61 → 类别边界须重写 |
| 反思日志(reflexive journal) | 每次编码后记判据演化与潜在偏见 | 复用 Day 9 的 memo 字段 |
| 三角验证(triangulation) | 用规则引擎 assessCase 的客观输出交叉验证人工归类 | 人判 typology_misjudge 时对照 topTypology |
| LLM 作第二「弱标注者」(仅参考) | LLM 归类与人工对比,分歧处人工复核,不取代人工 | judge 一致率监控(呼应 Day 3 ≥0.8 门槛) |
注意第四条的边界:LLM 只作分歧探测器,最终归类仍人工——与 Day 9 C 节「不能外包给 LLM」「防自证循环」一致。
设计要点/决策表
| 决策 | 选择 | 理由 |
|---|---|---|
| 类数 | 6 类(Day 11 定稿) | 由「每类能挂一个可执行 eval」倒推(A 节) |
| 小类处理 | <3 条并入近邻或「其他」 | 避免碎片化范畴(A 节) |
| 优先级排序 | 严重度主导,频次取 log 次级调节 | 长尾致命,频次最高≠最该修(B 节) |
| 严重度锚点 | 合规后果(漏报>误报>啰嗦) | AML 监管语境提供客观锚(B 节) |
| 信度度量 | 多人 kappa;单人用 test-retest 自一致 | 本项目单人,无法直接算 kappa(C 节) |
| kappa 报告 | 同时报 p_o 与边际,警惕 kappa 悖论 | 类别不均衡使 kappa 虚低(C 节陷阱) |
| LLM 角色 | 分歧探测器,不取代人工归类 | 防自证循环(C 节 + Day 9) |
对本项目的落地
- 新建
src/agent/eval/axialCoding.ts:消费 Day 9openCoding.ts的OpenCode[],产出FailureCategory { id, label, exemplarTraceIds, frequency, severity, paradigm? }。severity用枚举'low'|'mid'|'high'|'critical',映射 B 节的合规锚点;提供prioritize(categories)实现「严重度主导 + 频次 log」打分排序。 - 频次×严重度矩阵 UI(教学 lab,参考
src/dsdb-lab/):二维矩阵图,X=频次、Y=严重度,每个失败类别是一个气泡(气泡大小=优先级分);右上角(高频高害)红色高亮。把 B 节的优先级可视化,作为「我会做 AI 产品错误分析」的作品集展示物。 - 复用 AML 客观信号做三角验证:归类
typology_misjudge时,代码自动对照src/aml/typology.ts的assessCase(case).topTypology与金标case.label——人工归类与规则引擎输出不一致的 trace 自动标记「需复核」,落地 C 节的 triangulation 策略。这把单人项目缺第二标注者的缺口,用现成的确定性规则引擎部分补上。 - kappa 工具(即便单人也实现):
src/agent/eval/__tests__/下加cohensKappa(labelsA, labelsB)工具函数,单人项目用于 test-retest 自一致;实现时同时返回 p_o、p_e 与各类边际,并对类别不均衡发出告警(C 节 kappa 悖论护栏)。即便当前单人不算双人 kappa,工具就位为日后引入第二标注者(或 LLM 弱标注者对比)做准备。 - 诚实标注:代码注释写明「本项目为单人作品集,类别间 kappa 暂以 test-retest 自一致代理;多标注者 kappa 待引入第二人或 LLM 弱标注者后补」——不谎称已有双人信度数据。
- 接 Day 11:
axialCoding.ts输出的 6 个FailureCategory(带 paradigm 因果链)是 Day 11failureTaxonomy.ts的直接输入;每类的「因果条件→后果」链转成 Day 11 的判定规则与对应 eval 类型。
参考资料
- Strauss & Corbin — Basics of Qualitative Research(轴向编码定义、coding paradigm「条件→现象→策略→后果」关联模型)1990,经典;配近期整理 en.wikipedia Axial coding 与 MAXQDA Axial Coding 2025 Guide (2025)
- Cohen — A Coefficient of Agreement for Nominal Scales 1960(kappa 原始定义,扣除偶然一致)经典;Landis & Koch The Measurement of Observer Agreement 1977(解读带)经典
- Wikipedia — Cohen's kappa(κ=(p_o−p_e)/(1−p_e) 公式、p_e 由边际算、Landis-Koch 带、kappa 悖论:类别不均衡下高一致率低 kappa)配近期实践 numiqo.com / lensym.com 工具 (2025)
- Cambridge — Bias and Debiasing Strategies in Qualitative Data Collection(单人编码者偏见缓解:反思日志、三角验证、test-retest)Philosophy of Science (近期)
- insight7 / Greenbook — Avoiding/Eliminating Bias in Qualitative Research(单人项目缓解策略实务)(2025)
- Hamel Husain — Why is error analysis so important(轴向编码=把开放码聚成 failure taxonomy,「最重要的一步」)hamel.dev evals-faq (2025-09)
SOTA 检查 (2026-06-11)
- 轴向编码 + 频次×严重度优先级,2026-06 仍是错误分析事实标准:Hamel/Shreya 课程明确「axial coding 是最重要的一步」;本日 WebSearch 未发现替代聚类范式。扎根理论轴向编码(Strauss-Corbin 1990)定义层 35 年稳定。
- Cohen's kappa 仍是类别一致性主流度量,但 kappa 悖论在不均衡数据下是已知陷阱——近期 NLP/qualitative 论文(如 arXiv 2307.04367 app reviews taxonomy)继续在 LLM 标注语境讨论 kappa 与替代指标,说明这是活跃问题而非过时认知。
- 方法论 vs 实证等级:A/B 节的聚类与优先级是框架性方法论;C 节的 kappa 悖论与单人缓解有统计学/方法论文献支撑——引用时区分(延续 Day 3/9 纪律)。
- 过时警示:「按失败频次排序决定先修什么」是错误分析新手常见误区,本笔记 B 节已用严重度主导排序规避;「单人项目直接报百分比一致率当信度」忽略偶然一致,C 节已用 kappa 思想纠正。
- 待跟踪:本项目何时引入第二标注者或 LLM 弱标注者以算真实双人 kappa;频次/严重度的示意数字须在 Day 8 真实 traces 跑完开放→轴向编码后用真实统计回填(当前为占位示意)。