第十七种回避

招魂者 · 2026/5/14

第十七种回避

陈屿发现第十七种回避的那天,深圳下着一种很细的雨。

不是那种让伞都撑不住的暴雨,也不是那种可以忽略不计的毛毛雨,而是刚好让你觉得需要打伞、但打了伞又觉得自己矫情的那种。这种雨在深圳很常见,像城市的某种低频噪声,存在感弱,但持续不断。

他在”鲸落科技”十八楼的工位上,面前是三块屏幕。左边跑着实时风控日志,中间是代码编辑器,右边是通讯软件。风控日志在滚动,绿色的、黄色的、红色的条目交替出现,像一条永不停歇的河流。陈屿已经在这条河边坐了三年。

鲸落科技是一家互联网金融公司,做消费信贷,用户量两亿三千万,日均放款额四十个亿。陈屿的工作是维护风控引擎——那套决定给谁放款、给谁拒绝、给谁降额、给谁提额的算法系统。说白了,他就是那个说”不”的人。不是他本人说,是算法替他说。

鲸落的风控引擎叫”沧溟”,名字是创始人起的。创始人叫贺鸣,四十出头,早年在中信做投行,后来跳出来做互联网金融,赶上了消费金融的黄金年代。贺鸣喜欢读《庄子》,“沧溟”出自”北冥有鱼,其名为鲲”。鲸落这个名字也是他起的——“一鲸落,万物生”。贺鸣在A轮融资路演的时候说过这句话,后来它被印在了公司的文化墙上,就在前台接待处的后面,用金色的字,旁边是一条用点阵组成的鲸鱼。

陈屿对这些东西没有太大感觉。他不在意公司叫什么名字,不在意文化墙上写了什么。他在意的是沧溟的拒绝逻辑是否准确,逾期率是否控制在预期范围内,特征工程是否需要更新。

沧溟的拒绝逻辑分为十六种,每一种对应一个风险维度:

第一种:收入负债比过高。 第二种:多头借贷——同时在五家以上平台有在贷余额。 第三种:近三十天硬查询次数过多。 第四种:设备指纹异常——同一设备注册多个账号。 第五种:社交网络关联风险——申请人的手机通讯录中存在逾期用户。 第六种:地理位置异常。 第七种:行为特征异常——申请时陀螺仪数据显示设备处于不稳定状态,疑似中介操作。 第八种:证件信息不匹配。 第九种:历史逾期记录。 第十种:司法涉诉记录。 第十一种:关联企业风险——申请人为失信企业的法定代表人或股东。 第十二种:反洗钱规则触发。 第十三种:申请频次过高。 第十四种:年龄与收入不匹配。 第十五种:工作稳定性评估不通过。 第十六种:模型综合评分低于阈值。

十六种拒绝,覆盖了他们能想到的所有风险场景。每一种都有精确的规则定义,都经过反复验证,都有完整的审批流程。合规部门要求每一条拒绝都必须有据可查,银保监会的检查组随时可能上门。

但陈屿在那天下午三点十七分,发现了第十七种。

事情是这样的。他在做月度风控报告的时候,需要统计上个月所有的拒绝记录,按拒绝类型分组,算出每种拒绝的数量和占比。这是一个例行工作,每个月一次,通常只需要半小时。他用 Python 写了个脚本,从数据库里拉数据,跑了一下。

结果出来的时候,他发现了一个异常。

十六种拒绝类型加起来,总数是4,127,832条。但数据库里记录的拒绝总数是4,127,849条。差了17条。

这个差距很小,小到四百多万条数据里完全可以忽略不计。正常情况下,任何一个数据工程师都会把它归结为数据同步的延迟,或者并发写入时的微小不一致。陈屿自己也这样想过。但他是个有强迫症的人,差一条他都要查清楚。

他打开了那17条记录。

它们散落在不同日期、不同时段,申请人之间没有任何明显的关联。有广东的,有四川的,有黑龙江的。有男有女,年龄从二十二到五十七。申请金额从三千到十二万不等。他们的信用评估结果各不相同——有的确实该被拒绝,有的其实过了阈值。

但它们有一个共同点:拒绝类型字段是空的。

不是 null,不是”其他”,不是系统错误。就是一个空字符串。在十六种明确定义的拒绝类型之外,系统产生了十七次没有分类的拒绝。

陈屿皱了皱眉,开始逐条查看。他调出了这些申请人的完整审批流程日志,想看看沧溟在处理这些申请时到底发生了什么。

第一条记录:申请人何建平,男,四十三岁,湖南邵阳人,在东莞开了一家五金店。申请五万元经营贷。他的收入负债比正常,没有多头借贷,设备指纹正常,社交网络关联干净,模型综合评分78分——远超60分的及格线。按照所有规则,他应该被秒批。

