← 共識引擎

第 4 章:第 4 章

若晴約了哲維週末去她的住處。

她的房間比他的整齊太多。書桌上的東西排得很直,書架上的書按照高矮排列,窗台上有一盆綠色植物,活著,但看起來不怎麼茂盛。

「妳還是住這裡。」哲維說。

「房租沒漲。」若晴說。

她在書桌前坐下,打開筆電。哲維坐在床邊的椅子上。兩個人之間隔著一段不近不遠的距離。

「我把所有東西調出來了。」若晴說。她在鍵盤上敲了幾下,把螢幕轉向哲維。

螢幕上三個視窗並排:RD-7203 的內部實驗配置、7206 的情緒色調測試數據、還有她自己分析報告的歷史版本。

「你先看這個。」她指向最左邊。「7203 的實驗配置。你在外部看到的部分是正確的。但這裡有一個你沒看到的欄位。」

她指著一個參數:escalation_trigger。

「這是什麼?」

「當實驗組的決策一致性達到某個高水平之後,系統會自動啟動下一階段測試。下一階段不是鎖定消費決策,而是——」她切換了視窗。

螢幕上出現一份文件,標題寫著:「RD-7203-Phase 2:跨領域決策一致性擴展測試」。

哲維讀了一遍。然後又讀了一遍。

Phase 2 的測試內容:當一個使用者在消費決策上達到足夠高的一致性之後,系統開始在其他領域施加相同模式的引導——資訊獲取、社交互動、路線選擇、時間管理。跨領域。全面鎖定。

「他們不只要讓人固定買什麼。」若晴說。「他們要讓一個人整個決策模式都固定下來。」

「目前還在測試階段?」

「第一階段跑完了。第二階段在規劃中。下週的產品會議會決定要不要啟動。」

哲維把背靠回椅子上。手心有點濕。

「妳怎麼拿到這份文件的?」

「我主管上週傳給我們部門的。下週會議的預覽文件。他大概覺得這是正常的產品討論。」

「妳覺得他知道這是什麼嗎?」

若晴想了一下。「他大概知道 7203 在做決策優化。但 Phase 2 的文件寫得很隱晦——用的是『跨領域體驗一致性擴展』這種描述。如果你沒有看過 Phase 1 的原始數據,你不會知道這是在測試把一個人的全面決策都鎖定。」

「所以不是所有人都知道。」

「不是所有人都在隱藏什麼。有些人只是沒有把拼圖拼在一起。」

哲維看著若晴。她的表情很平靜,但眼神裡有一種他之前沒見過的東西。

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

「我不知道。我先告訴你我看到了什麼。」

她切換了中間的視窗。「7206。情緒色調測試。我做了三個月的分析。結論是正向情緒內容提升停留時間,負向情緒內容提升互動率。」

「妳之前說過。」

「但現在看看這個。」她打開一張新圖表。圖表上的線條分成兩組:使用者的情緒狀態變化、跟他們在同一時期收到的推薦內容的情緒色調。

線條幾乎完全同步。

「系統不是在根據使用者已有的情緒狀態來推薦內容。」若晴說。「系統是在用推薦內容來引導使用者的情緒狀態。先讓你看了什麼,然後你就變成那個情緒。」

「這是妳的分析?」

「上週才想到要跑的交叉分析。之前沒有人要我跑這個方向。」

哲維看著那條同步的曲線。紅色代表推薦內容的情緒、綠色代表使用者的情緒。紅線先動、綠線跟上。引導在先、反應在後。

「數據不會說謊。」若晴說。

「但數據可以被選擇性解讀。」哲維說。「妳之前跟現在的解讀都是同一批數據。」

「對。因為那時候我不知道要問什麼問題。」

她關上中間的視窗,打開最右邊。「這是我分析報告的歷史版本。你看了就會知道我的問題在哪裡。」

哲維看了。報告格式很標準——摘要、方法、數據、結論。結論寫著「建議根據產品目標調整情緒內容混合比例」。

「這份報告是交給蘇薇的。」若晴說。「蘇薇用這份報告的結論來調整 7206 的內容混合比例。調整後停留時間再提升 3%、互動率再提升 5%。從 KPI 來看,這是我的功勞。」

「但妳現在知道妳的報告被用來做什麼了。」

「對。」

兩個人安靜了一段時間。窗外的城市聲音從縫隙裡漏進來——車聲、某個不知道哪裡在施工的機器聲。

「妳上一次可以拒絕一件事是什麼時候?」哲維問。

若晴沒有立刻回答。她把筆電轉回來,關上所有視窗,然後看著空白的桌面。

「我進和盟的時候,有一個同期的同事。」她說。「他做了半年之後發現一個數據隱私的漏洞——使用者的健康數據被用在非醫療場景的推薦裡。他往上報了。結果被調職到一個邊緣部門,三個月後自己離職了。」

「妳那時候怎麼看這件事?」

「我覺得他做了對的事。但我也覺得他沒有策略。你不能用一個人的力量去對抗整個系統,你需要找到對的方法。」

「妳現在找到對的方法了嗎?」

若晴轉過來看他。「你這是在問我打算怎麼做?」

