Coding Agent 的實作課:從 100 行迴路到 Harness 工程
今日主題:Coding Agent 的技術棧與實作
2026-10-17 | 資料來源:Princeton SWE-agent 研究團隊、OpenHands(原 OpenDevin)、Anthropic 工程部落格、Mini-SWE-agent 開源專案、Terminal-Bench 評測
前言:Agent 最好的練功房是終端機
過去一年,Coding Agent 從「會補全程式碼的外掛」變成「住在終端機裡的工程師」。Claude Code、OpenHands、Mini-SWE-agent、Pi——它們看起來差很多,但原始碼攤開來看,核心迴路小得驚人:把對話送給模型、執行模型要求的工具、把結果貼回去、重複。一位開發者在 2026 年 10 月讀完 12 個開源 Coding Agent 的原始碼後寫道:12 個裡有 10 個,「模型沒有呼叫任何工具」就等於「工作完成」。Mini-SWE-agent 的核心甚至只有約 100 行 Python,只有一種工具:bash。
迴路很小,真正的工程在迴路周圍。這篇文章拆開 Coding Agent 的技術棧:核心迴路、Agent-Computer Interface(ACI)、Harness(支架工程)、評測方法,以及你要自己動手時的起手清單。
一、核心迴路:小到可以背下來
如圖一,一個最精簡的 Coding Agent 只需要四個零件:
1. 模型呼叫:把完整對話歷史送給 LLM。 2. 工具執行:解析模型要求的工具呼叫,在沙箱裡執行。 3. 歷史追加:把工具結果貼回對話,進入下一輪。 4. 停止條件:模型不再呼叫工具 → 視為完成。
Mini-SWE-agent 把這個想法推到極致:不用模型的 tool-calling 介面,直接讓模型輸出 bash 指令,用 subprocess.run 執行。好處是極簡——任何模型都能跑(連不支援 function calling 的模型都可以)、歷史完全線性(除錯時看到的就是模型看到的)、換沙箱只要把 subprocess.run 換成 docker exec。壞處也明顯:模型得自己拼出所有操作,聰明的模型才玩得轉。
用 Python 寫出來,骨架大概長這樣:
import subprocess
SYSTEM = "你是軟體工程師。每次回覆只輸出一個 bash 指令,或輸出 DONE 結束。"
def run(cmd, timeout=120):
p = subprocess.run(cmd, shell=True, capture_output=True,
text=True, timeout=timeout, cwd="/workspace")
out = (p.stdout + p.stderr)[-4000:] # 只保留尾端,避免塞爆上下文
return f"exit={p.returncode}\n{out}"
messages = [{"role": "system", "content": SYSTEM},
{"role": "user", "content": "修掉 issue #42 描述的 bug,跑測試確認"}]
for _ in range(30): # 迭代上限:Harness 的一部分
reply = llm(messages)
if reply.strip() == "DONE":
break
messages.append({"role": "assistant", "content": reply})
messages.append({"role": "user", "content": run(reply)})
這就是全部。剩下的,都是讓這個迴路「跑得穩、跑得快、跑得安全」的工程——也就是 Harness。
二、ACI:把工具做成模型拿得順手的樣子
Princeton 團隊在 SWE-agent 論文(NeurIPS 2024)裡提出一個關鍵詞:ACI(Agent-Computer Interface),類比人類的 HCI。重點不是給模型更多工具,而是給「模型用起來順手」的工具:
- 專用終端機:一次只顯示 100 行程式碼,附帶「跳到第幾行」指令。模型一次看太多會暈頭——有趣的是,人類一次也只看 50–100 行。
- 過去踩坑的提示:例如「先重現 bug 再修」「同一個指令失敗就不要原樣重跑」。這些提示來自開發者觀察模型失敗模式後的補救,是經驗的沉澱。
- CodeAct 典範:OpenHands 不給幾十個窄工具,而是讓 Agent 直接寫程式(Python / Bash)來解決問題。Agent 不是在呼叫固定 API,而是在寫程式——跟人類工程師一樣。
ACI 的設計哲學呼應我們 10/15 寫過的 Agent-Friendly API:描述寫「何時用」、參數防呆、回傳省著用。差別在於,ACI 是「給 Agent 用的電腦介面」整體設計。
三、Harness:真正的工程在這裡
2026 年 2 月,LangChain 公開了一個漂亮的實驗:同一個模型(GPT-5.2-Codex),只改 Harness 不換模型,Terminal-Bench 2.0 成績從 52.8% 拉到 66.5%,名次從 30 名外衝進前 5。13.7 個百分點,零模型進步。改了什麼?四個中介層(middleware),如圖二:
1. 自我驗證(Self-verification):宣告完成前強制跑檢查清單,確認自己的工作真的做完了。 2. 迴路偵測(Loop detection):追蹤每個檔案的編輯次數,砍掉「doom loop」——那種反覆改同一個檔案、燒掉幾千個 token 的重試漩渦。Doom loop 是 Harness 的 bug,不是模型的 bug。 3. 上下文注入(Context injection):啟動時給目錄結構與工具地圖,外加時間預算警告,讓 Agent 一開始就知道自己在哪,而不是到處亂逛。 4. 停止條件:不體面的斷電開關。沒有它,Agent 會在某個死角裡燒錢燒到天亮。
Anthropic 內部的經驗也指向同一個結論:工程師不再「寫 prompt 給 Claude」,而是「建造會自己 prompt 自己的系統」。Claude Code 團隊的 Boris Cherny 說,關鍵是 Harness 工程——讓 Claude 觀察、計畫、行動、反思的迭代迴路可以跑上幾小時甚至幾天。到 2026 年 5 月,Anthropic 內部超過八成合併的正式程式碼由 Claude 撰寫,工程師的工作變成設計架構、寫測試支架、處理 Agent 真正卡住的時刻。
一句話總結:模型決定上限,Harness 決定下限。
四、怎麼評測:SWE-bench 與 Terminal-Bench
寫 Coding Agent 不能只憑感覺,業界有兩套主流考卷:
- SWE-bench Verified:500 個經過人工驗證的真實 GitHub issue,來自 django、sympy、scikit-learn 等知名 Python 專案。評分看兩組測試:FAIL_TO_PASS(修之前不過、修之後要過)與 PASS_TO_PASS(原本會過的不能被修壞)。Agent 的產出是一份 git patch,在乾淨的 Docker 環境裡重跑驗證。
- Terminal-Bench 2.0:更貼近真實終端機任務的評測,考的是在 shell 裡完成任務的能力。LangChain 的 Harness 實驗就是在這張考卷上拿的分數。
自己動手時可以偷師這套方法:準備一個 Docker 沙箱、一組「修前不過、修後要過」的測試,Agent 跑完自動打分。這比人工看 log 可靠得多,也是我們 10/1 寫過的「評測飛輪」在程式碼領域的具體長相。
五、選型光譜:極簡、中庸、全功能
2026 年中的 CLI Coding Agent 版圖,大致是一條光譜:
- 極簡端 — Mini-SWE-agent:約 100 行 Python、bash only。定位是「研究對照組」:拿掉支架變因,量的是模型本身的能力。想理解 Coding Agent,先讀它的原始碼。
- 中庸端 — Pi:4 個工具(讀、寫、編輯、bash)、系統提示不到 1000 token。主張現代模型不需要更多,MCP 支援都該放進擴充 SDK。
- 全功能端 — OpenHands:事件流架構、瀏覽器、Jupyter kernel、雲端編排。適合「把整個開發環境交給 Agent」的場景,但複雜度與維運成本也最高。
選型建議:如果團隊第一次導入,從極簡或中庸開始。支架的每一層複雜度都要有評測分數來背書——連 Mini-SWE-agent 都打不贏的支架,就是純粹的累贅。
六、自己動手的起手清單
如果你想在自己的專案裡接一個 Coding Agent(例如修 bug、跑 migration、整理測試),按這個順序做:
1. 沙箱先行:Agent 的 bash 只能在 Docker 容器裡跑,正式環境的 credential 一律不進容器。這是 10/8 沙箱文章的同一條鐵律。 2. 迭代上限+超時:迴圈設硬上限(例如 30 輪),每個指令設 timeout。這是最便宜的 doom loop 保險。 3. 驗證閘:完成前強制跑測試或 lint,不通過就把錯誤貼回去繼續修,而不是直接宣告完成。 4. 線性歷史:除錯時能完整重播「模型看到什麼、做了什麼」。Mini-SWE-agent 的線性歷史設計值得抄。 5. 從一條小任務開始量測:挑一個真實的小 issue,記錄修好率、token 花費、人工介入次數,再決定要不要加支架。
結論
Coding Agent 的技術棧可以濃縮成三句話:迴路要小(100 行就夠)、介面要順(ACI 思維)、支架要硬(驗證閘、迴路偵測、停止條件)。模型年年變強,但 2026 年的實證反覆證明同一件事:同一顆模型,Harness 的好壞可以差出 13 個百分點。與其等下一代模型,不如先把你手上的迴路周圍砌好——那才是你真正能控制的工程。
參考來源
- Princeton SWE-agent 團隊 — SWE-agent 論文(NeurIPS 2024)與 Mini-SWE-agent 開源專案:https://github.heygears.com/PromptlyCode/SWE-agent
- OpenHands 架構解析(CodeAct 典範、五階段迴路):https://breathofcode.medium.com/openhands-the-open-source-ai-coding-agent-reshaping-software-development-in-2026-da688513efa8
- 讀完 12 個 Coding Agent 原始碼的實測筆記(迴路分析、Mini-SWE-agent 37 行核心):https://medium.com/@theadarshp/i-read-the-source-of-12-coding-agents-dont-trust-the-readme-ebd8a30bf05e
- Harness 工程解析(LangChain 52.8%→66.5% 實驗、四個 middleware):https://medium.com/@diz.iz.amit/architecting-the-agent-harness-what-the-companies-shipping-agents-are-building-around-them-59fdacf6c329
- 2026 年中 CLI Coding Agent 版圖(Pi / Mini-SWE-agent / OpenHands 光譜):https://blog.arcbjorn.com/state-of-cli-coding-agents-2026
- SWE-bench Verified 與 Terminal-Bench v2 評測方法:https://www.waiagent.win/article-swe-bench-deep-dive.html
- Anthropic Harness 工程訪談(Boris Cherny:建造會自己 prompt 的系統):https://explainx.ai/blog/anthropic-engineer-loops-prompts-ai-coding-harness-engineering-2026
沒有留言:
張貼留言