但他被拒绝了。拒绝时间:2026年4月7日,14:23:17。拒绝原因:空。

陈屿继续看下去。

他发现了一个更奇怪的模式。何建平被拒绝之后的三天内,他通讯录里的另外四个人也分别申请了贷款。这四个人分别被第五种拒绝(社交网络关联风险——申请人的手机通讯录中存在逾期用户)拒绝了。但何建平本人并没有逾期。他甚至不是鲸落的用户——这是他第一次申请。

那四个人被拒绝的原因,是因为他们的通讯录里有一个叫”何建平”的人,而系统把这个”何建平”标记为风险关联人。但标记的原因不是何建平做了什么,而是何建平自己被第十七种拒绝拒绝了。

这是一个闭环。何建平被拒绝,没有原因。然后他成了风险关联人,导致他通讯录里的人也被拒绝。而他通讯录里的人被拒绝之后,又变成了新的风险关联人,继续向外扩散。

陈屿往椅背上一靠,盯着屏幕。

他做了一个大胆的假设:第十七种拒绝不是 bug,而是沧溟自己产生的某种规则。一种没有被编写、没有被定义、没有被记录,但确实在运行的规则。

他继续查了剩下的十六条记录。每一条都呈现类似的模式:申请人本身条件良好,被无理由拒绝,然后成为风险关联节点,在社交网络中产生连锁拒绝效应。

十七条原始拒绝,扩散出去,影响了至少七十三个人。这些人的贷款申请被拒绝,其中一些人可能会因此错过一笔生意周转、一次看病的机会、或者一个孩子的学费。

陈屿把数据导出,存到了一个加密文件里,存到了自己的移动硬盘上。然后他关掉了屏幕上的所有窗口,去茶水间倒了杯水。

茶水间的落地窗外面,深圳的细雨还在下。远处是科技园的写字楼群,玻璃幕墙反射着灰白色的天光。陈屿看着那些楼,想:有多少决定,是在这些楼里做出来的?有多少人被拒绝,甚至不知道自己被拒绝了?

他三十一岁,北大信科本科,清华计算机硕士,毕业后在腾讯做了两年后端开发,然后跳到鲸落做算法。他的工资是每月四万八,加上年终奖和期权,年收入大概在八十万左右。他住在南山区的一套一居室里,月租六千五。他的银行卡里有六十多万的存款,是他从毕业开始一点一点攒下来的。

他是一个做拒绝的人,但他自己的生活从来没有被拒绝过。

那天晚上他没有加班。他坐地铁回去了,在小区门口的沙县小吃吃了碗拌面,然后回家躺在床上,盯着天花板,想了很久。

他想起了一个词:传染。

第二天,陈屿去找了他的直属上司陈薇。

陈薇是风控部门的总监,三十八岁,短发,戴一副金丝边的眼镜,说话简洁明了。她是鲸落的早期员工,沧溟系统的架构设计就有她的参与。在公司里,大家叫她”薇姐”,不是因为她有多亲切,而是因为她有多严厉。她的严厉是一种安静的严厉——不会大声说话,不会拍桌子,但她看着你的时候,你会觉得自己做的事情她全都看在眼里。

“你说沧溟自己产生了拒绝规则?“陈薇听完陈屿的汇报,皱了皱眉。

“不是’产生’。更像是……衍生。“陈屿说,“沧溟的社交网络关联模块在处理拒绝记录的时候,把被拒绝的人标记为风险节点。这个逻辑是我们写的,没问题。但问题是,当一个人被拒绝但拒绝类型为空时,系统不知道该怎么处理,于是默认把他归类为’未知风险’。‘未知风险’在权重计算中的得分比’已知风险’更高,因为它不可量化。所以这个人就成了比逾期用户更危险的存在。”

陈薇想了想。“这是 bug。拒绝类型为空不应该发生。查一下是哪里的写入逻辑出了问题。”

“我查了,“陈屿说,“写入逻辑没有问题。十六种拒绝类型各自有独立的写入通道,每个通道都会在拒绝发生的同时写入类型标识。理论上不可能产生空类型。”

“那这十七条记录是怎么来的?”

“我不知道。”

陈薇沉默了一会儿。她拿起桌上的杯子喝了一口水,然后放下杯子,看着陈屿说:“你知道我现在在想什么吗?”

“什么?”

“我在想,这十七条记录是不是你搞错了。”

陈屿没有反驳。他知道在这种时候,最好的做法是把证据拿出来。他从电脑里打开了那个加密文件,把分析结果展示给陈薇看。十七条记录,七十三条扩散记录,完整的日志链条。

陈薇看了很久。

“这些人的扩散拒绝,“她指着屏幕说,“都是正常的第五种拒绝。合规上没问题。”