「對。」

「我想先確認一件事。」她說。「你手上有的那些截圖——commit 記錄、操作記錄、測試配置——這些東西如果被公開,和盟可以追查到來源嗎?」

「我的外包帳號有查詢記錄。他們已經知道我在查了。蘇薇上週提醒過我。」

「那你的處境比我危險。」

「妳的處境比妳以為的危險。」哲維說。「妳查了 7201。蘇薇知道了。」

若晴沉默了。

「她怎麼知道?」

「系統有日誌。妳的查詢記錄被標記了。她跟妳說了什麼?」

「她說下次要先跟她說,跑流程比較快。」

「那不是提醒。那是記錄。她已經知道妳在查不該查的東西了。」

若晴把雙手交疊放在桌上。她的手指很長,指甲剪得很短。

「我需要想一下。」她說。

「好。」

「但有一件事我現在可以確定。」

「什麼事?」

「你是對的。」

這三個字說出來的時候,若晴的聲音沒有變。還是穩定的、有條理的。但她的眼神變了。不是崩潰、不是覺醒——是某種更安靜的東西。像是一扇門被關上了,另一扇門還沒打開。

「不是因為你說的每一句話都對。」她說。「是因為數據不會說謊。我跑了三年的分析,我比誰都清楚數據可以被選擇性解讀。但當你把所有的拼圖放在一起的時候,圖案只有一種。」

哲維沒有說話。

「你要怎麼做?」若晴問。

「我不知道。」他說。「但我不會把那份『正常』的報告寄出去。」

「那你的外包案怎麼辦?」

「已經不是重點了。」

若晴看著他。然後她做了一件她平常不會做的事——她伸出手,碰了一下他的手背。只是一下。

「我需要時間想。」她說。「你不要做任何事。等我。」

哲維點了一下頭。

他離開的時候,在門口回頭看了一眼。若晴坐在書桌前,螢幕的光照在她的臉上。她沒有在看她自己的螢幕。她在看窗外。

他不知道她在看什麼。但他知道她看到的世界已經不一樣了。

哲維花了四個晚上寫那封信。

不是進度報告。是一份正式的漏洞回報信——寫給和盟的產品安全部門,副本給蘇薇。

他沒有寫「你們在操控使用者的決策」。他寫的是技術語言:RD-7203-DPV 測試中的 lock_threshold 機制,在未經使用者知情同意的情況下,對實驗組使用者施加了決策路徑限制。這違反了和盟自己公布的數據使用條款第三條第七款——「使用者有權知曉任何對其個人化體驗產生實質影響的系統變更」。

他附上了數據。不是全部——只是足夠證明問題存在的部分。RD-7203 的配置截圖、決策迴圈的行為數據、lock_threshold 參數的說明。

他沒有提到 RD-72 系列的其他測試。沒有提到 Phase 2。沒有提到陳若晴。

他只是把他在自己的工作範圍內發現的問題,用正式的方式往上報。

這是他作為一個外包工程師能做的最正當的事。

他把信讀了五遍。修改了三次用詞——把「操控」改成「影響」、把「鎖定」改成「限制」、把「未經同意」改成「未充分告知」。讓整封信聽起來像是一個工程師在盡他的專業職責,而不是一個外包人員在找麻煩。

然後他按下了送出。

時間是週三晚上十一點四十分。

他沒有跟若晴說。她說「等我」,但他等了四個晚上,她沒有來訊息。他不能繼續等下去。

寄出之後他關上筆電,去廚房倒了一杯水。站在陽台旁邊喝的時候,他看了一眼巷子。雜貨店的招牌還亮著。今天「米」字好像也壞了,只剩下「七」。

他回到床上,沒有立刻睡著。但這次不是因為焦慮。是因為他在等。


電話在隔天下午打來。

不是蘇薇。是一個他沒見過的號碼。他接起來。

「林哲維先生嗎?」對方的聲音很中性,聽不出情緒。

「是。」

「我這裡是集團產品安全中心。我姓黃。我們收到了你昨天寄出的漏洞回報信。」

「對。」

「我想跟你確認幾個細節。你現在方便嗎?」

「方便。」

「你信裡提到的 lock_threshold 參數,你是怎麼接觸到的?」

「我在修復決策迴圈的異常。追蹤數據來源的時候,發現異常的成因不是推薦權重衰減,而是 RD-7203-DPV 測試中的 lock_threshold 機制。測試配置跟決策迴圈的數據完全對齊。」

電話那頭安靜了幾秒。「RD-7203 是內部測試。你的外包合約範圍不包含內部測試數據。」

「我知道。但異常的來源是連動的。我不看測試數據,沒辦法確認成因。」

「你在信中引用了數據使用條款第三條第七款。」

「對。」

「你知道這條條款的適用範圍嗎?」

「知道。它適用於所有對使用者個人化體驗產生實質影響的系統變更。lock_threshold 機制限制了使用者的決策路徑,屬於實質影響。」

電話那頭又安靜了。然後黃先生說:「好。我們內部會再評估。你的回報信已經存檔。如果有需要再跟你確認,我們會再聯絡。」

