ChenTW

记录理解世界的方法

·

19 次阅读

当我开始过度相信 AI:一次材料数据库治理失效的反思

这段时间,我在做一个公司信息化建设里的基础数据项目:搭建统一的采购材料库。

这个材料库不是简单的“采购物资清单”,而是要把公司历史上分散在不同部门、不同表格、不同项目里的物料数据,重新整理成一套可以长期使用的标准底库。

原始数据横跨机械、材料、后勤、行政等多个场景,存量记录有几万条。里面既有钢材、水泥、管件,也有车辆、机械配件、办公用品、生活物资;同一种东西可能有不同叫法,不同部门可能使用不同单位,名称和规格还经常混在同一个单元格里。

有些数据看起来只差一个括号、一个型号、一个单位,但实际上可能代表完全不同的物料;有些记录看起来不同,清洗以后又会发现其实是同一个东西。

最终要完成的,不只是“把数据合并”。

而是要把这些历史数据经过清洗、拆分、去重、标准化、分类、人工复核以后,整理成一套能够真正进入信息化系统长期使用的材料数据库。

这个项目我主要借助 DSH 这样的 Agent 来推进。

我原本认为,这类项目其实非常适合 Agent。

它可以同时读取很多 Excel,可以批量处理,可以写脚本,可以做分类,可以对规则进行反复检查,还可以通过 Git 保留每一次修改过程。

一开始,效果也确实非常好。

直到项目越做越深,我才慢慢发现:

我对 Agent 的能力边界,产生了一个很自然、但并不准确的理解。


一、AI 最危险的时候,不一定是它算错了

整个项目其实并不是没有治理。

从比较早的时候开始,我就已经建立了 Git、基线文件、专项审计、人工确认、会议结论等机制。

按照我过去做软件项目的经验,这套管理方式已经不算松。

但随着数据不断被清洗、分类、修订,还是开始出现一些很奇怪的问题。

昨天已经确认修掉的错误,今天又重新进入人工复核表;

会议中已经确认的名称和规格,没有完整进入最终 Demo;

不同阶段生成的文件,被重新组合以后,又形成了一个新的“当前结论”。

最典型的一次,是 AI 给了我一个非常完整的汇总:

当前只剩 40 多项遗留问题。

这个结果看起来没有任何异常。

有问题分类,有数量统计,有表格,还有处理建议。

如果只看这份报告,很容易产生一种感觉:

项目已经基本收口了。

但继续往下追以后,我才发现,其中一个所谓的“一级分类为空”,背后其实对应了 263 条不同的底层记录。

继续展开以后,真正需要进入人工复核范围的记录变成了 311 条。

这里其实不能简单说 AI 算错了。

“40 多项”可能是在统计问题类型;

“311 条”统计的则是受影响的底层记录;

而真正需要多少次人工独立判断,又可能是第三个数字。

问题出在:

我没有在任务开始时把统计粒度定义清楚。

而 AI 非常认真地完成了它所理解的那个任务。

这件事情对我的冲击反而比一次明显算错更大。

因为明显错误很好发现。

真正危险的是:

AI 在一个不够准确的问题定义下,生成了一个非常完整、非常专业、甚至逻辑完全闭合的结果。

如果人看到“40 多项”以后就停止追问,这个结果完全可能以“已完成”的状态进入下一阶段。

所以后来我开始养成一个习惯。

看到 AI 给出的数字,不再首先问:

“算得对不对?”

而是先问:

这个数字到底在数什么?


二、working 文件夹让我第一次真正理解“数据血缘”

这次让我印象最深的,其实还不是数字问题。

而是项目里的一个普通文件夹:

working

项目刚开始时,我把它理解成一个很正常的工作目录。

AI 需要生成一些临时成果,就放进去。

随着工作推进,里面逐渐出现了各种文件:

原始清洗表、

专项分析表、

会议前版本、

会议后版本、

修正版、

审计表、

人工复核表、

补执行版、

内部验证版。

刚开始我并不觉得这是问题。

因为我的潜意识里一直有一个假设:

这些文件既然都是 DSH 在项目过程中生成的,它应该知道它们之间是什么关系。

哪一个是旧版本;

哪一个已经被替代;

哪一个只是审计文件;

哪一个才是当前最新的数据源。

后来我发现,这其实是我自己的想象。

对于我来说,这些文件组成了一段有连续性的项目历史。

我知道昨天下午为什么生成这个表,晚上为什么又修了另一版,也知道哪次会议推翻了此前的一个结论。

但如果项目没有把这些关系显式记录下来,那么对 Agent 来说,这些文件首先只是:

一组现在可以读取的文件。

文件名、修改时间、Git 历史都能提供线索。

但线索不等于关系。

Git 可以告诉它:

某个文件什么时候被修改;

哪个 commit 增加了哪些内容。

但 Git 并不会自动告诉它:

这个文件现在已经失去业务效力;

那个表只能用于追溯,不能再次参与生成;

这次人工会议已经覆盖了此前的 AI 分类;

Demo 必须从哪一个唯一基线继续派生。

于是项目里真正发生了一次“双链分叉”。

一条链里,会议确认后的数据已经继续修正;

另一条链里,Demo 数据却还在沿着旧基线继续往后生成。

两条链都能正常工作。

两边的文件也都是真实的。

甚至两边的 Git 都没有问题。

但它们已经不属于同一个“现在”。

最后就出现了一个很荒诞的现象:

昨天已经处理掉的问题,今天又重新被 AI 当成待处理问题。

这件事让我第一次真正理解:

文件存在,不等于关系存在。

版本存在,也不等于血缘存在。

如果没有显式定义来源、继承、替代和失效关系,一个越来越大的工作目录,最后很容易变成一个“数据沼泽”。