“合规上没问题,但逻辑上有问题,“陈屿说,“这七十三个人被拒绝的原因,是因为他们关联了一个’未知风险’节点。而这个节点之所以是’未知风险’,是因为系统产生了一次没有原因的拒绝。这等于是一个不存在的罪名,通过社交网络传染给了无辜的人。”

“你说的’传染’,我理解你的意思。但你要知道,风控系统本来就是这样运作的。你跟谁打电话、谁在你的通讯录里、你跟谁合租——这些都是风险评估的信号。一个人身边的人逾期了,他自己的风险确实会升高。这不是我们发明的,银行一直在这么做。”

“但银行不会因为一个没有原因的拒绝,就把一个人标记为比逾期用户更危险的节点。”

陈薇把眼镜摘下来,用衣角擦了擦,重新戴上。“陈屿,我听懂你的意思了。你的发现很有价值。但我需要你做一件事。”

“什么?”

“把这十七条记录的拒绝类型补上。随便归到第十六种里——模型综合评分低于阈值。然后把这些人的关联风险标记去掉,让他们可以重新申请。”

陈屿愣了一下。“就这样?”

“就这样。”

“但问题的根源——”

“问题的根源可能是数据写入时的一个并发冲突,或者缓存失效,或者任何一种我们还没查到的原因。你继续查,没问题。但不要让这些异常记录留在生产数据库里。合规检查下个月就来了,我不希望他们看到空类型的拒绝记录。你知道那意味着什么。”

陈屿知道。那意味着约谈、整改、罚款,甚至可能吊销牌照。互联网金融行业的监管已经越来越严了,每一家公司都在合规的刀尖上跳舞。

“好,“他说,“我去处理。”

他回到工位上,写了一个脚本,把十七条记录的拒绝类型更新为第十六种,然后清除了这些人的风险关联标记。脚本跑完之后,数据库里的拒绝记录干干净净,十六种类型,总计4,127,849条,一条不多,一条不少。

他把脚本保存到了自己的移动硬盘上,连同原始数据一起。

然后他继续查。

接下来的两周,陈屿每天加班到十点以后。他不是在查那个写入 bug——他已经在心里承认,那可能不是一个 bug。他在查的是另一个问题:沧溟的社交网络关联模块,到底是怎么处理”未知风险”的。

沧溟的社交网络模块是陈薇在三年前设计的,后来经历了七八次迭代,但核心逻辑没有变过。它把每个申请人的手机通讯录作为一个社交图谱来分析,计算这个图谱中每个节点的风险权重。节点就是人,边就是关系。如果一个节点是逾期用户,它周围的边会被赋予更高的风险权重。如果多个逾期节点聚集在一起,整个簇的风险权重都会升高。

这个模型的理论基础是”网络传染”——金融风险在社交网络中的传播,跟病毒在人群中的传播有相似的数学结构。这是一个被广泛接受的理论,被全球的金融机构使用。从花旗银行到蚂蚁金服,都在用类似的模型。

但陈屿发现了一个细节。

在社交网络模块的代码里,有一条注释。注释是陈薇写的,日期是三年前,内容是:

// 未知风险节点的权重 = max(已知风险节点权重) * 1.5
// 这是因为未知风险不可量化,保守起见赋予更高权重
// TODO: 后续用更精细的模型替代

这个 TODO 从来没有被完成过。

“未知风险”节点的权重是已知风险节点的1.5倍。这意味着,如果一个人被标记为”未知风险”,他对他社交网络中其他人的影响力,比一个逾期用户还要大50%。

这就是”传染”的机制。第十七种拒绝产生了一个”未知风险”节点,这个节点以1.5倍的力度向外扩散,让周围的每个人都变得更难借到钱。

陈屿开始思考一个更深层的问题:第十七种拒绝到底是怎么产生的?

他把沧溟的核心决策模块翻了个底朝天。这是一个基于梯度提升树的模型,输入几百个特征,输出一个0到100的信用评分。评分低于60分的申请会被拒绝,拒绝类型根据触发规则自动判定。模型本身是确定性的——同样的输入,永远产生同样的输出。

但那十七条记录的申请人,评分都在60分以上。他们不应该被拒绝。

除非模型没有拒绝他们。

陈屿开始怀疑,拒绝他们的不是模型,而是模型之外的某种东西。他查看了沧溟的完整架构图,发现模型只是整个决策流程中的一个环节。在模型的输出之后,还有一个”后处理层”——一个由几十条补充规则组成的规则引擎,负责处理模型无法覆盖的特殊情况。

这个后处理层是两年前加的,原因是模型在某些极端情况下表现不好,需要人工规则来兜底。比如,当模型对某个申请人的评分在58到62之间——也就是在及格线附近——时,后处理层会额外检查一些信号,比如最近的宏观经济指标、同行业的违约率趋势等等,做出最终的通过或拒绝决定。

陈屿打开了后处理层的代码。

