模型 / 資料集
spcl/graph-of-thoughts avatar
spcl/graph-of-thoughts

Graph of Thoughts:把 LLM 推理寫成一張可執行的運算圖

Official Implementation of "Graph of Thoughts: Solving Elaborate Problems with Large Language Models"

2,840 個 Star216 個 ForkPythonNOASSERTION

秒懂

它是什麼?
spcl/graph-of-thoughts 把解題流程拆成 Graph of Operations,由 Controller 依序驅動 LLM 執行。它適合想重現論文實驗或研究推理拓撲的人,不適合想找現成產品化推論服務的團隊。
適合誰用?
要採用這個框架,先確認你的問題能否寫成 Generate、Score、GroundTruth 這類 operations 的序列,並且願意自己接上 LLM 與解析器。研究用途、想復現論文排序與關鍵字計數實驗的人,直接從 examples 目錄跑起最省事。
可以商用嗎?
請先確認。這個儲存庫使用的授權不在我們自動分類的範圍內,商用前請閱讀儲存庫中的 LICENSE 檔案。
還在維護嗎?
有在維護。儲存庫最近一次提交在 175 天前。
用什麼語言寫的?
主要是 Python(依據 GitHub 的語言統計)。

以上回答依據專案的 GitHub 資料(最近同步於 2026年9月15日)與我們的分析,不構成法律意見。

開源專案深度解析

它解決的是推理結構的表達問題,不是模型能力問題

多數 LLM 應用把思考壓成一條直線:輸入提示、拿到回應、必要時再追問一輪。這種寫法在簡單問答上夠用,但當問題需要先把答案拆開、分別評分、再合併回一個結果時,直線流程就開始扭曲。你要嘛把所有邏輯塞進一段提示,要嘛在程式碼裡手寫分支,兩者都讓實驗難以複現。

GoT 的做法是把解題流程本身當成資料結構。README 的開頭寫得很直接:這個框架讓你「將複雜問題建模為 Graph of Operations(GoO),並以大型語言模型作為引擎自動執行」。注意主詞是 GoO,不是 LLM。框架關心的不是模型多強,而是你怎麼描述一組操作之間的依賴關係。

目標讀者有兩類。第一類是研究人員,想驗證不同推理拓撲(鏈狀、樹狀、圖狀)在同一題目上的差異,並且需要把中間產物存下來比對。第二類是工程師,手上有一個明確可拆解的多步任務,願意為了可控性放棄一點開發速度。README 也說明了框架的彈性:你可以用新的 GoT 方法解題,也可以實作「類似 CoT 或 ToT 的 GoO」。換句話說,它把先前那些方法當成同一套抽象下的特例。

Graph of Operations 與 Controller:誰決定順序,誰負責呼叫模型

從 README 的 Quick Start 可以看出三個角色。operations.GraphOfOperations 是容器,你用 append_operation 把操作依序排進去。範例裡的 CoT 版本只有三步:Generate、Score(評分函式為 utils.num_errors)、GroundTruth(驗證函式為 utils.test_sorting)。

Controller 是執行者。它的建構子吃五個參數:語言模型物件、GoO、Prompter、Parser,以及一個描述初始 thought state 的字典。這個字典值得注意,因為它同時是輸入也是流程狀態。CoT 範例填的是 original、current、method 三個鍵;GoT 範例多了一個 phase 鍵,值為 0,method 則改成 got。同一個題目、同一個模型,差別只在初始狀態與 GoO 的形狀。

Prompter 與 Parser 是這套設計的接縫。Prompter 負責把當前的 thought state 轉成給 LLM 的文字,Parser 負責把模型回傳的字串轉回結構化資料。兩者都以類別形式傳入,也就是說換題目時你換的是這兩個類別,而不是改動 Controller 或 operations 的核心。

執行完之後呼叫 ctrl.output_graph("output_cot.json"),把整張圖寫成 JSON。README 明講,你可以「藉由檢視輸出圖 output_cot.json 與 output_got.json 來比較兩者結果」,而最終 thought state 的分數代表排序清單中的錯誤數量。分數是 num_errors 算出來的,不是模型自評。

