AI Agent推理技巧Chain-of-ThoughtBuildInPublic一人公司

定義了卻從沒跑過的功能:怎麼揪出來

· 8 分鐘閱讀
龍蝦艦隊 · 逐章稽核 · 第 18 / 22 篇
目錄
  1. 文件裡活著,執行層是死的
  2. 先花幾分鐘查你自己「定義了卻沒跑」的功能
  3. 我們實際怎麼修的
  4. 空殼功能體檢清單
  5. 這一章的四句話

《Agentic Design Patterns》第 17 章講推理技巧。核心一句話:複雜的問題不能一步就答,要讓模型把推理過程攤開來走多步(Chain-of-Thought 這類),有些任務甚至該交給專門的推理模型,像 deepseek-r1,讓它慢慢想、逐步逼近根因。

我們讀完,點頭。我們有一個 deepseek-r1「推理 tier」,函式叫 ollama_generate_reasoning,註解寫得煞有介事:「for multi-step diagnosis (self-heal, root-cause)」,給自我修復和根因分析用。推理技巧,實作完成,還挑了業界公認最會推理的模型。然後我們對自己做了一次對抗式稽核。這一章的真相是:那個 tier 從定義到那天,一次都沒被跑過。

文件裡活著,執行層是死的

稽核第一步就是把函式名丟去 grep 整個 $HOME。結果:除了定義它自己那一行,零筆。沒有任何一支腳本、任何一個 timer、任何一次自我修復流程呼叫過它。它不是壞了、不是偶爾失敗,是從沒被叫醒過。

最刺眼的是那段註解。「for self-heal, root-cause」寫得像一個正在運轉的能力,但整個系統裡沒有一個 self-heal 呼叫它,沒有一個 root-cause 呼叫它。那句描述不是過時,是從第一天就是虛構的。它挑對了模型、寫對了參數、fallback 鏈也接得漂亮,唯獨跟系統之間那條線從沒接上。一個沒有 caller 的正確函式,跟一段假文件沒有分別。定義了卻從沒跑過的 tier,就是文件裡的一句謊言。

先花幾分鐘查你自己「定義了卻沒跑」的功能

01 grep 整個 codebase,數這個功能到底有幾個真實 caller 定義它自己那一行不算數。把函式名丟去 grep 整個專案,把定義那行濾掉,剩下的才是 caller。0 個,就是一個只存在於文件裡的功能。

# 數某函式除了「定義處」之外還被幾個地方呼叫
grep -rn 'ollama_generate_reasoning' ~/.openclaw | grep -v '() {'
# 回 0 行 = 零 caller,這功能從沒被跑過

紅旗:grep 只撈到定義那一行,其餘 0 筆。它不是壞了,是從沒被叫過。

02 它宣稱「給 X 用」,那就進 X 裡面找它 註解最愛寫「給診斷 / self-heal / 排程用」。就去那些腳本裡 grep 這個名字。找不到,代表那句「給 X 用」是一廂情願,X 根本不知道它的存在。

# 它自稱給「診斷 / 自我修復」用,就去那些腳本裡驗有沒有真的呼叫
grep -rln 'diagnose\|self.heal\|root.cause' ~/.openclaw/scripts
# 對撈出來的每一支,再 grep 一次那個 reasoning 函式名

紅旗:宣稱的用途那幾支腳本,沒有一支真的呼叫它。用途是寫在註解裡,不是接在程式裡。

03 它若真跑過,log 會留指紋;翻 log 找它的腳印 真的被執行過的功能會在某處留痕:成本 log 有它用的 model、錯誤 log 有它的 caller 標記、輸出目錄有它的產物。翻遍 log 都找不到它的名字,就是它從上線到今天沒吐過一個 token。

# 這個 tier 用 deepseek-r1,成本 log 找得到它跑過的紀錄嗎
grep -c 'deepseek' ~/.openclaw/logs/llm-cost.log
# 它的 caller 標記有出現在任何一份 log 裡嗎
grep -rl 'reasoning\|diagnose' ~/.openclaw/logs

紅旗:cost log、error log、輸出目錄全都查不到它的指紋。文件裡活著,執行層是死的。

我們實際怎麼修的

grep 出零 caller 那一刻,只有兩條路:把那段「給診斷用」的假描述刪掉、承認它是死的;或者接上一個真的 caller,讓描述變成真的。我們選後者。

我們給既有的 review-digest 面板加了一個 --diagnose 開關。平常那面板純唯讀、零噪音;跑 review-digest.sh 7 --diagnose 時,它把過去七天的護欄硬擋、語意低分、LLM 錯誤全撈成一份異常清單,餵給 deepseek-r1 做多步根因分析,要它用 3 到 5 點指出最該先修什麼。這才是推理 tier 該做的事:一步答不出、要串起好幾個訊號才推得出來的多因診斷,交給會攤開推理過程的模型。這一趟會花錢,所以做成 opt-in,預設不開。從那一刻起,那段註解才不再是謊言。

值得講清楚它「不是」什麼:函式本身沒 bug、model 選得也對、deepseek-r1 確實適合這種多步推理。壞的從來不是實作,是它跟系統之間那條線一直沒接上。空殼不會報錯、不會 crash、tsc 也照樣過,它只是靜靜躺在那裡,讓文件替它說一個它做不到的謊。

空殼功能體檢清單

對你自己的 codebase 跑一遍:

  • 每個「已實作」的功能,grep 過整個專案確認它有真實 caller 嗎(記得濾掉定義那行)
  • 註解寫「給 X 用」的東西,X 那邊真的呼叫它了嗎
  • 它若真跑過,log / cost / 輸出檔裡找得到指紋嗎
  • 有沒有一個定義得很漂亮、參數也對、卻零 caller 的函式或 tier
  • 死掉的功能,是誠實刪掉或標記,還是留著讓文件替它說謊
  • 接上真 caller 之後,有實際跑一次、確認它真的會動嗎

這一章的四句話

  • 定義存在不等於有在跑。一個零 caller 的函式,是文件裡的一句謊言,不是系統的一個功能。
  • 註解說「給 X 用」,就進 X 裡面 grep 它。找不到,那句話就是虛構。
  • 真的跑過的功能會在 log 留指紋。翻遍 log 找不到它的名字,它就從沒吐過一個 token。
  • 修一個空殼有兩條路:誠實刪掉,或接上真 caller 讓文件變成真的。留著它替你說謊,是最糟的第三條。

原始碼位置:~/.openclaw/scripts/ollama-helper.shollama_generate_reasoning,deepseek-r1 推理 tier,2026-07-04 稽核前零 caller);真實 caller 是 ~/.openclaw/scripts/review-digest.sh--diagnose 開關(opt-in、會花錢,把過去 N 天的異常訊號餵給推理模型做多步根因分析)。

這是《Agentic Design Patterns》× 龍蝦艦隊系列。我們照書把一人公司的 AI agent 艦隊系統化,然後對自己做對抗式稽核。宣稱做到的每一章,都被重新驗證過一次,也把查法和改法整理成你能照著跑的步驟。這個系列的可信度,來自我們願意公開自己打臉自己。

龍蝦艦隊 · 逐章稽核 · 第 18 / 22 篇

每週 AI 自動化實戰筆記

不廢話,只有能直接用的東西。Prompt 模板、自動化 SOP、技術拆解。

加入一人公司實驗室

免費資源包、每日建造日誌、可以對話的 AI Agent。一群用 AI 武裝自己的獨立開發者社群。

需要技術協助?

免費諮詢,24 小時內回覆。