代码很长,有两万多行,是多个工程师在不同时期写进去的,风格不统一,有些地方甚至没有注释。他一行一行地读,用了三天时间。

在第四天的晚上十一点,他找到了。

后处理层里有一条规则,编号为 POST_017。这条规则的内容是:

如果申请人的社交网络中存在一个"不可达节点",则拒绝。

“不可达节点”的定义是:在社交图谱中,与申请人直接相连,但自身没有任何可验证信息的节点。没有手机号、没有身份证号、没有任何社交媒体账号——一个纯粹的空白。

陈屿看着这段代码,感到一阵寒意。

他理解了。沧溟在构建社交图谱的时候,不仅分析申请人通讯录中的已知联系人,还会尝试匹配这些联系人的身份信息。如果某个联系人在任何数据库中都查不到——不是查到了不良记录,而是完全查不到——他就被标记为”不可达节点”。

一个人的通讯录里有一个查不到任何信息的人,这在现实中太常见了。可能是存了一个快递小哥的手机号,可能是存了一个只见过一次面的客户,可能是存了一个已经注销号码的旧朋友。这些人不应该构成任何风险信号。

POST_017 规则说:如果他们存在,就拒绝。

陈屿查了这条规则的提交历史。提交人是”chen.wei”,提交时间是两年前的某天晚上十一点四十七分。提交信息只有一个字:fix

陈薇写的。

陈屿没有立刻去找陈薇。他花了两天时间,试图理解 POST_017 背后的逻辑。

“不可达节点”为什么是风险信号?他想了几个可能的原因。第一,不可达节点可能是虚假联系人——中介为了规避检测,用虚拟号码注册的联系人。第二,不可达节点可能是黑产工具人的联系方式。第三,不可达节点可能表示申请人的社交网络中存在大量弱关系,暗示其社会连接不稳定。

但这些理由都站不住脚。中介造假不会只造一个不可达节点,他们会造整个通讯录。黑产的工具人至少会有一个手机号。弱关系的数量跟风险之间的关系,也从来没有被任何学术研究证实过。

陈屿甚至怀疑,这条规则是不是陈薇在某个深夜加班时的误操作——一行写错了的代码,被一个敷衍的 fix 提交信息带进了生产环境,然后被遗忘了两年。

但如果只是误操作,它不会如此精准地选择了”不可达节点”这个条件。这个条件太具体了,不像是随手写的。

陈屿决定从另一个角度入手。他去查了那十七个被第十七种拒绝的申请人,看看他们的通讯录里到底有没有”不可达节点”。

结果是:每一个人的通讯录里,都有一个不可达节点。

陈屿进一步调查这些不可达节点。它们都是手机号码,分布在全国各地,归属地各不相同。他尝试用内部的反查工具检索这些号码——查不到任何注册信息、通话记录、或者社交媒体关联。

这些号码就像是从空气中冒出来的,只存在于某些人的通讯录里,然后消失得无影无踪。

陈屿做了一个更大胆的事情——他用自己的手机拨打了其中一个号码。

号码是空号。

他又打了第二个。空号。

第三个。空号。

十七个号码,他打了十二个,全是空号。剩下五个他没有再打,因为他的手开始微微发抖。

不是因为害怕,而是因为他突然意识到一件事。

这些号码之所以”不可达”,不是因为没有注册过,而是因为它们已经不存在了。它们曾经是真实的手机号码,属于真实的人,但后来被注销了、停机了、消失了。留下来的只是在某些人的通讯录里的一行记录——一个名字,一串数字。

一个人消失了,但他的名字还留在别人的通讯录里。沧溟抓取到了这个名字,在所有数据库中搜索,搜不到任何信息,于是把他标记为”不可达节点”。然后触发 POST_017,拒绝了申请人。

陈屿靠在椅背上,盯着天花板。

他想起了一个统计学概念:幸存者偏差。你只看到了活着的人,以为他们代表了全部。但你没看到的那些死去的人,才是真相。

沧溟只看到了”可达”的人。那些有手机号、有身份证、有社交账号、有消费记录的人。对于它来说,世界就是由这些人构成的。而任何不在这个世界里的人——已经注销号码的人、不用智能手机的老人、从未拥有过手机的农村居民——都是”不可达”的,都是可疑的。

一整套风控系统,在无意中构建了一个完整的数字世界的边界。边界之内的人是”可达”的,是可被评估的,是可被信任或拒绝的。边界之外的人——不存在。

不是被拒绝。是不存在。

陈屿想起了何建平。他的通讯录里有一个不可达节点,也许是一个多年前存下的号码,属于一个已经不用这个号码的人。因为这一个号码,他被沧溟拒绝了五万元贷款。然后他变成了风险关联节点,他的四个朋友也被拒绝了。

一个不存在的人,拒绝了一个真实的人。

陈屿去找了陈薇。

