學(xué)推理可靠性難題:從概率生成到形式化驗(yàn)證的工程實(shí)踐)
1. 從一道題講起AI做數(shù)學(xué)到底卡在哪前陣子幫一個(gè)做教育產(chǎn)品的朋友看他們的自動(dòng)解題模塊他給我看了一組數(shù)據(jù)同一道高中立體幾何題模型在三次獨(dú)立運(yùn)行中給出了三個(gè)不同的答案其中兩個(gè)是錯(cuò)的但推理過(guò)程寫得頭頭是道每一步看起來(lái)都很有道理。這個(gè)現(xiàn)象其實(shí)特別典型也是我想寫這篇隨筆的直接原因——AI數(shù)學(xué)這件事表面上是能不能算對(duì)骨子里是能不能可靠地推理。先把范圍界定清楚。我這里說(shuō)的AI數(shù)學(xué)不是指用AI去證明黎曼猜想那種宏大敘事而是指讓模型完成數(shù)學(xué)相關(guān)的任務(wù)解方程、做證明、推導(dǎo)公式、檢查步驟、生成題目、批改作業(yè)、把自然語(yǔ)言描述的數(shù)學(xué)問(wèn)題轉(zhuǎn)成可計(jì)算的形式。這個(gè)范圍覆蓋了教育、科研輔助、工程計(jì)算、金融建模等一大片場(chǎng)景也是目前落地需求最密集的地方。為什么值得單獨(dú)拿出來(lái)聊因?yàn)閿?shù)學(xué)和寫文案、聊天、翻譯有本質(zhì)區(qū)別。自然語(yǔ)言任務(wù)里差不多對(duì)往往可以接受一句話有點(diǎn)語(yǔ)病不影響理解但數(shù)學(xué)是強(qiáng)約束、可驗(yàn)證、容錯(cuò)率極低的領(lǐng)域一步錯(cuò)步步錯(cuò)最終答案要么對(duì)要么錯(cuò)沒有中間地帶。這就導(dǎo)致通用大模型那套概率生成、看起來(lái)合理就行的機(jī)制在數(shù)學(xué)上會(huì)暴露得特別明顯。適合讀這篇的人正在做AI教育產(chǎn)品的開發(fā)者、想把數(shù)學(xué)能力接進(jìn)自己系統(tǒng)的工程師、對(duì)模型推理能力好奇的技術(shù)愛好者以及被AI解題坑過(guò)的產(chǎn)品經(jīng)理。我會(huì)盡量把原理講透同時(shí)給出能直接上手驗(yàn)證的方法不管你是剛?cè)腴T還是已經(jīng)踩過(guò)坑都能拿到點(diǎn)東西。2. AI數(shù)學(xué)的核心難點(diǎn)拆解2.1 為什么會(huì)聊天不等于會(huì)算數(shù)大模型的底層是下一個(gè)token的概率預(yù)測(cè)。它學(xué)到的是在大量文本里什么樣的字符序列更常見而不是什么樣的推導(dǎo)在邏輯上成立。這兩者的差距在數(shù)學(xué)上會(huì)被無(wú)限放大。舉個(gè)生活化的類比這就像一個(gè)背了十萬(wàn)道菜譜的人你問(wèn)他鹽放多了怎么辦他能流利地說(shuō)出加點(diǎn)糖中和加水稀釋加點(diǎn)土豆吸鹽——聽起來(lái)很專業(yè)。但如果你給他一個(gè)從沒見過(guò)的食材組合讓他現(xiàn)場(chǎng)推導(dǎo)該放多少鹽他就抓瞎了因?yàn)樗麤]真正理解咸度這個(gè)物理量是怎么算的只是在匹配見過(guò)的模式。數(shù)學(xué)推理需要的是符號(hào)操作能力和多步一致性第3步用到的結(jié)論必須和第1步的假設(shè)嚴(yán)格對(duì)應(yīng)中間不能偷偷換變量、不能想當(dāng)然地約分、不能把充分條件當(dāng)必要條件用。而概率模型在生成第3步時(shí)并不會(huì)回頭嚴(yán)格校驗(yàn)第1步它只是在當(dāng)前上下文下最可能的下一個(gè)詞里挑。這就是錯(cuò)誤的根源。2.2 三類典型錯(cuò)誤算錯(cuò)、跳步、假推理我在實(shí)際測(cè)試?yán)锇袮I數(shù)學(xué)的翻車情況歸成三類這個(gè)分類對(duì)排查問(wèn)題特別有用。第一類是計(jì)算錯(cuò)誤。純算術(shù)層面的失誤比如多位數(shù)乘法進(jìn)位錯(cuò)、符號(hào)搞反、分?jǐn)?shù)通分算錯(cuò)。這類錯(cuò)誤隨著模型規(guī)模和工具調(diào)用能力的提升已經(jīng)大幅減少但沒根除。第二類是跳步。模型直接給出結(jié)論省略了關(guān)鍵中間步驟而省略的那一步恰恰是錯(cuò)的。這種最坑因?yàn)榇鸢缚赡芘銮蓪?duì)你根本發(fā)現(xiàn)不了過(guò)程有問(wèn)題。第三類是假推理也是我認(rèn)為最危險(xiǎn)的一類。推理過(guò)程完整、語(yǔ)言流暢、邏輯連接詞用得滴水不漏但某一步偷偷引入了一個(gè)不成立的假設(shè)。比如證明題里默認(rèn)三角形是銳角三角形卻沒說(shuō)明或者不等式兩邊同乘一個(gè)可能為負(fù)的式子卻沒討論符號(hào)。這種錯(cuò)誤對(duì)不懂?dāng)?shù)學(xué)的人來(lái)說(shuō)幾乎無(wú)法識(shí)別因?yàn)樗x起來(lái)完全正確。提示判斷一個(gè)AI數(shù)學(xué)系統(tǒng)靠不靠譜別只看最終答案對(duì)不對(duì)一定要看它能不能把每一步的依據(jù)說(shuō)清楚并且這些依據(jù)經(jīng)得起獨(dú)立驗(yàn)證。2.3 形式化與自然語(yǔ)言的鴻溝數(shù)學(xué)有兩種表達(dá)自然語(yǔ)言/符號(hào)混合的人話數(shù)學(xué)和形式化系統(tǒng)里的嚴(yán)格證明比如各種證明助手用的語(yǔ)言。人類日常做的數(shù)學(xué)絕大多數(shù)是前者——有省略、有約定俗成、有顯然可得。而機(jī)器要可靠驗(yàn)證需要的是后者。AI數(shù)學(xué)的核心矛盾就在這模型擅長(zhǎng)處理自然語(yǔ)言但自然語(yǔ)言的數(shù)學(xué)是有歧義、有隱含前提的形式化系統(tǒng)沒有歧義但把自然語(yǔ)言翻譯成形式化語(yǔ)言本身就是個(gè)難題而且形式化證明的搜索空間巨大。目前主流的思路是兩條腿走路一條是讓模型直接做自然語(yǔ)言推理靠規(guī)模和訓(xùn)練數(shù)據(jù)堆能力另一條是讓模型生成形式化代碼交給嚴(yán)格的證明檢查器驗(yàn)證。前者靈活但不可靠后者可靠但門檻高、覆蓋窄。真正好用的系統(tǒng)往往是兩者結(jié)合——模型負(fù)責(zé)猜思路形式化工具負(fù)責(zé)驗(yàn)對(duì)錯(cuò)。3. 讓AI數(shù)學(xué)更靠譜的幾條實(shí)操路線3.1 思維鏈與分步推理把黑箱拆開最基礎(chǔ)也最有效的一招是強(qiáng)制模型分步輸出。不要求它直接給答案而是要求它把每一步寫出來(lái)并且說(shuō)明這一步用了什么依據(jù)。這個(gè)做法在業(yè)界叫思維鏈Chain of Thought原理很簡(jiǎn)單當(dāng)模型把中間步驟顯式寫進(jìn)上下文后后續(xù)生成會(huì)看到這些步驟一致性會(huì)好很多。但要注意普通的思維鏈并不保證正確它只是讓錯(cuò)誤更容易被發(fā)現(xiàn)。我實(shí)測(cè)下來(lái)加了分步要求后簡(jiǎn)單題的正確率提升明顯但難題里假推理的比例反而可能上升——因?yàn)槟P蛯W(xué)會(huì)了編出看起來(lái)很完整的過(guò)程。所以我的建議是分步輸出 人工或自動(dòng)的步驟校驗(yàn)兩者缺一不可。校驗(yàn)可以很簡(jiǎn)單比如讓另一個(gè)模型實(shí)例專門檢查每一步的合法性或者用符號(hào)計(jì)算工具驗(yàn)證關(guān)鍵等式。3.2 工具調(diào)用讓模型學(xué)會(huì)用計(jì)算器純靠模型心算大數(shù)運(yùn)算和復(fù)雜符號(hào)推導(dǎo)遲早出錯(cuò)。更穩(wěn)的做法是讓模型調(diào)用外部工具需要算數(shù)就調(diào)計(jì)算器需要解方程就調(diào)符號(hào)計(jì)算庫(kù)需要驗(yàn)證就調(diào)證明檢查器。這里的關(guān)鍵設(shè)計(jì)是什么時(shí)候調(diào)、調(diào)什么、怎么把結(jié)果接回來(lái)。我的經(jīng)驗(yàn)是把工具調(diào)用設(shè)計(jì)成模型的一個(gè)動(dòng)作讓它自己判斷當(dāng)前步驟是否需要外部幫助。比如遇到計(jì)算 1234 × 5678這種模型應(yīng)該輸出一個(gè)調(diào)用請(qǐng)求而不是硬算遇到解這個(gè)微分方程應(yīng)該把方程轉(zhuǎn)成符號(hào)庫(kù)能識(shí)別的格式再調(diào)用。注意工具調(diào)用的格式必須嚴(yán)格約束否則模型會(huì)生成格式錯(cuò)誤的調(diào)用參數(shù)導(dǎo)致工具報(bào)錯(cuò)。建議用結(jié)構(gòu)化輸出比如JSON schema來(lái)限制而不是讓模型自由發(fā)揮。3.3 形式化驗(yàn)證給推理上把鎖如果對(duì)可靠性要求極高比如自動(dòng)批改、科研輔助形式化驗(yàn)證是繞不開的。思路是讓模型把自然語(yǔ)言的題目和推理翻譯成形式化語(yǔ)言然后交給證明檢查器逐步驗(yàn)證。檢查器說(shuō)通過(guò)才是真的通過(guò)。這條路線的難點(diǎn)在于翻譯的準(zhǔn)確性和覆蓋率。很多數(shù)學(xué)內(nèi)容尤其是應(yīng)用題、幾何題很難完整形式化翻譯過(guò)程本身也可能出錯(cuò)。所以實(shí)踐中通常是能形式化的部分形式化不能的部分靠其他手段兜底。我見過(guò)比較務(wù)實(shí)的做法是先用模型生成自然語(yǔ)言解答再針對(duì)其中的關(guān)鍵等式和不等式單獨(dú)做符號(hào)驗(yàn)證。這樣不需要完整形式化但能抓住最容易出錯(cuò)的計(jì)算環(huán)節(jié)。3.4 自洽性檢驗(yàn)多跑幾次看穩(wěn)不穩(wěn)還有一個(gè)成本低、見效快的技巧同一道題讓模型獨(dú)立跑多次看答案是否收斂。如果多次結(jié)果一致可信度就高如果發(fā)散說(shuō)明模型在這道題上沒把握需要人工介入或換方法。這個(gè)方法的原理是模型在有把握的題目上多次采樣會(huì)收斂到同一個(gè)答案在沒把握的題目上采樣會(huì)分散。實(shí)測(cè)下來(lái)這個(gè)方法對(duì)識(shí)別模型其實(shí)不會(huì)但硬答的情況特別有效。代價(jià)是計(jì)算成本翻幾倍。所以我的建議是分級(jí)使用簡(jiǎn)單題跑一次中等題跑三次取多數(shù)難題跑五次以上并且要求給出置信度說(shuō)明。4. 一個(gè)可復(fù)現(xiàn)的驗(yàn)證流程4.1 環(huán)境與工具準(zhǔn)備要復(fù)現(xiàn)我下面說(shuō)的流程你需要準(zhǔn)備幾樣?xùn)|西。首先是一個(gè)能調(diào)用的大模型接口本地部署或云端都行關(guān)鍵是能控制生成參數(shù)溫度、最大長(zhǎng)度等。其次是一個(gè)符號(hào)計(jì)算庫(kù)Python生態(tài)里比較成熟的有SymPy能處理方程求解、微積分、化簡(jiǎn)等。再準(zhǔn)備一個(gè)腳本框架用來(lái)串聯(lián)模型生成—工具驗(yàn)證—結(jié)果匯總。溫度參數(shù)很關(guān)鍵。做數(shù)學(xué)推理時(shí)我一般把溫度設(shè)得很低0.1到0.3減少隨機(jī)性做自洽性檢驗(yàn)時(shí)反而要適當(dāng)調(diào)高0.7左右讓多次采樣有差異才能看出收斂性。4.2 分步推理加符號(hào)驗(yàn)證的完整流程下面是我常用的一套流程直接給可參考的偽代碼結(jié)構(gòu)。# 第一步讓模型分步解答要求輸出結(jié)構(gòu)化步驟 prompt 請(qǐng)逐步解答下面的數(shù)學(xué)題每一步單獨(dú)成行格式為 步驟N: [推理內(nèi)容] 依據(jù): [用到的定理或運(yùn)算規(guī)則] 等式: [如果這一步產(chǎn)生了等式寫在這里] 題目{problem} # 第二步解析模型輸出提取所有等式 steps parse_steps(model_output) equations extract_equations(steps) # 第三步用符號(hào)庫(kù)逐個(gè)驗(yàn)證等式 for eq in equations: try: lhs sympify(eq.left) rhs sympify(eq.right) if simplify(lhs - rhs) ! 0: flag_error(eq, 等式不成立) except Exception as e: flag_error(eq, f無(wú)法解析: {e}) # 第四步對(duì)最終答案做獨(dú)立驗(yàn)證 final_answer steps[-1].result verify_with_substitution(problem, final_answer)這套流程的核心思想是模型負(fù)責(zé)生成思路符號(hào)庫(kù)負(fù)責(zé)驗(yàn)證關(guān)鍵節(jié)點(diǎn)。等式驗(yàn)證能抓住大部分計(jì)算錯(cuò)誤代入驗(yàn)證能確認(rèn)最終答案。4.3 參數(shù)選擇與結(jié)果判讀跑這套流程時(shí)有幾個(gè)參數(shù)需要調(diào)。采樣次數(shù)建議3到5次太少看不出收斂性太多成本高。驗(yàn)證嚴(yán)格度分兩檔寬松檔只驗(yàn)證最終答案嚴(yán)格檔驗(yàn)證每一步等式。超時(shí)設(shè)置要給足符號(hào)計(jì)算遇到復(fù)雜表達(dá)式可能很慢。結(jié)果判讀上我總結(jié)了一個(gè)簡(jiǎn)單的判斷表情況含義處理建議多次答案一致且等式全通過(guò)高可信可直接采用答案一致但部分等式驗(yàn)證失敗過(guò)程有誤但結(jié)果碰巧對(duì)需人工復(fù)核過(guò)程答案發(fā)散但等式多通過(guò)思路對(duì)但細(xì)節(jié)不穩(wěn)增加采樣或降低溫度答案發(fā)散且等式多失敗模型沒掌握該題型換方法或人工介入這張表是我踩了不少坑之后總結(jié)的實(shí)際用起來(lái)能省很多判斷時(shí)間。5. 常見問(wèn)題與排查技巧實(shí)錄5.1 模型嘴硬不認(rèn)錯(cuò)怎么辦這是最常遇到的問(wèn)題你指出它某一步錯(cuò)了它道歉然后換一種說(shuō)法繼續(xù)錯(cuò)甚至把對(duì)的改成錯(cuò)的。原因是模型在對(duì)話中傾向于迎合用戶而不是堅(jiān)持邏輯。我的處理辦法是不在同一對(duì)話里糾纏。發(fā)現(xiàn)錯(cuò)誤后直接開新對(duì)話把題目和請(qǐng)?zhí)貏e注意XX類型的陷阱一起重新輸入。新對(duì)話沒有之前的錯(cuò)誤上下文模型反而更容易給出正確答案。如果還錯(cuò)就換一種提問(wèn)方式比如把證明題改成請(qǐng)找出下面證明中的錯(cuò)誤。5.2 符號(hào)計(jì)算庫(kù)解析失敗的排查用SymPy這類庫(kù)時(shí)最常見的報(bào)錯(cuò)是無(wú)法解析表達(dá)式。原因通常是模型輸出的格式不規(guī)范用了庫(kù)不認(rèn)識(shí)的函數(shù)名、括號(hào)不匹配、隱式乘法沒寫出來(lái)比如2x應(yīng)該寫成2*x。排查順序建議這樣先打印出原始表達(dá)式看格式再手動(dòng)在符號(hào)庫(kù)里試一遍確認(rèn)是格式問(wèn)題還是表達(dá)式本身有問(wèn)題。如果是格式問(wèn)題可以在提示詞里明確要求輸出符合Python語(yǔ)法的表達(dá)式或者寫一個(gè)預(yù)處理函數(shù)做格式清洗。提示隱式乘法是重災(zāi)區(qū)。模型很愛寫3x、2sin(x)這種符號(hào)庫(kù)基本都不認(rèn)。預(yù)處理時(shí)統(tǒng)一插入乘號(hào)能解決大部分問(wèn)題。5.3 幾何題和證明題的特殊處理代數(shù)和算術(shù)題相對(duì)好辦幾何題和證明題是硬骨頭。幾何題難在圖形信息難以用純文本表達(dá)證明題難在步驟之間的邏輯依賴復(fù)雜。我的經(jīng)驗(yàn)是幾何題盡量轉(zhuǎn)成坐標(biāo)或向量形式再處理把圖形問(wèn)題變成代數(shù)問(wèn)題這樣符號(hào)庫(kù)能派上用場(chǎng)。證明題則要顯式列出已知條件和待證結(jié)論讓模型每一步都引用具體的條件編號(hào)方便追溯。如果模型某一步引用了不存在的條件編號(hào)基本可以判定是假推理。5.4 成本與效果的平衡最后說(shuō)個(gè)現(xiàn)實(shí)問(wèn)題上面這些方法都增加成本。多次采樣、符號(hào)驗(yàn)證、形式化翻譯每一步都要算力。所以實(shí)際做產(chǎn)品時(shí)一定要分級(jí)處理簡(jiǎn)單題走輕量流程難題才上重流程。判斷難度的方式可以很簡(jiǎn)單比如按題目類型、按模型首次輸出的置信度、按是否涉及多步推理。我個(gè)人的取舍是面向?qū)W生的練習(xí)場(chǎng)景正確率比速度重要值得上重流程面向大規(guī)模批改的場(chǎng)景先用輕量流程過(guò)濾只把可疑的挑出來(lái)重處理。6. 我對(duì)AI數(shù)學(xué)的一點(diǎn)個(gè)人判斷做了這段時(shí)間的測(cè)試和落地我越來(lái)越覺得AI數(shù)學(xué)的瓶頸不在算力也不在數(shù)據(jù)量而在驗(yàn)證。模型生成一個(gè)答案很容易難的是判斷這個(gè)答案對(duì)不對(duì)、過(guò)程合不合理。誰(shuí)能把驗(yàn)證這一環(huán)做扎實(shí)誰(shuí)的系統(tǒng)就靠譜。另一個(gè)體會(huì)是別指望模型自己學(xué)會(huì)嚴(yán)謹(jǐn)。嚴(yán)謹(jǐn)是靠外部約束逼出來(lái)的——分步要求、工具調(diào)用、符號(hào)驗(yàn)證、多次采樣這些都是外部約束。模型本身是概率的、發(fā)散的你要用工程手段把它框住。最后分享一個(gè)我常用的小技巧遇到模型反復(fù)出錯(cuò)的題型別急著調(diào)提示詞先把這類題手動(dòng)做一遍記錄下人類解題時(shí)的關(guān)鍵判斷點(diǎn)然后把這些判斷點(diǎn)寫進(jìn)提示詞里。很多時(shí)候模型不是不會(huì)算而是不知道這里需要小心。你告訴它哪里是坑它繞過(guò)去的概率會(huì)高很多。這個(gè)思路聽起來(lái)笨但實(shí)測(cè)比盲目調(diào)參有效得多。