
【CSDN 編者按】當 Claude Code、Devin 這些 AI 編程工具被神話成“下一代程序員”時,很多人以為背后是某種高不可攀的黑科技。但本文作者用不到 200 行 Python 代碼,親手拆解了一個最小可用的 Coding Agent,讓開發者可以直觀地看到:所謂“會讀代碼、會改項目”的智能體,本質只是一個圍繞 LLM 的工具調用循環。
原文鏈接:https://www.mihaileric.com/The-Emperor-Has-No-Clothes/
作者 | Mihail Eric 翻譯 | 鄭麗媛
出品 | CSDN(ID:CSDNnews)
現在的 AI 編程助手,用起來簡直像魔法。
你隨口用幾句不太通順的英語描述需求,它就能自動讀代碼、改項目、寫出能跑的功能模塊。Claude Code、Cursor、Devin,看起來都像是掌握了某種神秘黑科技。
但真相是:這些工具的核心,一點也不神秘——不到 200 行的 Python 代碼,就能復刻一個可用的 AI 編程 Agent。
下面,讓我們從零開始,親手實現一個「會改代碼的 LLM」。
![]()
先搞懂核心邏輯:Coding Agent 到底在干什么?
在寫代碼前,先搞清楚:你在用 Claude Code 時,后臺究竟發生了什么?
本質上,它就是大語言模型(LLM)+ 工具庫的對話循環,具體步驟只有五步:
(1)你發送指令(比如:“創建一個包含 hello world 函數的新文件”)
(2)LLM 分析指令后,判斷需要調用工具,并返回結構化的工具調用請求(可以是單次或多次調用)
(3)你的本地程序執行這個工具調用(比如真的創建文件)
(4)工具執行結果被回傳給 LLM
(5)LLM 結合結果繼續處理,直到完成任務
整個過程里,LLM 自始至終都沒有直接操作你的文件系統,它只負責下達指令,真正干活的是你寫的本地代碼。
![]()
核心三件套:實現 Agent 只需要 3 個工具
一個能用的代碼助手,底層只需要三個核心功能,再多的功能都只是錦上添花:
(1)讀取文件:讓 LLM 能查看你現有代碼的內容
(2)列出文件:幫 LLM 理清項目的目錄結構,實現 “導航”
(3)編輯文件:讓 LLM 能創建新文件、修改已有代碼
沒錯,就是這么簡單。像 Claude Code 這樣的商用產品,還會額外集成 grep 檢索、bash 命令執行、網頁搜索等功能,但對我們來說,這三個工具就足夠實現核心能力了。
![]()
第一步:搭建基礎框架
我們從最基礎的導入和 API 客戶端開始。我這里 用的是 Anthropic,但換成其他 LLM 供應商的 SDK 也完 全適用。
claude_client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])為了讓終端輸出的內容更易區分,我們定義幾個顏色常量:
RESET_COLOR = "\u001b[0m"再寫一個工具函數,用來解析并返回文件的絕對路徑,避免因相對路徑導致的找不到文件問題:
return path![]()
第二步:實現三大核心工具
注意:工具函數的文檔字符串(docstring)一定要寫清楚,LLM 會根據這些描述判斷該調用哪個工具、怎么傳參——這是讓 Agent 能正常工作的關鍵。
工具 1:讀取文件內容
功能最簡單的工具,傳入文件名,返回文件的完整內容。
}返回字典格式,是為了給 LLM 傳遞結構化的執行結果,方便它理解。
工具 2:列出目錄下的文件
幫 LLM 搞清楚項目結構,實現“導航”功能。
}工具 3:編輯文件(創建 + 修改)
這是三個工具里最復雜的一個,但邏輯依然清晰,它主要處理兩種場景:
當
old_str參數為空時:創建新文件當
old_str參數不為空時:替換文件中第一次出現的old_str為new_str
return {"path": str(full_path), "action": "edited"}商用 IDE 的代碼助手會有更復雜的容錯邏輯,但這個極簡版本足以驗證核心原理。
![]()
第三步:注冊工具,讓 LLM 能找到它們
我們需要一個“工具注冊表”,把工具名稱和對應的函數綁定起來,方便后續調用。
}![]()
第四步:給 LLM 寫 “使用說明書”
LLM 不會天生就知道怎么用我們的工具,我們需要通過系統提示詞,把工具的名稱、功能、參數格式告訴它。
我們先寫兩個輔助函數,從工具的函數簽名和文檔字符串里,自動生成工具說明:
return SYSTEM_PROMPT.format(tool_list_repr=tool_str_repr)然后定義核心的系統提示詞模板,這是整個 Agent 的 “靈魂”:你不是教 LLM 怎么寫代碼,而是教它怎么調用現實世界的工具。
"""![]()
第五步:解析 LLM 的工具調用指令
當 LLM 返回內容后,我們需要判斷它是不是在請求調用工具。這個函數的作用就是從 LLM 的回復里,提取出工具名稱和對應的參數。
return invocations![]()
第六步:封裝 LLM 調用邏輯
return response.content[0].text![]()
第七步:組裝核心循環,讓 Agent 跑起來
這一步是把前面所有的模塊串起來,實現 Agent 的核心工作流,也是“魔法”發生的地方。
})這個主循環的邏輯可以拆解為兩層:
外層循環:獲取用戶輸入,添加至對話內容;
內層循環:調用大型語言模型,檢測工具調用需求;
→若無需工具,輸出響應并終止內層循環;
→若需工具,執行工具操作,將結果添加至對話內容,循環繼續。
內層循環持續進行,直至 LLM 響應時不再請求任何工具。這使 Agent 能夠串聯多個工具調用(例如:讀取文件→編輯文件→確認編輯)。
![]()
最后一步:啟動程序
加上主函數入口,運行我們的代碼助手:
run_coding_agent_loop()現在,你就可以進行這樣的對話了:
你:創建一個名為 hello.py 的新文件,并在其中實現"Hello World"功能
AI 助手調用 edit_file 函數,參數為 path="hello.py",old_str="",new_str="print('Hello World')"
AI 助手:完成!已創建包含 Hello World 實現的 hello.py 文件。
或者,還可以進行多步驟交互:
你:編輯 hello.py 并添加一個乘法函數
AI 助手調用 read_file 查看當前內容,再調用 edit_file 添加函數
AI 助手:已在 hello.py 中添加乘法函數
![]()
我們的極簡版 vs 商用版 Claude Code
我們的代碼只有200 行左右,但已經實現了代碼助手的核心邏輯。商用產品 Claude Code 之所以更強大,是因為它在這個基礎上做了這些優化:
(1)更完善的錯誤處理:比如文件權限不足、路徑不存在時的容錯邏輯
(2)流式輸出:讓回復內容實時顯示,提升用戶體驗
(3)智能上下文管理:比如自動摘要長文件,避免 Token 超限
(4)更豐富的工具集:比如執行 shell 命令、搜索代碼庫、調用外部 API
(5)安全校驗流程:比如修改重要文件前需要用戶確認,防止誤操作
但核心工作流完全一致:LLM 決策 → 本地工具執行 → 結果反饋 → 繼續決策。
所以,動手試試吧!完整源代碼我放在這里了:https://drive.google.com/file/d/1YtpKFVG13DHyQ2i3HOtwyVJOV90nWeL2/view?pli=1
這不到 200 行的代碼只是一個起點,你還可以對其輕松擴展:換成其他 LLM 供應商的 API,調整系統提示詞,并可作為練習添加更多工具。你會發現,看似高大上的 AI 代碼助手,底層原理其實一點都不神秘。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.