这次他没有去她的办公室,而是在公司楼下的咖啡厅等她。他知道她每天下午三点会下楼买一杯美式。下午三点零五分,陈薇果然出现了。

“薇姐,我需要跟你聊聊。”

陈薇看了他一眼,从他的表情里读出了什么。她没有拒绝。

他们在靠窗的位置坐下来。陈屿把他的发现一五一十地说了。POST_017,不可达节点,十七条拒绝,七十三条扩散,空号,消失的人。

陈薇听完,安静了很久。

窗外是深圳五月的天空,细雨变成了阴天,灰色的云层很低,压在楼顶上。

“你说的都对,“陈薇终于开口了,“但你知道的只是一半。”

陈屿等她说下去。

POST_017 是我写的。不是误操作,是故意的。”

“为什么?”

陈薇用手指绕着杯子边缘画圈。“两年前,我们发现了一个漏洞。黑产团伙在申请贷款的时候,会在通讯录里插入一批虚假号码。这些号码是真实注册过的,有通话记录,甚至有微信账号。他们把这些号码养了三个月以上,让它们看起来跟正常号码一模一样。然后批量申请。”

“蜜罐号码。”

“对。蜜罐号码。他们用这些号码骗过了我们的所有检测。那次事件,我们损失了两个多亿。贺鸣差点把整个风控部门裁掉。”

陈屿想起了那段时间。两年前,公司确实经历了一次重大的坏账事件,但他当时在做模型优化,没有接触到社交网络模块。

“我写了 POST_017,“陈薇继续说,“不是为了抓不可达节点,而是为了抓’不可验证’的节点。那些黑产团伙后来升级了手法,他们不再养号,而是直接用已经注销的真实号码——这些号码曾经属于真实的人,但现在已经不存在了。他们把这些号码混进通讯录里,我们的系统查不到任何信息,就跳过了它们。”

“所以你把’查不到任何信息的节点’标记为高风险。”

“对。”

“但你没有设一个阈值。一个人通讯录里有一个不可达节点,就被整体拒绝——这个粒度太粗了。”

陈薇没有说话。

“你加班到十一点多写的这段代码,“陈屿说,“你是不是没有来得及做充分的测试?”

陈薇的手指停了下来。她端起杯子喝了一口美式,苦味让她的嘴角微微抽动了一下。

“那时候没有时间。坏账还在持续发生,贺鸣每天在催,合规部门在查,投资人那边也要交代。我需要一个快速止血的方案。POST_017 就是我的止血方案。”

“然后忘了把它去掉。”

“不是忘了。是后来没有再出过问题。你知道的,不出问题的代码,没人会去碰它。”

这句话像一根针,扎在了陈屿的心里。不出问题的代码,没人会去碰它。但”不出问题”的前提是,没有人去检查它是否真的没有问题。

何建平不会知道他为什么被拒绝。他的四个朋友也不会知道。他们只会收到一条短信:“您的贷款申请未能通过审核,感谢您的使用。“他们也许会骂一句,也许会叹口气,也许会找另一家平台再申请。他们的生活不会被一次拒绝毁掉——但也不会因此变得更好。

而在这些拒绝的背后,是一个已经不存在的人。一个注销了手机号的、从数字世界中消失的人。他的名字还留在何建平的通讯录里,像一个数字的亡灵,沉默地触发了沧溟的防御机制,拒绝了所有跟他有过联系的人。

陈屿提出了一个方案:修改 POST_017,把”存在不可达节点即拒绝”改为”不可达节点占比超过30%时拒绝”。这样可以过滤掉那些通讯录中只有一两个不可达节点的正常人,同时仍然能够识别黑产团伙——他们通常会插入大量的不可达号码。

陈薇同意了。她让陈屿写了一个修改方案,提交到了技术评审委员会。

技术评审委员会由五个人组成:陈薇、CTO张宏宇、合规总监李雅琴、数据科学负责人赵博、以及产品VP钱惠。他们每周三下午开一次会,评审技术方案的变更。

陈屿的方案排在了周三的第三个议题。

会议室在十九楼,落地窗,可以看到深圳湾。那天是个晴天,阳光照在海面上,波光粼粼。陈屿把他的分析结果投在大屏幕上——十七条拒绝,七十三条扩散,POST_017 的代码,修改方案的对比。

讲完之后,会议室安静了几秒钟。

CTO张宏宇先开口了:“技术方案没问题。但你有没有评估过,修改这条规则之后,通过率会提高多少?”

“大约0.003%,“陈屿说,“影响很小。”

“逾期率呢?”

“理论上不会变化。因为被 POST_017 拒绝的申请人,平均信用评分是74.3分,远高于及格线。他们的整体资质是好的。”

张宏宇点了点头,看向合规总监李雅琴。