里面所有东西都可能是真的。

但你已经不知道:

哪一个真,才是当前应该相信的真。


三、我把“Agent 能连续执行”,误认为了“Agent 会连续治理”

这其实是我这次最核心的误解。

过去我一直认为,DSH 已经不是普通聊天机器人了。

它是 Agent。

它可以读文件、写文件、执行命令、运行脚本、检查 Git、连续完成多步任务。

所以我自然会觉得:

既然它拥有这么强的项目操作能力,那么它应该也会自然维护项目状态。

现在看,这两件事情并不是一回事。

Agent 能连续执行任务,并不等于它会自动维护项目级的强一致状态。

它可以根据文件名、内容、时间和上下文,推断哪份文件最可能是最新版本。

但“推断最新”与“项目已经正式定义唯一事实源”,完全是两个概念。

它可以记得此前的一些结论。

但“有记忆”也不等于“当前状态已经被严格维护”。

它可以读取 Git。

但 Git 解决的是版本历史,不是业务效力。

这也是为什么我现在觉得,简单说“AI 会忘”其实不够准确。

这次真正暴露的,更像是:

我把记忆,当成了状态管理。

又把:

自主执行,当成了自主治理。

我之前潜意识里把 Agent 想成了一个长期连续工作的工程团队。

昨天做过什么,今天自然知道;

昨天废弃什么,今天自然不会再使用;

昨天确认的规则,今天自然会继续继承。

但实际上,如果这些关系没有在项目结构中被明确记录,Agent 仍然要重新判断。

而只要需要重新判断,就存在重新解释的空间。

所以现在我会把这个区别记得非常清楚:

Agent 负责执行连续性。

项目结构负责状态连续性。

这两件事不能混为一谈。


四、数据项目也要尽早建立“基本法”

这次还有一个让我重新认识的问题,就是我一直习惯使用的“基本法”。

过去在做软件项目时,我通常会在项目已经比较成熟以后,专门整理一份基本规则。

例如:

哪些架构不能随便改变;

哪些规则优先级最高;

哪些结论已经冻结;

哪些临时需求不能推翻全局设计。

以前我一直认为,这套东西主要是为了防止软件开发后期跑偏。

这次才发现:

复杂的数据分析、数据清洗、数据整合项目,其实更需要,而且应该更早建立。

因为数据项目最容易出现的不是代码突然坏掉。

而是:

规则一点一点变化。

比如材料数据库里,很多事情刚开始都可以探索:

什么算重复;

名称怎么标准化;

名称和规格如何拆分;

单位不同是不是同一物料;

包装不同是不是不同 SKU;

分类冲突时谁优先。

前几轮探索本身没有问题。

问题是,一旦这些规则逐渐稳定,就应该立即从聊天记录、专项报告和临时提示词里抽出来。

把它正式写成项目规则。

否则随着项目继续推进,人和 AI 都会越来越容易受局部问题影响。

某一次遇到特殊案例,临时修改了一条判断逻辑;

下一轮 AI 看到这次修改,又可能把它理解成新的全局规则;

过几轮以后,人自己也已经记不清:

这到底是一个例外,还是正式规则已经改变。

项目往往不是某一天突然彻底错误。

更多时候,是在很多次“看起来都合理”的微调里一点点漂移。

所以以后我会把这类数据项目明确分成两个阶段:

前期允许探索。

主要口径稳定以后,立即立法。

而且规则本身也要版本化。

以后每一次 AI 执行,都应该能明确回答:

当前使用的是哪一版数据;

哪一版规则;

人工结论与 AI 判断冲突时谁优先;

这一次临时处理是否允许改变全局规则。


五、以后同类项目,开工时先把这些词写死

后来我把这次问题重新整理了一遍。

其实最终只需要管理好两件事情。

第一件事是:

什么是当前事实。

这依靠数据血缘、当前基线、唯一事实源和版本替代关系。

第二件事是:

按照什么规则解释当前事实。

这依靠基本法、规则版本、规则优先级和人工确认。

两者缺一个都不行。

只有规则,没有血缘,可能拿着正确规则处理旧版本数据。

只有血缘,没有规则,又可能拿着正确数据不断改变解释口径。

所以以后再做类似的材料库、数据库清洗、历史数据整合、主数据治理项目,我不会再等问题出现以后补治理。

开工时就要提前把一组关键词写进项目结构:

唯一事实源(SSOT)

数据血缘(Lineage)

当前基线(Canonical Baseline)

派生关系(Derived From)

替代关系(Superseded By)

废弃状态(Deprecated)

输入白名单(Allowed Inputs)

规则版本(Rule Version)

规则优先级(Priority)

人工确认覆盖(Human Override)

例外边界(Exception Scope)

人工复核粒度(Review Granularity)

这些概念不一定都要做成复杂系统。

甚至第一版完全可以只是一个清晰的目录、一份 manifest、一份规则文件和几个强制字段。

重要的不是形式。

而是:

不能再把这些关系留给 Agent 自己猜。


回头看,这次真正的问题并不是 DSH 本身做错了什么。

相反,它完成了大量过去可能需要人工花很多天才能完成的事情。

问题在于,我因为它已经是 Agent,就无意中又往前多推了一步:

我以为它既然能够自主工作,就自然会维护整个项目的秩序。

这次之后,我不会再这样理解 Agent。

对我来说,今后这类项目有三句话应该在第一天就写下来:

Agent 负责执行,不等于负责治理。

记忆不等于状态,Git 不等于血缘。

先定义什么是真的,再定义按什么规则处理,最后才让 AI 去做。

这可能才是我这次材料数据库项目真正留下来的东西。