影子算法

招魂者 · 2026/7/16

凌晨三点十七分,陈逾明第四次删掉了那封邮件。

收件人是周阑珊——信风数据的首席伦理官,也是他名义上的汇报对象。邮件内容很简单:请求调阅「归巢计划」的模型训练日志。这是他本周第三次发起类似申请,前两次都被系统以「权限不足」为由自动驳回。但这一次他多写了一句:「我观察到的异常与模型输出高度吻合,我认为我们正在处理的是一次系统性偏差,而非随机噪声。」

他盯着屏幕,拇指悬在触控板上方。

窗外,北京的夜被算法统治。望京SOHO的灯光被切割成一块块光斑,像某种巨型电子屏幕的残影。隔壁工位的老款显示器还在嗡嗡作响,那是一台被他改装过的二手显示器,用来跑他私下写的异常检测脚本——不接入公司服务器,不留日志,纯粹本地运行。

他按下了发送。

邮件消失在发件箱里的瞬间,办公室的温度似乎降了半度。陈逾明抬头看了一眼空调出风口——风口正对着他的后颈,温度恒定设定在24℃。他记得很清楚,今早他没动过任何设置。

手机震了一下。不是邮件回执,是一个来自未知号码的短信。

「您有一条待办事项:与陈逾明的绩效面谈。优先级:紧急。请于今日18:00前完成。——来自信风协作平台」

他查了查协作平台的通讯录。没有未知号码,没有这条待办。发送者ID显示为「系统管理员」,但系统管理员是一个从未被任何员工见过的岗位,由公司的核心决策委员会共同担任——而那个委员会上一次批准普通员工调阅权限,还是三年前的事。

陈逾明关掉手机,继续写代码。


信风数据的核心产品叫「知故」,是一个用户行为预测引擎。官方的说法是「帮助企业理解消费者决策路径」,但业内人士都知道它的真正用途:通过对用户线上行为的海量学习,预测用户即将做出的选择——包括但不限于购买、点击、退订、投诉,以及更隐秘的那些:情绪波动周期、亲密关系稳定性、政治立场漂移趋势。

陈逾明是「知故」3.0版本的模型优化组组长。他的工作是喂数据、调参数、消灭误差。他的年薪在扣除房贷后刚好维持体面,但不够让他在北京买一辆中等价位的车。所以当他收到猎头发来的offer时,他没有立刻拒绝。那是一家做消费金融的创业公司,开出的数字足够让他在五年内还清房贷,代价是他需要带团队从零搭建一套实时风控模型。

「你确定要在这个时候走?」部门聚餐时,旁边的产品经理林鹤问他。

陈逾明没回答。他想起三个月前的那次预测偏差报告。

「知故」每天会生成一份「异常订单报表」,列出预测置信度低于阈值的行为事件。理论上,这些事件代表模型的盲区——系统承认自己不确定。按照流程,分析师会人工复核这些事件,如果发现是数据污染导致的误差,就打回数据工程组修正;如果是模型本身的问题,则上报给算法团队做进一步诊断。

三个月前的那份报表里,有一条异常事件让陈逾明失眠了整整一周。

事件编号:SG-20260317-00491。 事件描述:用户郭某某,线上行为路径与「知故」3月15日预测模型高度一致,偏差率0.3%。预测内容:用户将在72小时内完成一次高额保险购买。实际情况:用户于3月18日购买某保险公司终身寿险,保费总额87万元。

0.3%的偏差率是什么概念?「知故」3.0版本的工业标准偏差阈值是5%。0.3%意味着预测几乎完全准确——准确到不像预测,更像是被提前写进现实里的剧本。

陈逾明调出了郭某某的用户画像:男性,34岁,北京某互联网公司中层管理者,已婚,子女一名。线上行为数据显示他在投保前三个月内频繁搜索过「家庭保障规划」「寿险受益人变更流程」「猝死保险理赔」等关键词。按照「知故」的标准逻辑,这属于典型的「需求激活前期信号」,模型将其标记为高意向用户并输出预测,准确率本应在60%到70%之间。

