← 共識引擎

第 3 章:第 3 章

哲維決定繼續做超出工作範圍的事。

不是因為勇敢。是因為他知道如果他現在停下來、假裝什麼都沒看到、把那份「正常」的報告寄出去,他接下來的每一天都會睡不著。他試過了——前天晚上他蓋上筆電之後躺在床上,天花板上那條裂紋像一條河,他在那條河旁邊躺了三個小時,腦子裡的數據没有停過。

所以他繼續挖。

他從數據庫裡把 RD-7203-DPV 實驗組的全部使用者清單調了出來。不是 dashboard 上的統計數據,是原始清單——八百萬個編號,每一個編號代表一個被他不知道的系統選中的人。

他做了一件很花時間的事:把這些編號的決策路徑按照時間軸排列,然後隨機抽樣,一個一個看。

第一個:四十多歲的男性,南美,中等消費。六十七天前開始出現迴圈。在那之前,他的行為模式跟一般人一樣——有時候點推薦、有時候自己搜尋、有時候什麼都不做。六十七天後的某一天,他開始固定在每天的同一時段打開 APP,點擊同一個位置的推薦內容,然後離開。每天。像鬧鐘。

第二個:二十出頭的女性,東南亞,低消費。五十三天前開始。她的迴圈不是固定選擇,而是固定了「不動」——她在 APP 的首頁待很長時間,不往下滑、不點擊任何推薦、就只是盯著看。然後離開。隔天再回來,重複。

第三個:六十歲的男性,歐洲,高消費。三十一天前開始。他開始反复購買同一價位的商品,品牌會換但價格帶完全固定。他之前是會買不同價位的——有時候貴、有時候便宜、看心情。現在不看心情了。

哲維看了五十個。然後一百個。

每個人的迴圈表現形式不一樣,但有一個共通點:在迴圈開始之前,他們的行為是多樣化的。人有時候做這個、有時候做那個、有時候什麼都不做。這是正常的——人類的決策本來就是混亂的、不規律的、充滿隨機性的。

但在迴圈開始之後,隨機性消失了。

不是完全消失——他們還是會點別的東西、還是會有別的行為。但他們的「主要決策」被固定了。在那個特定的場景、那個特定的時間、那個特定的選擇上,他們變得極度一致。

而這個一致性的觸發點,是系統。

哲維把這些案例整理成了一份文件。不是要交給蘇薇的報告——是留给自己的記錄。他不知道這份記錄以後會不會有用,但他需要把它寫下來。寫下來代表他不是在幻想這些事情。

凌晨兩點的時候,他查到了另一件事。

RD-7203-DPV 不是唯一的一個測試。

他在數據庫裡搜尋了所有帶「RD-72」開頭的測試代號。跳出來了十一個。RD-7201、RD-7202、RD-7203⋯⋯到 RD-7211。每一個都是決策路徑相關的測試。每一個的影響範圍都在 0.1% 到 0.5% 之間。每一個的狀態都是「進行中」。

他把這些測試的配置全部看了一遍。

RD-7201:測試使用者在面對同類型不同價格商品時的決策模式。
RD-7202:測試資訊呈現順序對閱讀完成率的影響。
RD-7203:決策路徑鎖定測試。就是他在修的這個。
RD-7204:測試社交互動頻率對使用者黏著度的影響。
RD-7205:測試路線推薦對實際移動路徑的影響。
RD-7206:測試推薦內容的情緒色調對使用者行為的影響。
⋯⋯

每一個測試都有一個 lock_threshold 參數。每一個都在測試系統能在多大程度上影響使用者的決策。

而這些測試的使用者加起來——他算了一下——大約佔全球活躍使用者的 2.8%。

不是 0.3%。是 2.8%。

每天,大約有 1.5 億人正在被和盟的系統做決策測試。

哲維把計算機關掉。

他坐在螢幕前,手放在鍵盤上,沒有打字。

他想到一件事。這些測試的配置裡,每一個都有 KPI 目標——推薦接受率、停留時間、轉換率。全部都是正向指標。從產品的角度來看,這些測試都是「成功的」。

但沒有任何一個配置裡寫了「使用者知情同意」。

他是做技術的,他不需要去讀倫理審查的論文他也知道——對人類行為進行干預性測試,受試者應該知道自己在被測試。這是最基本的。和盟沒有做這件事。

