我第一次明顯感覺到 AI Coding 的“上下文不夠用”,是在查一個(gè)串口 DMA 偶發(fā)丟包的問(wèn)題。
現(xiàn)象很熟悉:線上偶現(xiàn)、復(fù)現(xiàn)條件模糊、日志不完整、代碼里還有幾段歷史包袱。
AI一開始表現(xiàn)得很聰明,能順著 HAL_UARTEx_RxEventCallback 往下讀,也能把環(huán)形緩沖區(qū)、空閑中斷、半傳輸中斷這些點(diǎn)串起來(lái)。
可聊著聊著,它開始忘記前面確認(rèn)過(guò)的事實(shí),甚至又建議我去檢查一個(gè)剛剛已經(jīng)排除掉的方向。
那一刻很像在一顆 SRAM 緊張的 MCU 上調(diào)試:不是 CPU 不夠快,而是關(guān)鍵數(shù)據(jù)放不下。上下文窗口,就是 AI Coding 的片上 RAM。
嵌入式工程師對(duì)資源限制很敏感。Flash、SRAM、棧、DMA buffer、中斷優(yōu)先級(jí),任何一個(gè)資源邊界沒算清楚,系統(tǒng)都會(huì)用很隱蔽的方式提醒你。
AI Coding 也是這樣。
它能讀到的內(nèi)容有限,能穩(wěn)定記住的內(nèi)容有限,能同時(shí)權(quán)衡的約束也有限。當(dāng)倉(cāng)庫(kù)稍微復(fù)雜一點(diǎn),問(wèn)題就會(huì)從“生成代碼”變成“維護(hù)現(xiàn)場(chǎng)”。
1
壓縮有用,但別把它當(dāng)最終方案
上下文壓縮通常會(huì)把長(zhǎng)對(duì)話整理成幾段摘要。它能幫你繼續(xù)工作,但我不建議把它當(dāng)成長(zhǎng)期方案。
因?yàn)閴嚎s最容易丟三類東西。
第一類是證據(jù)。
比如原始討論里有一句:“rx_len == 0 只在空閑中斷重復(fù)進(jìn)入時(shí)出現(xiàn),半傳輸路徑?jīng)]有復(fù)現(xiàn)。”壓縮后可能只剩下“懷疑空閑中斷處理異常”。前者能指導(dǎo)下一步,后者只是方向感。
第二類是約束。
嵌入式項(xiàng)目里的約束往往不是寫在代碼里的。比如“這顆芯片的這個(gè) UART 和 RS485 方向腳共用一個(gè)歷史驅(qū)動(dòng),不能直接改初始化順序”,這種約束一旦被壓縮掉,AI 很可能給出看似正確但無(wú)法落地的方案。
第三類是排除路徑。
調(diào)試最寶貴的不只是發(fā)現(xiàn)了什么,還有排除了什么。壓縮經(jīng)常保留結(jié)論,卻丟掉“為什么不是它”。下一輪 AI 又會(huì)沿著舊路走一遍,浪費(fèi)時(shí)間,也容易把人帶偏。
壓縮應(yīng)該像日志歸檔,不應(yīng)該像斷電重啟。
一個(gè)更穩(wěn)的做法是:壓縮只保留可驗(yàn)證事實(shí),不保留含糊判斷。
protocol_parse_frame |
2
真正好用的辦法是給 AI 做一套上下文分層
我現(xiàn)在更傾向于把 AI Coding 的上下文分成四層。

第 1 層是本輪任務(wù)上下文。
只放這次要解決的問(wèn)題、必須遵守的約束、最近的報(bào)錯(cuò)、相關(guān)文件和期望輸出。它應(yīng)該短,最好一屏能看完。
第 2 層是模塊地圖。
比如串口模塊有哪些入口,協(xié)議解析在哪里,板級(jí)差異在哪里,哪些文件不要碰。這個(gè)東西不需要每次都重新解釋,應(yīng)該沉淀成項(xiàng)目文檔。
第 3 層是項(xiàng)目長(zhǎng)期記憶。
包括歷史坑點(diǎn)、架構(gòu)決策、調(diào)試經(jīng)驗(yàn)、常用命令、測(cè)試板卡差異。它不一定很長(zhǎng),但必須穩(wěn)定。
第 4 層是可檢索資料庫(kù)。
比如芯片手冊(cè)片段、寄存器說(shuō)明、協(xié)議文檔、錯(cuò)誤日志、代碼符號(hào)索引。AI 不需要一次性吃下所有資料,它只需要在需要的時(shí)候拿到正確片段。
這四層配起來(lái),AI 才不需要把所有東西都塞進(jìn)一個(gè)上下文窗口里。
3
給上下文做預(yù)算,別把窗口交給運(yùn)氣
上下文資源有限,就應(yīng)該有預(yù)算。
我通常會(huì)按下面的比例分配。