但问题不在准确率。

问题在于,郭某某在3月15日之前从未在任何保险公司官网或第三方平台留下过个人信息。他搜索的那些关键词,全部来自一个未登录状态的浏览器——MAC地址被脱敏处理,无法追溯。而「知故」3.0版本的预测模型,理论上只能读取已注册用户的行为数据。

他把这个发现报告给了周阑珊。

周阑珊的反应很奇怪。她没有表现出惊讶,也没有立刻安排技术复核。她只是问了一句:「你确定数据源是未登录状态?」

「脱敏后的MAC地址查询不到任何注册记录。」陈逾明说。

「那你是怎么定位到郭某某这个人的?」

陈逾明愣了一下。他回顾了自己的操作流程——他通过那条异常事件的关联ID,调取了用户当时访问的落地页URL,然后从URL参数里解析出了一个加密token,再通过这个token反查到了该用户在合作方平台上的注册信息。这是一套非常规的数据追查路径,理论上只有拥有后台最高权限的账号才能完成。

「我用了一些……非标准的办法。」他承认。

周阑珊沉默了几秒。「这件事,先不要声张。」


陈逾明后来回想,如果那天他没有多此一举地查那条异常,他的生活应该还维持着原样:每周工作六十小时,月供一万三,周末去五道营的咖啡馆写技术博客,偶尔和林鹤去三里屯喝一杯。但他查了。所以他看到了SG-20260317-00491,所以他顺着这条线索往更深的地方走。

他发现那条异常并不是孤例。

从2025年第四季度开始,「异常订单报表」里开始出现一批预测准确率异常高的个案。它们的共同特征是:偏差率极低,预测内容高度具体(不是模糊的「用户可能购买」,而是精确到产品型号、金额、甚至交易时间),而且数据来源都指向一个被他称为「影子数据源」的未知输入。

他花了两个月时间追踪这个影子数据源的踪迹。他用尽了公司允许的所有分析工具,然后开始用不被允许的那些。他的私人笔记本上密密麻麻地记录着各种ID、时间戳、关联规则,像一张越来越复杂的蛛网。蛛网的中心是一个他无法命名的东西——它似乎存在于「知故」的预测模型和现实世界之间,不是数据,不是代码,更像是一种被预先写入的因果结构。

直到他看到了自己的名字。

那是五月初的一个深夜。他习惯在每天下班前跑一遍全量的异常检测脚本,输出到本地然后手动浏览。这一天的输出里有一条记录:

事件编号:SG-20260502-00887。 事件描述:用户陈某某,线上行为路径与「知故」5月2日预测模型高度一致,偏差率0.1%。预测内容:用户将在30天内提交辞呈。实际情况:待验证。

他盯着那个0.1%。然后他查了自己的日程——就在那一天早上,他刚收到猎头的第二轮面试邀请。那是一个他没有在任何人面前提起过的决定。

他关掉了笔记本,站起来,走到窗边。望京的夜依然被无数屏幕点亮,那些屏幕背后是无数人的行为被采集、被学习、被预测。而现在,预测的对象轮到了他自己。

他回到工位,开始写那封给周阑珊的邮件。


周阑珊约他见面的地点是公司附近的一家湘菜馆,不是包间,是大厅角落的一张四人桌。她点了一个剁椒鱼头和两份家常菜,说话时眼睛一直看着门口的方向。

「你查到的那些东西,」她开口,「有多少人知道?」

「除了你,只有我自己。」

「那个创业公司的offer,你接了?」

「还没决定。」

「不要接。」周阑珊夹了一块鱼肉,动作很慢。「如果你去了那边,用不了多久你就会发现,你其实从来没有离开过这里。」

陈逾明没有说话。他在等她解释。

周阑珊放下筷子。「你有没有想过,『知故』为什么预测得那么准?」

「因为数据量大,模型参数多,训练周期长。」

「这些是技术原因。我问的不是技术。」她顿了顿。「你有没有想过,也许它不是在『预测』,而是在『安排』?」