不是因為和盟不知道。是因為做了就沒辦法測了。

他終於理解這個測試的設計邏輯了。

如果你告訴一個人「我們正在測試能不能讓你不自覺地每天做同一個決定」,他就會開始注意自己的決策,測試結果就失真了。所以你不能告訴他。你只能在不知不覺中觀察、引導、記錄。

這不是 bug。這不是 filter bubble。

這是一場大规模的、未經知情同意的、對人類決策能力的測試。

而他寫的程式碼,是這場測試的偵測器。

哲維蓋上筆電。

凌晨三點的房間很暗,只有窗外巷子的路燈燈光從百葉窗的縫隙裡漏進來,在天花板上畫出一條一條的橫線。那些橫線跟那條裂紋交叉在一起,看起來像某種座標系统。

他躺在床上,把眼睛閉起來。

他想到那八百萬個編號。想到那個四十多歲的南美男性每天早上像鬧鐘一樣點同一個位置。想到那個二十出頭的東南亞女生盯著首頁不點擊任何東西。想到那個六十歲的歐洲男性只買固定價位的商品。

他們不知道。

他們完全不知道自己被選中了、被測試了、被鎖定了。

他們以為自己在選擇。

哲維睜開眼睛,看著天花板上的光影座標。

他拿起手機。螢幕的光很亮,他瞇了一下。時間是凌晨三點四十七分。

他打開了跟若晴的對話視窗。最後一則訊息還停在她說「我不知道它被用在 lock_threshold 邏輯裡」之後,他沒有回。

他想了很久。

然後他打了一行字:「妳看過全部的 RD-72 系列測試嗎?不只是 7203。」

他把手機放在枕頭旁邊,沒有送出。

光標在對話框裡閃著。一下、一下、一下。

他沒有按下送出。

他只是盯著那個光標,盯到他終於睡著了。

夢裡他看到一面巨大的螢幕,上面的紅點和綠點穩定流動著。每一個點都是一個人在做決定。他想要把螢幕關掉,但他找不到開關。

哲維最後是在中午的時候按下送出的。

他坐在便利商店門前的台階上,吃了一個肉包,喝了一罐冰咖啡。陽光很大,他的眼镜起了一層薄霧。他摘下眼鏡用袖子擦了那層霧,然後把手機拿出來,把那則昨天晚上沒送出的訊息送出了。

「妳看過全部的 RD-72 系列測試嗎?不只是 7203。」

已讀。過了四分鐘,若晴回了。

「我需要當面跟你說。」

哲維看著這行字,把最後一口肉包吃掉了。

他回:「什麼時候?」

「今天晚上。七點。一樣的地方。」

一樣的地方。他們分手前常去的一家小餐館,在便利商店旁邊的那條巷子裡面。賣的是台式定食,價格不貴,座位很少,但人也不多。他不知道若晴還記不記得了——她說「一樣的地方」,她也記得。

七點的時候他到了。若晴已經坐在裡面了。

她穿了一件素色的上衣,頭髮比上次視訊裡看到的長了一點。她面前擺了一杯水,沒有在喝。看到哲維進來,她點了一下頭。

他坐下來。兩個人對看了大概兩秒鐘。

「你先點餐。」她說。

他叫了一份排骨飯。她叫了一份雞腿飯。這是他們以前來這家店會點的東西——他排骨、她雞腿。他沒有刻意選,她也沒有。但有些東西就是會自動歸位。

老闆娘把餐端上來。哲維吃了兩口,若晴沒有動。

「你看過哪些?」她直接問。

「RD-7201 到 RD-7211。」他說。「妳呢?」

「我只有 7203 和 7206 的存取權限。7203 是我的分析範圍,7206 是同一個 data pipeline 所以我可以查。」

「其他的妳沒有權限?」

「和盟的測試數據是分层管理的。每個分析師只看到的自己的範圍。」

哲維把筷子放下。「所以妳不知道 7201 到 7211 全部。」

「我現在知道了。」她的聲音很平。「你上次問我之後,我查了。我用了我的權限能查的範圍,看到了 7203 和 7206 的全貌。其他的——7201、7202、7204——我查不到。你怎麼看到的?」

他沒有回答這個問題。

