第一百八十四章 注册证
周宁是在周五上午发来的。
不是文件,是文件清单——一份Excel,三十一行,每行一个文件名,旁边有三列:文件类型、所属公司、备注。备注那列大多是空的,偶尔有几行写着「扫描件」或者「见附件」,用括号附在文件名后面。
陆衍把清单打开,看了一遍,然后又看了一遍。
医疗器械行业的文件有一种他在前两个项目里没见过的结构。
制造业的文件是横向的——这份文件引用那份文件,那份文件支撑这个认证,认证对应这段合同,链条是平的,一条线展开。生物技术的文件是纵向的,同一个项目有多轮版本,每轮版本对应一个阶段,更像是一棵树,主干往上,枝干往旁边展开。
医疗器械的文件是层叠的。
他在清单里看到的那个词反复出现:注册证。注册证 A,注册证 B,注册证变更申请,变更批复,注册证附件,续期申请,续期批复——这些不是同一件事的不同版本,是同一件事在不同时间点的不同状态,每个状态都有自己的一套文件,但彼此之间有引用和依赖关系,如果只看单个文件,会漏掉它们之间的连接。
他把这个判断在脑子里过了一遍,然后给卫越发消息:「你看清单了吗?」
卫越回了一条语音。
「我看了,我有个问题。」语音里卫越的声音有点慢,像是在边说边想,「我们的字段别名表,现在的结构是平的——「注册证号」「证书编号」「证号」,都指向同一个标准字段。但如果有主注册证和附件,同一份文件可能有两个「注册证号」,一个是主证,一个是附件的,它们不是同一件事,不应该映射到同一个字段。」
陆衍听完,把语音又点了一遍,把卫越说的话在脑子里展开。

主注册证号和附件证号——两个字段名在字面上可能相同,但指的是不同层级的认证,一个是产品获批的主体凭证,一个是对主体的补充或变更。如果工具把它们识别成同义词,后续矛盾扫描里一旦两个号码不一致,工具会报一条高置信度矛盾,但实际上不一定是矛盾——可能只是层级关系没有被正确处理。
「你的意思是,字段别名表需要加层级,」他回了一条文字,「不只是名字映射,还有字段的从属关系。」
「差不多是这个意思,」卫越回,「但如果要改,现在的结构得重写一部分。」
陆衍在椅子上坐了一会儿,想这件事。
改结构这个决定不难做,难的是什么时候改。现在还没有对这批文件跑过任何东西,不知道字段层级的问题在这批文件里是偶发的还是普遍的。如果只有一两份文件有这个问题,改结构的代价可能比维持原结构手动处理那几条要大。如果层级问题普遍存在,不改结构就会让整个扫描结果失真。
他给卫越打了电话。
「先跑一遍,」他说,「用现在的结构,不改,先跑预处理。跑完我们能看到有多少条待确认字段,里面有多少条是因为层级问题触发的,到时候再决定要不要改结构。」
卫越停了一下,「如果跑完发现层级问题很多,我们还得回来改,相当于跑了两遍。」
「是,」陆衍说,「但如果不跑直接改,我们改的是一个假设,不是一个被数据支撑的判断。先跑一遍,花一天,换一批真实数据,值得。」
电话那头安静了几秒。

「好,」卫越说,「我把文件下载下来,今晚跑预处理。」
当天下午,霍建新发来一条消息。
不是关于医疗器械项目的,是关于另一件事:「上次那个报告,我们所里另一个合伙人看了,问了我两个问题,我不确定该怎么回。」
陆衍把消息看完,回了一句:「什么问题。」
「第一个问题:」霍建新发来,「这个工具是不是只看文件本身,不联网查外部数据库?」
「对,」陆衍回,「工具只处理输入的文件,没有外部访问。」
「第二个问题,」霍建新继续,「报告上那个边界说明,「工具不了解书面说明文件之外的上下文」——他问这句话是什么意思,是工具的局限,还是免责声明?」
陆衍把这个问题在脑子里停了一下。
这两个解读不是互斥的,但也不是同一件事。说它是局限,是在说工具做不到某件事;说它是免责声明,是在说工具不对某件事负责。两个解读都有道理,但说清楚这个区别需要解释为什么工具做出了这个选择,而不只是说它做了什么。
他想了几分钟,然后回了一条稍微长一点的消息:

「两个都是,但顺序不一样。工具只处理文件里能看到的内容,这是设计选择,不是技术限制——我们可以让它去查外部数据库,但不做,因为一旦引入外部数据,结论的来源就模糊了,你很难区分这条发现是文件里来的还是外部来的。边界说明是在告诉用户,你手头的其他信息需要你自己判断,工具不替你做这一步。所以先是局限的说明,然后才是责任的划分。」
他把消息发出去,等了一会儿,没有立刻收到回复。
大约二十分钟后,霍建新回了一条:「我把这段话复制给他了,他说「说得清楚」。他想约个时间了解一下,说是他手上有个项目,文件结构比较复杂。」
陆衍看着这条消息,把它读了两遍。
律所内部的合伙人主动要约时间——这不是被动接单,是产品开始被内部转介绍。
他没有马上回复霍建新,先给卫越发了一条消息:「宸恒律所另一个合伙人想了解咱们的工具,霍建新转介绍的。你今晚跑预处理,如果结果出来了,明天发我一下,我想看一眼数字。」
卫越回了一个「好」,然后停了一下,又发了一条:「是那个层级结构的问题触发了,还是别的?」
「还不知道,」陆衍回,「明天看数据。」
他把手机放下,看了一眼窗外。楼下的街道在下午的光里有一点褪色,行人走得慢,公交车停在站台边,门开着,人上人下。
第三个项目还没有正式开始,第四个已经在敲门了。

晚上卫越发来消息:「预处理跑完了,待确认字段十七条,里面有五条是注册证相关的,都是层级问题——主证和附件的证号被识别成同义词了。」
陆衍看了一眼时间,十点半。
「好,」他回,「明天我们讨论一下字段别名表怎么改。你先把那五条标出来,看看能不能在不改底层结构的情况下,用字段标注解决——给每个字段加一个「层级」属性,主证是主层,附件是子层,映射的时候分开处理。」
「这个方向可以,」卫越回,「但得改映射逻辑,不只是别名表。」
「我知道,」他回,「改了这一块,后面遇到同样结构的行业就省事了。医疗器械不会是最后一个有层级关系的行业。」
那边安静了一会儿,然后卫越发来一条:「你今天是被那个合伙人那条消息打动了,还是本来就想改?」
陆衍想了一下,回了一条:「本来就想改,但合伙人那条消息让我想快一点。」
卫越发来一个「明白了」,然后说晚安。
陆衍把手机放下,把本子翻到今天这一页,在底下写了一行:
「字段层级——医疗器械暴露,但不只是医疗器械的问题。通用结构改一次,后面遇到就直接用。」