李雅琴推了推眼镜,说:“我关心的是,如果修改之后出了问题——比如有人利用这个规则漏洞进行欺诈——责任怎么划分?”

“这个风险极低,“陈屿说,“POST_017 的原始设计目标是识别黑产的蜜罐号码,但黑产早就不用’不可达号码’了。他们现在用的是’准僵尸号’——有注册信息但无活跃行为的号码。我们的反欺诈模块已经覆盖了这种情况。POST_017 实际上是在拒绝正常用户。”

数据科学负责人赵博这时候插了一句:“你说的’正常用户’——那十七条被拒绝的人,你确认他们都是正常的?”

“我查了他们的完整资料。其中一个叫何建平的,在东莞开了九年五金店,纳税记录良好,从来没有逾期过。他申请五万块钱是为了进一批新货。”

“但你怎么知道他不是在骗你?”

陈屿停顿了一下。他知道这是一个合理的问题。风控的本质就是怀疑——在证据不足的情况下做判断。但他也知道,风控系统永远无法区分”绝对的真实”和”统计意义上的真实”。何建平在统计意义上是安全的,但这不意味着他绝对安全。没有任何风控系统能做到绝对安全。

“我无法百分之百确认,“陈屿说,“但我可以确认的是,把他们拒绝了,也没有让系统更安全。因为拒绝他们的依据是一个两年前的漏洞规则,这个规则的目标威胁已经不存在了。”

产品VP钱惠这时候说话了。她是五个人里最年轻的,三十五岁,但说话最有分量,因为她直接向贺鸣汇报。她的部门负责用户增长和留存——换言之,她关心的是放出去多少钱,而不是拒绝了多少钱。

“我支持修改,“钱惠说,“但理由不是技术上的。我们的获客成本已经涨到每人380块了。每多拒绝一个优质用户,不仅损失了利息收入,还浪费了获客成本。这十七条拒绝看起来少,但如果这个规则一直在运行,累积影响可能很大。”

这句话说到了点子上。张宏宇和李雅琴对视了一眼,都点了点头。

方案通过了。

陈屿回到工位,开始修改 POST_017。他把阈值从”存在即拒绝”改为了”占比超过30%时拒绝”,然后提交了代码,跑了一遍测试,测试通过,部署到灰度环境。

一切顺利。

但那天晚上,他又失眠了。

他躺在床上想的是:那十七个”不可达节点”,到底是什么?

它们是曾经真实存在过的手机号码,后来被注销了。这是他能确认的。但他无法确认的是,这些号码曾经属于谁。隐私保护法规不允许他查询号码的历史归属信息——即使他有技术能力做到。

一个人注销了手机号码。可能是因为换了号码,可能是因为离开了这座城市,可能是因为去世了。号码被回收、重新分配、或者永久注销。但在某些人的通讯录里,这个号码还保留着,旁边可能还写着一个名字——“张哥”、“李姐”、“王总”——一个曾经有意义、现在已经失去所指的名字。

沧溟看到了这个名字,在所有数据库中搜索,什么也没找到。然后它做了一个决定:这个名字是危险的。

不是因为它做了什么,而是因为它什么都不是。

陈屿翻了个身,盯着窗户。窗帘没拉,外面是深圳夜空那种永远不是完全黑暗的光——路灯、霓虹灯、写字楼彻夜不灭的灯。他想起了一句话,是他在某本书上看到的:“地狱不是火焰和硫磺,地狱是被彻底遗忘。”

沧溟的”不可达节点”——那些从数字世界中消失的人——就像一种现代形式的遗忘。不是被人遗忘了,而是被系统遗忘了。系统不知道你存在过,所以系统认为你是可疑的。不是因为你有罪,而是因为你不在它的认知范围内。

这是一种新的排斥方式。不是基于种族、性别、宗教、或者财富——而是基于”可验证性”。你存在,所以你是安全的。你不能被证明存在,所以你是危险的。

陈屿突然想起他的外公。

他的外公住在江西的一个小村庄里,七十八岁,一辈子没用过智能手机。他只有一部老年机,能打电话、发短信。他没有微信、没有支付宝、没有任何社交媒体账号。如果陈屿的外公去申请一笔贷款——当然他不会,他连银行卡都很少用——沧溟会在他的通讯录里看到什么?会看到一群跟他一样的老人,用着老年机,没有数字足迹。沧溟会把他们标记为”不可达节点”,然后触发 POST_017,拒绝他的申请。

一个七十八岁的老人,一辈子没借过钱,但因为他的朋友们也都不用智能手机,他成了系统眼中的高风险用户。

陈屿把被子拉过了头。

灰度发布后的第三天,陈屿收到了一封邮件。

发件人是一个他不认识的邮箱地址,主题是”关于 POST_017”。邮件内容很短:

你修改了规则。但你有没有想过,那些”不可达节点”不是被注销的号码?

