用大模型做金融数据分类分级:12 轮实验、3 次打脸,最硬的结论全是负面的
原创
Yu
Yu
TJXFire
2026年10月10日 14:57
江西
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
全文约 6600 字,预计阅读 18 分钟。面向数据安全、数据治理与 AI 落地从业者。数据来自某金融机构两个业务系统的真实元数据,已按约定脱敏。
零、先说清楚这件事是什么
如果你不做数据安全,\"数据分类分级\"这六个字可能有点陌生,但它是过去几年国内几乎所有持牌金融机构、国企和大型平台都必须完成的一项工作。
它要回答的问题很朴素:你们库里的每一个字段——客户手机号、交易金额、日记账行号、服务器 IP——分别属于哪一类数据?重要程度是几级?是不是敏感数据?
为什么必须做:《数据安全法》确立了数据分类分级保护制度,金融行业还有专门的标准(如 JR/T 0197《金融数据安全 数据安全分级指南》)。定完级之后,加密、脱敏、访问控制、出境评估、留痕审计这些要求才有落脚点——级别是所有后续管控措施的挂载点。级别定错,后面全错。
为什么它难:难点不在概念,在量。一家中型金融机构,几十个业务系统、几万到几十万个字段,靠人一个个判。判的人不同,结果就不同;判完还要定期复核。这是典型的\"规则清楚但工作量大、且高度依赖判断\"的活——看起来正是大模型该上场的地方。
那它到底行不行?这就是这个项目要回答的。
这个项目的起点
一家金融机构,两个业务系统,合计 85179 行元数据——所谓元数据,就是\"这个库里有哪些表、表里有哪些字段、字段的注释写的是什么\"。
没有样本值。一条真实数据都看不到。出于合规要求,数据内容不能出库,我们能拿到的只有字段名和注释。这是很多单位的真实处境,也是这个项目最关键的约束:不能看数据,只能看字段说明,还要判断它是什么。
机构已经有一份人工做的分类分级台账,可以当真值(ground truth)用。但这份台账本身有多少噪声,没人知道。——记住这句话,它是后面整个故事的引信。
五个术语,读这篇够用了
类目:这个字段属于哪一类数据(如\"交易基本信息\"\"财务会计信息\"\"个人信息\")。 级别:数据的重要/敏感程度,本项目用的体系分若干级,级别越高管控越严。 台账:机构现有的那份人工标注结果,本文把它当作对照基准之一。 敏感召回:真正该被标为敏感的字段里,有多少被识别出来了。漏判就是没识别出来的那部分——这是分类分级里代价最高的错误。 Kappa 系数:衡量两个人(或两套结果)一致程度的统计量,扣除了\"瞎蒙也会碰对\"的部分。0.6 以上通常被认为\"较好\",0.8 以上才叫\"很好\"。
这篇讲什么
从这个起点,到最后写成一篇论文,中间跑了 12 轮实验(我按 P0 到 P11 编号)。
这篇按真实顺序讲完整过程,包括三次把自己打脸的经过——其中一次花了两千多次 API 调用,最后净成果为零。
那三次才是最值钱的部分。
一、第一个发现:这件事的工作量被高估了一个数量级
P0 做数据底座的时候,顺手做了一个统计,结果让整个项目的目标直接改了。
我们检查\"级别\"和\"类目\"之间的关系,发现:
85179 行里,只有 5 行的级别偏离了它所属类目的应有级别。 敏感标又是级别的确定性函数——零偏离。
翻译成人话:只要判出类目,级别和敏感标查表就能得到,不需要单独判断。
这个发现让预测目标从\"三个任务\"坍缩成\"一个任务\"。更重要的是它的现实含义:很多单位把分类、定级、打敏感标当成三件事分三轮做,实际上只有第一件是真正需要判断的,后两件是映射关系。
如果你们单位正在按三件事排工期,可以先跑一下这个统计。方法很简单:按类目分组,看每组内部的级别取值是不是唯一。
顺带也发现了台账的问题,这构成了后面所有事情的背景:
- 库级标签只有单一取值(等于没标)
- 表级与列级标注仅 48% 一致
- 18.6%
的同名字段级别冲突
* 49.8%
的跨系统类别冲突
* 抓到真实误标:CLIENT_SECRET、SECRETKEY 被标成第 2 级;折旧费用、资产残值被标成非敏感
这些数字当时被当成\"数据质量问题\"记下来,后来才发现理解错了。 这是第二次打脸的伏笔。
二、传统方法:全线崩盘
P1 做了五档基线:多数类、字段名字典、规则+字典、TF-IDF 分类器。
切分方式是留一系统交叉验证(用一个系统训练,在另一个系统上测),同时在系统内按判定单元切分,杜绝泄漏。
结果:跨系统 Macro-F1 最好的一档只有 0.087。
这不是\"效果不好\",是根本不能用。原因也很清楚:两个系统的字段命名习惯、业务语义、类目分布几乎不重叠,字典和统计特征学到的东西换个系统就完全失效。
这一步的价值不在于结论本身,而在于它确立了评测口径:以后任何方法,都必须在\"没见过这个系统\"的前提下证明自己。这个口径后来救了我们好几次——因为很多看起来有效的东西,一换系统就现原形。
三、大模型级联:第一次看到希望
P2 上大模型。架构是规则层 + LLM 级联:
- 规则层先处理确定性的部分(覆盖 34%,另有 17% 做抑制)
- 剩下的交给大模型,带脱敏出域 + 少样本检索 + 76 类的 prompt
- 模型用的是境内的 DeepSeek(境外 API 默认拒绝,数据出境合规是硬约束)
P3 把 76 个类目归并成 18 个(零跨级别合并,不改任何一行的级别),P4 跑两折交叉验证。
结果对比:
| 敏感召回 | 漏判敏感 | 低估率 | 类目 MacroF1 | |
|---|---|---|---|---|
| LLM 级联 | 66.06% | 3453 | 4.24% | 0.24 |
| 最好基线 | 19.32% | 8208 | 9.47% | 0.18 |
最有说服力的是其中一折:财务总账那一侧的训练数据里几乎没有个人信息字段,模型在另一个系统上的敏感召回仍然有 69%。
这支撑了一个对落地很重要的判断:不需要见过同类样本,只要有清晰的类目定义,模型就能判。 对于\"我们没有标注数据所以做不了\"的单位,这条是关键。
到这里为止,一切顺利。然后开始连续打脸。
四、第一次打脸:模型自报的置信度是废的
P6 想做人机分流——让模型把没把握的挑出来给人复核。最自然的做法是用模型自报的 confidence 排序。
结果是这个信号完全不能用:
- 54.6% 的样本,confidence 恰好等于 0.9。
分布近似常数,根本没有区分度。
* 校准是非单调的
:0.9–0.95 这一档的敏感漏判率 61.6%,反而高于 0.8–0.9 档的 36.6%。也就是说,模型越\"自信\"的那一档,错得越多。
* 按置信度升序复核的提升倍数只有 0.86–1.36,与随机抽查基本没有区别。
如果你正在用模型自报的置信度做复核排序,这件事大概率没有产生任何价值。 它看起来很科学——有分数、能排序、能画图——但它和随机抽一样。
替代方案不是没有:自洽性投票(同一条问多次看分歧)、规则层的风险位,都比自报分数可靠。但自报分数必须先被排除掉,否则后面所有人机协同的设计都建立在沙子上。
五、第二次打脸:漏判的原因,跟我想的完全相反
同样在 P6,我们把 3453 条漏判逐条归因。
原本的假设很合理:元数据信息太少,模型没法判——字段没注释、ERP 弹性域字段名零语义(SEGMENT、ATTRIBUTE 这类),这些应该是漏判主力。
实际结果:
- 无注释的:2 条(0.1%)
- ERP 弹性域的:113 条(3.3%)
- 其余 96.7% 发生在注释完整、字段名有语义的字段上
假设被直接推翻。漏判不是信息不足。
那是什么?继续拆,答案是口径分歧,而且高度集中:
- 财务会计 1656 + 管理会计 472 + 税务 142 + 金额 136 + 财务支出 38 = 2444 条,占 71%
- 开发类数据 715 条,占 21%
- 合计 92% 集中在三个类目上
这是一个边界问题,不是能力问题。
于是判断变了:不需要换更强的模型,需要把这三个类目的边界说清楚。 这个判断听起来完全正确,也确实是对的——但接下来花了三轮实验、两千多次调用才发现,\"说清楚\"这件事做不到。
六、第三次打脸:最贵的一次,也是最有价值的一次
P8 的设计很直接:既然是边界问题,那就在 prompt 里写三条边界硬约束(B1、B2、B3),专治那三个类目对的混淆。
第一轮结果好得惊人:
| 臂 | 敏感召回 | 漏判 | 敏感精确 | 误报 |
|---|---|---|---|---|
| A 基线 | 59.92% | 1047 | 72.49% | 594 |
| C 加边界约束 | 75.50% | 640 | 52.35% | 1795 |
敏感召回 +15.58pp,漏判少了 407 条。三个目标类目的原类目命中率从 8.16% 涨到 47.32%,5.8 倍。
看起来找到金矿了。然后做了一件很多人会跳过的事:把每一条改判拆开,看它到底是\"修复了漏判\"还是\"制造了误报\"。
- B2
(系统运维数据 → 开发类数据):修复 320,误报 0,净 +320
* B1
(交易基本信息 → 财务会计信息):修复 4,误报 760,净 −756
* B3
(元数据信息 → 管理会计信息):修复 2,误报 314,净 −312
结论完全翻转:
- B1 迁移了 764 条,其中 760 条是误报。
我原本在报告里写它\"是想要的方向\"——错得离谱。
* 全部收益几乎来自 B2 一条
,它零误报。
* B1 + B3 合计制造了 87% 的误报。
那就简单了:删掉 B1、B3,只留 B2,应该能拿到 +320 且几乎无代价。
这个推论是错的,而且错得很彻底。
同一段文本,效果从 +320 变成 0,再变成消失
我们跑了两个收窄版本。B2 的文本一个字都没改。
| 版本 | 条款 | B2 方向的效果 |
|---|---|---|
| v1 | 三条都有 | +320 |
| v2 | 删 B3,B1 收窄 | ≈0 (该迁移方向几乎消失) |
| v3 | 只留 B2 | 完全消失 |
更离谱的是 v3。只留一条窄条款,结果冒出来两个与 B2 毫不相干的迁移方向:交易基本信息 → 财务会计信息 354 条(0 修复 / 354 误报,而 B1 明明已经被删了)、财务会计信息 → 系统运行信息 332 条——后者是降级方向,只在这一臂出现,直接制造新漏判。
v3 成了五臂里最差的一臂:敏感召回比基线还低 11.60pp,漏判 +303。
结论:在这个任务上,prompt 里的约束不能当作可独立增删的模块。 逐迁移归因能准确描述\"这一臂内部发生了什么\",但不能用来预测\"改了条款之后会发生什么\"。约束之间相互影响,是一个整体,不是可加的零件。
三轮实验、约 2400 次调用,净可落地成果为零。
七、补刀:连\"省钱版\"也被证伪了
P8 结束时还剩一个假设:v1 的收益,会不会根本不是\"消歧\",而只是三条激进指令共同造成的整体上提偏置?
证据看起来支持这个猜测——v1 的收益集中在召回(+15.58pp)而精确率大跌(−20pp),这正是\"整体调高判定阈值\"的典型形态。
如果成立,那就有个好消息:同样的效果可以用零 API 成本的后处理规则复现,而且可控、可回滚。
P11 就是去验证这件事的。设计上特意防了自证:规则从一折推导,在另一折评测,绝不在同一批数据上既选规则又报指标。
两种失败方式:
一是能复现偏置,但性价比差一倍多。 敏感召回 +18.40pp,漏判少 390,但误报多了 2568,代价函数反而变差。救回与误报之比约 1 : 6.6,而 v1 是 1 : 3。
二是规则完全不跨系统泛化。 反方向推导出来的三个类目,在另一个系统里根本不会被预测出来,于是上调前后指标一字未变。这和 P1 里传统基线跨系统崩塌是同一个病:规则绑在类目上,而两个系统的类目分布几乎不重叠。
力度曲线从阈值 200 扫到 −1000,每一档都比不做上调更差。
于是得到一对互补的负面结论:
- 不可分解
(P8):约束的效果无法归因到单条,无法预测组合结果。
* 不可替代
(P11):其效果也无法用确定性后处理复现,说明它不是简单的阈值偏置——模型读到边界条款后确实做了某种真实的判别。
工程含义很硬:这条路要么整体照搬 v1(连同它 52% 的敏感精确率一起接受),要么放弃。没有中间态——不能拆开挑好的用,也不能用零成本手段模拟。
八、转折:那个数字终于来了
前面所有实验都有一个共同的隐含前提:存在一个\"对\"。
模型类目准确率 58%,听起来很差——差在哪里?和什么比?默认答案是和 100% 比。
于是我们做了一件很少有单位会做的事:把台账放到一边,请人重新标一遍。
具体做法是从全量数据里分层抽了 799 个字段,做成标注包发给专家,让他在不看台账的前提下,按类目体系独立判定。
P7 是第一位专家的结果:专家与台账只对上 54.94%,Kappa 0.4412。当时的结论写的是\"类目体系的人工可复现性不达标\"。
但只有一位标注人时,无法区分\"体系边界不清\"和\"这位标注人口径特殊\"。必须补第二位。
P10,第二位专家的结果回来了:
两位受过训练的专家,背对背标同一批字段,类目一致率 67.96%,Cohen's Kappa 0.6012。
这个数字改变了前面所有指标的读法。
模型的类目准确率不该和 100% 比,该和\"两个人独立判只能对上 68%\"比。P7 那个 0.44 也要修正——它是专家与台账之间的值,含标注人个体漂移;专家之间的真实上限是 0.60。
这件事的意义超出这个项目本身。绝大多数单位验收分类分级的方式是\"抽检若干字段,看填得对不对\",而这个做法有个从未被验证过的前提:存在一个\"对\"。如果两位同样受过训练、同样看着你们类目体系文件的人会给出不同答案,那\"抽检对不对\"本身就不成立——抽检结果取决于抽检人是谁。
所以在评价任何工具、模型或团队产出之前,先量一量你们自己的人和人之间能对上多少。这个数是所有后续讨论的地基。
顺带说一句,为什么必须是背对背:两人互相不知道对方答案,也都不知道台账怎么标的。一旦有人先看到了台账,测出来的就不是一致率,是从众率。
九、最诚实的一段:模型并没有赢
拿到两位专家的结果后,我们取了共识子集——两位专家类目判定一致的 543 条(占 68.0%),这是目前最干净的真值代理。
在这个子集上评:
- 模型
:类目 58.64%|级别 89.32%|敏感召回 71.32%|敏感精确 83.62%|漏判 39
* 人工台账
:类目 68.14%|级别 85.82%|敏感召回 67.65%|敏感精确 74.19%|漏判 44
模型在级别和敏感维度略优,在类目维度略劣。但做了显著性检验之后:
- 敏感召回 McNemar p = 0.4421
- 类目准确 p = 0.7770
全都不显著。
这意味着一句话:模型与现行人工口径打平,谈不上超越。 这和 P7 用一位专家时的结论一致,而且更可信。
我知道写成\"大模型超越人工\"会好看得多,也更容易传播。但 p = 0.44 就是 p = 0.44。在这个位置上让步一次,整篇论文的可信度就全没了。
还有一个必须同时说明的边界条件:共识子集天然偏易(两个专家都能对上的,本来就是好判的),绝对值系统性偏高,只有模型与台账的相对高低可比。
十、写论文时,砍掉了一个自己的结论
最后说一个和写作有关的决定。
项目里有一条设计决策:保留 76 类的 prompt(归并只用在评测层和输出层)。依据是 P5 的消融实验——\"连 prompt 一起归并会让敏感召回下降\"。
写论文时回头核对这条证据,发现它很弱:
- 两折平均敏感召回 66.06%(保留 76 类)对 65.31%(直接 18 类),只差 0.75pp
- 而且在财务总账那一折上,18 类反而更好——漏判更少,MacroF1 也更高
- 优势只在另一折上成立
第三个系统客户确认不会提供,第三折的路断了,没法再验证。
按常规操作,这种情况写成\"实验表明保留 76 类更优\"也不会有人质疑——差异是正的,方向是对的。
但我们最后的处理是:如实写成证据不足。
论文和对外材料里都不得写\"P5 证明保留 76 类更好\",只能写成:两折结果方向不一致,差异 0.75pp,证据不足以支撑任一方向,现行实现沿用 76 类属工程惯性,不是实验结论。
一个方向不一致、差异 0.75pp 的结果,本来就不该被叫做\"证明\"。 这种地方守不住,后面那些真正扎实的结论也会变得可疑。
十一、真正能落地的东西,反而最便宜
跑了 12 轮实验,最有落地价值的发现不在模型那一侧。
第一件:口径文档能直接买到一致率。
第二轮标注的说明页里,我们新增了 8 条类目边界澄清。效果是立竿见影的:
- 与台账的整体一致率:专家 1 是 54.94%,专家 2 是 61.58%,+6.64pp
- 第一轮出现的四个系统性漂移类目全部收敛
- 专家 2 与模型的一致率 61.04%,远高于专家 1 的 41.81%
两页纸的口径说明,换来 6.64 个百分点。 对比一下:我们在 prompt 上折腾了三轮、两千多次调用,净收益是零。
第二件:台账修订工单。
173 条(21.7%)是\"两位专家意见一致、且都与台账不同\"——这是\"台账该改\"最有力的证据类型,其中 45 条是专家判得更高(台账疑似漏保护)。这份清单可以直接当工单派下去。
另外在全量数据上,模型高置信但与台账不一致的有 7762 行,其中模型判得更高的 4943 行——疑似台账漏保护,可作为复核优先队列。
十二、如果你要复现这件事
按时间顺序,这是我认为最省事的做法:
- 先算\"级别是不是类目的函数\"。
一条 SQL 的事,可能直接帮你砍掉三分之二的工作量。
2. 先做台账质检,别急着上模型。
库级标签是否单一取值、表级与列级是否一致、同名字段是否级别冲突——这三项能暴露大部分问题。
3. 两位标注人背对背,先量人类一致率上限。
没有这个数,你后面所有指标都在和一个不存在的 100% 比。
4. 评测口径必须是跨系统的。
同系统内的好成绩没有意义,换个系统就崩。
5. 把钱花在口径文档上,不是调 prompt 上。
前者 6.64pp,后者两千次调用换零。
6. 任何改判都要拆成\"修复\"和\"制造误报\"两类看。
只看总指标,你会把 760 个误报当成功劳。
总结:负面结论为什么值钱
这个项目最终写进论文的核心内容里,有一半是负面结论:
- 模型自报置信度不可用于人机分流
- 漏判不是信息不足,是口径分歧
- prompt 约束不可分解、不可组合、不可预测
- 其效果也不可用确定性后处理替代
- 模型与人工口径打平,未超越
这些结论没有一个能让人兴奋。但它们有一个共同特点:每一条都能帮别人省掉一段弯路。
模型自报置信度那条,能帮一个团队省下整套人机分流的设计工作;prompt 不可分解那条,能让人不必重复我们那两千多次调用;而\"两个专家只对上 68%\"那条,能让一个单位第一次知道自己的验收标准立在什么上面。
这个领域不缺方法论 PPT,缺的是有人把真做下去会撞到什么如实写出来。 负面结论恰恰是最稀缺、也最没人愿意写的东西——因为它不好看。
最后回到最开头那个问题:大模型到底能不能做数据分类分级?
这个项目给出的回答是有条件的:能做,但它现在的位置不是\"替代人\",是\"和现行人工口径打平,且能把台账里最该改的地方挑出来\"。 在 8.5 万行的规模上,这个位置已经很有价值——它意味着人可以从\"逐条判\"变成\"审可疑项\"。
但它做不到的事同样明确:它的上限被类目体系本身的清晰度卡住,而不是被模型能力卡住。这也是为什么两页纸的口径文档能换来 6.64 个百分点,而两千次 prompt 调用换来零。
而如果你只记住一句,我希望是这句:
在你知道人能做到多少之前,任何关于\"准不准\"的讨论都是空的。
数据核验截至 2026-10-10 · 各行业规范不同,口径以本单位与主管部门要求为准
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论