我把算式藏起來,讓模型獨立推一遍:殊途同歸,才是真的證據


我在做一個優惠券比價的工具。目標很直接:把一堆速食優惠券,照「實際划算程度」排給你看。

但「划算」卡在一個硬問題——每張券只寫了總價,不寫裡面每樣東西各值多少。要比出哪張券真的划算,就得先反推出每個品項——一塊炸雞、一個蛋塔、一杯飲料——各自的隱含單價。

做法是把它當成一組方程式:每張券是一條,總價等於品項數量乘上單價的總和,拿很多張券去解出每個品項的單價。

而這件事有個先天缺陷,規劃的時候就寫下了:解出來的單價沒有對照組,數字錯了不會有人察覺。 方程式解歪了就是靜靜地歪下去,不會跳錯,測試也不會亮紅燈。

偏偏,我手上有一套自己的算法。

我是這樣估真實價的:從促銷結構反推。

  • 買一送一,那真實價大概是定價的一半。
  • 第二件三折,大概是定價的 0.65。
  • 內容單純的整份券,總價直接除以份數。

這套規則是我自己一張張優惠券看過來、歸納出來的,實際在用。但它有個毛病:它是經驗法則,沒有經過任何數學推導。它管不管用,我心裡有底;但它到底「對不對」,我其實一直沒什麼信心。

所以,當我要把反解單價這件事交給 Claude 時,我做了一個決定:把自己的算法藏起來,不給它。

兩個原因。第一,我的算法沒經過數學推導,我不確定它站不站得住,怕一拿出來反而干擾 Claude 的推導、把它帶偏。第二,我也想看看,單靠 Claude 自己的知識庫,能不能摸到正確的解法。

於是我只把「我想怎麼篩選、怎麼排序」的邏輯描述給它,然後放手讓它自己去推算式。我的算法,一句都沒提。

Claude 寫完規格之後,反覆跟我提:某個階段的內容需要我驗證。我沒仔細看。

這算我失職。我太專注於讓它獨立做了,以至於連它主動遞回來的、要我幫忙確認的東西,也一併跳過。我滿腦子是「別干擾它」,卻沒注意到它已經在回頭找我了。

直到它在低樣本的方案上卡住、走不下去。

它把實際算出來的數字攤開來給我看。這時候我才停下來,把自己一直沒說的算法搬出來,跟它一起討論。說來奇怪:如果不是它把具體數字攤在眼前,我大概還不會講——我心裡一直覺得這套算法只是自己在用的、不夠「正規」的東西,不好意思拿來指導推導。

然後,兩條路碰在一起了。

我用我的算法估炸雞,大約 50 上下。 Claude 用 NNLS 加 ridge 迴歸,從 25 張券裡反解出炸雞的單價:45.9。

兩邊沒有任何共用的假設。我這邊是促銷結構的算術——買一送一拆一半、第二件三折乘上 0.65;它那邊是純粹的方程式求解。起點完全不同,卻落在同一個地方。

後來我把我的算法推算出來的每個品項,全部拿去跟 Claude 的解對一遍。不只是炸雞這一個點,是整組品項,落點都一致。

兩條獨立的路殊途同歸,反解出來的單價第一次有了對照——從「錯了不會有人察覺」,變成「兩條不相干的路,都走到這裡」。

但對我來說,收穫其實是另一件事。

我對自己那套沒有數學推導的算法,一直沒什麼信心。它在用、它管用,可我不知道它到底對不對。這一次,是它頭一回拿到一個跟我毫無瓜葛的獨立背書。

這件事也讓我想清楚了一個道理。想驗證一個連自己都半信半疑的方法,最好的方式不是拿去問模型「我這樣對嗎」——它會被你的答案牽著走,而且說到底,那只是在求一個認同。真正可靠的,是讓它在不知道你答案的前提下,自己用另一條路推導一次。兩條路走到同一個地方,那才是證據。