HKU CodePlot-CoT 深度解析:視覺推理還是幾何推理?

前言

上一篇寫 MathCanvas 深度解析 的時候,我的總結觀點是: 大模型在幾何上不穩定,並不是因為看不懂圖,而是因為沒有穩定的中間結構可以操作

一些研究工作開始讓模型畫出來再想。

例如 MathCanvas 的做法,讓模型在內部生成草圖,再基於草圖推理。

寫完那篇後,有讀者問我:

既然視覺中間步驟這麼重要,為什麼不直接讓模型把圖真的畫出來?

找了一下相關研究,果然有,看到 HKU 的 CodePlot-CoT,他們就是這麼做的。

CodePlot-CoT 示例圖

模型不再「腦補」輔助線,而是寫 python matplotlib,把輔助線真的畫出來,再繼續解題。

聽起來非常合理吧,如果視覺推理不穩定,那就給模型一個可執行的視覺世界。

但新的問題也隨之出現:

當模型開始「寫圖形程式碼」時,它到底是在進行幾何推理,還是只是在一個具體座標實例上做數值驗證?

要回答這個問題,得先看論文到底在解決什麼。

論文真正要解決的問題

CodePlot-CoT 聚焦的是一個底層現象:多模態模型在數學題中空間工作記憶不穩定。

具體來說,模型可以讀懂題意,也能寫出標準推理鏈,但一旦依賴圖形中間狀態,推理就開始漂移。

這表現在:

  • 輔助線前後不一致
  • 空間關係被遺忘
  • 後續步驟依賴一個並不存在的結構

上篇分享的 MathCanvas 的答案是在模型內部生成草圖,形成視覺 CoT(Visual Chain-of-Thought)。

而 CodePlot-CoT 選擇了另一條路,與其讓模型想像圖,不如讓模型操作一個真實可執行的圖形環境

換句話說,他們把「思考中的圖」外包給 Python。

技術關鍵:讓模型寫 matplotlib

CodePlot-CoT 技術流程

論文中的一個示例,模型在推理過程中給出一步:

「先連接 CD」

然後不是繼續寫文字,而是直接輸出 python 程式碼:

ax.plot([C[0], D[0]], [C[1], D[1]])

整個流程就是:

文本推理 -> 生成繪圖程式碼 -> 渲染圖像 -> 再輸入模型 -> 繼續推理

也就是說,模型的「思維中間狀態」不再存在於 token 或 latent,而存在於一個可執行環境中的外部世界。

這帶來幾個立刻可見的好處:

1. 空間狀態穩定

模型不再依賴記憶,而依賴環境(類似 agent 使用工具)。

2. 視覺一致性提高

多模態模型常見的「圖變形」問題消失。

3. 數據可規模化

論文構建了 Math-VR 數據集(17.8 萬題),把「圖 -> 程式碼 -> 推理」變成監督訊號。

這是一個非常典型的計算機視覺團隊思路:不讓模型學會想像世界,而是給模型訓練一個世界。

到這裡為止,這篇論文其實相當漂亮,但細想也有很直接的問題。

關鍵問題:它真的理解了幾何嗎?

我們看回那句程式碼:

ax.plot([C[0], D[0]], [C[1], D[1]])

這句話表達的含義是:在座標平面畫一條線段。

但幾何推理需要的不是這個。

幾何裡,「連 CD」並不是畫線,而是一個構造操作

  • CD 是弦?
  • CD 是角平分線?
  • CD 與某線垂直?
  • CD 是兩圓交點連線?

這些才是推理的來源。

matplotlib 表達的是圖像外觀,幾何推理需要的是關係約束。

也就是說,這個中間結構仍然停留在「看起來像」,而不是「必然成立」。

構造因果的丟失

幾何證明依賴的是「為什麼成立」,而不是「是否成立」。

例如 構造:角平分線 -> 等角,這是邏輯關係。

但在渲染圖中變成 測量角度 ≈ 相等

這兩者本質不同:

類型性質
幾何構造必然
數值實例偶然

CodePlot-CoT 的推理方式是:

生成一個座標實例 -> 看圖 -> 得出結論

這在數學上叫單實例驗證,問題是幾何命題要求對所有配置成立,而模型看到的只是一個樣本世界。

視覺驗證 vs 數學證明

到這裡可以抽象成兩種推理範式:

CodePlot-CoT幾何證明
判斷依據看起來成立必然成立
方法實驗推導
本質經驗推理演繹推理

CodePlot-CoT 實際上做的是「幾何實驗 AI」,而不是「幾何證明 AI」。

它在回答「這張圖像是否支持這個結論」,而不是「這個結論是否在公理系統中成立」。

為什麼它到不了 AlphaGeometry?

HKU CodePlot-CoT 提供了可執行圖形;Google AlphaGeometry 提供了可推導證明。

但中間少了一層東西:幾何對象本身。

具體來說:

  • 點是交點還是自由點?
  • 線是角平分線還是連接線?
  • 圓是過三點唯一圓還是隨便畫的圓?

這不是視覺問題,而是數學結構建模問題。

如果把三種路線放在一條軸上:

圖像 -> 渲染程式碼 -> 幾何對象 -> 邏輯證明

CodePlot-CoT 停在第二層,AlphaGeometry 在第四層,而第三層其實才是人類解題最常操作的部分:構造圖形。

我們解幾何題時,很少一開始就寫證明,也不會只看圖像,而是在操作對象:作垂線、取交點、過點作圓、作角平分線……

這一步既不是視覺,也不是證明,但決定了後面一切推理是否成立。

推理層級示意圖

寫在最後

我自己在做的大角幾何(Dino-GSP),其實就是在嘗試把這一層單獨抽出來。

不是讓模型畫圖,也不是讓模型直接證明,而是讓模型操作幾何對象本身。

模型輸出的不是 ax.plot(...),也不是 Therefore AB ⟂ CD,而是:

PerpLine(<Line>, <Point>)  # 過直線外一點作垂線
Intersection(Circle(O, 2), Line(2, 3))  # 取圓和直線的所有交點

一旦中間結構變成對象約束,很多事情就會改變:

  • 圖形可以穩定生成,而不是依賴單個座標實例
  • 關係可以直接驗證,而不是視覺測量
  • 推理可以建立鏈條,而不是經驗判斷

從這個角度看,CodePlot-CoT 很重要,重要性不在「解數學題更強」,而在它證明視覺推理需要外部中間狀態。

也就是說,LLM 的問題不是不會數學推理,而是沒有工作空間建立數學模型。

CodePlot-CoT 提供了一種工作空間,只是這個空間還不是數學空間。

而幾何真正需要的,可能是一套可以被操作的圖形語言。

參考資料