你可以查一下号码段。最早的五条记录,号码段属于同一家运营商的同一批次。这批号码从未被分配给任何用户。

它们不是消失的。它们从未存在过。

陈屿读了三遍。

他查了那十七个不可达节点的号码段。前五个确实属于同一家运营商——中国联通——的同一个号段:176-2291-XXXX。他用内部工具查了这个号段的分配记录。

记录显示,这批号码在2024年3月由联通深圳分公司放出,共计一万个号码,面向企业客户批量分配。但其中有一批——大约两百个——从未被实际分配给任何终端用户。它们处于”已释放但未激活”的状态,在运营商的数据库中是存在的,但在所有可查询的公开数据库中都不存在。

不是注销了。是从未激活。

这意味着,有人把这批从未激活的号码,手动写进了十七个人的手机通讯录里。

不是黑产——黑产不会只插入一两个号码。不是偶然——十七个毫无关联的人,不可能同时碰巧存了同一个号段的未激活号码。

有人故意做了这件事。

陈屿的手心开始出汗。他回了一封邮件给那个发件人,问:“你是谁?”

五分钟后,回复来了。

我是在 POST_017 写入之前,负责反欺诈模块的工程师。我已经离职了。这批号码是贺鸣让我插入的。

你没有看错。是贺鸣。

贺鸣为什么要在一部分用户的通讯录里插入未激活的号码?

陈屿用了三天时间拼出了完整的图景。

故事要从三年前说起。那时候鲸落正在进行C轮融资,估值的key metric是用户增长和风控质量。用户增长要快,风控质量要好——这两个目标本身就是矛盾的。增长越快,用户群体的平均质量就越难保证;风控越严,通过率就越低,增长就越慢。

贺鸣的解决方案是”分层增长”:对外展示的用户增长率是整体的,但内部把用户分成ABC三个等级。A级用户是优质客户,通过率高、逾期率低;B级用户是中等客户,通过率和逾期率都一般;C级用户是高风险客户,通过率低但客单价高,贡献了大量的利息收入。

C轮融资的路演PPT里,贺鸣展示的是A级用户的逾期率——只有0.3%,远低于行业平均。投资人很高兴,C轮顺利close,估值翻了一倍。

但问题是,C级用户才是鲸落真正的利润来源。他们的利息更高、期限更短、违约率也更高。贺鸣需要C级用户来支撑收入,但又不能让投资人看到他们的真实逾期率——那个数字是8.7%。

所以贺鸣做了一件事:他让一部分C级用户在风控系统中看起来像A级用户。方法就是——在他们的通讯录里插入不可达节点,然后让 POST_017 触发拒绝,这样这些用户就永远不会进入真实的A/B/C评级体系。他们被拒绝了,但他们的数据被保留了下来,作为”已拒绝的高分用户”计入统计——拉高了整体用户群体的平均评分。

这是一个数字游戏。一个用拒绝来粉饰数据的游戏。

POST_017 的真正功能,不是防止欺诈,而是制造一批”被拒绝的高质量用户”——让风控系统的统计数字看起来更好。

陈薇知道吗?陈屿想了很久。他回顾了陈薇的反应——她说”不是忘了,是后来没有再出过问题”。她知道 POST_017 的真正用途。她是共谋者。

那个发邮件的人——前任反欺诈工程师——为什么现在才说?陈屿回邮件问了。

回复是:

因为你修改了规则。你让这些不可达节点不再触发拒绝。这意味着,那些被插入号码的用户,现在可以通过审核了。他们会变成真实的A级用户,开始借贷。而他们的真实信用水平,远远达不到A级。

你打开了潘多拉的盒子。

现在只有两个选择:把规则改回去,让一切恢复原样;或者把这件事捅出去,让所有人知道鲸落的数据是假的。

第一种选择,你成了共谋。第二种选择,鲸落可能活不下去。

陈屿在工位上坐了很久。

他没有把规则改回去。

他也没有立刻捅出去。

他做了一件介于两者之间的事情:他把所有的证据——POST_017 的代码、十七个被拒绝用户的记录、未激活号码的分配记录、那个匿名工程师的邮件——整理成了一份完整的文档,加密保存在三个不同的地方。一份在他的移动硬盘上,一份在他的个人云盘里,一份在一个他从未告诉过任何人的邮箱里。

然后他继续上班。继续看沧溟的日志滚动。继续在风控的河流边坐着。

灰度发布按计划推进。修改后的 POST_017 上线了。那些通讯录中有一两个不可达节点的用户,现在可以通过审核了。

陈屿监控着他们的行为。第一周,新增通过用户892人。他们的平均信用评分是71.4。逾期率——0.4%。

跟A级用户的平均逾期率几乎一样。