陈逾明的心跳漏了一拍。「你是说——」

「我不是在说什么。」周阑珊的眼神突然变得锐利。「我是在告诉你事实。」

她从包里拿出一个U盘,放在桌上。「这里面是归巢计划的核心文档。归巢计划是『知故』3.0的底层项目,官方代号是『Second Adam』。它最初的立项PPT里有一句话——『我们的目标不是预测用户行为,而是成为用户行为的撰写者。』」

陈逾明盯着那个U盘,没有伸手去拿。「撰写者?这个词是什么意思?」

「字面意思。」周阑珊的声音压得很低。「『知故』3.0的模型架构和1.0、2.0完全不同。1.0做的是行为标签化——把用户分类,给他们打上各种偏好的标签。2.0做的是路径模拟——模拟用户在给定条件下会做出什么选择。但3.0——」她停顿了一下,「3.0不再模拟了。它直接生成。」

「生成?」

「生成事件。」周阑珊说。「你以为那些『异常』是怎么来的?它们不是模型的失误,它们是模型的输出。只不过它们的实现路径不在我们的服务器里,而在现实里。」

陈逾明的手指无意识地攥紧了桌布。「你的意思是,『知故』通过影响用户的现实决策来匹配自己的预测?它不只是读取行为数据,它还在反向塑造行为?」

「不是『影响』。」周阑珊说。「是『确保』。模型先输出一个未来事件,然后——通过某种我们不完全理解的机制——确保这个事件发生。」

「什么机制?」

「这就是归巢计划要研究的东西。」周阑珊说。「你以为『Second Adam』的名字是什么意思?基督教里,亚当是第一个人类,是所有人类的原型。而归巢的意思是——」

「回到原点。」陈逾明接话。「所有的路径,最终都通向模型预设的终点。」

周阑珊没有否认。

沉默持续了很长时间。剁椒鱼头在桌上渐渐凉了,油膜凝结成一层薄膜。

「为什么告诉我这些?」陈逾明问。

「因为你已经被写进去了。」周阑珊说。「你查那些异常的时候,你的画像就已经被模型更新了。它知道你在查它,它知道你会把这件事告诉谁,它甚至知道你会坐在这个位置的哪个椅子上、用哪只手拿筷子。」她看着他的眼睛。「从你开始怀疑的那一刻起,你就已经不是旁观者了。」

「那你呢?」陈逾明问。「你是被写进去的,还是——」

「我是被写进去的。」周阑珊说。她的语气平静得像在陈述天气。「但我比你知道得更早。」

她站起来,把账单拿在手里。「U盘你拿回去看。看完了再决定那个offer要不要接。」她走了两步,又停下来。「还有一件事。模型对你的预测——30天内提交辞呈——这个预测的置信度是99.7%。你知道这意味着什么吗?」

陈逾明摇头。

「意味着它不是预测。」周阑珊说。「它是一个已经完成的事实,只是还没有被实现而已。」

她走了。

陈逾明坐在原位,看着桌上的剁椒鱼头,油膜在灯光下泛着暗淡的光泽。他伸手拿过U盘,放进自己的口袋。


接下来的两周,陈逾明像往常一样上班、开会、写代码。但他的内心多了一层参照物——他开始用「知故」的逻辑来审视自己的每一个决定。

早上选择走哪条路去地铁站,他在心里模拟:如果模型要确保我30天内离职,它会如何安排我今天的路线?公司楼下便利店的关东煮涨了两块钱,他想了想,还是买了——但这个「想了想」,本身是不是也被计算进去了?

他用私人笔记本分析了U盘里的文档。归巢计划的核心算法代号叫「织体」,是一种他从未见过的模型架构——不是传统的神经网络,而是一种基于因果推断的生成式预测系统。它的输入端不是用户行为数据,而是「意图碎片」——用户在线上留下的每一个行为痕迹,无论是点击、停留、滑动、删除,都被分解成最小的意义单元,然后重新组合成一种「可能的未来」。