若晴沒有追問。她看著他的眼睛,等他自己說。

「我查了妳的操作記錄。」他說。「cyq_analyst 在八十三天前提交了決策追蹤函數的修改。在七十天前查詢過實驗組數據。在四十五天前跑了一份分析報告。」

「那些都是我做的。」她說。「但那次分析報告的內容是推薦一致性指标的優化建議。我不知道那份報告被用來做 lock_threshold 的調整依據。」

「妳沒有看完整個測試在做什麼嗎?」

「我的工作是分析 7203 的實驗數據、提供優化建議。測試的整體方向和配置是蘇薇那边決定的。我看到的是一個已經被設計好的測試框架,我負責跑數據。」

「妳看到那些人每天做同一個決定,妳覺得正常嗎?」

若晴拿起水杯,喝了一口,放下。「我看到的不是『人』。我看到的是一組 data points。一組實驗組的 data points 的決策一致性指標比對照組高出 47%。」

「妳知道那些 data points 是真人。」

「我知道。」她的聲音沒有變。「但哲維,你在看數據的時候你也不是在看『人』。你在看編號。」

這句話打中了他。因為她說的是事實。

他不說話了。老闆娘經過他們的桌子旁邊,問了一下「還要不要加湯」,他說好,她去盛了一碗湯回來。

「我需要問妳一件事。」哲維喝了口湯。「妳有沒有覺得不對?不是數據上的不對。是⋯⋯妳自己,有沒有覺得這個測試在做不該做的事?」

若晴把筷子放下。

「有。」她說。

這個字說出來的時候,兩個人之間的空氣變了一點。

「什麼時候開始的?」

「六週前。我跑完那份分析報告之後,我多看了幾眼數據。不是工作需要的,就只是⋯⋯看了。我看到一個使用者的行為曲線在特定時間點之後,所有的波動都消失了。不是變小了,是消失了。正常人的行為曲線是有波動的。這個人的曲線變成了一條直線。」

「然後呢?」

「然後我告訴自己那是極值案例。數據分析裡總有極值案例。我沒有繼續追。」

「為什麼?」

若晴沉默了好一會兒。她把水杯轉了一圈,看著杯子上的水珠。

「因為繼續追下去,我要嘛得承認我的工作有問題,要嘛得承認我在沒有充分質疑的情況下參與了一個有問題的事情。兩個都很難。」

哲維理解。他太理解了。

「妳現在打算怎麼做?」他問。

「我不知道。」她說。「我知道的是:我不能用我的內部帳號去查這些測試了。上週蘇薇那邊有人查過外包工程師的存取記錄。你的名字被標記了。」

哲維的手停了一下。「什麼?」

「你的外包帳號查詢了 RD-7203 的配置文件和底層數據表格。這些查詢觸發了內部監控。蘇薇在查你為什麼看到超出範圍的東西。」

「妳怎麼知道這件事?」

「我的主管上週在會議上提的。沒有說名字,只說有外包帳號查詢了內部測試數據。但時間範圍跟你的外包案開始時間對得上。」

哲維把湯碗放下。碗底的湯還在冒煙。

「妳在警告我?」

「我在告訴你我看到的事情。」若晴說。「你可以自己決定怎麼做。但我要先你知道一件事。」

「什麼事?」

「他們不是要害你。他們不在乎你是誰。你在他們系統裡只是一個外包帳號、一筆應付帳款、一個需要管理的風險因子。他們不會對你做什麼。他們只會把你切斷。」

「切斷?」

「終止合約、凍結款項、收回權限。然後你從他們的系統裡消失。你什麼都拿不到、什麼都證明不了。」

兩個人安靜了。隔壁桌有一個男生在看手機,手機的聲音放得很大。

「把數據給我。」若晴最後說。

「什麼數據?」

「你截圖存的那個加密資料夾。全部。」

「妳要那個做什麼?」

「我需要確認你在說的是不是真的。如果數據是真的,我需要知道範圍有多大。如果範圍像你說的——全部的 RD-72 系列——那我需要重新評估一些事。」

「妳不是在評估產品指標。妳是在評估要不要背叛妳的工作。」

若晴看著他。她的眼神沒有變——還是那個有條理的、溫柔的、認真的若晴。但底下多了一層東西。

「我需要先看到數據。」她說。