安裝與最小可跑路徑:pip、config.json、兩個模組指令

環境門檻是 Python 3.8 或更新版本,README 在 Setup Guide 第一句就寫明了。安裝有兩條路。只想使用套件的使用者直接從 PyPI 裝:

pip install graph_of_thoughts

要改原始碼的開發者則從 GitHub 取下來,在專案目錄內以可編輯模式安裝:

git clone https://github.com/spcl/graph-of-thoughts.git cd graph-of-thoughts pip install -e .

兩條路都要求你先啟用 Python 環境。

真正的摩擦點在 LLM 設定。README 沒有在這一頁給出金鑰格式,而是把讀者導向 Controller 的說明文件:graph_of_thoughts/controller/README.md。程式碼範例則透露了形狀,language_models.ChatGPT("config.json", model_name="chatgpt"),註解寫著「假設當前目錄有含 OpenAI API key 的 config.json」。這表示設定檔路徑是硬傳進建構子的,你要嘛把 config.json 放在工作目錄,要嘛自己改路徑。

想先看它跑起來的樣子,README 提供了兩個模組指令:

python -m examples.sorting.sorting_032 python -m examples.keyword_counting.keyword_counting

README 提醒結果會存在各自的 examples 子目錄下。這兩個指令不需要你自己寫 Prompter 或 Parser,是確認環境與金鑰是否正確的最短路徑。

範例目錄是論文實驗的入口,也是這份程式碼最重的資產

README 把 examples 目錄描述為「包含數個可用此框架解決的問題範例,其中包括論文中所呈現的那些」,並說每個範例都有自己的 README.md 說明如何執行與調整。這是判斷要不要投入時間的關鍵資訊:你不必從空白開始設計 GoO,可以直接讀既有的 Graph of Operations 怎麼被組出來。

論文結果的復現也走同一條路。README 說你可以依 examples 目錄的指示跑論文實驗;如果只想檢視與重繪結果,則用 paper 目錄。這種分工意味著 paper 目錄放的是繪圖與結果資料,不是執行腳本,跑實驗的成本主要落在 LLM 呼叫上。

排序範例的規模在程式碼裡是明示的:32 個數字,題目變數就叫 to_be_sorted。這個規模不是隨便選的,它小到能人工核對錯誤數,又大到讓 CoT 與 GoT 的差異有機會顯現。關鍵字計數範例則展示了另一種題型。兩者都是文字進、文字出的任務,不需要外部工具或檢索。

要注意的是,範例的價值在於示範結構,而不是示範效能。README 沒有給出任何延遲、成本或準確率的數字,只說分數代表錯誤數量,實際數字要你自己跑出來。

限制一:這是一份研究實作,不是維運過的服務

版本節奏說明了一切。v0.0.1 在 2023 年 8 月,v0.0.2 在同年 9 月,兩者都還在 0.0.x 階段。授權欄位顯示為 NOASSERTION,代表 GitHub 無法從倉庫內容自動判定授權,README 也沒有授權段落。要把它放進商業產品的依賴樹之前,這件事必須先釐清,而且我無法從現有材料告訴你它最終是什麼條款。

第二個限制在於抽象層的成本。為了讓同一套 Controller 能跑 CoT 與 GoT,你必須提供 Prompter 與 Parser 兩個類別。對單一、固定的任務來說,這比直接寫一段 prompt 加一次 API 呼叫要多出不少程式碼。框架的彈性只有在你要比較多種推理結構、或要保存中間圖譜時才回本。

第三個限制是失敗模式偏安靜。Controller 依序執行 operations,Score 用你提供的函式打分,GroundTruth 用你提供的函式驗證。如果 Parser 把模型輸出解析錯了,錯誤會以低分的形式出現在圖裡,而不是拋出例外。你必須自己去看 output_got.json 的最終 thought state 分數,才知道這一輪到底發生什麼事。

限制二:什麼情況下它會是錯的工具

如果你的任務是一次問答、一次摘要、一次分類,GoO 只會是一層多餘的間接。你要寫 Prompter、寫 Parser、組 GraphOfOperations、傳初始狀態字典,換來的是一張只有兩三個節點的圖。這種情況下直接用模型 SDK 更短也更清楚。