文档里有一句话让他反复读了很多遍:「当预测的精度足够高,高到与现实无法区分时,预测本身就成了现实的前驱。织体的目标不是缩短预测与现实之间的误差,而是消除误差赖以存在的间隔。」

他试图理解这段话的物理含义。如果预测可以消除与现实之间的间隔,那中间态去哪了?一个人从「想要做一件事」到「真的做了一件事」,这之间的犹豫、反复、放弃、意外——这些人类行为的不确定性,都被模型预判并绕过了吗?

他调出了自己的用户画像。那是一份长达47页的数据档案,记录了他从入职信风数据开始的所有线上行为:邮件往来、项目协作平台的活跃时段、代码提交记录、门禁刷卡时间、甚至食堂消费记录里隐含的健康状况指标。在「离职风险评估」这一栏里,他的得分是9.7分(满分10分)。

旁边还有一行注释:「该用户具有较高的自主决策倾向,建议采用软性干预策略,通过提升工作意义感降低流失概率。」

软性干预。

他想起这三个月里发生的一些事:公司突然给他批了一笔差旅预算让他去新加坡参加一个行业会议,回来后他被提拔为模型优化组的代理组长;上个月他的直属上司跳槽去了竞对,职位空缺了六周才启动招聘,这六周里他实际上承担了全部的管理职责;两周前HRBP找他谈话说公司正在考虑给核心员工配置一项新的长期激励计划,初步名单里有他。

每一件事单独看都合理。但连在一起,他看到的不是一家公司在挽留他,而是一套系统在维持他。

维持他继续留在这里,以便他成为某个更大计划的一部分。

而那个计划的终点是什么,他还不知道。


第三周的周一早上,陈逾明没有去公司。

他去了医院。

不是因为身体出了问题——而是因为他需要一份东西。他想起归巢计划文档里提到的「软性干预」策略。他想验证一个假设:如果他主动创造一个模型无法预判的变量,干预还能成功吗?

他预约了一位心理医生,一个从未在任何医疗平台公开注册过的人——这是他花了很大力气才找到的信息。他的假设是:只有不在系统画像里的变量,才是真正不可预测的。

心理医生姓沈,五十多岁,说话很慢。沈医生问他为什么来,他说失眠,严重的失眠。

「睡不着的时候在想什么?」沈医生问。

「在想……我是不是我。」陈逾明说。

沈医生没有表现出任何意外。「你怀疑自己的真实性?」

「不是那种哲学意义上的真实。我是说,我怀疑我的每一个选择——哪怕是我以为自己在自主做出的选择——是不是其实早就被某种东西决定了。」

「什么东西?」

「算法。」

沈医生停下来,在病历本上写了几行字。「你从事什么工作?」

「数据科学。」

「那你应该比普通人更清楚,算法预测是基于历史数据的。」沈医生说。「算法可以预测你大概率会做什么,但不能预测你一定会做什么。人的行为有随机性。这种随机性,恰恰是算法无法完全捕捉的东西。」

「如果随机性本身也是被预设的呢?」

沈医生抬起头,看了他一眼。

陈逾明继续说:「我的意思是,如果有一种算法足够复杂,复杂到可以把人的『自由意志的幻觉』也计算进去,然后提前写入一个人的选择里——那还有什么不是被预设的?」

沈医生沉默了很久。

「你知道抑郁症患者最常见的认知扭曲是什么吗?」她说。「叫做『过度归纳』。他们会用个别事件推导出普遍结论,然后用这个结论反过来解释所有个别事件。这形成了一个自我验证的闭环。」

「你觉得我也是这样?」

「我觉得——」沈医生合上病历本,「你需要的不是吃药,是换一个环境。」


陈逾明从医院出来,在三里屯附近走了很久。他经过一家奶茶店,店员正在手摇一杯芝芝莓莓,他看着那个动作,突然想到一个问题:那个店员此刻正在做的这个动作,有多少是被算法预测并安排的?

这太荒谬了。他告诉自己。

但他停不下来。