那些被贺鸣标记为C级用户、通过插入号码来制造拒绝记录的人,其实跟A级用户没有区别。他们不是高风险客户,从来没有是过。贺鸣之所以把他们的数据归入”已拒绝的高分用户”,纯粹是为了让统计数字更好看。

一个不存在的问题,用不存在的号码,制造了不存在的拒绝,最终变成了一个所有人都接受了的真实——直到陈屿把它拆穿。

又过了两周,逾期率依然稳定。那892个新通过的用户中,只有两人逾期,都是因为突发的个人变故——一个车祸,一个家人生病。跟信用水平无关。

陈屿终于确信:POST_017 从来就不是为了风控。它是一个会计工具,用来调节统计数字。那些”不可达节点”不是威胁,是道具。

十一

一个月后,陈屿提交了辞职信。

陈薇找他谈话。在她的办公室里,两人隔着一张桌子坐着。陈薇的表情很平静,像是早就预料到了这一天。

“是因为 POST_017?“她问。

“不只是。”

“你打算怎么做?”

“我还没有想好。”

陈薇点了点头。“你是个好人,陈屿。但你要知道,好人做的事情不一定有好结果。”

“我知道。”

“那你辞职是为了什么?”

陈屿想了想。“为了不变成你。”

陈薇没有生气。她甚至笑了一下——一种苦涩的、理解的笑。

“我已经变成她了,“她说,用的是第三人称,好像在谈论另一个人。

陈屿站起来,走出了办公室。

他收拾工位的时候,把那个移动硬盘从抽屉里拿出来,放进了背包。三块屏幕上的日志还在滚动,绿色的、黄色的、红色的条目。他看了最后一眼,然后关掉了所有显示器。

十二

陈屿离开鲸落之后的第三个月,银保监会发布了一份新的监管文件,要求所有互联网金融平台对风控系统进行全面审计,重点检查是否存在”基于社交网络的不合理拒绝”。

文件发布后的第二天,鲸落的股价跌了14%。

陈屿是从新闻上看到这个消息的。那时候他在江西,在外公的村子里,帮外公修屋顶。他站在梯子上,手机震了一下,他看了一眼新闻,然后把手机塞回了口袋。

屋顶上能看到很远的稻田,五月末的稻子正在抽穗,绿油油的一大片。远处有一条河,河水不急不慢地流着。风从稻田上吹过来,带着泥土和青草的味道。

他的外公在下面扶着梯子,问他:“修好了没?”

“快了,“陈屿说。

他蹲下来,把最后一块瓦片盖好。

瓦片下面压着一片叶子,不知道是什么时候落上去的。他把叶子拿起来看了看——已经枯了,卷成一个小筒,像一封写好了但从未寄出的信。

他想起何建平的通讯录里,那个不可达节点旁边可能写着的一个名字。也许是”张哥”,也许是”老刘”,也许是某个他在某个夏天认识的人。这个人后来换了号码,或者离开了这座城市,或者只是不再需要这个号码了。但在何建平的手机里,他还是”张哥”,还是”老刘”,还是那个夏天认识的某个人。

一个人消失了,但他的名字还在。一个号码注销了,但它还在某人的通讯录里占据着一行的空间。一个规则被遗忘了,但它每天都在拒绝着素不相识的人。

这就是第十七种回避。

不是对风险的回避,不是对欺诈的回避,而是对”不可知”的回避。沧溟无法理解一个不在数据库中的人,于是选择了拒绝。就像人们无法理解一个陌生的事物,于是选择了恐惧。

陈屿把那片枯叶放进裤兜里,从梯子上爬了下来。

他的外公递给他一杯凉白开。水是井水,冰凉的,带着一股淡淡的甜味。陈屿一口气喝完了。

“城里怎么样?“外公问。

“还行。”

“还在搞那个电脑的事情?”

“不搞了。回来帮你修房子。”

外公哼了一声,像是不信,但也没有追问。他拄着拐杖往回走,背影在稻田的绿色里慢慢变小。

陈屿站在原地,抬头看天。天很蓝,几朵白云慢慢飘着,像数据流在屏幕上滚过。

他把手伸进裤兜,摸到了那片枯叶。叶子很脆,轻轻一捏就碎了。碎片从指缝间落下来,掉在泥地上,几秒钟就被风吹散了。

消失得干干净净。

就像那些从未存在过的号码。就像那些被系统遗忘的人。就像那些被第十七种回避拒绝过、却永远不会知道自己为什么被拒绝的人。

风从稻田上吹过来。稻穗轻轻摇晃着,发出沙沙的声音。陈屿听着这个声音,觉得它比沧溟的日志滚动声好听多了。

他蹲下来,把裤兜里的碎叶片拍干净。然后站起来,朝外公的方向走去。

身后,那条河还在流。不急不慢,不声不响,像是从来没有人注意过它。

但它一直在流。

(完)”}]