建多智能體自主數(shù)學(xué)發(fā)現(xiàn)環(huán)境:提議-驗(yàn)證-攻擊-裁決框架)
在人工智能研究中數(shù)學(xué)推理一直被視為衡量機(jī)器智能的重要試驗(yàn)場(chǎng)。傳統(tǒng)自動(dòng)定理證明和數(shù)學(xué)軟件更多依賴人工定義規(guī)則、搜索策略或預(yù)置題庫(kù)系統(tǒng)本身并沒(méi)有“提出問(wèn)題”的能力。而“開(kāi)放世界多智能體環(huán)境中的自主數(shù)學(xué)發(fā)現(xiàn)”這個(gè)方向嘗試讓多個(gè)智能體在一個(gè)可持續(xù)探索的數(shù)學(xué)環(huán)境中自己生成猜想、驗(yàn)證猜想、尋找反例并在多輪博弈中不斷修正結(jié)論。它不是讓你給模型背答案而是讓模型學(xué)會(huì)像研究者一樣發(fā)現(xiàn)問(wèn)題再用嚴(yán)謹(jǐn)工具確認(rèn)問(wèn)題。本文將圍繞一條可落地的技術(shù)主線展開(kāi)如何使用 Python 構(gòu)建一個(gè)“提議-驗(yàn)證-攻擊-裁決”的多智能體數(shù)學(xué)發(fā)現(xiàn)環(huán)境。在這個(gè)環(huán)境里提議者負(fù)責(zé)生成數(shù)學(xué)猜想驗(yàn)證者使用符號(hào)計(jì)算或數(shù)值采樣檢查猜想攻擊者主動(dòng)尋找反例裁判負(fù)責(zé)終結(jié)無(wú)意義的爭(zhēng)論。整個(gè)過(guò)程是開(kāi)放式的智能體可以不斷引入新的數(shù)字域、新的運(yùn)算規(guī)則和新的關(guān)系約束從而形成一個(gè)可持續(xù)擴(kuò)展的自主發(fā)現(xiàn)閉環(huán)。這個(gè)方向適合以下讀者正在做多智能體協(xié)作框架選型的算法工程師希望把大模型接入數(shù)學(xué)驗(yàn)證工具鏈的研究者以及想在強(qiáng)化學(xué)習(xí)或群體智能項(xiàng)目里加入“共同推理”機(jī)制的開(kāi)發(fā)者。讀完本文后你會(huì)得到一個(gè)最小可運(yùn)行的 Python 工程骨架理解每個(gè)智能體扮演的角色知道如何讓系統(tǒng)真正運(yùn)行起來(lái)也了解它距離自動(dòng)化數(shù)學(xué)研究還有哪些工程差距。1. 先想清楚為什么自主數(shù)學(xué)發(fā)現(xiàn)需要多智能體環(huán)境1.1 單智能體做數(shù)學(xué)發(fā)現(xiàn)的三個(gè)瓶頸單個(gè)智能體直接做數(shù)學(xué)發(fā)現(xiàn)時(shí)最容易出現(xiàn)的問(wèn)題是“自說(shuō)自話”。它可能生成一個(gè)結(jié)構(gòu)看起來(lái)很漂亮的結(jié)論但由于缺少外部檢驗(yàn)常常把偶然的數(shù)值巧合當(dāng)作一般規(guī)律。例如一個(gè)模型在 1 到 100 的整數(shù)范圍內(nèi)驗(yàn)證了某個(gè)不等式成立就認(rèn)為它是全局定理實(shí)際上第 101 個(gè)數(shù)就是反例。這種問(wèn)題不能單純靠更大規(guī)模的模型解決。數(shù)學(xué)發(fā)現(xiàn)包含兩個(gè)不同性質(zhì)的任務(wù)生成候選結(jié)論和驗(yàn)證候選結(jié)論。生成是發(fā)散性的驗(yàn)證是收斂性的。單個(gè)模型很難同時(shí)扮演這兩種角色讓生成者去驗(yàn)證它會(huì)傾向于維護(hù)自己寫(xiě)出的結(jié)論讓驗(yàn)證者去生成它會(huì)變得保守失去探索能力。把兩個(gè)角色拆開(kāi)讓不同智能體負(fù)責(zé)不同目標(biāo)函數(shù)是工程上的自然選擇。第二個(gè)瓶頸是局部搜索。一個(gè)智能體如果只在一個(gè)固定數(shù)字域里探索很容易陷入自己熟悉的模式反復(fù)提出類似猜想。開(kāi)放世界環(huán)境則需要智能體有能力跳出現(xiàn)有邊界去改變數(shù)字域、改變運(yùn)算規(guī)則、改變關(guān)系約束。這種“跳出舒適區(qū)”的動(dòng)作只有在環(huán)境中存在競(jìng)爭(zhēng)或激勵(lì)差異時(shí)才會(huì)穩(wěn)定發(fā)生。第三個(gè)瓶頸是可信度。數(shù)學(xué)發(fā)現(xiàn)的最終產(chǎn)物應(yīng)該是可驗(yàn)證的命題而不是自然語(yǔ)言表述的“感覺(jué)”。單智能體輸出一段文字說(shuō)這個(gè)猜想成立沒(méi)有結(jié)構(gòu)化表達(dá)也沒(méi)有工具參與校驗(yàn)后續(xù)人類無(wú)法復(fù)查。多智能體環(huán)境中加入驗(yàn)證者和裁判角色后每個(gè)結(jié)論都帶上了驗(yàn)證記錄可信度會(huì)明顯提高。1.2 把“開(kāi)放世界”理解成可擴(kuò)展的狀態(tài)空間這里的“開(kāi)放世界”并不是指一個(gè)圖形化的 3D 場(chǎng)景而是指數(shù)學(xué)生成環(huán)境的狀態(tài)空間可以動(dòng)態(tài)擴(kuò)展。環(huán)境內(nèi)部維護(hù)一組數(shù)學(xué)對(duì)象比如整數(shù)、有理數(shù)、模數(shù)、圖、函數(shù)以及一組操作符比如加法、乘法、取模、連接。智能體可以建立新的對(duì)象并把新對(duì)象加入環(huán)境供后續(xù)回合使用。從工程實(shí)現(xiàn)上看開(kāi)放世界環(huán)境至少需要三層抽象對(duì)象層保存當(dāng)前環(huán)境中的數(shù)學(xué)實(shí)體每個(gè)實(shí)體有類型和值。規(guī)則層保存可用的運(yùn)算規(guī)則規(guī)則定義了輸入類型、輸出類型和求值函數(shù)。關(guān)系層保存智能體關(guān)心的關(guān)系例如“相等”“整除”“同余”“小于”以及已經(jīng)被驗(yàn)證或證偽的命題記錄。與傳統(tǒng)封閉題庫(kù)不同環(huán)境本身不預(yù)先知道哪些結(jié)論是正確的。它的職責(zé)是提供計(jì)算工具和存儲(chǔ)記錄讓智能體在探索過(guò)程中逐步積累知識(shí)。這也是“自主數(shù)學(xué)發(fā)現(xiàn)”區(qū)別于“自動(dòng)求解已知問(wèn)題”的核心差異。1.3 多智能體在這里不是聊天群而是角色分工模型很多項(xiàng)目把多個(gè)大模型實(shí)例放在一起讓它們互相聊天美其名曰多智能體系統(tǒng)。這種做法在開(kāi)放世界數(shù)學(xué)發(fā)現(xiàn)里效率很低因?yàn)槊總€(gè)智能體沒(méi)有明確的生存目標(biāo)消息很快會(huì)漂移成泛泛而談。真正有效的多智能體環(huán)境每個(gè)角色必須有獨(dú)立的效用函數(shù)和決策邊界。在本文的框架中環(huán)境內(nèi)部至少存在四類角色角色核心目標(biāo)典型行為失敗表現(xiàn)提議者生成新猜想數(shù)量?jī)?yōu)先于質(zhì)量構(gòu)造表達(dá)式、關(guān)系、邊界條件重復(fù)陳舊猜想驗(yàn)證者對(duì)給定猜想執(zhí)行確定性檢查或高精度檢查符號(hào)化簡(jiǎn)、數(shù)值采樣、定理調(diào)用誤判為真攻擊者尋找反例驗(yàn)證猜想邊界隨機(jī)搜索、邊界掃描、遺傳搜索只做隨機(jī)數(shù)生成裁判判斷論戰(zhàn)是否收斂決定記錄或終止匯總驗(yàn)證記錄和反例證據(jù)偏袒某個(gè)角色這種結(jié)構(gòu)類似工業(yè)界的“紅隊(duì)對(duì)抗”提議者提出一個(gè)假設(shè)攻擊者負(fù)責(zé)打掉它驗(yàn)證者負(fù)責(zé)給出專業(yè)結(jié)論裁判負(fù)責(zé)維護(hù)交流協(xié)議。它并不是為了熱鬧而是為了讓每個(gè)智能體的失敗都能被其他角色發(fā)現(xiàn)并糾正。2. 設(shè)計(jì)一套可運(yùn)行的“提議-驗(yàn)證-攻擊-裁決”框架2.1 消息不是自然語(yǔ)言而是結(jié)構(gòu)化 Hypothesis 對(duì)象多智能體系統(tǒng)最容易踩的坑是讓智能體之間傳遞自然語(yǔ)言。數(shù)學(xué)表達(dá)對(duì)精確性要求極高一句話里含糊一點(diǎn)整個(gè)推導(dǎo)鏈條就全錯(cuò)了。因此在工程實(shí)現(xiàn)中智能體之間的所有通信都應(yīng)當(dāng)使用結(jié)構(gòu)化對(duì)象本文統(tǒng)一稱為Hypothesis。一個(gè) Hypothesis 至少包含四個(gè)字段id假設(shè)的唯一編號(hào)用于追溯。expression數(shù)學(xué)表達(dá)式使用 Python 可求值的字符串或 AST。domain這個(gè)假設(shè)適用的集合例如整數(shù)集、正整數(shù)集、模 7 整數(shù)集。relation關(guān)心哪種關(guān)系例如“對(duì)一切 xexpression(x) 為真”還是“存在某個(gè) x 使 expression(x) 成立”。用 Python 表示如下from dataclasses import dataclass, field from typing import List, Any dataclass class Hypothesis: id: str expression: str domain: str relation: str # forall 或 exists variables: List[str] constraints: dict field(default_factorydict) status: str pending # pending / verified / refuted / disputed這個(gè)對(duì)象在提議者生成后立即廣播給驗(yàn)證者和攻擊者。驗(yàn)證者在同一個(gè)對(duì)象上執(zhí)行檢查攻擊者在這個(gè)對(duì)象上生成反例搜索。裁判最后根據(jù)兩者返回的記錄更新 status。2.2 環(huán)境黑板讓智能體共享歷史而不是各自記憶每個(gè)智能體如果只在本地維護(hù)自己的歷史知識(shí)的復(fù)用就會(huì)很弱。提議者提出的猜想被驗(yàn)證為真后攻擊者下一次搜索應(yīng)該避開(kāi)已被驗(yàn)證的區(qū)域同樣的被證偽的表達(dá)式模式也應(yīng)該被記錄下來(lái)。為了實(shí)現(xiàn)這一點(diǎn)環(huán)境內(nèi)部設(shè)計(jì)一個(gè)共享黑板保存所有歷史命題和驗(yàn)證記錄。黑板的數(shù)據(jù)結(jié)構(gòu)可以設(shè)計(jì)成以 Hypothesis id 為主鍵的字典值為驗(yàn)證記錄集合class Blackboard: def __init__(self): self.records {} def add_hypothesis(self, hypothesis: Hypothesis): self.records[hypothesis.id] { hypothesis: hypothesis, evidence: [] } def add_evidence(self, hypothesis_id: str, evidence: dict): self.records[hypothesis_id][evidence].append(evidence) def get_verified(self): return [ r[hypothesis] for r in self.records.values() if r[hypothesis].status verified ] def get_refuted(self): return [ r[hypothesis] for r in self.records.values() if r[hypothesis].status refuted ]有了黑板之后新的提議者可以查詢已經(jīng)證偽的模式避免重復(fù)提出完全相同的猜想。驗(yàn)證者也可以參考?xì)v史證據(jù)如果某個(gè)表達(dá)式曾經(jīng)在高精度數(shù)值采樣中失敗它可以選擇更快地返回 refuted。2.3 回合制調(diào)度一輪發(fā)現(xiàn)中每個(gè)智能體只做一件事為了防止智能體之間互相阻塞或無(wú)限爭(zhēng)論調(diào)度器采用回合制。每個(gè)回合包含四個(gè)階段每個(gè)階段由對(duì)應(yīng)角色執(zhí)行一次動(dòng)作Round N: 1. Proposer proposes 1 new hypothesis. 2. Verifier checks numeric/symbolic status. 3. Attacker searches for counterexamples. 4. Judge aggregates evidence and sets status.這種設(shè)計(jì)借鑒了游戲開(kāi)發(fā)中的固定時(shí)間步長(zhǎng)調(diào)度。每個(gè)角色在一個(gè)回合內(nèi)只做有限計(jì)算系統(tǒng)整體保持確定性和可控性。否則一旦攻擊者陷入大規(guī)模搜索整個(gè)環(huán)境的推進(jìn)就會(huì)被卡住。class DiscoverySession: def __init__(self, proposer, verifier, attacker, judge, blackboard): self.proposer proposer self.verifier verifier self.attacker attacker self.judge judge self.blackboard blackboard def run_round(self, round_id: int): hyp self.proposer.propose(self.blackboard.get_refuted()) self.blackboard.add_hypothesis(hyp) verify_result self.verifier.check(hyp) self.blackboard.add_evidence(hyp.id, verify_result) attack_result self.attacker.attack(hyp) self.blackboard.add_evidence(hyp.id, attack_result) final_status self.judge.decide(hyp, verify_result, attack_result) self.blackboard.update_status(hyp.id, final_status) return final_status這個(gè) minimal 調(diào)度器已經(jīng)能讓系統(tǒng)跑起來(lái)。后續(xù)所有擴(kuò)展例如并行提議、多攻擊者協(xié)同、驗(yàn)證緩存等都可以在保持回合結(jié)構(gòu)不變的前提下加入。3. Python 環(huán)境準(zhǔn)備與工程骨架搭建3.1 依賴選擇符號(hào)計(jì)算、數(shù)值計(jì)算、基礎(chǔ)工具庫(kù)實(shí)現(xiàn)這個(gè)框架不需要重型深度學(xué)習(xí)框架。核心依賴是 Python 3.9 以上版本搭配 sympy 做符號(hào)驗(yàn)證和表達(dá)式化簡(jiǎn)numpy 做向量化數(shù)值采樣pydantic 或 dataclass 做結(jié)構(gòu)化通信對(duì)象。推薦環(huán)境清單如下依賴用途安裝命令sympy符號(hào)化簡(jiǎn)、模式匹配、安全表達(dá)式求值pip install sympynumpy大規(guī)模候選點(diǎn)采樣、數(shù)組計(jì)算pip install numpypydantic假設(shè)對(duì)象校驗(yàn)與序列化pip install pydanticpytest驗(yàn)證器和裁決邏輯測(cè)試pip install pytest學(xué)習(xí)環(huán)境可以直接在 Jupyter Notebook 中運(yùn)行。生產(chǎn)環(huán)境建議使用 Python 3.11 或 3.12安裝依賴前先鎖定版本文件避免 sympy 和 numpy 版本不兼容導(dǎo)致表達(dá)式解析行為變化。3.2 項(xiàng)目目錄結(jié)構(gòu)為了讓這個(gè)工程具備擴(kuò)展性建議按角色拆分模塊而不是把所有邏輯寫(xiě)在一個(gè)文件里math_discovery_env/ ├── core/ │ ├── __init__.py │ ├── hypothesis.py # 假設(shè)對(duì)象定義 │ ├── blackboard.py # 共享黑板 │ └── session.py # 回合調(diào)度器 ├── agents/ │ ├── __init__.py │ ├── proposer.py # 提議者 │ ├── verifier.py # 驗(yàn)證者 │ ├── attacker.py # 攻擊者 │ └── judge.py # 裁判 ├── domains/ │ ├── __init__.py │ ├── integer_domain.py # 整數(shù)域 │ ├── modular_domain.py # 模數(shù)域 │ └── poly_domain.py # 多項(xiàng)式域 ├── experiments/ │ └── run_discovery.py # 運(yùn)行入口 └── tests/ ├── test_verifier.py └── test_session.py3.3 早期協(xié)議先用“通用規(guī)則”跑通最小系統(tǒng)不要一開(kāi)始就接入大模型。這個(gè)階段的目標(biāo)是讓多智能體框架在簡(jiǎn)單數(shù)學(xué)域中工作即使智能體邏輯非常幼稚。可以先實(shí)現(xiàn)一個(gè)固定規(guī)則提議者它根據(jù)預(yù)設(shè)模版生成猜想例如“對(duì)任意正整數(shù) nn 是奇數(shù)則 n^2 是奇數(shù)”class RuleProposer: def __init__(self): self.counter 0 def propose(self, refuted_hypotheses): self.counter 1 expression x ** 2 1 return Hypothesis( idfhyp_{self.counter}, expressionexpression, domainpositive_integers, relationforall, variables[x] )這里提議者雖然傻但它已經(jīng)能進(jìn)入完整的驗(yàn)證循環(huán)。等系統(tǒng)跑通后可以逐步替換成基于大模型的提議者讓它生成更有探索性的表達(dá)式。早期協(xié)議的重要性在于排除“框架問(wèn)題”和“模型能力問(wèn)題”的混淆如果你一開(kāi)始就接入大模型出現(xiàn) bug 時(shí)很難判斷是框架錯(cuò)了還是模型錯(cuò)了。4. 核心代碼實(shí)現(xiàn)四個(gè)角色的職責(zé)與參數(shù)設(shè)計(jì)4.1 提議者從模板生成到開(kāi)放式探索提議者的核心功能是把“靈光一現(xiàn)”變成一個(gè)結(jié)構(gòu)化的 Hypothesis。模板式提議者雖然簡(jiǎn)單但它能保證生成內(nèi)容的安全性和可驗(yàn)證性。在數(shù)字域內(nèi)常用的數(shù)學(xué)表達(dá)式模板包括多項(xiàng)式恒等式例如 x^2 y^2 與 (x y)^2 的關(guān)系。整除性關(guān)系例如 n^2 - 1 是否能被 8 整除。同余關(guān)系例如 x^2 mod p 的取值集合。不等關(guān)系例如 x^2 1 2x 是否對(duì)全體整數(shù)成立。實(shí)現(xiàn)時(shí)提議者內(nèi)部維護(hù)一個(gè)候選運(yùn)算符池和變量池隨機(jī)組合成一個(gè)表達(dá)式再選擇一個(gè)關(guān)系類型生成 Hypothesis。為了防止生成無(wú)意義的純隨機(jī)字符串應(yīng)該限制表達(dá)式深度并確保所有變量在使用前出現(xiàn)在變量列表中。class RandomProposer: def __init__(self, operators, domainintegers, max_depth3): self.operators operators self.domain domain self.max_depth max_depth self.counter 0 def propose(self, refuted_hypothesesNone): self.counter 1 expr self._random_expression(x, depth2) hyp Hypothesis( idfhyp_{self.counter}, expressionexpr, domainself.domain, relationforall, variables[x] ) return hyp注意refuted_hypotheses 參數(shù)在這個(gè)簡(jiǎn)單實(shí)現(xiàn)里暫時(shí)沒(méi)被使用但在完整系統(tǒng)中應(yīng)該傳入給模型避免重復(fù)提出相同類型的問(wèn)題。4.2 驗(yàn)證者用 sympy 做符號(hào)校驗(yàn)用 numpy 做邊界采樣驗(yàn)證者負(fù)責(zé)對(duì) Hypothesis 做“確定性檢查”和“高置信度檢查”。確定性檢查適合多項(xiàng)式恒等關(guān)系可以通過(guò) sympy 展開(kāi)表達(dá)式差值看化簡(jiǎn)結(jié)果是否為 0。例如要驗(yàn)證“x^2 1 2x 是否恒成立”可以化簡(jiǎn)表達(dá)式x**2 1 - 2*x結(jié)果應(yīng)該為(x - 1)**2。import sympy as sp class SympyVerifier: def check(self, hypothesis: Hypothesis): x sp.Symbol(x) try: expr sp.sympify(hypothesis.expression) if hypothesis.relation forall: simplified sp.simplify(expr) return {result: unknown, simplified: str(simplified)} except Exception as e: return {result: error, message: str(e)}對(duì)于不確定的情況驗(yàn)證者需要調(diào)用數(shù)值采樣。采樣點(diǎn)不是均勻取 1000 個(gè)隨機(jī)數(shù)而是要在邊界處密集取值因?yàn)閿?shù)學(xué)反例最常出現(xiàn)在“接近邊界”的位置。例如如果 domain 是正整數(shù)采樣應(yīng)該是 1 到 1000 的數(shù)。如果 domain 是實(shí)數(shù)則需要對(duì)負(fù)數(shù)、零、小數(shù)、大數(shù)分別采樣。數(shù)值采樣永遠(yuǎn)無(wú)法證明“恒成立”但能暴露反例。因此驗(yàn)證者的返回值必須包含check_type字段區(qū)分是symbolic還是numeric。裁判在決定結(jié)論時(shí)對(duì) symbolic 驗(yàn)證結(jié)果給予更高權(quán)重。4.3 攻擊者給反例搜索加一點(diǎn)策略而不是純隨機(jī)攻擊者是最容易出現(xiàn)“看起來(lái)在干活實(shí)際上沒(méi)效果”的角色。如果攻擊者只是生成 uniform 隨機(jī)數(shù)它很難發(fā)現(xiàn)邊界反例。更有效的做法是結(jié)合遺傳算法或領(lǐng)域啟發(fā)式規(guī)則。攻擊策略可以拆成三部分邊界掃描在 domain 的邊界附近集中采樣。候選變異從已驗(yàn)證為真的點(diǎn)出發(fā)加入小的擾動(dòng)檢查擾動(dòng)后性質(zhì)是否仍然成立。模式生成根據(jù)驗(yàn)證者返回的疑似問(wèn)題點(diǎn)反向構(gòu)造新的測(cè)試點(diǎn)。在 Python 中攻擊者可以維護(hù)一個(gè)候選點(diǎn)隊(duì)列class Attacker: def __init__(self, rngNone): self.rng rng or np.random.default_rng() def attack(self, hypothesis: Hypothesis): expr hypothesis.expression counterexamples self._search_counterexamples(expr, hypothesis.domain) if counterexamples: return {result: refuted, counterexamples: counterexamples[:5]} return {result: not_found, counterexamples: []} def _search_counterexamples(self, expr, domain): examples [] # 邊界和中心采樣策略 candidates list(range(1, 100)) [10**6, 10**9] for val in candidates: x val if not self._check_expression(expr, x): examples.append(x) return examples實(shí)際運(yùn)行中攻擊者的搜索時(shí)間應(yīng)該被限制。每個(gè) Hypothesis 最多允許 1000 次采樣或 0.5 秒計(jì)算時(shí)間避免整個(gè)會(huì)話被卡住。4.4 裁判用加權(quán)證據(jù)決定命題狀態(tài)裁判是最終裁決者。它讀取驗(yàn)證者的符號(hào)結(jié)果、數(shù)值采樣結(jié)果和攻擊者給出的反例列表然后決定該 Hypothesis 的狀態(tài)。設(shè)計(jì)一個(gè)簡(jiǎn)單但嚴(yán)謹(jǐn)?shù)牟脹Q邏輯如果存在反例直接判定為refuted。如果 sympy 給出確定性的符號(hào)化簡(jiǎn)結(jié)果且證明等式恒成立判定為verified。如果只有數(shù)值采樣沒(méi)有反例且采樣數(shù)量超過(guò)閾值判定為disputed表示有初步支持但還沒(méi)得到證明。如果驗(yàn)證者和攻擊者都沒(méi)有結(jié)果判定為disputed。class Judge: def decide(self, hypothesis, verify_result, attack_result): if attack_result[result] refuted: return refuted if verify_result.get(result) verified: return verified if verify_result.get(result) unknown and attack_result[result] not_found: return disputed return pending裁判的價(jià)值在于把“數(shù)值上沒(méi)找到反例”和“數(shù)學(xué)上證明了正確性”區(qū)分開(kāi)。很多初級(jí)實(shí)現(xiàn)把兩者混為一談最后輸出的所謂定理其實(shí)只是“在采樣范圍內(nèi)沒(méi)被發(fā)現(xiàn)錯(cuò)誤”。這會(huì)讓整個(gè)系統(tǒng)的可靠性下降。4.5 把四個(gè)角色接入調(diào)度器最后把四個(gè)角色組合成完整的發(fā)現(xiàn)會(huì)話def main(): blackboard Blackboard() proposer RandomProposer(operators[, *, **], domainpositive_integers) verifier SympyVerifier() attacker Attacker() judge Judge() session DiscoverySession(proposer, verifier, attacker, judge, blackboard) for round_id in range(10): status session.run_round(round_id) print(fRound {round_id}: {status})運(yùn)行后你會(huì)在終端看到每個(gè)回合的命題狀態(tài)變化。這個(gè)最小系統(tǒng)已經(jīng)能讓“規(guī)則提議者”提出猜想由驗(yàn)證者和攻擊者檢查并由裁判歸檔結(jié)論從而形成自主發(fā)現(xiàn)的完整循環(huán)。5. 運(yùn)行驗(yàn)證跑通一輪并檢查結(jié)果質(zhì)量5.1 最小驗(yàn)證用一個(gè)已知結(jié)論驗(yàn)證框架判斷能力為了確認(rèn)框架沒(méi)有邏輯錯(cuò)誤建議先準(zhǔn)備一個(gè)已知為真的數(shù)學(xué)事實(shí)。例如“對(duì)任意整數(shù) nn^2 不等于 2 mod 4”。這個(gè)結(jié)論很容易用符號(hào)方法驗(yàn)證攻擊者也找不到反例。將這個(gè)結(jié)論以 Hypothesis 形式手動(dòng)放入黑板運(yùn)行驗(yàn)證者和攻擊者確認(rèn)裁判狀態(tài)輸出為verified。known_true Hypothesis( idknown_true_1, expression(x**2 - 2) % 4, domainintegers, relationforall, variables[x] ) # 期望 verify_result 為 symbolic verified # 期望 status 為 verified這個(gè)測(cè)試能快速發(fā)現(xiàn)基礎(chǔ)錯(cuò)誤比如表達(dá)式解析失敗、模運(yùn)算域未定義、裁判狀態(tài)轉(zhuǎn)換邏輯寫(xiě)反等。5.2 再測(cè)一個(gè)已知為假的猜想看看反例會(huì)不會(huì)被抓住另一個(gè)關(guān)鍵測(cè)試是傳入一個(gè)錯(cuò)誤命題例如“對(duì)任意正整數(shù) nn^2 n 41 總是素?cái)?shù)”。這個(gè)命題在 n 較小時(shí)成立但當(dāng) n 40 時(shí)結(jié)果是 1681 41 * 41這是經(jīng)典反例邊界。攻擊者的邊界掃描策略應(yīng)該能在候選點(diǎn)中覆蓋這個(gè)位置。如果攻擊者沒(méi)有返回反例問(wèn)題通常出在采樣范圍過(guò)小或沒(méi)有覆蓋邊界值。解決方法是把采樣策略從“均勻隨機(jī)”調(diào)整為“等比數(shù)列 特殊值列表”并將諸如 40、41、42 這類常見(jiàn)反例點(diǎn)加入候選集。5.3 驗(yàn)證指標(biāo)不要只統(tǒng)計(jì)通過(guò)率要看探索覆蓋率衡量一個(gè)自主發(fā)現(xiàn)系統(tǒng)不能只記錄“驗(yàn)證通過(guò)了多少個(gè)猜想”。更有價(jià)值的指標(biāo)包括指標(biāo)含義計(jì)算方式新假設(shè)率提議者生成與歷史假設(shè)不重復(fù)的比例重復(fù)假設(shè)數(shù) / 總假設(shè)數(shù)反例攻擊命中率攻擊者返回反例的假設(shè)比例被證偽數(shù) / 參與攻擊數(shù)驗(yàn)證置信度已驗(yàn)證假設(shè)中符號(hào)驗(yàn)證占比符號(hào)驗(yàn)證數(shù) / 已驗(yàn)證數(shù)探索覆蓋率新變量、新操作符、新域出現(xiàn)頻率環(huán)境變化計(jì)數(shù)器這些指標(biāo)缺一不可。只有通過(guò)率高說(shuō)明提議者太保守只有新假設(shè)率高說(shuō)明提議者太發(fā)散。要在探索性和可靠性之間取得平衡最好的辦法是讓攻擊者樣本數(shù)和驗(yàn)證者采樣數(shù)成為可調(diào)參數(shù)并觀察系統(tǒng)輸出隨參數(shù)變化的情況。6. 常見(jiàn)問(wèn)題排查從現(xiàn)象定位到根因6.1 假設(shè)對(duì)象校驗(yàn)失敗表達(dá)式中存在未知符號(hào)現(xiàn)象運(yùn)行驗(yàn)證者時(shí)拋出sympy.SympifyError或NameError提示y未定義。可能原因提議者在變量列表中沒(méi)有聲明所有變量而驗(yàn)證者直接把字符串傳給 sympy 求值。處理方式在Hypothesis創(chuàng)建時(shí)對(duì)變量列表做嚴(yán)格校驗(yàn)驗(yàn)證者在解釋表達(dá)式前先用 sympy 的symbols()顯式初始化變量再?gòu)淖饔糜蛑胁樵儽磉_(dá)式里的自由符號(hào)確保所有自由符號(hào)都在變量列表中。def _validate_variables(expr: str, variables: List[str]): free_symbols {str(s) for s in sp.sympify(expr).free_symbols} declared set(variables) if not free_symbols.issubset(declared): raise ValueError(fFree symbols {free_symbols - declared} not declared)6.2 數(shù)值采樣沒(méi)有找到反例但狀態(tài)被判為 verified現(xiàn)象攻擊者跑了 10000 次隨機(jī)采樣沒(méi)有反例裁判直接判定為 verified。原因驗(yàn)證者的返回值里包含了result: verified字段但它的邏輯只做了數(shù)值采樣沒(méi)有做符號(hào)化簡(jiǎn)。裁判無(wú)法區(qū)分“已證明”和“未發(fā)現(xiàn)反例”。處理方式在驗(yàn)證者中增加check_type字段。數(shù)值采樣階段不能返回verified只能返回maybe或not_found。只有 sympy 化簡(jiǎn)或定理證明接口返回確定性結(jié)果時(shí)才允許返回verified。裁判端再做一次最終校驗(yàn)。6.3 探索過(guò)程發(fā)散提議者不斷提出無(wú)意義的復(fù)雜表達(dá)式現(xiàn)象10 輪后黑板里全是x**7 y**3 - x*y**2 1這類混亂表達(dá)式驗(yàn)證者和攻擊者只能勉強(qiáng)執(zhí)行但系統(tǒng)沒(méi)有積攢任何有價(jià)值的結(jié)論。原因提議者的表達(dá)式深度和復(fù)雜度沒(méi)有限制導(dǎo)致生成的 Hypothesis 超出了現(xiàn)有驗(yàn)證器能力范圍。處理方式在提議者中設(shè)置復(fù)雜度評(píng)分表達(dá)式深度超過(guò)閾值時(shí)直接重新生成。同時(shí)提供一個(gè)“溫度參數(shù)”控制表達(dá)式中的操作符數(shù)量。對(duì)純模板生成的表達(dá)式建議先使用限定操作符集合、*、**、%并限制指數(shù)不超過(guò) 3。這樣能夠保證每個(gè)假設(shè)至少是“可分析”的。6.4 裁判只依賴攻擊者結(jié)果導(dǎo)致命題狀態(tài)反復(fù)橫跳現(xiàn)象同一個(gè)假設(shè)攻擊者偶發(fā)采樣到反例時(shí)狀態(tài)為 refuted下一輪攻擊者隨機(jī)采樣沒(méi)找到反例狀態(tài)又變回 disputed。原因裁判沒(méi)有保存歷史裁決結(jié)果每一輪都根據(jù)當(dāng)前攻擊結(jié)果重新決定。處理方式裁決邏輯應(yīng)該是單調(diào)的——一旦某個(gè)假設(shè)被 refuted就不能再變回 verified 或 disputed。實(shí)現(xiàn)時(shí)在 Judge 的 decide 方法中加入狀態(tài)機(jī)判斷并且建議把攻擊結(jié)果緩存到黑板上避免重復(fù)計(jì)算。問(wèn)題現(xiàn)象常見(jiàn)原因檢查方式處理建議表達(dá)式校驗(yàn)失敗變量列表與表達(dá)式自由符號(hào)不一致打印 free_symbols 與 variables校驗(yàn)變量聲明沒(méi)有反例卻被判為真驗(yàn)證者把數(shù)值采樣當(dāng)成證明檢查 check_type 字段數(shù)值采樣只能返回未發(fā)現(xiàn)系統(tǒng)生成過(guò)于復(fù)雜提議者沒(méi)有復(fù)雜度控制統(tǒng)計(jì)表達(dá)式節(jié)點(diǎn)數(shù)設(shè)置深度和操作符上限狀態(tài)反復(fù)橫跳裁判沒(méi)有歷史記憶查看同一 id 的多條記錄狀態(tài)機(jī)單調(diào)更新7. 最佳實(shí)踐從最小原型走向可信賴的數(shù)學(xué)發(fā)現(xiàn)環(huán)境7.1 先讓環(huán)境“可信”再讓模型“聰明”許多團(tuán)隊(duì)拿到 “自主數(shù)學(xué)發(fā)現(xiàn)” 這個(gè)題目后第一反應(yīng)就是接入一個(gè)大型語(yǔ)言模型讓模型直接輸出數(shù)學(xué)猜想。這種做法的風(fēng)險(xiǎn)在于模型輸出帶有隨機(jī)性而驗(yàn)證環(huán)境如果本身不可信最終結(jié)論就完全無(wú)法依賴。工程上正確的順序是先讓環(huán)境具備可信驗(yàn)證能力再逐步替換智能體內(nèi)部邏輯。早期使用規(guī)則模板生成假設(shè)用 sympy 做確定性檢查用人工已知反例測(cè)試驗(yàn)證器和攻擊者確?;A(chǔ)設(shè)施沒(méi)錯(cuò)之后才讓模型承擔(dān)提議和攻擊中的策略部分。這樣即使模型輸出質(zhì)量不高環(huán)境也能兜底不會(huì)把錯(cuò)誤結(jié)論當(dāng)作定理保存下來(lái)。7.2 使用黑板緩存驗(yàn)證結(jié)果避免重復(fù)計(jì)算數(shù)學(xué)探索過(guò)程中大量假設(shè)在結(jié)構(gòu)上是相似的。例如x^2 1和(x1)^2 - 2x在化簡(jiǎn)后可能等價(jià)。如果每次都對(duì)這類假設(shè)重新做符號(hào)化簡(jiǎn)和數(shù)值采樣計(jì)算成本會(huì)線性膨脹。黑板系統(tǒng)可以緩存表達(dá)式規(guī)范化后的摘要鍵已經(jīng)驗(yàn)證失敗的表達(dá)式模式可以直接被拒絕。def _normalize_expr(expr: str): x sp.Symbol(x) return sp.srepr(sp.sympify(expr))使用srepr獲取表達(dá)式的規(guī)范表示形式比使用字符串拼接更可靠因?yàn)閤1和1x會(huì)在規(guī)范化后變成同一個(gè)鍵。7.3 限制每個(gè)智能體的單輪預(yù)算保證系統(tǒng)可控多智能體環(huán)境里的智能體如果不受資源限制任何一個(gè)角色的死循環(huán)都可能拖垮整個(gè)會(huì)話。實(shí)際工程建議為每個(gè)角色設(shè)置獨(dú)立的預(yù)算包括時(shí)間預(yù)算、采樣點(diǎn)預(yù)算和調(diào)用次數(shù)預(yù)算。例如攻擊者每輪最多采樣 2000 點(diǎn)驗(yàn)證者每輪最多執(zhí)行 2 秒符號(hào)計(jì)算提議者每輪最多生成 3 個(gè)候選假設(shè)。這樣做除了防止失控還讓系統(tǒng)時(shí)間可預(yù)期便于調(diào)試和壓測(cè)。注意限制預(yù)算不只是為了性能更是為了語(yǔ)義清晰。當(dāng)命題狀態(tài)是 disputed 時(shí)如果沒(méi)有預(yù)算限制你無(wú)法區(qū)分“搜索得不夠久”和“確實(shí)沒(méi)有反例”的區(qū)別。有了預(yù)算每一輪驗(yàn)證結(jié)果都附帶了搜索強(qiáng)度信息便于后續(xù)分析。7.4 生產(chǎn)環(huán)境還需要補(bǔ)上日志、監(jiān)控和回滾如果這個(gè)系統(tǒng)要長(zhǎng)期運(yùn)行那么建議輸出結(jié)構(gòu)化日志把每個(gè)假設(shè)的ID、表達(dá)式、驗(yàn)證結(jié)果、攻擊結(jié)果和裁決狀態(tài)記錄為 JSON 行。這樣后續(xù)可以重放某一段探索過(guò)程分析提議者策略的變化是否有效。{event: hypothesis_verified, id: hyp_001, expr: x**2 % 4, check_type: symbolic} {event: counterexample_found, id: hyp_002, value: 40}7.5 三個(gè)可以直接落到自己項(xiàng)目里的做法如果你的項(xiàng)目只是想利用這個(gè)框架的一部分能力建議從下面三個(gè)做法開(kāi)始把“提議者”和“驗(yàn)證者”拆成獨(dú)立服務(wù)通過(guò)消息隊(duì)列通信。這樣可以方便地把數(shù)學(xué)發(fā)現(xiàn)能力嵌入流水線而不是在一個(gè)進(jìn)程里強(qiáng)行耦合。把驗(yàn)證者從 sympy 擴(kuò)展到更專業(yè)的定理證明工具。先定義統(tǒng)一驗(yàn)證接口再為不同工具寫(xiě)適配器避免把環(huán)境綁定到某個(gè)具體庫(kù)。給攻擊者加入強(qiáng)化學(xué)習(xí)策略。攻擊者在不斷尋找反例的過(guò)程中實(shí)際上是在做獎(jiǎng)勵(lì)稀疏的搜索。把它訓(xùn)練成一個(gè)能優(yōu)先在“可疑區(qū)域”采樣的策略網(wǎng)絡(luò)是目前這個(gè)方向比較自然的大模型接入點(diǎn)。8. 擴(kuò)展方向從數(shù)字游戲走向自動(dòng)化數(shù)學(xué)研究目前這套最小系統(tǒng)只能處理簡(jiǎn)單的數(shù)字域和表達(dá)式關(guān)系。真正要讓多智能體環(huán)境做出更有價(jià)值的數(shù)學(xué)發(fā)現(xiàn)還需要三個(gè)層面的擴(kuò)展。第一層是領(lǐng)域擴(kuò)展。除了整數(shù)和多項(xiàng)式新的領(lǐng)域可以包括密碼學(xué)里的有限域、代數(shù)中的群論、拓?fù)渲械膱D結(jié)構(gòu)以及組合數(shù)學(xué)中的格路徑。環(huán)境每增加一個(gè)新的領(lǐng)域就必須同時(shí)提供對(duì)應(yīng)的規(guī)則、驗(yàn)證工具和攻擊策略工作量不小但每個(gè)領(lǐng)域都能帶來(lái)新的研究問(wèn)題。第二層是證明生成。當(dāng)前框架只能判斷一個(gè)命題是否被反例推翻或者是否能用符號(hào)化簡(jiǎn)驗(yàn)證。真正的數(shù)學(xué)發(fā)現(xiàn)要求系統(tǒng)在 verified 狀態(tài)下能夠生成證明軌跡而不僅僅是返回一個(gè)布爾值。這意味著驗(yàn)證者需要記錄完整推導(dǎo)步驟并把步驟結(jié)構(gòu)化存儲(chǔ)。這是向自動(dòng)定理證明延伸的關(guān)鍵路徑。第三層是智能體之間的長(zhǎng)期協(xié)作。當(dāng)智能體數(shù)量增多后提議者可以依賴其他角色的歷史結(jié)果繼續(xù)做更復(fù)雜的抽象。例如在某個(gè)子問(wèn)題被證明后提議者可以把該命題作為“引理”組合進(jìn)更大的假設(shè)中。這種層次化推理能力是開(kāi)放世界環(huán)境相比封閉題庫(kù)的最大優(yōu)勢(shì)。如果讀者想從最小工程開(kāi)始練習(xí)建議順序是先把本文的框架在本地跑通再用 sympy 替換驗(yàn)證器增加兩個(gè)數(shù)字域然后接入一個(gè)開(kāi)源大模型作為提議者最后加入日志和可視化。每一層擴(kuò)展都能獨(dú)立驗(yàn)證而不是推到重來(lái)。這個(gè)方向真正困難的不是讓智能體說(shuō)出一個(gè)結(jié)論而是讓它學(xué)會(huì)在一個(gè)擁有驗(yàn)證、反例、爭(zhēng)論和證據(jù)的開(kāi)放世界里不斷修正自己的判斷。多智能體機(jī)制的價(jià)值就在這里每個(gè)角色都有不同的功利目標(biāo)它們的博弈讓系統(tǒng)的結(jié)論更加接近數(shù)學(xué)研究“可證明、可復(fù)現(xiàn)、可承認(rèn)”的標(biāo)準(zhǔn)。