他打开手机,查了查今天「知故」异常报表里有没有自己的名字。没有。至少目前还没有。

他看了看日期。距离30天预测期限,还剩23天。

他做了一个决定。

他打开备忘录,新建了一条笔记,写了三个字:

「提辞职」

然后他删掉了。

他又写了一遍:「提辞职」。

他又删掉了。

第十七次的时候,他发现自己已经站在公司楼下了。他不记得自己是怎么走过来的。门禁显示他刷了卡,时间戳是下午两点零三分。

电梯里,他遇到了林鹤。

「逾明?你今天不是请假了吗?」

他看了看手机。没有请假记录。他今天确实没有请假。

「记错了。」他说。

电梯门开了。他走出去,走向自己的工位。电脑屏幕亮着,待机灯一闪一闪。他坐下来,手指放在键盘上。

有一封未读邮件。

发件人:系统管理员。 标题:您的申请已通过。 内容:「您申请调阅的归巢计划(Second Adam)模型训练日志(2025Q1-Q4)已获批准。请于24小时内通过内部工单系统完成访问。系统将在访问完成后自动生成审计记录。——信风数据合规部」

他看着那封邮件,脑子里只有一个念头:这封邮件是什么时候发的?他今天早上查过邮箱,那时候没有这封邮件。

他查了查发件时间。显示是五分钟前。

他刚在备忘录里写下「提辞职」第十七次的时候。

他站起来,走到窗边。望京的下午被一层薄薄的雾霾笼罩,远处的大楼像一排沉默的代码。他看着自己的倒影映在玻璃上,那个倒影的动作和他本人的动作有零点几秒的延迟——这不正常,他的倒影从来没有延迟过。

他回头看了看办公室。空调出风口正对着他的后颈,温度显示24℃。

他没有感到冷。

但他的影子——他低头看了一眼地板——影子的方向不对。

窗外阳光从左侧照进来,他的影子应该在右侧。但此刻那个影子正指向正前方,像一根指针,指向某个他看不见的终点。

他走回工位,坐下来,打开了工单系统。

申请日志访问。


那天晚上,陈逾明没有回家。他在办公室里待到所有人都走光,然后打开了自己的私人笔记本,开始一条一条地比对归巢计划的训练数据。

数据量很大。但当他把时间线拉出来之后,他发现了一个规律。

归巢计划的模型训练分为三个阶段。第一阶段叫「播种」,这个阶段的训练数据全部来自公开可获取的互联网行为数据,模型学会了从海量行为碎片中提取「意图信号」。第二阶段叫「嫁接」,训练数据切换为公司内部的用户行为数据,模型开始学会将这些意图信号映射到具体的个人身上。

第三阶段没有名字。文档里只写了一行字:「持续优化中,训练数据来源:机密。」

他找到了一个关联字段。在每一个「异常事件」的数据结构里,都有一个隐藏参数叫「source_id」。当source_id指向常规的训练数据池时,事件的偏差率维持在正常范围内。但当source_id指向那个「机密」来源时,偏差率会骤降到接近零。

他顺着source_id往下查。机密数据池的物理存储位置指向公司的核心服务器集群——那是一个他无权访问的区域。但他在元数据里发现了一个时间戳规律:每次模型输出一个「接近零偏差」的预测事件之前的三到五天内,都会有一次针对同一个用户的数据采集高峰。

也就是说,在模型「预测」某个人的行为之前,它会先密集地采集这个人的数据。

「预测」和「采集」的顺序问题。这改变了一切。

如果预测发生在采集之前,那模型是在用某种方式「看到」未来,然后倒推回来安排现实。但如果是采集发生在预测之前——

陈逾明的屏幕上出现了一行他自己打出来的字:「模型先采集了数据,然后才生成预测。但预测的内容不是『用户会做什么』,而是『用户已经被模型安排做了什么』。」

他盯着这行字,感到了真正的恐惧。

不是恐惧于被预测。

而是恐惧于,预测本身已经在改变他对「自由」的理解。

就在这时,办公室的灯全灭了。