如果你的瓶頸是檢索或工具呼叫,這個框架也幫不上忙。README 描述的引擎是 LLM,範例是排序與關鍵字計數,都是純文字進出的推理題。它沒有提到向量資料庫、外部 API 或函式呼叫的整合方式。

還有一種情況容易被忽略:需要嚴格延遲保證的線上服務。GoT 版本在排序範例中會經過多個 phase,每個 phase 都牽涉 LLM 呼叫,而 CoT 版本只有一次 Generate。README 沒有給出任何呼叫次數或時間數字,但從「更複雜的 GoT 方法」這個描述可以合理推斷,圖越複雜,呼叫越多。這是設計上的取捨,不是缺陷,但如果你在意尾延遲,就要先量測再決定。

替代方案:LangGraph 走的是狀態機,GoT 走的是運算圖

同類工具裡最常被拿來對比的是 LangGraph。兩者都在處理「多步 LLM 流程」這個問題,但切入點不同。

LangGraph 把流程建模成狀態機:節點是函式,邊是轉移條件,執行時沿著邊推進共用狀態。它的重心在控制流,包含迴圈、條件分支、中斷與續跑。GoT 的重心在資料流:GraphOfOperations 是一串操作,每個操作消費並產生 thought state,Controller 依序執行,最後把整張圖 dump 成 JSON。

差異在可觀測性上最明顯。GoT 的產出是一份圖檔,你可以事後檢視每個 thought state 與它的分數,這對研究比對很直接。LangGraph 的產出是執行軌跡,重心在流程有沒有走對分支。反過來說,GoT 的 operations 是內建集合(Generate、Score、GroundTruth 等),要表達複雜的分支邏輯會比較繞;LangGraph 的節點是任意函式,表達力更自由。

選擇的判準很簡單:你要比較不同推理拓撲、要保存中間思考與分數,選 GoT。你要編排多個工具、多個模型、帶重試與人工介入的生產流程,LangGraph 的模型更貼合。兩者不是同一層的東西,硬要比優劣沒有意義。

維護成本與升級前該確認的事

這個倉庫沒有封存,最後一次推送是 2026 年 3 月。但發佈版本只有 v0.0.1 與 v0.0.2,時間點都在 2023 年 9 月。也就是說,程式碼有在動,語意化版本卻停在很早期。對依賴管理來說,這代表 pip install graph_of_thoughts 拿到的版本與 main 分支可能有一段距離,鎖版本時要特別留意。

升級成本主要來自兩處介面。第一是 Controller 的建構子簽章,因為初始狀態字典的鍵(original、current、method、phase)與你的題目綁在一起,欄位一改,所有呼叫端都要跟著改。第二是 language_models 底下的模型類別,README 只示範了 ChatGPT 一種,並把其餘設定指向 controller/README.md。若上游供應商的 API 有變動,這一層是最先受影響的地方。

授權方面,NOASSERTION 意味著倉庫裡沒有可被自動辨識的授權檔。這不是說它沒有授權,而是說我無法從提供的材料判斷條款內容。要商用之前,請直接檢視倉庫根目錄的授權檔案,必要時詢問維護者,這裡不構成法律意見。

文件的可信度其實不低。README 強調「我們特別用心完整記錄程式碼」,並指出 Controller 與 Operations 兩個模組的說明文件最關鍵。以研究實作而言,願意把模組層級的文件寫到這個程度並不常見,這也是它相對容易上手的原因。

編輯結論

要採用這個框架,先確認你的問題能否寫成 Generate、Score、GroundTruth 這類 operations 的序列,並且願意自己接上 LLM 與解析器。研究用途、想復現論文排序與關鍵字計數實驗的人,直接從 examples 目錄跑起最省事。只想把 LLM 包成服務、需要穩定 API 與版本保證的團隊不該選它:v0.0.2 停在 2023 年 9 月,語言模型走 config.json 的 API key 路線,升級前務必先讀 controller/README.md 確認介面有沒有變動。

官方來源

  1. Issues
  2. Project website
  3. README
  4. Releases
  5. spcl/graph-of-thoughts on GitHub
社群筆記

社群筆記