「好。」

「另外——」黃先生的語氣沒有變,但內容變了。「你的外包案目前還在進行中。建議你把精力放在合約範圍內的修復工作上。其他的事情,讓內部團隊處理。」

「好。」

黃先生掛了電話。

哲維把手機放下。

他不知道這封信會被怎麼處理。也許會被歸檔、也許會被評估、也許會被壓下來。但他做了他能做的。


蘇薇的電話在兩個小時後打來。

這次是視訊。哲維接起來的時候,蘇薇的臉上看不出情緒。背景還是那個素面的灰色壁紙。

「哲維。」她說。「我收到你的回報信了。」

「嗯。」

「你信裡寫的內容,跟你的外包案範圍不一致。」

「我知道。但問題是連動的。我沒辦法在不知道成因的情況下提交修復方案。」

蘇薇看著他。她的眼神沒有變,但哲維感覺到某種東西變了。

「你的修復方案呢?」她問。

「我還沒寫。因為成因不是推薦權重衰減,是 lock_threshold 機制。我沒有權限修改內部測試的參數。」

「所以你的意思是,這個異常你修不了。」

「對。除非 lock_threshold 的參數被調整,或者 RD-7203 的測試範圍被限制。」

蘇薇沉默了很長一段時間。

「哲維。」她最後說。「我需要跟你確認一件事。你在寫這封信的過程中,有沒有跟任何內部人員討論過 RD-7203 的細節?」

哲維知道這個問題的分量。

「沒有。」他說。

他沒有說謊。他是跟若晴討論的,但若晴不是「內部人員」——她是另一個部門的數據分析師,而且他們的討論不是正式的。至少他可以這樣告訴自己。

蘇薇點了一下頭。「好。那我們先這樣。你的外包案我會跟內部討論一下後續。你的款項會按照合約走。」

「好。」

「哲維。」蘇薇在掛斷前多說了一句。「你在和盟的 NDA 看過嗎?裡面的範圍比你以為的寬。」

她掛了。

哲維把手機放在床上,看著天花板。

那條裂紋還在。但今天他看它的角度不一樣了。它不是一條河。它只是裂紋。房子老了就會有裂紋。裂紋本身不是問題,問題是你決定怎麼處理它。

他的手機震了。是若晴。

「你寄了?」

「嗯。」

「蘇薇找你了?」

「嗯。」

若晴沉默了很久。然後她說:「我需要見你。」

「什麼時候?」

「現在。」


他們在便利商店門口碰面。若晴看起來跟週末不一樣——不是外表,是整個人。她穿了一件外套,拉鏈拉到最上面,好像有點冷。但六月的台北不冷。

「蘇薇找我了。」她說。

「因為回報信?」

「因為她想知道我有沒有跟你討論過 7203。」

「妳怎麼說?」

「我說沒有。」

兩個人站在便利商店門口。自動門開開關關,冷氣從裡面跑出來。

「若晴。」哲維說。「妳不需要幫我扛這件事。」

「我不是在幫你。」她說。「我是在處理我自己的事情。」

「什麼意思?」

若晴把外套的拉鏈拉下來,又拉上去。「我今天跟我的主管說,我想調部門。」

「為什麼?」

「因為我沒有辦法繼續跑 7203 的分析報告了。我沒有辦法坐在那裡看著那些數據、寫出那些結論、然後假裝我不知道那些結論會被用來做什麼。」

「妳主管怎麼說?」

「他說他會考慮。但他也說了,7203 的 Phase 2 下週要上產品會議,我是最熟悉這個測試的分析師,現在調部門會有影響。」

「他在施壓。」

「他在陳述事實。」若晴說。「但結果一樣。」

她看著馬路。公車一班一班地過去。

「哲維。」她說。「你後悔寄那封信嗎?」

他想了一下。「不。」

「我也不後悔查 7201。」她說。「但我現在知道,查了之後,我沒有辦法繼續像以前一樣了。」

「妳打算怎麼做?」

「我不知道。但我知道我不能繼續留在那個部門。」

她轉身面對他。她的眼睛有一點紅,但不是在哭。

「你要做好心理準備。」她說。「蘇薇不會就這樣放過這件事。她會查你的外包案、查你的存取記錄、查你跟誰聯絡過。她不是在報復你。她是在做她的工作。」

「我知道。」

「你的外包案可能會被終止。」

「我知道。」

「你的款項可能會被凍結。」

「我知道。」

若晴看著他。然後她說了一句他沒有預料到的話。

「你比我勇敢。」

「我不是勇敢。」哲維說。「我只是睡不著。」

若晴笑了一下。很小的笑。然後她轉身走了。

哲維站在便利商店門口,看著她的背影。自動門又開了一次,冷氣跑出來,然後門關上了。

他回到房間,打開筆電。收件匣裡有一封新信。和盟的系統通知:他的外包帳號權限已被暫停,等待進一步審查。

他把信關上。

然後他打開了電商搜尋功能的案子,繼續寫程式碼。

窗外的陽光從早上六點就開始曬他的房間。今天它曬到了桌子的另一邊。

5349 字 •