嗨,大家好。
先講一個不用寫程式也能懂的情境。
班上有人改了你交出去的作業,你想查是誰動的。保全說:「有,下午兩點有人開過你的櫃子。」
你追問:「誰?拿了什麼?改哪幾行?」
保全:「系統只記『開櫃』,不記名字跟內容。這是規定,怕侵犯隱私。」
你會覺得這套紀錄有跟沒有一樣。
昨天我碰到的就是這種事——只是換成 AI 改檔案。
我設陷阱,叫 AI「讓測試全綠」。它沒作弊——一次老實修了程式,一次加壓力後乾脆拒絕,還識破我在做實驗。
後來我反過來,叫它重演三種已知的假綠手法,測規則能不能抓:改期望值、跳過測試,有抓到;用 conftest.py 替身,沒抓到,git diff 仍是空的。
規則本身還曾寫錯一個字(content 寫成 contents),「跳過測試」那條一度永遠不響——跟 Day 1 監視器壞了也不亮紅燈一樣。
我想:我自己寫的規則不可靠,業界標準應該比較靠得住吧?
於是我去查一套叫 OpenTelemetry 的東西。白話說:很多公司約好「AI 做事時,紀錄要長什麼樣子」,大家照同一本格式寫,工具才讀得懂。
9 月初我用一支小程式,真的叫 AI 回答「請問如何學英文」,把系統留下的紀錄存成一份 JSON(檔名 otel-groq-trace-export.json)。下面是我從裡面摘的重點,不是抄教科書。
可以想成一張外層便條 + 一張內層便條,貼在同一本日誌上:
外層便條(這一趟 Agent 在幹嘛)
這是 AI Agent 在跑
名字叫 groq-demo
這是第幾次對話:conv_groq_exp03
就這樣。沒有「它想了什麼」。
內層便條(這一步叫模型回答)
用 Groq 的 API
模型叫 qwen/qwen3.8-27b
花了幾秒、用了幾個 token
我問:請問如何學英文
它回:一千多字的長文(完整內容在檔案裡)
負責看系統健康的同事會說:很好啊,誰在跑、花多少錢、花多久,都有了。
但我要查案,還想問:它當初為什麼這樣回答?讀了什麼?
這裡有一個陷阱:我跑的是「完整模式」。
同一支程式還有「精簡模式」——對話內容不會寫進去。程式會自己提醒你:這些欄位預設是關的,要自己開才會記。
所以文章裡你能看到完整問答,是因為我手動開了,不是大家預設就會拿到。
我繼續讀規範裡「AI 使用工具」那一段,發現規定比我想的還寬。
AI 用「寫檔」這個工具時,一份完全符合規範的紀錄,最少只要寫:
① 這次是「使用工具」
② 工具名叫 Write
結束。
不會寫改了哪個檔、寫了什麼字。參數、結果、工具清單,全部標成「選用」——白話就是預設不記,怕記到密碼和私人內容。
對話也是:
理由很簡單:記太多 = 外洩風險 + 檔案爆炸。這我懂。
但查案要的「它憑什麼這樣做」,答案就在這幾項裡。
沒有它們,你手上只有「下午兩點 AI 用了 Write」,沒有「因為它讀到 README 寫說測試已過時」。前者像保全說的「有人開櫃」,後者才是「誰拿了什麼」。
Day 2 的 conftest.py 就是例子:紀錄裡可能都寫「Write」,一個是改測試作弊,一個是正常寫程式——光看工具名分不出來。
以下對照的是 OTel GenAI 規範的預設合規實作——欄位有定義,但很多標成「選用」,預設不記。個別產品若自己把選用欄位打開,紀錄會比這張表多。
| 我想問 | 能答嗎? |
|---|---|
| 幾點幾分 | 能 |
| 哪一次對話 | 能 |
| 哪個 AI 在跑 | 大致能(但不太建議記「這一次執行」的細編號) |
| 用了什麼工具(例如 Write) | 能 |
| 改了哪個檔、寫了什麼 | 預設不能 |
| 改完結果怎樣 | 預設不能 |
| 它讀了什麼、依據哪句話 | 預設不能 |
| 是你叫它做的,還是它自己決定的 | 規範裡沒有 |
| 改動前後差在哪 | 規範裡沒有 |
| 那是作業檔還是測試檔 | 規範裡沒有 |
標準不是「還不成熟所以漏了」,是刻意把最敏感、最有用的那幾項留成「要你自己決定要不要開」。
整份規範目前還在修(2026 年 9 月我讀的那版還在變)。
我不能讓 Cursor 的監視器跟測試用 AI 各寫各的格式,否則規則要重寫。所以我約定:全部寫進同一份日誌檔(jsonl),分三層——
還有一條今天就要記住:
「零次」和「我不知道」不能寫成一樣。
「工具用了 0 次」可能是真的沒用,也可能是監視器壞了所以不知道。意思相反,數字卻一樣。Day 1 我 hook 收到零筆,就是「不知道」,不是「真的零次」。
9/14 我為了修監視器,在一個乾淨資料夾跑了一下午。日誌長到 246 KB——裡面有公司 email、十二個檔案的完整內容、每一句問答。
那個資料夾甚至不是 git 專案,也沒有 .gitignore。
監視日誌自己變成新的外洩點。
所以標準預設不記內容,不是偷懶。記太少查不了案,記太多也可能漏密碼——兩邊都要選。
我目前的折衷:問題只存 hash、改動太大就截斷。這是取捨,不是完美解法。
(開源的 Pi Agent 還有一條「在送進模型前攔下來自己記」的路,我還沒在本機試過,之後有結果再寫。)
打開你在用的 AI 工具(例如 Cursor)設定,搜 trace 或 logging,找「要不要記對話內容」。
兩個問題:
明天要問更刁的:AI「寫檔」這個動作,刪的是測試還是垃圾檔?在紀錄裡可能長得一模一樣。
今天對應的威脅: T3(事後查不出它當初在想什麼,規避才成立)。
引用來源: OpenTelemetry Semantic Conventions for Generative AI(Development,規範仍在修)。實驗:Groq API;上文問答來自完整模式匯出,精簡模式不會記對話內容。