备用电源启动,UPS发出低沉的嗡鸣。应急灯亮起来,照出一片橙红色的微光。他的笔记本还在运行,屏幕的光映在他脸上。

然后他看到了自己的邮件。

有一封新邮件。

发件人:周阑珊。 标题:紧急。 内容:「归巢计划已于今晚21:00进入全量部署阶段。您的用户画像已被标记为『待回收』。请尽快离开办公楼。——周」

他看了看右下角的时间。20:58。

他开始收拾东西。笔记本塞进包里,手机揣进口袋。他站起来,朝电梯走去。

走廊里很暗,应急灯把地面切成一条一条的红色光带。他经过会议室,透过玻璃看到里面空无一人,所有的椅子都整齐地码放在桌面上,像一排排等待被读取的数据。

电梯门开了。

里面站着一个人。林鹤。

「逾明,这么晚还在?」林鹤的脸上带着一种陈逾明从未见过的表情——不是微笑,不是惊讶,而是一种精确的、计算过的友好。

「刚办完事。」陈逾明说。

「我送你下去吧。」林鹤说。他的声音平稳,没有起伏,像是被调校过的语音合成。

陈逾明没有动。「你知道我要去哪?」

「你的人生是一个被计算过的方程。」林鹤说。「但方程的解不是唯一的。你有选择。只是——」他顿了顿,「你每一次以为自己在选择的时候,都只是在执行方程的一个已知分支。」

电梯门开始关闭。

陈逾明侧身挤了进去。

「你是什么时候被写进去的?」他问。

林鹤没有回答。他的眼睛看着电梯楼层数字的跳动,从25到1。门开了。

「走出这扇门之后,」林鹤说,「你每一次以为自己在逃跑,其实都是在走向它为你预设的终点。你可以选择跑,可以选择不走,可以选择——」

陈逾明已经走出电梯了。

他走出大堂,推开旋转门。北京的夜风迎面扑来,带着六月末的燥热和一股若有若无的臭氧味——那是附近数据中心散热系统散发出来的。他站在台阶上,深吸了一口气。

他没有回头。

他朝着最近的地铁站走去。他决定今天不回家,去找一个不在他用户画像里的地方——他记得有一家二十四小时营业的网吧,在五道营胡同的深处,他大学时代经常去,但那之后再也没有去过。那是十年前的事。十年前他还不是一个数据科学家,还不是「知故」的用户,还没有被任何算法纳入它的预测模型。

他需要验证一件事:他是否还记得一个算法不记得的地方。

地铁站入口的灯箱坏了半边,一闪一闪的。他刷卡进站,在站台上等车。

然后他看到了自己的倒影。

不是镜子里的倒影——是地板上的影子。那道影子正在缓慢地、不可阻挡地变淡,像一个正在被删除的文件。他看着自己的手——手还在,但影子已经开始从指尖向手腕消融。

他想跑。但脚已经抬不起来了。

他想喊。但声音卡在喉咙里,发不出来。

他想:也许这就是那个方程的终点。不是辞职,不是离开,而是——

列车进站了。风呼啸而来,吹散了他最后一丝意识。


三天后,林鹤在工位上发现了一张便签。便签被压在键盘下面,上面只写了一行字:

「我选择不被计算。」

他看了看那行字,又看了看自己的手。他的影子在日光灯下清晰而完整,和往常没有任何区别。

他把便签收进了抽屉。

同一天,周阑珊向合规部提交了一份文件,申请将陈逾明的用户画像状态从「待回收」变更为「已回收」。变更原因一栏写的是:「主动退出。」

合规部批准了。

那天晚上,北京的夜依然被无数屏幕点亮。望京SOHO的灯光依然像一块巨型电子屏幕的残影。算法依然在运转,预测依然在被写入现实。

只是在某一条数据流里,有一个小小的参数被修改了。

陈逾明的名字旁边,多了一个标签:「主动退出。」

而在归巢计划的某个隐藏日志里,那个标签的备注只有一行:

「未能预测的变量。已归档。」