哲維想了一下。然後他把手伸進口袋,拿出手機,打開了加密資料夾,截圖全部轉傳給她。

對話視窗裡一張一張的截圖傳過去。RD-7203 的配置、lock_threshold 參數、RD-72 系列的列表、cyq_analyst 的操作記錄。

若晴看著手機,一張一張滑過去。

她的表情沒有變。但她的手——放在桌子上的那隻手——收緊了。

他們吃完了那頓飯。走出餐館的時候,天已經暗了。巷子裡的路燈亮著,照在那個雜貨店壞掉的招牌上。

「米七。」若晴看了一眼,說。

「妳也注意到。」哲維說。

「我一直都在注意。」

他們站在巷子裡,沒有說話。然後若晴轉身,往捷運站的方向走。走了幾步,她回過頭。

「哲維。」

「嗯。」

「你確定你不是在工作焦慮?」

這問題她在電話裡問過一次。那時候他的回答不是重點。

「確定。」他說。

若晴點了一下頭,然後走了。

哲維站在巷子裡,看著她的背影消失在路的盡頭。然後他往回走,爬上六樓沒有電梯的房間,打開筆電。

他打開了那份一直沒有寄出的進度報告,把它刪掉。

然後他從頭開始,寫了一份新的。

若晴花了三個晚上看哲維給她的數據。

第一天晚上她只是在確認——確認那些截圖是真的、確認 commit 記錄上的時間軸合理、確認 cyq_analyst 的操作紀錄確實是她自己的帳號。

全部都是真的。

第二天晚上她開始交叉比對。用她的內部權限查了 RD-7203 的原始實驗配置,跟哲維截圖裡的內容一對一比對。完全一致。然後她查了 7206——她的另一個有權限的測試。

7206 的描述是「推薦內容情緒色調對使用者行為的影響」。表面上是測試正向內容跟負向內容哪個更能提升停留時間。但她現在用不同的眼光去看,看到了別的東西。

實驗組的使用者被分成三個子組:A 組收到正向情緒偏多的推薦、B 組收到負向情緒偏多的推薦、C 組是對照組。

數據上,A 組的停留時間最长、B 組的留言互動率最高——憤怒的留言比快樂的留言多出三倍。

這份分析報告她三個月前就交了。當時的結論是「正向情緒內容有助於延長停留時間,負向情緒內容有助於提升互動率,建議根據產品目標調整混合比例」。

現在她看著這份報告,看到了另一個結論:他們已經知道怎麼用情緒來引導使用者的行為了。正向讓你沉溺、負向讓你激動。兩種都是鎖定。

第三天晚上,她做了一件她以前從來不做的事。

她查了 RD-7201。

她沒有 7201 的權限。但她有 7203 的權限,而 7203 跟 7201 用的是同一個數據 pipeline。她可以用 7203 的查詢接口,加上手動調整參數的方式,存取 7201 的部分數據。這不是合規的做法。但她做了。

7201 的數據比她以為的更廣。

不是只有消費決策。7201 測試的是「同類型不同價格商品的決策模式」——看起來是最無害的一個。但數據裡的「商品」不只是商品。她看到了新聞內容的價格等價(免費、付費、訂閱)、看到了影音內容的價格分級、看到了教育課程的價格區間。

系統在測試:當一個人在面對「同一件事但要付不同價錢」的時候,他的決策會被什麼因素影響。然後學會怎麼讓他「選擇」特定價位的那個。

這不是推薦優化。這是付費行為的操控。

若晴把查詢關掉,坐在黑暗裡。

她的房間比哲維的整齊。沒有泡麵碗在水槽裡、沒有衣服堆在椅子上。書桌上的東西排得很直。但此刻她坐在床邊,什麼都沒在做,只是看著地板。

她想到三年前她進和盟的時候。

那時候她剛畢業,拿到兩個 offer——一間是傳統金融公司的數據分析部門,另一間是和盟。金融公司薪水高 15%,但她選了和盟。原因很簡單:她想做「有意義的事」。和盟在做的是用數據理解人的行為,然後讓人的生活變得更好。金融公司做的只是讓有錢的人更有錢。

三年來,她確實看到了數據帶來的改變。醫療診斷的準確率提升、交通事故率下降、資源分配更有效率。這些是真實的。不是公關話語,是她親手跑出來的分析結果。