這個(gè)比例不是標(biāo)準(zhǔn)答案,但它能提醒我們:不要讓源碼把所有空間吃完。
對(duì)復(fù)雜任務(wù),我會(huì)先給 AI 一張任務(wù)卡。
# 任務(wù)卡## 當(dāng)前問(wèn)題設(shè)備運(yùn)行 8 小時(shí)后,UART3 偶發(fā)出現(xiàn)協(xié)議幀錯(cuò)位。重啟后恢復(fù)。## 目標(biāo)定位幀錯(cuò)位是發(fā)生在 DMA 接收層、環(huán)形緩沖區(qū)層,還是協(xié)議解析層。## 范圍本輪只分析 `Drivers/uart_dma.c`、`App/Protocol/protocol_parser.c` 和最近一次日志。## 約束- 不改協(xié)議結(jié)構(gòu)體。- 不引入堆內(nèi)存。- 不在中斷里加阻塞日志。- 不做大范圍重構(gòu)。## 已知事實(shí)- UART1 未復(fù)現(xiàn),UART3 復(fù)現(xiàn)。- 丟包前出現(xiàn)過(guò) 17 次 `rx_len == 0`。- 環(huán)形緩沖區(qū)滿計(jì)數(shù)沒有增加。- 協(xié)議層 CRC 錯(cuò)誤計(jì)數(shù)增加。## 希望輸出- 最可能的故障鏈路。- 需要繼續(xù)確認(rèn)的證據(jù)。- 最小修改建議。- 驗(yàn)證步驟。
這張任務(wù)卡的作用很直接:把 AI 的注意力鎖在本輪問(wèn)題上。
不要指望 AI 自己判斷什么重要。工程師要做的是把重要性排序交給它。
4
讓 AI 按需取上下文,而不是一次吃完整個(gè)倉(cāng)庫(kù)
大倉(cāng)庫(kù)里,最糟糕的方式是把大量文件一股腦塞進(jìn)去。
更好的方式是先建立索引,讓 AI 先知道去哪里找。
你可以把索引理解成代碼倉(cāng)庫(kù)的目錄緩存。

這個(gè)流程里,AI 不是靠“記住一切”工作,而是靠“需要時(shí)找到正確材料”工作。
如果你的工具鏈支持代碼檢索、符號(hào)索引、語(yǔ)義搜索,可以用起來(lái)。如果沒有,也可以從很簡(jiǎn)單的方式開始:
這些東西看起來(lái)土,但有效。
嵌入式項(xiàng)目里,真正提高效率的經(jīng)常不是更炫的工具,而是少走三次彎路。
5
大任務(wù)必須拆,不拆就是浪費(fèi)上下文
AI Coding 很容易讓人產(chǎn)生一種沖動(dòng):既然它能寫代碼,那干脆讓它一次性完成。
“幫我把這個(gè)驅(qū)動(dòng)重構(gòu)一下,順便修 bug,加測(cè)試,再優(yōu)化性能。”
這類任務(wù)通常會(huì)把上下文打爆。不是模型不努力,而是任務(wù)邊界太大。
更靠譜的拆法是按工程鏈路拆:
每一輪只解決一個(gè)問(wèn)題。
這和嵌入式調(diào)試很像。示波器一次只抓幾個(gè)通道,邏輯分析儀也要設(shè)置觸發(fā)條件。你不能把所有信號(hào)都接上,然后指望自己一眼看懂。
6
一個(gè)我認(rèn)為可落地的工作流
如果從零開始改造,我會(huì)這樣做。

這個(gè)流程有幾個(gè)關(guān)鍵點(diǎn)。
第一,先寫任務(wù)卡,再讓 AI 干活。
任務(wù)卡會(huì)強(qiáng)迫你把問(wèn)題說(shuō)清楚。很多時(shí)候,寫任務(wù)卡的過(guò)程本身就能暴露盲點(diǎn)。
第二,先讓 AI 給證據(jù)鏈,再讓它改代碼。
如果它說(shuō)不清“為什么是這里”,直接動(dòng)代碼就是碰運(yùn)氣。AI 寫補(bǔ)丁很快,回滾錯(cuò)誤方向很慢。
第三,每次通過(guò)驗(yàn)證后都要更新項(xiàng)目記憶。
這一步最容易被省掉,但它決定下一次 AI 是不是還要重新踩坑。
一個(gè)團(tuán)隊(duì)的 AI Coding 用得好不好,不看它一次能生成多少代碼。
我更愿意看三個(gè)指標(biāo):
如果做不到,那上下文再大也只是晚一點(diǎn)溢出。
把上下文管好,AI 才不會(huì)只是一個(gè)能寫代碼的聊天窗口。它會(huì)慢慢變成項(xiàng)目里的第二塊工作臺(tái):一邊放代碼,一邊放證據(jù),一邊留下下一次還能接著用的經(jīng)驗(yàn)。