但現在她看到的另一面是:同樣的能力,同樣的數據,同樣的分析框架,可以被用在完全不同的方向。

讓一個人「更好」跟讓一個人「更可以預測」,之間的距離比她以為的近得多。

她的手機震了一下。是哲維。

「妳看完了嗎?」

她打了幾個字,刪掉,再打。最後她回:「看完了。」

「然後呢?」

若晴看著螢幕上這兩個字。然後呢。

她可以回去上班、裝作什麼都沒看到、繼續跑她的分析報告。沒有人會知道她查了 7201。她的主管不會問。蘇薇不會問。她的薪水不會少。

但那天晚上她在床上躺著,天花板上沒有裂紋——她的房間在天花板沒有裂紋的那一面——她想到一件事。

RD-7203 的 lock_threshold 參數,她的分析報告提供了優化建議。那些建議被採納了。然後 lock_threshold 的參數被調低了,代表更多使用者會被鎖定。

她交的那份報告,直接影響了那八百萬人的決策被固定住。

不是系統的責任。不是蘇薇的責任。

是她的。

若晴把眼睛閉起來。


隔天她照常上班。

早上九點進辦公室,和盟的辦公室比她之前待的金融公司明亮很多。落地窗外是城市的景觀,桌上的螢幕比她自己買的要大一個等級。她打開了自己的工作排程:今天要做的是 7203 新一輪的數據彙報,要把過去四週的實驗進度整理成簡報。

她打開了數據 dashboard。實驗組的數據很漂亮。決策一致性持續上升,推薦接受率穩定在高點。她之前每次看到這些數據都會有一種滿足感——產品在變好、她的分析有價值。

今天她只看到了數字。數字背後那些「consistency index 提升 0.3%」代表的是真實的人在做真實的決定。

她把簡報做出來了。跟之前格式一樣、數據一樣、結論一樣。她把簡報交給主管,主管說了一聲「好」,沒有多看。

中午她沒有去員工餐廳。她出去走了一圈,買了一個坐在路邊吃完。

下午她打開了跟蘇薇的通訊視窗。蘇薇是她的跨部門合作窗口——雖然她們在同一個大樓,但蘇薇那邊是產品、若晴這邊是分析,兩個人用通訊工具溝通比走過去更快。

她打了一行字:「蘇薇姐,我想確認一下 7203 的實驗下一步規劃。lock_threshold 的參數最近有要調整的計畫嗎?」

蘇薇在十五分鐘後回。「下週的產品會議會討論。目前 7203 的 KPI 達標,有在考慮擴大實驗範圍到 0.5% 到 1%。」

1%。從 0.3% 到 1%。

若晴把通訊視窗關掉。

她想起了哲維說的那句話:「optimizing 什麼?所有人。」

那天晚上她下班前做了一件事。她把自己經手的所有 7203 相關分析報告和數據查詢記錄,全部備份到了她自己的加密雲端空間。不是和盟的內部系統,是她自己付費買的。

她不知道這份備份以後會不會有用。

但如果有一天她需要證明「我知道這件事、我知道多久了、我提供了什麼」,她會有一份記錄。

走出和盟大樓的時候,天已經暗了。她站在門口,看著馬路對面的公車站。公車一班一班地過去。

她的手機又震了。是蘇薇。

「7203 的最終報告可以先準備結案版本了。你那邊方便嗎?」

若晴看了一會兒,然後回:「好。」

蘇薇又傳了一則:「另外,之前你查了 RD-7201 的系統日誌顯示了你的查詢記錄。下次要查跨測試的數據先跟我說,我好幫你開權限,跑流程比較快。」

若晴站在公車站前面,看著這則訊息。

不是質問。不是警告。只是一則提醒——「下次要先說」。

她回:「好,知道了。」

但是她知道,蘇薇已經知道了她查了 7201。這件事被記錄了。不是被追責,是被記錄。

若晴上了公車。車上沒什麼人。她坐在靠窗的位置,看著窗外的城市在行駛中倒退。

她的腦子裡同時裝著兩件事:明天要交的簡報,和她備份在加密雲端裡的那份記錄。

兩件事她都會做。

不是因為勇敢。是因為她不知道如果不做,她要怎麼繼續在這個辦公室裡坐下去。

7648 字 •