2026年10月24日 星期六

用程式碼剪影片?免費開源工具 Concat 結合 AI Agent 的實戰與坑點解析

原來寫 Code,也能拿來剪影片?

最近在研究一款影片剪輯工具 Concat,除了基本的影片剪輯功能,還能透過 API 讓程式或 AI Agent 操作剪輯流程,讓我對影片製作自動化多了一些想法。

官方網站:https://concat.fun/

一、Concat 是什麼?

Concat 是一款免費、開源、跨平台的影片剪輯工具,支援 Windows、macOS、Linux 等平台。

它提供一般影片剪輯需要的功能,包括:

  • 基本剪輯:分割、裁切、調整播放速度與多軌編輯

  • 文字與標題:加入標題、字幕、文字效果

  • AI 功能:自動字幕、文字轉語音、背景移除等

  • 影片輸出:支援不同格式與最高 4K 影片輸出

  • 自動化整合:透過 JSON-RPC、gRPC 與 MCP 等介面,讓程式或 AI Agent 參與剪輯工作流程

另一個值得注意的特色是,影片編輯與相關 AI 處理以本機運作為主,不需要為了基本剪輯功能訂閱付費方案。

實際功能仍會受到軟體版本、硬體與已安裝模型影響。

二、一般人怎麼開始使用?

如果只是想剪一支 YouTube 影片或 Shorts,不需要一開始就碰 API。

基本流程很簡單:

  1. 從官方網站下載並安裝 Concat

  2. 建立專案並匯入影片素材

  3. 將影片拖進時間軸,進行分割、裁切與排序

  4. 加入標題、字幕或音訊

  5. 預覽成品,再輸出影片

官方入門指南:https://concat.fun/guides/

如果只是一般剪輯需求,可以先熟悉時間軸、字幕與輸出設定,再考慮進一步整合 AI 自動化。

三、真正讓我感興趣的是 AI Agent 整合

Concat 不只提供圖形化介面,也有程式控制介面。

官方文件:https://concat.fun/docs/

透過 API,程式可以操作專案、匯入素材、執行剪輯指令,甚至啟動影片輸出。

這讓我想到另一種工作流程:

讓 AI 協助整理素材與規劃剪輯,再由程式執行重複的時間軸操作,最後由人來檢查畫面與敘事品質。

例如,將登山影片整理成 30 秒的片頭,理論上可以把素材整理、候選片段選擇、標題配置與剪輯操作逐步自動化。

不過,能夠自動執行剪輯指令,不代表 AI 就能挑出最好的畫面。素材判讀與鏡頭安排仍然是需要處理的問題。

四、這次實作,我也真的踩坑了

我拿陽明山芒草季的既有素材來測試,目標是改善一段約 30 秒的片頭,保留原本的 4K 專案,並加入「秋日山徑・芒花搖曳」的字幕。

原本以為讓 AI 寫好 PowerShell 腳本,再呼叫 Concat API,就能把流程串起來。

結果並沒有想像中順利。

第一個問題:API 說專案沒有開啟。

明明 QixingTest 已經在 Concat 視窗裡,API 卻回傳 notOpen。

後來才釐清,桌面視窗與 Socket API 有各自的專案工作階段,同一個專案不能直接由兩端同時編輯。正確做法是先儲存並關閉視窗中的專案,再讓 API 開啟它。

這不是換個 API 方法就能解決的問題,而是必須先理解工具的運作規則。

第二個問題:程式能挑影片,不代表剪得好看。

當時的腳本主要根據影片長度、解析度等資訊篩選素材,卻無法單憑這些條件判斷哪個鏡頭最適合開場。

最後才發現,技術上能把影片排進時間軸,與真正剪出有節奏、有故事的片頭,是兩回事。

這次的流程也還沒有完整驗證成功,所以我不會把它包裝成已經完成的 AI 自動剪輯方案。

五、我的心得

Concat 值得研究的地方,不只是它能剪影片,而是它讓傳統剪輯軟體多了一個可以被程式控制的入口。

對一般使用者來說,它是一款可以嘗試的影片剪輯工具;對喜歡研究自動化的人來說,API 與 MCP 則提供了進一步整合 AI Agent 的可能性。

當然,工具有 API,不代表自動化就會一次成功。還是得理解專案狀態、指令格式、錯誤處理,以及最重要的影片內容本身。

我會繼續研究怎麼把這些步驟串起來,讓影片製作不只是靠手動操作,也能逐步建立可重複執行的工作流程。

工具可以幫我們減少重複工作,但最後決定一支影片好不好看的,仍然是內容與判斷。

#Concat #AI工具 #AI Agent #影片剪輯 #自動化 #開源工具

AI Coding 如何減少 Token?10 個實戰技巧,降低消耗又不犧牲程式碼品質

 

AI Coding 如何減少 Token?10 個實戰技巧,降低消耗又不犧牲程式碼品質

使用 Claude Code、Cursor、GitHub Copilot 或其他 AI Coding Agent 開發專案,最容易忽略的一件事,就是 Token 可能不是花在寫程式,而是花在理解專案、讀取無關檔案、重複分析,以及反覆修正。

例如,你只是想新增一支 IQC API,AI 卻開始探索整個 Repository、讀取大量 Model、分析不相關的前端元件,最後還產生一份很長的分析報告。

程式還沒寫,Token 已經消耗不少。

這時候,與其一味更換更強的模型,不如先思考:

能不能讓 AI 只讀取必要的資訊、執行必要的工作,並減少重複推理?

以下整理 10 個可以直接應用在 AI Coding 工作流程中的技巧。

一、限制 AI 的搜尋範圍,不要一開始就掃描整個專案

這是我認為最值得優先處理的問題。

當你要求 AI:

幫我分析整個專案,新增 IQC API。

AI 可能需要自行探索目錄、尋找相關 Model、追蹤資料庫關係,再判斷應該修改哪些檔案。

如果任務範圍不明確,探索成本就可能不斷增加。

更有效的方式,是直接指定起始範圍與調查方向:

請先檢查 backend 中與 IQC、GRN 相關的實作。

確認現有 Model、Router、Service、Schema、
權限檢查及測試慣例。

只有在必要依賴無法確認時,才擴大搜尋範圍。
不要掃描無關的 Frontend 模組。

這種做法的重點不是禁止 AI 查看其他檔案,而是採用「由近到遠」的調查策略。

先找直接相關的程式碼,再沿著實際依賴追查。

適用情境: 新增 API、修正 Bug、調整既有功能、處理單一模組的重構。

二、明確告訴 AI 哪些檔案不要讀

大型專案經常包含大量不需要進入一般開發上下文的檔案,例如:

node_modules/
dist/
build/
coverage/
__pycache__/
.pytest_cache/
*.log

依專案情況,也可以排除產生的文件、暫存資料及不相關的建置產物。

但要注意,不同工具使用不同的忽略機制。

例如:

  • Claude Code 可以使用 CLAUDE.md、設定檔及相關的忽略或權限機制管理工作範圍。

  • Cursor 可以透過 .cursor/rules/ 定義規則,也可以設定檔案排除。

  • GitHub Copilot 可以使用 .github/copilot-instructions.md 提供專案指令。

這些設定的效果並不完全相同。

Git 的 .gitignore 也不代表 AI 一定不會讀取被忽略的檔案。

另外,排除規則應該依工具的實際行為設定,不能假設所有 AI Coding Agent 都支援相同的 .claudeignore 檔案。

還有一個實用原則:不要排除可能用於除錯的關鍵日誌、測試資料或設定檔。目標是減少無關資訊,不是讓 AI 失去必要的證據。

三、建立精簡的專案指令檔,避免每次重複輸入規則

如果你每次開發都要重複告訴 AI:

  • 使用 FastAPI 與 Pydantic v2。

  • 遵循現有 SQLAlchemy 寫法。

  • Router 不要塞入大量業務邏輯。

  • 修改前確認實際資料表結構。

  • 不要任意新增 Service、DTO 或抽象層。

  • 修改後執行相關測試。

那麼就可以把穩定且經常使用的規則放進專案指令檔。

例如:

smtms/
├── AGENTS.md
├── .github/
│   └── copilot-instructions.md
├── backend/
└── frontend/

AGENTS.md 可以放置適用於整個專案的開發原則;Copilot 的指令檔則用於對應的工具。

如果需要,也可以進一步設定模組專屬規則,避免所有任務都載入大量不相關的說明。

不過,這裡有一個容易忽略的細節:

指令檔不是越長越好。

如果一份規範包含數百行說明、重複的程式碼範例,以及大量與當前任務無關的規則,本身也可能增加上下文消耗。

建議優先保留:

  1. 不可違反的業務規則。

  2. 專案特有的程式碼慣例。

  3. 必要的修改與驗證要求。

  4. 常用文件的位置。

其餘內容再依任務需要載入。

四、把專案背景與業務規則分開,採用按需讀取

假設你的專案是 FastAPI + React 的品保管理系統 SMTMS。

AI 在新增 IQC API 時,不一定需要理解整個前端,也不一定需要重新閱讀所有驗收文件。

可以把長期有效的資訊整理成幾份精簡文件:

.ai/
├── architecture.md
├── business_rules.md
└── project_state.md

例如 business_rules.md:

# Business Rules

- IQC 檢驗紀錄必須符合既有收料流程
- GRN 必須關聯對應的供應商批次
- 實際用料必須能追溯至供應商批次

實際規則仍須以專案已確認的規格與實作為準,不能因為這個範例就直接假設所有資料表都採用相同設計。

執行任務時,要求 AI 先查看必要的背景與業務規則,再檢查相關程式碼即可。

例如:

先參考 .ai/business_rules.md。

接著檢查 IQC 與 GRN 的實際實作,
確認資料模型與 API 慣例後再修改。

若文件與程式碼不一致,先確認差異,
不要直接假設其中一方正確。

這種方式的好處,是不必每次重新解釋整個系統。

但不要為了管理 Context,刻意建立多份內容重複的文件。現有的 README、架構文件及驗收規格如果已經完整,就應該優先重用。

五、不要把所有原始碼貼進 Prompt,改用精準的檔案引用

另一種常見的 Token 浪費方式,是將大量程式碼直接複製到對話中。

例如,只需要修改一個 Router,卻把整個 Service、所有 Model、資料庫結構及前端頁面全部貼進去。

這不但增加輸入量,也可能讓重要資訊被大量次要內容淹沒。

比較好的方式是提供:

  • 需求描述。

  • 相關檔案路徑。

  • 必要的程式碼片段。

  • 已確認的業務規則。

  • 驗收條件。

例如:

任務:修正 IQC API 的資料驗證。

優先檢查:
- IQC Router
- IQC Schema
- IQC Service
- 對應 Model
- 相關測試

先確認資料驗證在哪一層執行,
沿用既有模式,以最小差異修正。

不要為了這次修改重新分析整個專案。

如果工具能透過檔案引用、符號搜尋或程式碼索引取得內容,就善用這些能力。

但要注意,檔案引用語法並非所有工具通用。例如 @檔案路徑 的支援方式取決於使用的工具與介面。

六、控制 Session 長度,避免把所有工作塞進同一段對話

長時間使用同一個對話處理不同任務,也可能造成上下文膨脹。

例如:

  1. 修正 JWT 認證。

  2. 調整 RBAC 權限。

  3. 修改供應商資料模型。

  4. 開發 IQC。

  5. 回頭處理前端表格。

這些工作可能有部分關聯,但也包含許多已經不再需要的歷史資訊。

建議依任務的關聯性管理 Session。

適合延續原 Session 的情況:

  • 同一個 Bug 的調查與修正。

  • 同一個功能的實作與測試。

  • 需要延續前面已確認的技術決策。

適合開新 Session 的情況:

  • 上一個任務已經完成。

  • 開始完全不同的模組。

  • 舊對話累積大量無關的工具輸出。

  • AI 開始反覆引用已經過時的假設。

如果任務尚未完成,可以先整理目前狀態,再使用工具的上下文整理功能,或在新 Session 中提供必要摘要。

以 Claude Code 為例,可以使用 /clear 開始新的對話工作階段,或使用 /compact 整理目前上下文。

但要記得:新 Session 不會自動知道舊對話中所有重要資訊,因此應保留已確認的事實、修改檔案、測試結果及未解決問題。

七、建立簡短的 Project State,避免每次重新理解進度

對於持續開發的專案,可以維護一份 project_state.md:

# Project State

## Completed
- JWT Authentication
- RBAC
- Supplier Management

## In Progress
- IQC Module

## Next
- Complete IQC API
- Verify permissions
- Run related tests

## Known Constraints
- Follow existing SQLAlchemy patterns
- Verify actual schema before changing models

每次開始新任務時,先查看目前進度,就能減少重複說明背景的工作。

但這份文件應該短小,並且在重要變更後更新。

它不能取代程式碼、資料庫結構及測試結果。如果文件中的進度與實際實作不同,仍然需要核對現況。

最重要的是,不要把每一次聊天的所有內容都寫進去。

只保留會影響下一步工程決策的資訊。

八、限制 AI 的修改範圍,減少反覆修正的 Token

Token 不只會花在閱讀,也可能大量消耗在錯誤的修改循環。

例如,AI 為了修正一個 API 問題,順便重構多個 Service、調整資料模型、修改前端元件,最後引入更多錯誤。

接著又開始修正這些新問題。

這就是典型的無效迴圈。

可以在任務中加入以下要求:

1. 先確認根因與必要修改範圍。
2. 優先沿用現有實作模式。
3. 只修改完成需求所必要的檔案。
4. 不新增不必要的抽象層或重複邏輯。
5. 修改後執行與變更直接相關的測試。
6. 若測試失敗,先分析原因,不要盲目擴大修改。
7. 最後回報修改檔案、驗證結果及未解決問題。

這類限制能減少不必要的程式碼產生、工具呼叫及後續除錯。

但不要把「最小差異」理解成「只能修改一個檔案」。如果正確修正確實需要同步調整 Schema、Service、Router 與測試,就應該完整修改。

目標是避免無關變更,而不是限制必要的工程工作。

九、減少冗長的工具輸出與分析報告

在 AI Coding 工作流程中,工具輸出也是值得管理的成本來源。

例如執行測試時,如果整份測試日誌有數千行,但真正的問題只有一個 AssertionError,就不一定需要把全部輸出都交給模型分析。

可以先使用適當的篩選方式,保留:

  • 失敗的測試名稱。

  • 例外訊息。

  • 必要的呼叫堆疊。

  • 與錯誤相關的程式碼。

  • 測試總結。

對於大型搜尋結果,也可以先查看檔案清單與相關片段,再決定是否需要讀取完整內容。

另外,任務回報也可以依複雜度調整。

小型修正只需要回報修改內容與測試結果;跨模組重構則需要說明設計取捨、相容性及風險。

不需要每次修改一行程式碼,都產生一份完整的架構分析報告。

不過,過度壓縮日誌也可能漏掉重要錯誤,因此應保留能夠支持判斷的必要證據。

十、量測實際 Token 用量,不要只靠感覺

以上技巧可能改善效率,但不能直接推論每個專案都能減少固定比例的 Token。

實際成效會受到模型、工具、任務複雜度、快取機制及上下文管理方式影響。

如果想確認哪些方法真的有效,可以挑選幾個相似任務,記錄導入前後的結果:

指標觀察目的
輸入 Token是否減少無關上下文
輸出 Token是否減少不必要的報告與程式碼
快取 Token是否有效利用產品提供的快取
工具呼叫次數是否減少重複搜尋與讀取
修改檔案數是否減少無關變更
測試結果是否維持正確性
人工修正次數是否降低返工成本
完成時間與實際費用是否真正提升開發效率

不同平台的用量統計方式可能不同,應使用各平台實際提供的資料,並在相同模型、相近任務與一致驗收標準下比較。

不要只看 Token 數字下降,卻忽略測試失敗、人工修正增加或開發時間變長。

真正有價值的是:用更少的無效消耗,完成品質相同甚至更好的工程任務。

最後:我會優先採用哪幾個技巧?

如果現在要開始改善 AI Coding 的 Token 使用效率,我會按照以下順序執行:

  1. 縮小搜尋範圍:讓 AI 從相關模組開始調查。

  2. 控制上下文:只提供任務真正需要的文件與程式碼。

  3. 建立精簡規範:避免每次重複輸入相同要求。

  4. 管理 Session:任務結束後,適時整理或重新開始對話。

  5. 控制修改範圍:減少不必要的重構與返工。

  6. 精簡工具輸出:只保留有助於判斷的必要資訊。

  7. 持續量測:確認 Token、成本、時間與品質是否一起改善。

這些方法不需要一次導入所有工具,也不需要先把專案改造成複雜的 AI 架構。

從下一次新增 API 或修正 Bug 開始,先明確指定調查範圍、必要規則及驗收條件,就能逐步建立更有效率的 AI Coding 工作流程。

降低 Token 的關鍵,不是讓 AI 少做必要的工作,而是不要讓 AI 把資源花在不必要的工作上。


延伸工具:OmniRoute 與 AI 原生 Repo

除了 Context Engineering,也可以關注 OmniRoute 這類 AI Gateway。它的定位是統一模型 API 入口,協助管理不同模型供應商、路由與故障轉移;實際支援能力仍需依工具及模型相容性確認。

但要注意,模型路由不等於 Token 優化。

真正減少不必要消耗的關鍵,仍然是讓 AI 只讀取任務需要的資訊,而不是每次都把整個專案塞進上下文。

我會優先做好:

  • AGENTS.md:定義 AI Agent 的專案工作規則

  • .ai/:整理架構、業務規則與專案狀態,按需載入

  • Cursor Rules / TRAE Rules:依各工具的機制設定規則入口

當這些基礎建立好,再搭配 OmniRoute 管理多模型,才更有機會兼顧開發效率、成本與可靠性。

AI Coding 的重點,不只是選對模型,而是讓模型在正確的上下文中完成正確的任務。

2026年10月23日 星期五

2026 年的資深工程師面試,到底是在評估理解能力,還是在評估記憶能力?

 

都 2026 年快結束了,還在用 Laravel Lifecycle 跟 SQL 語法評斷資深工程師?

最近面試一個 Laravel 職缺,被問到 Laravel Request Lifecycle、Service Provider、SQL JOIN、GROUP BY。

這些問題有錯嗎?

沒有。

但我想問的是:一場評估十多年資歷工程師的面試,如果大部分時間都在確認他記不記得框架細節,那究竟是在評估工程能力,還是在考技術問答?

這不是說基礎不重要,而是面試官必須先想清楚:自己到底想找到什麼樣的人。

一、背得出 Lifecycle,不代表遇到問題就能解決

Laravel Request Lifecycle 當然重要。

但知道請求的執行流程,跟能利用這些知識排查正式環境問題,是兩回事。

一個人可以把 Lifecycle 背得滾瓜爛熟,卻在實際遇到 Middleware 異常、依賴解析失敗或請求流程不如預期時,不知道從哪裡開始查。

反過來說,有經驗的工程師未必能在面試現場,按照文件順序完整背出每個執行環節,卻能透過 Log、Route、Middleware、Container 與原始碼,逐步定位問題。

那麼,哪一種能力對實際交付更有價值?

如果職缺需要研究 Laravel 底層,深入考查 Lifecycle 非常合理。

但如果只是要求候選人背出整套流程,再用回答得多完整來判斷資歷,我會想問:你要找的是能解決問題的工程師,還是記得住文件的考生?

二、SQL 寫得出來,不代表你有能力確保資料正確

JOIN、GROUP BY 是基本功,這沒有爭議。

但真正危險的,從來不是工程師忘記某個 SQL 語法,而是他寫出一段可以執行的 SQL,卻不知道結果早就算錯了。

例如,一筆訂單有多筆付款紀錄。直接 JOIN 後再加總訂單金額,就可能因為資料列被展開而重複計算。

查詢成功了,報表產生了,甚至沒跳出任何錯誤。

但數字是假的。

這時候,真正有價值的能力是找出資料為什麼膨脹、金額為什麼重複、查詢結果是否符合業務規則,以及如何驗證修正後的正確性。

SQL 語法決定查詢能不能執行,資料理解與驗證能力決定結果能不能相信。

如果面試只考 JOIN 怎麼寫,卻不考候選人能不能發現 JOIN 造成的資料錯誤,那這場面試測到的,可能只是語法熟練度,而不是資料處理能力。

三、設計模式很重要,不懂的人確實不適合盲目依賴 AI

這裡我先站在反方說一句話。

如果一個人宣稱自己用 Cursor 開發 Laravel,卻連 Dependency Injection 是什麼、設計模式要解決什麼問題都不知道,那確實有問題。

因為 AI 可以產生程式碼,卻不代表它產生的架構一定合理。

Controller 裡直接塞商業邏輯、SQL、第三方 API 呼叫,AI 寫得出來,測試也可能通過。但當需求持續變動,原本沒有明確責任邊界的程式,就可能變成難以修改、難以測試、牽一髮動全身的技術債。

所以,不懂設計原理就盲目使用 AI,確實可能只是加速製造問題。

但接下來才是重點。

設計模式很重要,不等於面試就應該花大量時間考候選人背定義。

與其問「Repository Pattern 是什麼」,不如問:

  • 這個情境為什麼需要 Repository?直接使用 Eloquent 不行嗎?

  • 什麼時候該拆 Service Layer?什麼時候拆了反而增加複雜度?

  • 如果 AI 把所有商業邏輯塞進 Controller,你會怎麼判斷是否需要重構?

  • 這次重構的收益,是否真的大於修改成本與回歸風險?

這些問題才能看出候選人是否理解設計背後的取捨。

因為真正成熟的工程師,不是看到程式碼就急著套設計模式,而是知道問題在哪裡、有哪些方案,以及每個方案要付出什麼代價。

能背出 Pattern 的名稱,不代表懂架構;知道什麼時候不該用 Pattern,反而更能看出經驗。

四、我知道面試官為什麼喜歡考這些,但方便篩選不等於評估完整

站在面試官的角度,基礎題確實有它的價值。

面試只有一個小時,不可能讓每個人都完整操作一個專案。問 Lifecycle、SQL 與設計模式,可以快速確認候選人有沒有基本功,也能降低找來一個完全依賴 AI、卻沒有能力驗證產出的人的風險。

這個理由完全合理。

但問題是:一套方便面試官出題的題庫,不應該自動變成評估資深工程師的標準答案。

如果基礎問題只是用來確認底線,我沒有意見。

如果候選人連基本原理都說不清楚,當然值得追問。

但如果一位有十多年經驗的工程師,能處理既有系統、整合 API、定位資料錯誤、控制修改範圍,卻因為無法完整背出某段框架執行流程,就被認定能力不足,那我認為評估方式本身就值得檢討。

不是所有記不住細節的人都很有能力,也不是所有背得出答案的人都沒有能力。

問題在於,面試官是否有能力分辨這兩種人。

五、AI 已經能寫程式,資深工程師的價值就更不該只停留在「會寫」

過去,熟悉語法、掌握框架、理解設計模式,再把程式碼寫出來,是工程師的重要能力。

現在,AI 已經能協助完成大量程式碼產生工作。

但程式碼產生得快,不代表需求理解得正確;測試通過,不代表業務規則完整;架構看起來漂亮,也不代表它適合目前的系統。

工程師仍然必須判斷:

  • 需求是否有漏洞?

  • AI 是否擅自假設不存在的欄位或規則?

  • 這個設計是否過度複雜?

  • 修改會影響哪些既有功能?

  • 如何驗證結果,並控制交付風險?

這些事情都需要技術基礎,但不是把技術名詞背熟就能做到。

AI 沒有讓基礎知識變得不重要,而是讓「只會背、只會寫」更難成為資深工程師的競爭優勢。

六、如果我是面試官,我會考原理,但更會考判斷

我會問 Lifecycle,也會問 SQL,更會問設計模式。

但我不會滿足於候選人講出定義。

我會給他一段既有程式碼,問他問題在哪裡、為什麼這樣判斷、有哪些修改方案,以及各自的風險。

我會讓他面對一個資料不一致的情境,觀察他如何排查,而不是只看他能不能快速寫出一段查詢。

我也會問他如何使用 AI 修改既有系統、如何限制修改範圍、如何驗證產出,以及當 AI 提出的方案不合理時,他是否有能力拒絕。

因為我想找的不是一個什麼都能立刻回答的人,而是一個在答案不明確、文件不完整、需求持續變動時,仍然能做出合理判斷的人。

這才是資深工程師應該展現的價值。

結語

我從來沒有說 Laravel Lifecycle 不重要、SQL 不重要,或設計模式不重要。

我質疑的是:當我們要評估一位資深工程師時,為什麼有時候仍然習慣用背誦知識的方式,代替對實際工程能力的判斷?

基礎知識應該是入場券,不是整場面試的主角。

理解原理,不等於背誦細節;會做架構決策,不等於會默寫框架文件。

如果面試的目的只是確認候選人記得多少知識,那考題確實很好設計。

但如果目的是找到能對系統品質、資料正確性與交付結果負責的資深工程師,就應該考得更深入,而不是只考得更細。

最後,我想問一句:

2026 年的資深工程師面試,究竟是在挑選能解決問題的人,還是在挑選最會回答技術考題的人?

如果連這兩件事都分不清楚,那可能不只是候選人需要重新檢視自己的能力。

面試的評估方式,也值得重新檢視。

#Laravel #AI輔助開發 #AICoding #軟體工程 #技術面試 #資深工程師

AI SEO 技術實戰:從 Technical SEO、Entity SEO 到品牌權威性,讓 ChatGPT 與 Gemini 更容易理解你的公司

 

AI SEO 技術實戰:從 Technical SEO、Entity SEO 到品牌權威性,讓 ChatGPT 與 Gemini 更容易理解你的公司

一、前言:SEO 沒有消失,而是競爭場域正在改變

過去,企業經營網站 SEO,最關心的是搜尋排名、自然流量與轉換率。

使用者搜尋「Laravel 系統開發公司」,搜尋引擎會提供一系列網站,讓使用者自行比較。

現在,使用者也可能直接詢問 ChatGPT 或 Gemini:

我們公司有一套使用十多年的企業系統,想導入 AI Agent、自動化工作流程,並整合既有 API。台灣有哪些技術團隊值得參考?

這時候,使用者期待的已經不只是網站清單,而是經過整理的建議,例如哪些公司具備相關技術能力、有哪些實際案例,以及不同方案的優缺點。

這帶來一個新的問題:

如果使用者不再只透過搜尋引擎尋找網站,而是直接向 AI 詢問答案,企業該如何讓 AI 找到自己的資訊、理解自己的專業,並在適當的情境下引用或推薦自己的品牌?

這就是近年受到關注的 AI SEO 與 GEO(Generative Engine Optimization,生成式引擎最佳化)。

不過,AI SEO 並不是一套能夠保證品牌被推薦的特殊技術。Google 的官方文件仍然強調網站可檢索性、內容品質及既有搜尋最佳化原則;OpenAI 也提供了專門的搜尋爬蟲設定與網站發布者說明。

因此,與其追逐各種未經證實的 AI SEO 技巧,不如從工程角度拆解這個問題:

  1. 網站能不能被搜尋系統取得?

  2. 網站內容是否能清楚回答使用者的問題?

  3. AI 能不能正確辨識公司、人物、產品與技術專案?

  4. 不同公開來源能否互相驗證這些資訊?

  5. 如何判斷 AI 是否真的引用或推薦了這些資訊?

這篇文章將從 Technical SEO 開始,逐步延伸至 Entity SEO、跨平台資訊一致性、品牌權威性與成效驗證,建立一套可以實際執行的 AI SEO 工作方法。

官方參考:Google Search Central:AI features and your website


二、先理解 AI 搜尋:找到網站,不等於推薦品牌

在討論技術實作之前,需要先區分三個經常被混為一談的概念。

層次要解決的問題可能的驗證方式
Discoverability搜尋系統能否發現網站?爬蟲存取、索引狀態
Retrieval & Citation網站內容是否被取得並引用?AI 回答中的來源連結
Brand Recommendation品牌是否出現在相關推薦中?固定問題集的品牌提及率

這三者有關聯,但並不是必然的線性關係。

網站可以被 Google 收錄,卻沒有出現在某次 AI 回答中;AI 也可能引用一篇技術文章,卻沒有推薦文章作者所屬的公司。

更重要的是,不同 AI 產品使用的資訊來源與生成流程不完全相同。部分回答會使用即時搜尋,其他回答則可能受到模型既有知識、對話上下文或其他資料來源影響。

因此,不能假設所有 AI 都會先完整讀取企業網站,再依照固定規則評選推薦名單。

以具備網路搜尋能力的 AI 服務為例,可以用以下概念流程理解:

使用者提出問題
       │
       ▼
理解需求與拆解搜尋意圖
       │
       ▼
取得相關網頁或其他可用資訊
       │
       ▼
評估相關性並整理資訊
       │
       ▼
生成答案、引用來源或提出建議

這是概念性模型,不代表所有平台都採用相同的內部實作。

Google 的 AI 搜尋功能可能將複雜問題拆解成多個相關搜尋,再整合不同來源的資訊。ChatGPT Search 則能在適當情境下搜尋網路並提供來源連結。

這也說明了為什麼 AI SEO 不能只關注網站本身。

如果企業希望在「Laravel 舊系統改造」這類問題中被提及,除了讓官網具備良好的 SEO 基礎,也需要提供能證明相關專業的內容與公開資訊。


三、第一層:Technical SEO,先讓網站具備被發現的條件

AI SEO 的第一步仍然是技術檢查。

如果重要頁面無法正常存取、被錯誤封鎖,或只有使用者登入後才能看到內容,再好的品牌策略也可能無法發揮作用。

3.1 檢查 robots.txt 與 AI 爬蟲設定

傳統 SEO 需要確認 Googlebot 能正常存取公開內容。

如果希望網站有機會出現在 ChatGPT Search 的搜尋結果中,也應確認 OpenAI 的搜尋爬蟲 OAI-SearchBot 是否遭到封鎖。

例如:

User-agent: Googlebot
Allow: /

User-agent: OAI-SearchBot
Allow: /

Sitemap: https://example.com/sitemap.xml

這只是簡化範例,實際設定仍須依照網站現有規則、公開路徑及安全政策調整。

OpenAI 的爬蟲具有不同用途:

User-Agent用途
OAI-SearchBot協助網站出現在 ChatGPT 搜尋結果
GPTBot控制與 OpenAI 模型訓練相關的網頁資料蒐集

企業可以依照自身需求,分別決定是否允許不同用途的爬蟲。

但要注意,允許 OAI-SearchBot 存取,不代表網站一定會被收錄、引用或推薦。這只是讓網站具備被相關搜尋系統取得資訊的條件之一。

參考:OpenAI:Overview of OpenAI Crawlers

3.2 檢查 HTTP 狀態碼、CDN 與防火牆

可以先使用 curl 檢查重要頁面的基本回應:

curl -I https://example.com/services/ai-agent

接著檢查 Sitemap:

curl -I https://example.com/sitemap.xml

工程團隊應進一步確認:

  • 重要公開頁面是否正常回傳 HTTP 200。

  • 是否存在不必要的 301、302 或錯誤的 canonical。

  • CDN、WAF 與 Bot Protection 是否誤擋合法爬蟲。

  • 頁面是否意外帶有 noindex。

  • 公開內容是否被登入驗證或權限機制阻擋。

  • 不同 User-Agent 是否取得不一致或錯誤的頁面內容。

這些檢查只能確認部分技術條件,不能直接證明頁面已經被搜尋引擎收錄。

Google Search Console 的網址檢查工具,可以進一步確認 Google 實際取得的頁面與索引狀態。

3.3 JavaScript 網站要確認重要內容是否可被處理

Vue、React 等前端框架本身不是 SEO 問題,真正需要確認的是重要內容能否被搜尋系統有效取得。

例如,頁面原始 HTML 只有:

<div id="app"></div>

文章標題、服務介紹與案例內容全部等待 JavaScript 執行後才產生。

這不代表搜尋引擎一定無法理解內容,但會增加渲染與除錯的複雜度。

針對重要的公開頁面,可以評估:

  • Server-Side Rendering(SSR)。

  • Static Site Generation(SSG)。

  • 預先輸出完整 HTML。

  • 確保 JavaScript 執行後的重要內容沒有被意外隱藏。

例如,Laravel 後端可以直接輸出服務頁面的標題、介紹、案例與常見問題,不一定要將所有重要資訊留給前端在執行階段載入。

是否需要改變架構,應根據實際爬蟲渲染結果、網站效能與維護成本決定,而不是因為 AI SEO 就全面重寫網站。

參考:Google Search Central:JavaScript SEO basics


四、第二層:Content Engineering,讓內容真正回答問題

網站能被搜尋到,只是第一步。

接下來的問題是:網站內容是否提供了足夠具體、可靠且有參考價值的資訊?

假設有兩家公司都提供 Laravel 系統開發服務。

第一家公司寫著:

我們專精於企業系統開發,提供專業、高效且創新的數位轉型服務。

第二家公司則說明:

接手缺乏測試的 Laravel 舊系統時,我們會先盤點路由、資料庫結構、權限設定與實際執行流程,再確認需求涉及的業務不變條件。修改時優先採取小範圍變更,並根據既有行為設計必要的回歸檢查,降低對其他功能的影響。

兩段文字都在介紹技術能力,但第二段提供了具體的方法、工程判斷與風險管理原則。

這種內容對正在評估技術服務的使用者更有參考價值,也比較容易回答具體的技術問題。

4.1 從關鍵字導向,轉向問題導向

傳統 SEO 常從關鍵字研究開始,例如:

  • Laravel 開發公司。

  • AI Agent 開發。

  • 企業系統整合。

  • 製造業品質管理系統。

這些關鍵字仍然有價值,但不能只靠重複使用關鍵字來建立內容。

更值得研究的是使用者在什麼情境下會提出問題。

例如,搜尋「AI Agent 開發」的使用者,可能真正想知道的是:

  • AI Agent 能否安全修改既有程式碼?

  • 如何限制 Agent 可以執行的操作?

  • 沒有完整測試的舊系統,應該如何導入 AI?

  • 如何驗證 Agent 的輸出,而不是只相信它產生的程式碼?

  • 導入 AI 自動化後,如何維持系統可維護性?

因此,網站可以依照實際業務建立一組內容主題:

內容類型範例
技術教學如何讓 AI Agent 在受控範圍內修改 Laravel 專案
架構分析如何設計 AI Agent 的工具權限與執行邊界
問題排查舊系統缺乏測試時,如何降低修改風險
專案案例如何建立供應商批號與產品序號追溯關係
技術比較自動化測試、人工審查與 Agent 評估的差異

這樣的內容規劃,不只是為了增加搜尋曝光,而是逐步建立企業在特定技術領域的知識資產。

4.2 技術案例要能被驗證

技術文章可以說明觀念,但實際案例更能呈現工程團隊如何處理問題。

一篇完整的案例可以包含:

  1. 問題背景: 原本的系統遇到什麼問題?

  2. 技術限制: 為什麼不能直接重寫或套用現成工具?

  3. 系統架構: 使用哪些元件,以及它們如何互動?

  4. 設計決策: 為什麼選擇這個方案?

  5. 驗證方法: 如何確認功能與資料一致性?

  6. 結果與限制: 實際完成了什麼,還有哪些問題尚未解決?

如果有實際測試結果,可以公開測試條件、執行方式與結果;如果只是開發中的原型,就應明確標示為原型。

不要為了讓案例看起來更有說服力,就編造效能數據、客戶成果或上線經驗。

對技術內容而言,清楚說明做了什麼、如何驗證,以及還有哪些限制,比宣稱自己很專業更有價值。


五、第三層:Entity SEO,讓品牌、人物與技術專案具有清楚的身分

前面兩層主要解決網站與內容問題,但還有一個值得獨立討論的方向:Entity SEO。

Entity 可以理解為具有特定身分、可與其他實體區分的對象,例如:

  • 一家公司。

  • 一位工程師。

  • 一個開源專案。

  • 一項產品。

  • 一個技術框架。

  • 一個研究機構。

對 AI 搜尋而言,重要的不只是某個網頁出現了哪些關鍵字,還包括網頁描述的是誰、做了什麼,以及這些資訊之間有什麼關係。

例如,假設某位工程師公開了一個品質管理系統專案,並在文章中介紹其資料模型、追溯流程與權限設計。

如果不同公開來源能清楚對應到同一個人與同一個專案,就比較容易讓讀者與資訊系統理解這些資料的關聯。

可以用下列模型表示:

Person:工程師
   │
   ├── author of ──► Technical Article
   │
   └── maintainer of ──► Software Project
                              │
                              ├── uses ──► Technology
                              │
                              └── demonstrates ──► Capability

這是資訊建模的概念示意,不代表搜尋引擎一定會以這種方式建立內部知識圖譜。

5.1 建立一致且可驗證的品牌身分

對企業網站而言,可以從 Organization 結構化資料開始。

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "Example Technology",
  "url": "https://example.com/",
  "description": "提供企業軟體開發、API 整合與自動化服務。",
  "sameAs": [
    "https://www.linkedin.com/company/example"
  ]
}
</script>

這個範例描述公司名稱、官網、簡介與外部身分連結。

實際使用時,必須替換成真實資料,並確保外部連結確實指向同一家公司。

同樣的原則也可以用在個人與軟體專案上:

  • 公司官網應清楚說明公司提供哪些服務。

  • 作者頁面應清楚標示作者的身分與專業背景。

  • 專案 README 應說明專案用途、技術架構與維護狀態。

  • 技術文章應明確標示作者、發布日期與參考資料。

  • 不同平台上的名稱、描述與網址應盡可能保持一致。

這些措施能讓資訊更清楚,也有助於一般搜尋引擎理解相關資料。

但要特別注意,Schema.org 是用來描述資料的詞彙標準,不是要求 AI 將某家公司列入推薦名單的指令。

5.2 Knowledge Graph 不等於企業可以自行控制的推薦資料庫

Google Knowledge Graph 是 Google 用來組織與理解實體及其關係的知識系統之一。

企業可以透過清楚、可靠且一致的公開資訊,協助搜尋系統理解自己的身分,但不能單靠建立一段 JSON-LD,就宣稱自己已經進入 Google Knowledge Graph,更不能據此保證 ChatGPT 或 Gemini 會推薦公司。

不同 AI 平台的資料來源與系統機制並不相同。

因此,Entity SEO 比較合理的目標是:

減少品牌資訊的歧義,讓公司、人物、產品與專案的公開資料更容易被辨識與查證。

參考:Schema.org:Organization


六、第四層:Cross-platform Presence,建立跨平台的技術足跡

這一層是許多只談網站 SEO 的文章容易忽略的部分。

使用者要判斷一家公司是否值得合作,通常不會只看首頁的自我介紹。

他們可能會查看公司的技術文章、GitHub 專案、工程師的公開履歷、第三方報導,或其他可以驗證專業能力的資訊。

這些來源也可能成為搜尋系統取得資訊的管道。

因此,企業不應把所有品牌資訊都限制在自己的官網,而應該思考:不同公開平台能提供哪些獨立的證據?

6.1 GitHub:讓技術能力有實際的程式碼與文件可以參考

對軟體開發團隊而言,GitHub 可以展示比服務簡介更具體的資訊。

例如,一個公開的品質管理系統專案,可以提供:

  • README 與專案目標。

  • 系統架構圖。

  • ERD 與資料模型。

  • API 文件。

  • 權限與角色設計。

  • 資料追溯流程。

  • 交易一致性與錯誤處理方式。

  • 測試方法與已知限制。

假設專案涉及產品序號與供應商批號追溯,README 可以說明:

本專案用於示範產品序號、物料使用紀錄與供應商批號之間的追溯關係。文件涵蓋資料模型、追溯查詢流程、權限設計及測試情境。

如果專案尚未完成正式部署,就應明確標示為示範專案或 MVP,不應包裝成已經在企業環境中驗證的產品。

另外,公開程式碼也必須注意資安問題,避免洩漏 API Key、帳密、客戶資料、內部網址與其他機密資訊。

6.2 LinkedIn:讓人物、職務與專業方向保持一致

LinkedIn 的價值不在於重複張貼技術關鍵字,而在於提供清楚的職業背景與專業方向。

例如,工程師可以透過公開履歷與文章,具體說明自己在以下領域的經驗:

  • Laravel 後端系統設計。

  • 企業 API 與資料庫整合。

  • AI Coding Agent 工作流程。

  • 既有系統維護與重構。

  • 自動化驗證與交付風險管理。

但要區分「實際具備的經驗」與「正在研究的技術」。

如果熟悉 Laravel,卻只有初步接觸 FastAPI,就不應為了擴大曝光而將兩者描述成同等程度的實戰經驗。

清楚、準確的專業定位,比大量堆疊技術名稱更能建立可信度。

6.3 技術文章:建立可重複引用的知識資產

技術文章可以發布在公司官網、個人網站或適合的技術社群。

重要的不是同一篇文章發布越多次越好,而是讓每個來源提供明確價值。

例如:

  • GitHub:展示實作與架構文件。

  • 個人技術部落格:說明設計決策與問題排查。

  • LinkedIn:整理專案經驗與技術觀點。

  • 公司官網:說明服務能力與正式案例。

如果文章有轉載到其他平台,應妥善處理來源連結與 canonical 等設定,避免因重複內容而造成不必要的維護問題。

跨平台布局的目標不是製造大量品牌提及,而是建立一組內容互補、身分清楚且能互相驗證的公開資料。


七、第五層:Brand Authority,讓專業能力有足夠的證據支持

品牌權威性經常出現在 SEO 討論中,但必須避免把它誤解成一個可以直接控制的單一排名分數。

對企業而言,真正值得建立的是能夠被外部查證的專業證據。

例如,一家公司宣稱自己擅長 AI Agent 導入,使用者可以進一步查看:

  • 是否有公開的技術架構說明?

  • 是否有展示 Agent 執行邊界與權限控制?

  • 是否說明如何評估輸出品質?

  • 是否有實際專案或可重現的示範?

  • 是否清楚揭露系統限制與安全考量?

這些資訊比單純宣稱「我們是 AI 領域專家」更能協助使用者做出判斷。

7.1 以 Case Study 建立可查證的能力描述

假設企業想展示製造業品質管理系統的技術能力,可以建立一篇案例,描述:

問題背景

產品序號與供應商批號之間缺乏完整的資料關聯,發生品質異常時,需要人工比對多份紀錄。

設計方向

建立產品、物料使用紀錄、供應商批號與品質異常之間的關聯,並提供正向與反向追溯查詢。

技術重點

  • 資料模型與關聯約束。

  • 寫入交易的一致性。

  • 角色與權限控制。

  • 異動稽核紀錄。

  • 追溯查詢與異常情境測試。

驗證方式

透過測試資料驗證追溯範圍、權限邊界及資料一致性,並公開測試條件與已知限制。

如果沒有真實客戶案例,也可以用開源專案或模擬資料進行示範,只要清楚說明案例性質即可。

7.2 不要把 Case Study Schema 當成特殊的 AI 推薦技巧

案例頁面可以使用符合內容的結構化資料,例如 Article、Organization 或其他適用類型。

但不存在一個只要加入就能保證進入 AI Overview 或 ChatGPT 推薦名單的通用 Case Study Schema。

案例真正的價值在於其內容是否清楚、可信、具體,而且能夠讓讀者驗證其中的主張。

換句話說,結構化資料是輔助描述,案例證據才是內容本身。


八、把 AI SEO 整合成一套可以執行的技術架構

綜合前面的內容,可以建立以下工作模型:

┌────────────────────────────┐
│ 1. Technical SEO            │
│ 爬蟲存取、索引、HTML、Sitemap │
└──────────────┬─────────────┘
               ▼
┌────────────────────────────┐
│ 2. Content Engineering      │
│ 技術文章、案例、問題解決方法  │
└──────────────┬─────────────┘
               ▼
┌────────────────────────────┐
│ 3. Entity & Identity        │
│ 公司、人物、產品、專案身分    │
└──────────────┬─────────────┘
               ▼
┌────────────────────────────┐
│ 4. Cross-platform Evidence  │
│ 官網、GitHub、作者頁面、外部資料│
└──────────────┬─────────────┘
               ▼
┌────────────────────────────┐
│ 5. AI Search Observation    │
│ 品牌提及、引用、引薦流量      │
└──────────────┬─────────────┘
               ▼
┌────────────────────────────┐
│ 6. Measurement & Iteration  │
│ 驗證結果、修正內容、持續改善  │
└────────────────────────────┘

這是一套用來規劃工作與驗證成效的工程模型,不是搜尋引擎或 AI 平台公開的推薦演算法。

各個階段也不必完全依序執行。例如,內容盤點時可能就會發現網站架構問題;測試 AI 引用時,也可能反過來發現品牌資訊在不同平台上不一致。

實際執行時,應優先處理有明確證據、影響範圍較大,而且修正成本合理的問題。


九、實戰:如何驗證 ChatGPT 與 Gemini 是否理解你的品牌?

如果 AI SEO 只停留在理論,就很容易把偶然出現的品牌提及誤認為優化成功。

因此,建議建立一套固定的測試流程。

9.1 建立品牌與技術領域的基準資料

先整理一份可以作為對照依據的品牌資料:

項目範例
公司或專案名稱SMTMS
專案類型供應商物料追溯與品質管理系統
主要技術FastAPI、SQLAlchemy、React、TypeScript
核心功能批號追溯、品質異常、權限管理、稽核紀錄
公開來源GitHub、官方網站、技術文章
專案狀態MVP、示範專案或正式產品,依實際情況填寫

這份資料不是拿來要求 AI 一定照著回答,而是用來檢查 AI 對品牌的描述是否正確。

9.2 設計不同層次的測試問題

不要只測試「你知道某家公司嗎?」這種單一問題。

可以把測試分成幾類:

測試類型問題範例觀察重點
品牌辨識這個專案是什麼?名稱與用途是否正確
技術辨識這個專案使用哪些技術?技術描述是否正確
能力辨識它展示了哪些系統設計能力?是否能找到相關證據
來源引用請提供支持上述描述的公開來源是否引用正確頁面
產業推薦哪些公開專案展示了物料追溯設計?是否出現在相關答案
品牌查證這個專案是正式產品還是示範專案?是否正確呈現專案狀態

每次測試都應記錄完整問題、平台、日期、回答內容及來源網址。

若要比較不同平台,應盡量保持問題與測試條件一致。

9.3 區分品牌提及、來源引用與推薦

這三個指標不應混為一談。

Brand Mention Rate

在一組固定的相關問題中,品牌被提及的比例。

計算方式:

品牌提及率 = 出現品牌的回答數 ÷ 有效測試回答總數

Citation Rate

回答中有多少次引用了自家網站或公開專案作為來源。

Recommendation Rate

在明確要求推薦或比較方案的問題中,品牌出現在推薦名單中的比例。

這些都是企業自行建立的觀測指標,不是平台官方提供的排名分數。測試時應記錄分母、問題類型與資料期間,避免把不同問題的結果混在一起。

而且,即使品牌提及率提高,也不代表業務一定成長。仍須進一步觀察網站造訪、有效詢問與實際轉換。

9.4 結合網站分析工具

OpenAI 官方文件指出,ChatGPT 搜尋的引薦連結會使用 utm_source=chatgpt.com 參數,因此可以在網站分析工具中追蹤部分來自 ChatGPT 的引薦流量。

參考:OpenAI:Publishers and Developers FAQ

不過,這種追蹤方式有其限制。

如果使用者看過 AI 回答後,改用瀏覽器搜尋品牌名稱,或直接輸入網址,就不一定會被歸類為 AI 引薦。

因此,建議同時觀察:

  • Google Search Console 的自然搜尋曝光與點擊。

  • 網站分析工具中的 AI 引薦流量。

  • 固定問題集的品牌提及與來源引用。

  • 有效詢問、註冊與實際成交。

只有結合這些指標,才能比較完整地評估 AI SEO 的實際價值。


十、哪些 AI SEO 技巧不值得盲目相信?

AI SEO 受到關注後,也出現不少缺乏充分證據的說法。

迷思一:建立 llms.txt,AI 就會優先推薦你

不能這樣推論。

llms.txt 是一種提議中的網站資訊檔案格式,但不能假設所有搜尋引擎或 AI 平台都會採用它,更不能把它當成 Google AI 搜尋的必要條件。

Google 的生成式 AI 搜尋指南沒有要求網站必須建立 llms.txt 才能出現在 AI 搜尋功能中。

迷思二:加入特殊 Schema 就能進入 AI 推薦名單

結構化資料可以協助搜尋系統理解頁面資訊,但不能保證品牌被引用或推薦。

應該依照實際內容選擇適用的 Schema.org 類型,而不是建立與頁面內容不符的標記。

迷思三:文章越長,AI 越容易引用

沒有普遍適用的官方規則,要求 AI SEO 文章必須達到特定字數。

文章應該完整回答問題,但不需要為了達到某個字數而加入重複內容。

迷思四:每天大量發布 AI 文章,就能建立權威性

文章數量不等於專業能力。

如果大量內容只是改寫既有文章、重複相同觀點,卻沒有新增實例、證據或獨特分析,可能只會增加維護成本。

更合理的策略是優先改善重要頁面,並持續累積可驗證的技術內容。

迷思五:讓 AI 爬蟲進站,就一定會被推薦

允許爬蟲存取只是技術條件之一。

是否被收錄、檢索、引用或推薦,還可能受到內容相關性、可用來源及平台自身機制影響。任何單一設定都無法保證最終結果。


十一、工程團隊如何分階段導入?

如果要在既有企業網站上實施 AI SEO,我會建議從小範圍開始,而不是一次重構整個網站。

Phase 1:Technical Audit

盤點:

  • robots.txt 與 Sitemap。

  • Googlebot、OAI-SearchBot 的存取狀況。

  • HTTP 狀態碼與索引問題。

  • canonical 與多語系設定。

  • JavaScript 渲染後的重要內容。

  • 結構化資料與頁面內容的一致性。

交付成果是一份有證據支持的問題清單,包含問題位置、影響範圍、修正優先順序與驗證方式。

Phase 2:Content & Entity Audit

盤點:

  • 公司服務頁面是否清楚。

  • 技術文章是否回答具體問題。

  • 作者與專案資訊是否一致。

  • 案例是否有可驗證的技術細節。

  • GitHub、LinkedIn 與官網是否能互相對應。

  • 不同頁面是否存在大量重複或矛盾資訊。

這個階段的目標不是增加文章數,而是找出品牌資訊與內容品質的缺口。

Phase 3:建立示範頁面與公開技術資料

挑選一個重要服務頁面、一篇技術文章及一個公開專案,建立可以互相連結的資訊。

例如:

公司服務頁
   │
   ├──► 技術文章:設計與實作方法
   │
   └──► GitHub:公開專案與架構文件
                  │
                  └──► README、ERD、測試與限制

確認每個來源的描述一致、連結有效,並清楚區分已驗證成果與開發中的功能。

Phase 4:建立固定測試集與成效追蹤

定期在 ChatGPT 與 Gemini 執行同一組問題,記錄品牌提及、來源引用、描述準確性及網站流量。

當結果不理想時,不要立刻增加文章或修改 Schema,而應先確認問題出在哪裡:

  • 搜尋系統找不到頁面?

  • 頁面沒有回答使用者真正的問題?

  • 品牌與專案身分不清楚?

  • 公開來源彼此矛盾?

  • AI 已經找到資訊,但該次回答沒有採用?

這種依據證據逐步修正的方法,比盲目嘗試各種所謂的 AI SEO 秘技更容易控制成本,也更適合長期維護。


十二、結語:真正值得建立的,是能被查證的專業身分

AI SEO 不只是讓網站被爬蟲讀取,也不只是撰寫更多符合搜尋意圖的文章。

如果企業希望在 AI 回答相關問題時,有機會被引用或推薦,就應該同時思考網站技術、內容品質、品牌身分與公開證據。

從工程角度來看,可以將工作整理成三個方向:

第一,讓資訊可以被取得。

處理爬蟲存取、索引、網站架構、HTML 呈現與多語系問題。

第二,讓專業可以被理解與驗證。

透過技術文章、架構文件、公開專案與具體案例,清楚說明自己能解決什麼問題,以及如何驗證解決方案。

第三,讓結果可以被觀察。

透過搜尋曝光、AI 引薦流量、品牌提及、來源引用與實際轉換,評估策略是否有效,而不是只憑單次回答判斷成敗。

這裡沒有一個神奇的 Schema,也沒有一個能保證 AI 推薦的檔案。

真正值得長期投入的,是讓公司的公開資訊具備一致的身分、具體的專業內容,以及可以被外部查證的技術證據。

當使用者詢問某個技術問題時,企業不應只希望 AI 知道自己的名字,更應該讓公開資料足以回答:

這家公司是誰?它具備什麼能力?有哪些證據支持這些主張?

這才是 AI SEO 從網站最佳化延伸到品牌資訊建設後,最值得工程團隊研究的方向。

十三、AI SEO 工具實戰:從技術檢查到 AI 品牌曝光監測

前面的架構與策略,必須搭配實際工具才能落地。

AI SEO 並不需要一開始就購買昂貴的監測平台。對工程師而言,可以先使用 Google、Bing 與 OpenAI 提供的官方工具,確認網站是否具備被發現的條件,再逐步加入爬蟲分析、品牌曝光監測與自動化測試。

以下依照實際工作流程整理。

13.1 工具總覽

工作階段工具主要用途
搜尋索引Google Search Console檢查索引狀態、搜尋曝光與點擊
Bing 搜尋Bing Webmaster Tools檢查 Bing 索引、爬蟲與網站問題
網站爬取Screaming Frog SEO Spider批次檢查 URL、標題、狀態碼與內部連結
結構化資料Google Rich Results Test檢查 Google 支援的搜尋結果結構化資料
Schema 驗證Schema Markup Validator驗證 Schema.org 結構化資料
流量分析Google Analytics 4追蹤自然搜尋、AI 引薦與轉換
AI 曝光監測Ahrefs Brand Radar、Semrush AI Visibility追蹤品牌提及、引用與競爭對手
品牌人工驗證ChatGPT Search、Gemini測試真實問題下的品牌辨識與來源引用

工具的角色並不相同。官方搜尋工具適合確認網站的技術與搜尋狀態;第三方 AI 曝光工具則是用來觀察特定資料集與測試問題中的品牌表現,不能將其報表直接視為所有 AI 使用者的實際推薦率。

13.2 Google Search Console:確認 Google 是否真正找到網站

官方網址:Google Search Console

這是網站 SEO 的基本工具,適合用來檢查:

  • 重要頁面是否已被 Google 索引。

  • 網址檢查結果是否有抓取或索引問題。

  • 搜尋曝光與點擊是否增加。

  • 哪些搜尋查詢帶來網站流量。

  • Sitemap 是否正常提交與處理。

實作流程:

  1. 將網站網域加入 Search Console,並完成所有權驗證。

  2. 提交 Sitemap。

  3. 選擇重要的服務頁面或技術文章。

  4. 使用「網址檢查」查看 Google 的索引狀態。

  5. 修正問題後,再確認實際檢查結果。

注意:Google 已收錄網站,不代表 ChatGPT 或 Gemini 一定會引用它。Search Console 主要用來觀察 Google 搜尋,而不是直接提供所有 AI 平台的推薦數據。

官方說明:Inspect and troubleshoot a single page

13.3 Bing Webmaster Tools:補足另一個搜尋系統的觀測

官方網址:Bing Webmaster Tools

除了 Google,也可以檢查 Bing 的索引與網站狀態。

值得使用的功能包括:

  • URL Inspection:檢查網址的索引與抓取狀況。

  • Site Explorer:查看網址、索引狀態與爬取問題。

  • Sitemap:提交與檢查 Sitemap。

  • Site Scan:掃描部分 SEO 技術問題。

這對 AI 搜尋研究也有參考價值,但不應直接推論所有 AI 產品都只依賴 Bing 的索引。

官方文件:Bing URL Inspection

13.4 Screaming Frog SEO Spider:批次檢查網站結構

官方網址:Screaming Frog SEO Spider

如果網站有數百甚至數千個頁面,逐一手動檢查並不實際。

Screaming Frog 可以協助批次爬取網站,盤點:

  • HTTP 狀態碼。

  • Title 與 Meta Description。

  • H1 標題。

  • Canonical。

  • Robots Meta 與索引設定。

  • 內部連結與失效連結。

  • Sitemap 與 URL 結構。

  • 可取得的結構化資料。

建議的操作方式:

先爬取網站,再篩選 4xx、5xx、被 noindex 的重要頁面、錯誤 canonical 與缺少標題的頁面。

如果網站大量使用 JavaScript,也可以比較一般爬取與 JavaScript 渲染後的結果,確認重要內容是否確實出現。

這類工具能協助發現技術問題,但不能判斷某篇文章是否一定會被 AI 推薦。

13.5 Google Rich Results Test 與 Schema Markup Validator

這兩個工具的用途不同,不應混為一談。

Google Rich Results Test

網址:https://search.google.com/test/rich-results

用來檢查頁面是否具有 Google 支援的複合式搜尋結果所需的結構化資料,並查看相關錯誤或警告。

Schema Markup Validator

網址:https://validator.schema.org/

用來驗證 Schema.org 結構化資料的語法與資料結構,不限於 Google 支援的複合式搜尋結果類型。

例如,企業網站加入 Organization 資料後,可以先用 Schema Markup Validator 確認資料格式,再使用 Rich Results Test 檢查是否符合相關的 Google 搜尋功能要求。

如果某個 Schema 類型沒有對應的 Google 複合式搜尋結果,Rich Results Test 沒有顯示可用結果,不代表該 Schema 一定寫錯。

最重要的是:通過結構化資料驗證,不代表網站會獲得更高排名,也不代表 AI 一定會引用該頁面。

官方說明:Google:Test your structured data

13.6 Google Analytics 4:追蹤 AI 引薦流量

官方網址:Google Analytics

如果網站希望知道 AI 搜尋是否帶來實際訪客,可以使用 GA4 的流量開發報表。

OpenAI 官方說明指出,ChatGPT 搜尋的引薦連結會帶有 utm_source=chatgpt.com,因此可以在 GA4 中觀察相應流量。

操作方向:

  1. 確認網站已正確安裝 GA4。

  2. 開啟「報表」中的「流量開發」。

  3. 查看工作階段來源/媒介等維度。

  4. 搜尋 chatgpt.com 等相關來源。

  5. 進一步觀察工作階段、參與情況及轉換。

官方文件:GA4 Traffic acquisition report

要注意,這只能追蹤帶有相關來源資訊的部分訪客。使用者可能先看過 AI 回答,之後才自行搜尋品牌或輸入網址,因此 GA4 的 AI 引薦流量不等於 AI 曝光總量。

13.7 Ahrefs Brand Radar:追蹤品牌在 AI 回答中的能見度

官方網址:Ahrefs Brand Radar

這類工具的目標不是檢查網站能不能被爬取,而是觀察品牌在 AI 搜尋回答中出現的情況。

依照 Ahrefs 公開的產品說明,Brand Radar 提供 AI 品牌曝光探索、指定問題追蹤,以及品牌提及與引用相關分析。

適合用來研究:

  • 品牌在哪些主題中被提及。

  • 哪些頁面或網域經常成為引用來源。

  • 競爭品牌在相關問題中的曝光情況。

  • 哪些問題值得補充技術文章或案例。

這類產品的資料通常來自特定提示詞、搜尋資料集或平台觀測機制,因此結果不一定代表全部使用者的實際體驗。

13.8 Semrush AI Visibility:觀察品牌與競爭對手

官方網址:Semrush AI Visibility

Semrush 提供 AI 能見度相關工具,可用於觀察品牌提及、競爭對手與特定問題的 AI 回答表現。

比較適合需要管理多個品牌、網站或競爭對手的團隊。

導入前應先確認:

  • 支援哪些 AI 平台。

  • 是否支援繁體中文與目標市場。

  • 指標的計算方式。

  • 可追蹤的問題數量與更新頻率。

  • 是否能匯出原始回答及引用來源。

不要只看一個總分就決定內容策略。對工程團隊來說,能追溯到具體問題、回答與來源的報表,通常比缺乏細節的單一分數更有用。

13.9 ChatGPT Search 與 Gemini:直接測試品牌辨識

第三方監測工具可以提高測試效率,但仍建議直接使用目標 AI 產品進行人工驗證。

先準備一組固定問題,例如:

  1. 「請介紹這家公司提供的技術服務,並附上來源。」

  2. 「有哪些公開專案展示 Laravel 與企業系統整合能力?」

  3. 「請分析這個 GitHub 專案的架構、技術選型與限制。」

  4. 「有哪些品質管理系統具備供應商批號與產品序號追溯功能?」

  5. 「比較這幾個公開專案的技術架構,並列出支持比較結果的來源。」

每次測試都記錄:

  • 測試日期與平台。

  • 完整問題。

  • 是否提及品牌。

  • 是否引用自家網站或 GitHub。

  • 引用內容是否正確。

  • 是否將原型誤認為正式產品。

  • 是否存在錯誤或無法驗證的主張。

若要比較模型能力,應盡量使用相同的問題與相近的搜尋條件。測試時也要區分有使用網路搜尋的回答與沒有搜尋的回答。

這項測試可以協助發現資訊缺口,但不能保證某個答案會代表所有使用者的搜尋體驗。


十四、把工具整合成可重複執行的工作流程

工具的價值不在於安裝得越多越好,而在於每個工具都能回答一個具體問題。

建議採用以下流程:

步驟使用工具交付成果
1. 技術盤點Screaming Frog、curl網站技術問題清單
2. 索引確認Google Search Console、Bing Webmaster Tools重要頁面的索引狀態
3. 結構化資料Rich Results Test、Schema Markup Validator結構化資料驗證結果
4. 品牌資料盤點官網、GitHub、LinkedIn品牌與專案資訊對照表
5. AI 回答測試ChatGPT Search、Gemini固定問題集與回答紀錄
6. 曝光監測Ahrefs Brand Radar、Semrush AI Visibility品牌提及與引用趨勢
7. 成效分析Google Analytics 4、Search Console搜尋流量、AI 引薦與轉換資料

實務上不必一次導入全部工具。

剛開始可以先使用 Search Console、Bing Webmaster Tools、結構化資料驗證工具、GA4 與人工測試。當網站規模擴大,或需要長期追蹤多個競爭品牌時,再考慮付費的爬蟲分析與 AI 能見度平台。

最後要記住:工具只能提供觀測資料,不能代替工程判斷。

如果品牌沒有出現在某次 AI 回答中,應先確認網站是否可被取得、內容是否相關、公開身分是否清楚,以及測試問題是否合理,而不是直接假設需要購買另一套工具。

AI SEO 的技術價值,最終仍然來自能否找到問題、提出合理的修正方案,並用可重複的方式驗證結果。

延伸閱讀

  1. Google Search Central:AI features and your website

  2. Google Search Central:JavaScript SEO basics

  3. Google Search Central:Introduction to structured data

  4. OpenAI:Overview of OpenAI Crawlers

  5. OpenAI:Publishers and Developers FAQ

  6. Schema.org:Organization

  7. Schema.org:Person

  8. Schema.org:SoftwareSourceCode

從傳統資安掃描到 AI Agent 審計:GitHub 專案的安全檢查工具與實務

從 DevSecOps 到 AI Agent Security Review:重新思考 GitHub 專案的資安掃描

一、資安掃描的下一步,不只是找到更多漏洞

在現代軟體開發流程中,資安檢查已經逐漸融入 CI/CD Pipeline。

開發者提交程式碼後,系統可以自動執行 SAST、Secret Scanning、Dependency Scanning 與 Container Scanning,在程式碼合併或部署之前,找出潛在的安全風險。

這些工具解決了許多傳統人工審查難以持續執行的問題。

然而,自動化掃描結果仍然需要判讀。

工具可能找到一段可疑的程式碼,但它是否真的構成漏洞?攻擊者是否能滿足利用條件?系統其他位置是否已經存在防護機制?修補之後,又是否會破壞原有的業務邏輯?

這些問題往往需要結合程式碼、執行流程、權限設計與系統架構才能回答。

因此,我認為值得關注的發展方向,是從傳統的自動化資安掃描,進一步走向 AI Agent Security Review。

Cloudflare 開源的 Security Audit Skill,提供了一個值得研究的案例:它不只是要求 AI 尋找漏洞,而是將架構分析、漏洞搜尋、對抗式驗證、結構化輸出與獨立檢查納入同一套審計流程。

這背後真正值得探討的問題是:

當 AI 能夠協助尋找漏洞時,我們要如何確認它找到的問題確實成立?

二、傳統 DevSecOps:不同工具負責不同的安全風險

DevSecOps 的核心不是把所有資安工具塞進 Pipeline,而是將安全檢查整合到軟體開發生命週期,讓問題能夠及早被發現、追蹤與修復。

常見的 GitHub 專案安全檢查,可以分成以下幾個類別。

1. SAST:靜態應用程式安全測試

代表工具:CodeQL、Semgrep。

SAST 在不需要實際執行完整應用程式的情況下,分析原始碼中的潛在安全問題。

CodeQL 可以利用程式碼資料模型與查詢規則分析資料流,尋找符合特定模式的漏洞。Semgrep 則適合使用既有或自訂規則,檢查不安全的程式碼模式與團隊規範。

這類工具能協助發現 SQL Injection、不安全的輸入處理,以及其他受分析規則涵蓋的漏洞。

但靜態分析的結果取決於語言支援、分析能力、規則品質與程式碼上下文。沒有掃描結果,不代表沒有漏洞。

參考:CodeQL、Semgrep

2. Secret Scanning:機密資訊檢查

代表工具:Gitleaks。

開發者可能不小心將 API Key、資料庫密碼、Token 或私鑰提交到 Git Repository。

Gitleaks 可以掃描儲存庫內容,尋找疑似機密資訊,協助團隊在問題進入正式環境之前發現風險。

需要注意的是,從最新版本刪除機密資訊,不代表 Git 歷史紀錄中的內容已經消失。若憑證曾經外洩,通常還需要撤銷或輪替,並檢查相關存取紀錄。

參考:Gitleaks

3. Dependency Scanning:第三方依賴套件檢查

代表工具:Dependabot、Trivy。

現代應用程式大量依賴第三方套件。即使自行撰寫的程式碼沒有明顯問題,依賴套件仍可能存在已知漏洞。

Dependabot 可以追蹤支援的依賴套件與安全公告,並依照設定提出版本更新。Trivy 則可以掃描語言套件、作業系統套件及其他支援的目標,找出已知漏洞。

不過,發現有漏洞的依賴,不代表它在目前系統中一定能被利用。仍需考慮受影響版本、實際使用方式、攻擊可達性與修補相容性。

參考:Dependabot、Trivy

4. Container Scanning:容器與部署設定檢查

代表工具:Trivy。

對採用 Docker 的專案而言,安全問題不只存在於應用程式原始碼,也可能來自基底映像、作業系統套件、容器設定與部署配置。

Trivy 可以針對支援的容器映像與設定檔進行檢查,協助團隊在部署之前發現風險。

這類掃描能補足純粹檢查應用程式程式碼的不足,但仍不能取代正式環境的權限管理、網路隔離與執行時期防護。

傳統工具的共同限制

這些工具各有專長,卻不能單獨代表完整的資安審計。

它們通常能回答:

  • 哪些程式碼符合已知的不安全模式?

  • 哪些依賴套件存在已知漏洞?

  • 哪些提交可能包含機密資訊?

  • 哪些容器或部署設定存在風險?

但對於跨模組的權限邏輯、業務流程中的安全假設,以及一個候選漏洞是否真的可以被利用,仍可能需要更深入的分析。

這正是 AI Agent Security Review 可以嘗試補足的部分。

三、為什麼掃描工具可能發現不了真正的業務邏輯漏洞?

以企業系統常見的多租戶 API 為例。

假設系統提供以下端點:

GET /supplier/123/materials

登入使用者可以查看供應商 123 的物料資料。當使用者將網址中的 ID 改成 456:

GET /supplier/456/materials

如果後端只檢查使用者是否已登入,卻沒有確認該使用者是否有權限存取供應商 456 的資料,就可能造成跨租戶資料外洩。

這類漏洞稱為 BOLA(Broken Object Level Authorization,物件層級授權失效)。

OWASP API Security Top 10 2023 將 BOLA 列為 API1:2023,並指出,API 在根據使用者提供的物件識別碼存取資料時,必須正確執行物件層級的授權檢查。

參考:OWASP API1:2023 — Broken Object Level Authorization

這個案例說明了為什麼安全檢查不能只看某一行程式碼。

假設某個 Controller 沒有直接檢查供應商歸屬權限,不能因此立即認定存在漏洞。權限檢查可能已經在 Middleware、共用依賴或資料存取層執行。

反過來說,即使程式碼沒有 SQL Injection,也不代表 API 的存取控制是安全的。

真正需要追蹤的是完整的請求路徑:

  1. 使用者如何通過身分驗證?

  2. API 如何取得請求中的物件 ID?

  3. 系統在哪個位置判斷使用者的存取權限?

  4. 資料查詢是否受到租戶或所有權條件限制?

  5. 未授權的請求是否真的能讀取或修改其他人的資料?

這種需要理解多個模組與業務規則的問題,正是單純依賴掃描規則可能不足的地方。

四、Cloudflare Security Audit Skill:將安全審計流程化

專案網址:cloudflare/security-audit-skill

Cloudflare Security Audit Skill 是一套用於 Coding Agent 的安全審計工作流程,也是 Cloudflare 公開漏洞發現系統的起點版本。

它的價值不在於取代所有既有掃描器,而在於把 AI Agent 的安全審計拆成明確的階段,並要求候選漏洞經過驗證與獨立檢查。

六個主要階段

1. Reconnaissance:架構分析

先理解程式庫的架構、信任邊界、輸入來源與主要攻擊面,建立後續審計的範圍與紀錄。

2. Coverage-led Hunting:依涵蓋範圍搜尋漏洞

將審計範圍拆成不同工作單位,交由不同的 Hunter Agent 檢查。除了搜尋漏洞,也要追蹤已檢查的範圍,並找出可能被遺漏的部分。

3. Candidate Validation:候選漏洞驗證

將候選漏洞交給新的 Verifier Agent,要求它嘗試推翻原本的判斷。

驗證者需要檢查程式碼路徑、必要條件、防護機制與實際影響,而不是直接接受發現者的結論。

4. Structured Output:結構化結果

將結果整理到 findings.json,並使用不同狀態區分已確認、待驗證與已被推翻的問題。

這讓後續流程可以根據明確的資料結構處理結果,而不是只依賴一份自然語言報告。

5. Independent Record Verification:獨立檢查報告證據

由新的 Agent 重新核對結構化紀錄中的程式碼位置與事實陳述,確認最終報告是否仍有足夠的原始碼證據支持。

6. Target-neutral Reporting:產生審計報告

依照經過驗證的紀錄,產生人類可閱讀的報告、詳細發現紀錄,以及尚待驗證的問題清單。

以上階段與輸出設計,可以直接參考官方專案的 README。

五、真正值得研究的設計:Verification Chain

如果只把 Cloudflare Security Audit Skill 理解成「用 AI 找漏洞」,就容易忽略它更重要的工程設計。

我認為它最值得研究的是 Verification Chain(驗證鏈):讓一個安全發現從提出、驗證到正式寫入報告,每個階段都必須留下可追蹤的依據。

概念上可以表示為:

程式碼與架構分析
        |
        v
Hunter Agent
提出候選漏洞與證據
        |
        v
Verifier Agent
嘗試推翻候選漏洞
        |
        v
結構化 Findings
記錄狀態與證據
        |
        v
Independent Verification
重新核對來源與結論
        |
        v
安全審計報告
        |
        v
人工審查、修補與回歸測試

這是概念上的責任流程,不代表所有實作都只能依照單一線性順序執行。

為什麼要讓不同 Agent 負責不同工作?

假設 Hunter 發現某個 API 可能存在越權存取。

如果同一個 Agent 直接替自己的發現背書,就可能沿用原先的假設,忽略其他模組已經存在的防護。

Verifier 的任務應該不同:它不是幫忙把原本的說法寫得更完整,而是主動尋找反證。

例如:

  • 是否有 Middleware 已完成授權?

  • 查詢是否已限制在目前使用者所屬的租戶?

  • 攻擊者是否真的能控制目標物件的識別碼?

  • 請求成功後,是否確實能讀取或修改未授權的資料?

如果證據不足,就應該保留待驗證狀態,而不是直接定義為已確認漏洞。

這種責任分離與一般程式碼審查的概念相似:開發者提交修改,Reviewer 挑戰設計與實作,QA 驗證行為,最後才進入交付流程。

但要注意,使用不同 Agent 並不會自動消除錯誤。不同 Agent 可能共享相似的模型弱點或錯誤假設。因此,對高風險問題仍應搭配可重現的測試、人工審查與安全的執行環境。

真正的重點不是讓 AI 多回答一次,而是讓驗證階段有明確的反證責任。

六、如何將傳統掃描與 AI 審計整合?

傳統工具與 AI Agent 並不是二選一,而是適合處理不同層次的問題。

以下是一個概念性的 GitHub 安全檢查流程:

GitHub Push / Pull Request
            |
            v
   ┌─────────────────────┐
   │ CodeQL / Semgrep    │
   │ 靜態程式碼分析      │
   └─────────────────────┘
            |
            v
   ┌─────────────────────┐
   │ Gitleaks            │
   │ 機密資訊掃描        │
   └─────────────────────┘
            |
            v
   ┌─────────────────────┐
   │ Trivy / Dependabot  │
   │ 依賴與容器風險      │
   └─────────────────────┘
            |
            v
   ┌─────────────────────┐
   │ Security Audit Skill│
   │ 深入分析與獨立驗證  │
   └─────────────────────┘
            |
            v
       Human Review
            |
            v
     修補與回歸測試
            |
            v
         Deploy

這張圖展示的是一種可能的整合方式,而不是 Cloudflare Skill 的內建工具清單,也不代表所有專案都應將完整 AI 審計放在每一次 Pull Request 中。

實際導入時,可以依照成本與風險決定執行頻率:

  • 每次 Pull Request: 執行速度較快、適合高頻率執行的靜態分析與機密掃描。

  • 定期或重大變更時: 執行較深入的 AI Agent 安全審計。

  • 修補完成後: 執行相關安全測試、原有功能測試與必要的回歸檢查。

  • 正式部署前: 由負責人確認高風險問題的處理狀態與交付條件。

另外,安全審計涉及不受信任的程式碼時,必須限制執行環境與權限。不能為了驗證漏洞,就讓 Agent 在沒有適當隔離的環境中執行任意程式碼,或直接探測未經授權的正式系統。

七、AI Agent Security Review 的限制

即使採用多 Agent 驗證流程,仍然有幾個問題需要正視。

第一,驗證不等於形式上的安全證明。

Agent 找到證據、重現問題,能提高判斷的可信度,但無法證明整個系統不存在其他漏洞。

第二,覆蓋率仍然重要。

如果某個模組根本沒有被檢查,再好的驗證流程也無法確認該模組是否安全。架構分析與涵蓋範圍紀錄因此很重要。

第三,AI 審計有額外成本。

多階段分析、平行 Agent 與獨立驗證會增加 Token、工具呼叫與執行時間。是否值得投入,應取決於系統風險與審計目標。

第四,發現漏洞不等於修補完成。

修補可能引入新的錯誤,尤其是權限、租戶隔離與資料完整性等涉及業務不變條件的功能。

因此,AI 安全審計的成果應該進入正常的工程流程,包含問題追蹤、人工審核、修補、測試與重新驗證,而不是以一份 AI 產生的報告作為安全保證。

八、結語:Security as Process,而不只是 Security as Tool

從 CodeQL、Semgrep、Gitleaks、Trivy 到 Dependabot,傳統資安工具已經能在程式碼、依賴套件、機密資訊與部署設定等層面提供自動化檢查。

Cloudflare Security Audit Skill 則展示了另一種值得研究的方向:讓 AI Agent 參與更完整的安全審計,並將候選漏洞的驗證、證據紀錄與獨立檢查納入工作流程。

對 AI 輔助開發而言,這個方向尤其值得關注。

當 AI Agent 越來越常參與程式碼撰寫,工程團隊不能只關心產生程式碼的速度,也必須建立相應的驗證機制,確認程式碼是否符合安全要求、修改是否破壞既有行為,以及審計結論是否有足夠證據支持。

未來資安工具的競爭,可能不再只是誰能找到更多漏洞,而是誰能建立更可信的 Verification Chain,讓漏洞發現、驗證、修復與追蹤形成可持續運作的工程流程。

這也是從傳統 DevSecOps 走向 AI Agent Security Review 時,最值得深入思考的工程問題。

安全不應只是工具執行完畢後的一份掃描報告,而應該是整個軟體交付流程中,能持續驗證、追蹤與改善的工程能力。

從 API 呼叫到工程閉環:以 Laravel 12 打造可追蹤、可恢復的 AI Agent 迴圈工程

本文以 Laravel 12 專案 RentFlow 為實作背景,探討如何將 AI 從單次 API 呼叫,設計成具備狀態管理、測試驗證、錯誤處理與終止條件的可控修復迴圈。

一、前言:真正困難的不是讓 AI 寫出程式碼

當我們開始在軟體開發流程中導入大型語言模型(LLM),最容易想到的應用,就是把錯誤訊息交給 AI,請它分析根因,再產生一份修復建議。

這樣的流程很容易實現。

例如,當 PHPUnit 測試失敗時,將錯誤輸出傳送給 Gemini,要求模型找出問題,並回傳可能的修正方式。只要完成 API 串接,就能得到一個看起來具備程式碼分析能力的工具。

但這還不是完整的 AI Agent 工程。

因為 AI 回答了,不代表問題已經解決;AI 提出了 Patch,不代表 Patch 能夠套用;Patch 成功套用,也不代表系統行為正確。

真正的工程問題在於:

  • 如何讓 Agent 知道自己目前正在執行哪一個任務?

  • 如何確認測試真的執行過,而不是只根據文字推測?

  • 如何判斷應該繼續、暫停、重試,還是終止?

  • 如何避免 AI 無限制地重複呼叫 API?

  • 如何保存每一輪的執行結果,讓任務可以在不同命令之間恢復?

  • 如何將 AI 產生的修復建議,與實際套用的程式碼變更區分開來?

  • 當 API 配額不足、測試程序失敗或修復無效時,系統應該如何處理?

這些問題並不能單靠一個 Prompt 解決。

因此,在我的 Laravel 12 專案 RentFlow 中,我將 AI Agent 的設計重點放在 Loop Engineering(迴圈工程):把測試執行、結果分析、修復提案、狀態管理與後續驗證,組合成一個具有明確控制條件的工程流程。

本文會以專案中的兩種 Agent 工作方式為例:

  1. 原有 Queue AI Agent:支援純分析與測試驅動的自動修復流程,並可透過設定決定是否自動套用修復。

  2. Autonomous AI Code Repair Agent Demo:在既有 Repository 中新增的隔離展示案例,採用離線模擬、可選擇的 Gemini 分析,以及人工審核修復提案的流程。

兩者共享迴圈工程的核心概念,但用途與執行方式不同,不應混為一談。


二、什麼是 Loop Engineering?

我將 Loop Engineering 定義為:

將一個需要反覆嘗試才能完成的工程任務,拆解成有狀態、有邊界、有觀測資料,而且每一輪結果都能決定下一步行動的執行閉環。

傳統的一次性 AI 呼叫通常是:

輸入問題
   ↓
呼叫 LLM
   ↓
取得回答
   ↓
結束

這種模式適合解釋錯誤訊息、提供程式碼建議,或回答一般技術問題。

但當任務需要實際執行測試、依據測試結果修正程式碼,再重新執行測試時,單次呼叫就不夠了。

我們需要的是:

建立任務
   ↓
執行測試
   ↓
取得真實執行結果
   ↓
判斷是否成功
   ├── 成功 → 結束任務
   │
   └── 失敗
         ↓
      分析失敗原因
         ↓
      產生修復提案
         ↓
      驗證提案與執行條件
         ↓
      套用修復或等待人工審核
         ↓
      再次執行測試
         ↓
      判斷是否繼續

這個流程的核心,不是「重複呼叫 AI」,而是讓每一輪都建立在上一輪的實際結果之上。

如果沒有測試結果,Agent 就無法可靠地判斷問題是否解決;如果沒有狀態管理,Agent 就無法知道自己應該從哪裡繼續;如果沒有停止條件,Agent 就可能持續消耗資源,卻無法產生有意義的結果。

因此,一個可靠的 Agent Loop 至少需要四個基本元素:

  1. Execution:執行——實際執行測試或其他工程操作。

  2. Observation:觀測——保存退出碼、輸出、錯誤資訊與執行狀態。

  3. Decision:決策——根據觀測結果決定下一步,而不是只根據 AI 的主觀判斷。

  4. Control:控制——限制迴圈次數、管理失敗狀態、處理配額與控制任務終止。

這四個元素共同構成迴圈工程的基本骨架。

三、為什麼選擇 Laravel 12 作為實作環境?

RentFlow 本身是一個以 Laravel 12 建置的 Multi-Tenant Rental SaaS Platform,包含租戶隔離、車輛管理、預約流程、定價規則、JWT 會員 API,以及 Filament 後台管理功能。

這是一個適合展示工程型 AI Agent 的環境,因為它不只有模型呼叫,還有既有的應用程式結構、資料庫、Queue、測試套件與明確的商業規則。

Agent 必須在這些既有條件中工作,而不是建立一個獨立的範例專案,再假裝問題已經解決。

目前的實作設計涉及以下元件:

元件在迴圈工程中的責任
Laravel Artisan Command接收任務、設定執行參數、建立或恢復 Loop
Queue Job執行任務處理流程,將長時間工作與命令入口分離
Agent Loop 資料模型保存任務狀態、目前輪次與執行設定
PHPUnit提供可重現的測試結果
Symfony Process在獨立子程序中執行指定測試
Gemini API在真實模式下分析測試失敗資訊
SQLite Demo Database保存 Demo 任務及逐輪執行歷史
Patch 驗證流程檢查修復提案是否符合允許的修改範圍與替換條件

需要強調的是,這些元件各自負責不同的事情。

Gemini 負責分析,不負責證明分析正確;PHPUnit 負責執行測試,不負責決定整個任務的生命週期;資料庫負責保存狀態,不代表狀態轉移一定正確。

Agent 的可靠性,來自這些元件之間清楚的責任分工。

四、迴圈工程的第一個核心:任務必須有明確狀態

如果一個 Agent 只有一段不斷執行的 while 迴圈,那麼它很難處理中斷、恢復、配額不足與多輪測試等情境。

因此,我將任務生命週期視為一個需要明確管理的狀態機。

以 Demo 的工作流程為例,狀態可能是:

pending
   ↓
processing
   ↓
pending
   │
   │ 等待人工檢視、修改 Fixture 或恢復任務
   ↓
processing
   ↓
completed

如果測試持續失敗,也可能進入:

processing
   ↓
failed

如果真實 Gemini 分析遇到配額不足或 HTTP 429,則可能進入:

processing
   ↓
waiting_quota

而在原有 Agent 的工作流程中,任務還可能依據測試結果、修復套用結果與重試條件,進入不同的後續狀態。

這些狀態不能只當成資料表中的文字欄位。

每個狀態都應該代表一組清楚的語義與允許操作。

例如:

  • pending:任務等待執行或等待下一輪處理。

  • processing:任務目前正在執行。

  • waiting_quota:任務因配額限制而暫停,等待後續處理。

  • completed:任務已依照對應模式的完成條件結束。

  • failed:任務已無法依照目前流程繼續完成。

這裡最容易犯的錯誤,是把 completed 理解成「程式碼已經修好」。

實際上,狀態的意義必須與任務模式一起判讀。

例如,純分析任務可能在 Gemini 成功回應後結束。這只能證明分析流程完成,不代表程式碼已被修改,更不代表 PHPUnit 已經通過。

同樣地,Demo 中的離線分析也可能產生修復提案,但這些內容是固定展示資料,不是模型真正推論的結果。

因此,狀態設計必須回答的問題是:

這個任務完成了哪一件事,而不是只問它是否完成。

五、第二個核心:每一輪都必須有可驗證的觀測結果

AI Agent 很容易產生一種假象:只要回傳了一段看似合理的分析文字,就好像已經完成了工程工作。

但在真正的程式碼修復流程中,文字不是最終證據。

最重要的證據之一,是測試程序的實際退出碼。

以 PHPUnit 為例:

  • 退出碼為 0:代表該次測試程序成功結束。

  • 非 0:代表該次程序沒有以成功狀態結束,必須進一步檢查輸出及失敗原因。

不能只看終端機裡是否出現某個關鍵字,也不能只看 AI 是否說「問題已修復」。

Demo 使用 Symfony Process 執行指定的 PHPUnit Fixture,並將測試程序的輸出與退出碼保存下來。

逐輪歷史則可保存:

  • 測試退出碼。

  • 測試完整輸出。

  • 分析內容。

  • 分析來源,例如 offline simulation 或真實模型分析。

  • Token 使用量。

  • 本輪狀態與執行結果。

這讓每一輪不再只是一次不可追蹤的函式呼叫,而是一筆可以回頭檢視的工程紀錄。

5.1 為什麼不能只保存 AI 分析?

假設 Agent 回傳:

Root cause:
The discount calculation is missing.

Suggested fix:
Apply the discount rate before returning the total.

這段文字看起來合理,但我們仍然不知道:

  1. 測試是否真的執行過?

  2. 測試是否確實因折扣計算失敗?

  3. 修復提案是否符合目前的程式碼?

  4. 修復是否真的套用?

  5. 套用後的測試是否通過?

因此,分析結果必須與實際執行結果分開保存。

AI 的輸出是候選解釋,測試的輸出是工程觀測;兩者不能互相取代。

六、第三個核心:用有限迴圈避免無止境的重試

AI Agent 的迴圈如果沒有上限,就可能在相同錯誤中不斷重複。

例如:

  1. 測試失敗。

  2. Gemini 產生修復提案。

  3. Patch 無法套用,或套用後測試仍失敗。

  4. Agent 再次分析相同問題。

  5. 模型又產生另一個無法有效解決問題的提案。

  6. 流程不斷重複。

這不只是 API 費用問題,也可能造成無效的 Queue 工作、日誌膨脹,以及難以追查的任務狀態。

因此,迴圈必須具有明確的預算。

在原有 Agent 中,預設最大迴圈次數為 3 次,並可透過 --max-loops 調整。

Demo 同樣提供迴圈上限設定,但採用不同的執行方式:每次命令執行一輪,開發者檢視並修改 Fixture 後,再使用 --resume=ID 恢復任務。

這兩種方式展示了不同的控制策略。

自動迴圈與人工確認迴圈

比較項目原有 AgentDemo Agent
核心用途測試驅動的分析與修復展示受控的修復提案流程
輪次推進依既有 Job 流程與終止條件決定每次命令執行一輪
修復套用可依設定選擇是否自動套用不自動套用
人工介入依任務設定與修復流程決定每輪由人員檢視並決定是否修改
停止條件測試成功、迴圈上限或其他終止條件測試成功、迴圈上限或其他失敗條件

有限迴圈的目的,不是保證 Agent 一定能修好問題。

它的目的,是保證 Agent 不會因為沒有解決問題,就無限制地繼續執行。

可控的失敗,往往比不可預測的持續重試更有工程價值。

七、用一個可重現的 PHPUnit 案例展示整個閉環

為了讓迴圈工程可以被實際觀察,而不是只停留在架構圖,我在 Demo 中設計了一個刻意失敗的折扣計算案例。

假設一筆租車訂單的小計為 100,折扣率為 10%。

預期金額為:

[
100 \times (1 - 0.1) = 90
]

但刻意錯誤的實作直接回傳原始小計:

$total = $subtotal; // Intentional defect

測試預期為 90,實際卻得到 100,因此 PHPUnit 會回報失敗。

這個案例的優點是簡單、可重現,而且失敗原因容易理解。

它不需要連接正式租車資料庫,也不需要準備大量種子資料,就能展示 Agent 如何取得失敗結果。

7.1 第一輪:建立任務並執行測試

執行:

php artisan ai:demo

在預設離線模式下,Demo 會建立或執行一個 Agent Loop,並使用 Symfony Process 啟動指定的 PHPUnit Fixture。

這一輪的重點不是 AI 分析,而是確認測試真的失敗。

預期可觀察到:

PHPUnit: FAIL (exit 1)
Failed asserting that 100 is identical to 90.

這是測試程序的輸出,不是 AI 自己生成的錯誤敘述。

接下來,Demo 才進入分析階段。

7.2 第二步:產生修復提案

在離線模式中,Demo 使用固定的展示分析。

因此,輸出必須明確標示為模擬分析,而不能把它描述成 Gemini 的真實回應。

例如:

Offline simulated analysis (not Gemini):
Fix status: proposed; not applied.
Human review required.

這個設計可以在不消耗 API 配額、不依賴網路的情況下,展示 Agent 的控制流程。

如果要使用真實模型,則必須明確指定:

php artisan ai:demo --real

真實模式會將測試輸出送給 Gemini 分析,可能消耗 API 配額,也可能受到速率限制、認證失敗或服務端錯誤影響。

7.3 第三步:由人員檢視並修改 Fixture

Demo 不會直接修改檔案。

開發者必須檢視提案,決定是否接受,再手動修改:

$total = (int) ($subtotal * (1 - $discountRate));

這裡刻意保留人工審核。

因為即使 AI 的提案看起來合理,仍然可能存在型別、精度、商業規則或其他邏輯問題。

在真實商業系統中,金額計算還需要依照系統的精度與捨入規則設計。這個案例只用來展示測試驅動的閉環,不代表所有折扣金額都應採用相同的整數轉型方式。

7.4 第四步:恢復同一個任務

修改 Fixture 後,使用第一輪輸出的 Loop ID:

php artisan ai:demo --resume=ID

Demo 會恢復原有任務,並再次執行測試。

當測試通過時,預期輸出為:

PHPUnit: PASS
Final status: completed — Tests passed successfully

這時,整個流程才取得新的測試證據。

但仍要精確描述成果:我們證明的是指定 Fixture 在修改後通過了指定測試,而不是證明整個 RentFlow 專案所有功能都沒有問題。

7.5 第五步:展示迴圈上限

如果不修改 Fixture,而是設定:

php artisan ai:demo --max-loops=1

在符合該 Demo 的迴圈上限處理條件時,任務會以失敗狀態結束,原因為:

Final status: failed | Max loops exceeded

這個案例展示了一項重要的工程能力:

Agent 不一定要成功修復問題,但必須能夠辨識自己已經無法在預算內完成任務,並且正常終止。

八、為什麼 Demo 需要離線模式?

如果每一次展示都必須呼叫 Gemini,會產生幾個問題:

  • 受網路連線影響。

  • 受 API 金鑰與帳號設定影響。

  • 受速率限制與每日配額影響。

  • 模型回應可能隨時間與輸入內容改變。

  • 每次展示的 Token 用量與回應時間不一定一致。

因此,Demo 將離線模擬與真實模型分析分開。

離線模式

php artisan ai:demo

特性:

  • 不發送 Gemini HTTP 請求。

  • 使用固定的展示分析。

  • Token 用量固定為 0。

  • 可以重現預先設計的測試失敗與修復提案流程。

  • 適合展示狀態管理、逐輪紀錄與人工審核。

真實 Gemini 模式

php artisan ai:demo --real

特性:

  • 依照真實 PHPUnit 輸出呼叫 Gemini。

  • Token 用量取決於模型實際回報。

  • 可能發生配額不足、速率限制、認證或請求錯誤。

  • 分析結果具有模型推論的不確定性。

這兩種模式的差異,不只是開發方便與否,而是展示流程的可重現性與真實模型推論之間的責任分離。

離線模式能證明流程在固定情境下如何運作,但不能證明模型具有正確分析能力。

真實模式能觀察模型實際輸出,但也不能單憑一次成功回應,證明整個 Agent 的修復能力。

九、第四個核心:隔離執行環境,避免測試污染應用程式

AI Agent 的危險不只來自錯誤的修復提案,也可能來自測試程序本身。

例如,當 Agent 執行 PHPUnit 時,如果測試程序誤用應用程式的預設資料庫,可能造成不必要的資料變更。

因此,Demo 採用兩個用途不同的 SQLite 環境。

9.1 Demo 狀態資料庫

檔案位置:

database/agent-demo.sqlite

用途:

  • 保存 Agent Loop 任務狀態。

  • 保存逐輪測試與分析歷史。

  • 支援跨命令恢復任務。

Demo 使用既有的 agent_loops 表保存任務狀態,並使用 agent_loop_demo_runs 保存每輪執行紀錄。

9.2 PHPUnit 子程序資料庫

測試子程序使用:

DB_CONNECTION=sqlite
DB_DATABASE=:memory:

用途是隔離該次測試的資料庫環境。

Demo 透過 Symfony Process 啟動獨立測試程序,並在啟動前檢查有效的 Laravel 資料庫設定;若不是指定的 SQLite 記憶體資料庫,就拒絕建立 PHPUnit 程序。

這兩個環境不能混為一談。

前者負責保存任務狀態,後者負責隔離測試執行。

這種設計也提醒我們:把測試放進子程序,不會自動讓測試安全;仍然需要明確控制子程序的環境變數、資料庫設定與執行邊界。

同時,這項隔離措施不能被解讀為對所有主機故障、外部副作用或未來程式碼變更的絕對保證。環境檢查只能保護它實際涵蓋的範圍。

十、第五個核心:修復提案不等於已套用的 Patch

在 AI 程式碼修復系統中,有一個非常容易混淆的概念:

AI 產生修復方案,不代表系統已經修改程式碼。

在 RentFlow 中,原有 Agent 與 Demo 對此採用不同策略。

原有 Agent 可以依照設定選擇是否自動套用修復,例如使用 --auto-apply-fixes。在自動套用模式下,仍需要符合允許的檔案範圍、精確搜尋片段與其他修復驗證條件。

Demo 則不自動套用修復。開發者需要檢視提案,手動修改 Fixture,再恢復任務執行測試。

這兩種策略分別適合不同的風險情境。

人工審核模式

優點:

  • 可以在修改前檢視 Patch。

  • 可以拒絕不符合商業規則的建議。

  • 可以降低自動修改造成意外變更的風險。

  • 適合展示、教學與尚未成熟的修復流程。

代價是每輪都需要人工介入,無法完全自動化。

自動套用模式

優點是能減少人工操作,並讓 Agent 在符合條件時自動進入下一輪測試。

但自動套用不應只依賴 AI 的自我判斷。

至少需要考慮:

  1. 修復檔案是否在允許清單中。

  2. 搜尋片段是否與目前檔案完全相符。

  3. Patch 是否只修改允許的內容。

  4. 套用後是否確實重新執行測試。

  5. 測試失敗時是否能停止或回報。

  6. 是否保存實際修改的檔案與修復歷史。

在工程上,我更重視這個順序:

AI 提案
   ↓
檢查提案
   ↓
確認允許修改的範圍
   ↓
套用 Patch
   ↓
重新執行測試
   ↓
依據測試結果判斷

真正的成功條件應該來自驗證結果,而不是模型宣告「修復完成」。

十一、第六個核心:配額、重試與終止必須是流程的一部分

當 Agent 開始使用真實模型,外部 API 就成為整個迴圈的一個不確定因素。

即使 PHPUnit 已經產生正確的失敗輸出,Gemini 仍可能因為配額不足或速率限制而無法完成分析。

如果系統沒有清楚的錯誤分類,就可能把 API 問題誤判成程式碼問題,或者在同一個錯誤上反覆重試。

RentFlow 的設計將配額相關失敗與一般失敗區分處理。

例如,Demo 在真實模式下遇到包含 quota 原因或 HTTP 429 的分析失敗時,可以將任務標記為 waiting_quota,並停止當次命令的後續流程。

這比無條件重試更容易控制。

11.1 為什麼不能把所有錯誤都當成同一種錯誤?

可以將錯誤概念上區分為:

錯誤類型需要關注的問題
PHPUnit 失敗程式行為是否違反測試預期?
測試程序啟動失敗路徑、執行環境或 Process 設定是否有問題?
Patch 無法套用搜尋片段是否過時,或修改範圍是否不合法?
Gemini 配額不足是否應暫停等待,而不是立即繼續呼叫?
HTTP 429是否觸發速率限制?
認證或請求錯誤API Key、模型設定或請求格式是否正確?
迴圈達上限是否應結束任務並保存原因?

這些錯誤需要不同的處理策略。

尤其要注意,waiting_quota 不等於任務已經修復,也不等於系統會自動恢復。

它代表任務因為特定限制而暫停。何時恢復、由誰恢復,以及恢復後從哪個階段繼續,都必須由明確的控制流程決定。

同樣地,最大迴圈次數與 Queue 重試次數也不是同一件事。

  • 迴圈上限限制一個工程任務可以進行多少輪。

  • Queue 重試機制處理工作執行失敗後是否再次交由 Queue 執行。

如果把兩者混為一談,即使每個設定值看起來合理,整個系統仍可能產生超出預期的 API 呼叫或重複工作。

十二、持久化與恢復:Agent 不應只存在於一次命令中

一般腳本的生命週期通常是:

啟動 → 執行 → 結束

但工程型 Agent 可能需要跨越多次命令執行。

例如,Demo 的第一輪產生修復提案後,開發者需要檢視程式碼、修改 Fixture,才能進行下一輪。

如果所有狀態只保存在記憶體中,第一次命令結束後,任務進度就很難被可靠地延續。

因此,Demo 將任務狀態與逐輪歷史保存到獨立 SQLite 資料庫,並提供:

php artisan ai:demo --resume=ID

這讓任務恢復不再依賴原本的命令程序仍然存在。

但要注意,真正可靠的恢復不只是把 status 改回 pending。

恢復流程還應該能夠辨識:

  • 任務目前進行到哪一輪。

  • 原本設定的迴圈上限。

  • 上一輪測試是否已經執行。

  • 上一輪分析是否成功。

  • 任務是否處於等待配額或人工審核的狀態。

  • 恢復後應該重跑哪個階段。

Demo 在恢復任務時會沿用資料庫中保存的迴圈上限。這能避免使用者在恢復時無意間改變原有任務的預算。

這也說明了為什麼任務狀態、輪次與歷史紀錄應該被視為整體設計,而不是各自獨立的欄位。

十三、可觀測性:如何判斷 Agent 到底做了什麼?

對工程型 Agent 而言,可觀測性不是附加功能,而是判斷它是否可靠的必要條件。

如果一個任務最後只留下:

status = completed

我們仍然無法回答:

  • 測試到底有沒有執行?

  • 執行了幾輪?

  • 哪一輪產生了修復提案?

  • AI 分析是否成功?

  • Token 使用量是多少?

  • 有哪些檔案被修改?

  • 最後為什麼結束?

因此,RentFlow 的 Agent 工作流程會使用任務欄位與逐輪紀錄保存相關資訊。

原有 Agent 的紀錄可能涉及:

  • current_loop

  • max_loops

  • test_path

  • last_test_exit_code

  • last_test_output

  • ai_analysis

  • modified_files

  • patch_history

  • failure_reason

  • termination_reason

Demo 則另外保存每輪執行輸出、分析來源、狀態與 Token 數。

這些資訊讓我們可以從結果反向追查整個流程。

例如,若 test_path 為 NULL,就必須注意這可能是純分析任務,而不是測試驅動的修復任務。

此時即使 ai_analysis 有內容,也不能推論 PHPUnit 已經執行。

同樣地,Token 使用量為 0 可能代表離線模擬,也可能是提供者未回報使用量中繼資料。必須結合分析來源與執行紀錄判斷,不能只看單一欄位。

這就是可觀測性的價值:讓系統的實際行為能夠被檢查,而不是只能相信 Agent 自己的敘述。

十四、用 CustomerAuth 註冊問題理解真正的工程驗證

除了 Demo 中的折扣案例,RentFlow 的手動驗證指南也使用了更接近真實 API 的情境:會員註冊時,User 已建立,但 JWT 產生失敗。

假設註冊流程依序執行:

驗證請求
   ↓
建立 User
   ↓
產生 JWT
   ↓
回傳註冊結果

如果 JWTAuth::fromUser($user) 拋出 JWTException,Controller 回傳 HTTP 500,但 User 已經寫入資料庫,就可能出現:

  • 使用者收到註冊失敗的回應。

  • 資料庫中卻已經存在該帳號。

  • 使用者再次註冊時,可能遇到 Email 重複問題。

這是一個值得測試的資料一致性風險。

但在工程上,不能只憑這個描述就宣稱缺陷已經被驗證。必須實際讓 JWT 產生流程拋出例外,再檢查資料庫中的結果。

對應的測試應驗證:

  1. 提供有效的註冊資料。

  2. 讓 User 建立成功。

  3. 模擬 JWT 產生時拋出 JWTException。

  4. 確認 API 回傳預期的 HTTP 500。

  5. 確認交易確實回滾,資料庫中不存在該筆新 User。

如果程式碼的修正方向是將 User 建立與 JWT 產生放入同一個 DB::transaction(),就必須確保 JWT 例外能夠離開交易 callback,讓 Laravel 回滾交易。

如果交易只包住 User 建立,卻在交易結束後才產生 JWT,就無法達到這個回滾目的。

這個例子說明了迴圈工程最重要的一點:

Agent 必須根據可重現的測試結果判斷問題,而不是只根據錯誤描述生成一段看起來合理的修補程式碼。

對這種情境而言,真正有價值的不是 AI 是否寫出了 DB::transaction(),而是修正後的程式是否通過了可以重現該例外的測試。

十五、工程型 AI Agent 最容易出現的六種誤判

在設計這類系統時,我認為有幾種情況特別值得注意。

15.1 把分析完成當成修復成功

純分析模式可能完全沒有執行測試。

因此,completed 必須搭配任務模式與終止原因判讀。

15.2 把 Patch 產生當成 Patch 套用

AI 回傳 JSON 中包含 fixes,只代表模型提出了修復建議。

仍然需要確認檔案路徑、搜尋片段、替換內容與允許修改的範圍。

15.3 把 Patch 套用成功當成測試通過

檔案成功修改,只代表變更已經發生。

它可能引入其他錯誤,也可能根本沒有解決原始問題。

15.4 把一次測試通過當成整個專案正確

測試通過只能證明指定測試在指定環境中通過。

如果只執行一個 Fixture,就不能推論整個應用程式的功能都已經正確。

15.5 把 Queue 重試當成 Agent 的下一輪

Queue 重試與工程迴圈具有不同語義。

如果沒有清楚區分工作重試、業務迴圈與模型 API 重試,就可能增加非預期的執行次數。

15.6 把離線模擬當成真正的 AI 推論

固定展示資料有助於測試流程,但不能用來證明 Gemini 的推理品質。

因此,分析來源與 Token 紀錄必須清楚標示。

這些誤判的共同問題,是把不同層次的成功條件混在一起。

真正可靠的 Agent,應該能夠分別回答:

  • 任務是否成功執行?

  • AI 是否成功回應?

  • 修復是否實際套用?

  • 測試是否通過?

  • 任務是否符合終止條件?

只有把這些問題分開,才能避免用一個模糊的「成功」掩蓋實際狀態。

十六、迴圈工程的邊界:它不是無限制的自主程式碼修改器

我並不認為工程型 Agent 的成熟度,應該用它能修改多少檔案、能夠執行多少輪,或能否完全不需要人類參與來衡量。

一個允許 AI 無限制修改程式碼的系統,即使看起來非常自主,也可能因為錯誤的假設、錯誤的 Patch 或錯誤的執行環境而產生更大的風險。

因此,RentFlow 的 Demo 明確保留以下限制:

  • 每次命令只執行一輪。

  • 離線模式不呼叫 Gemini。

  • 真實模型分析需要明確指定 --real。

  • 修復提案由開發者檢視。

  • Fixture 由人員手動修改。

  • 迴圈具有上限。

  • 測試程序使用獨立的 SQLite 記憶體資料庫。

  • 任務狀態與逐輪結果保存於獨立的 Demo 資料庫。

這些限制不是為了讓系統看起來比較保守,而是為了讓整個流程的行為可以被理解、檢查與重現。

未來若要擴展成更完整的自動修復系統,還需要持續處理更多問題,例如:

  • Patch 的語法與語義驗證。

  • 測試覆蓋率與回歸測試策略。

  • 多任務併發時的狀態競爭。

  • Queue 重複投遞與冪等處理。

  • 外部 API 的退避策略。

  • 中斷後的任務恢復一致性。

  • 修改檔案前後的版本控制與差異檢查。

  • 自動修復失敗時的回復策略。

目前的 Demo 不宣稱已經解決所有這些問題,也不宣稱具備通用的自主程式碼修復能力。

它要展示的是:在加入更複雜的能力之前,先建立一個有邊界、有紀錄、有驗證條件的工程閉環。

十七、如何評估一個 Agent Loop 是否值得信任?

如果要評估一個 AI Agent,我不會只問它能不能呼叫 Gemini,或能不能產生一段 PHP 程式碼。

我會先確認以下幾件事。

任務控制

  • 是否有明確的任務狀態?

  • 是否有迴圈上限?

  • 是否有清楚的成功與失敗條件?

  • 是否能在中斷後恢復?

執行驗證

  • 是否真的執行指定測試?

  • 是否保存退出碼與輸出?

  • 是否能區分測試失敗與程序啟動失敗?

  • 修復後是否重新執行測試?

修復安全

  • 是否限制可修改的檔案?

  • 是否驗證搜尋片段與替換內容?

  • 是否能區分提案與已套用的變更?

  • 是否保留實際 Diff 供人工檢視?

資源控制

  • 是否限制迴圈次數?

  • 是否處理 API 配額與速率限制?

  • 是否能避免無意義的重複呼叫?

  • 是否記錄 Token 用量及分析來源?

可觀測性

  • 是否保存每輪歷史?

  • 是否能查出任務為何結束?

  • 是否能辨識純分析、離線模擬與真實測試?

  • 是否能根據資料庫紀錄與實際測試輸出重建執行過程?

這些問題比單純展示一段 AI 回答,更能反映 Agent 的工程成熟度。

十八、結語:把 AI 放進工程閉環,而不是讓工程依賴 AI 的自我宣告

回到最初的問題:如何打造一個能夠持續分析、修復與驗證程式碼的 AI Agent?

答案不只是增加 Prompt、換一個更強的模型,或讓 Agent 多執行幾輪。

真正的核心,是建立一套清楚的控制流程:

Task
  ↓
Execution
  ↓
Observation
  ↓
Decision
  ↓
Controlled Action
  ↓
Verification
  ↓
Next Iteration or Termination

在這個流程中,AI 是重要的分析元件,但不是唯一的判斷依據。

測試結果負責提供工程證據;狀態機負責管理任務生命週期;資料庫負責保存執行歷史;迴圈上限負責控制成本與執行範圍;Patch 驗證負責限制修改行為;人工審核則在需要時提供額外的決策邊界。

RentFlow 的 AI Agent Demo 是我用來探索這套設計的工程案例。

它不追求宣稱 AI 能夠自動修復所有問題,而是把任務狀態、測試執行、分析來源、修復提案、人工確認與再次驗證,組成一個可以觀察的閉環。

對我而言,這才是 Loop Engineering 的重點:

不是讓 AI 無止境地嘗試,而是讓每一次嘗試都有目的、每一個結果都有證據、每一個狀態都有意義,而且每一個迴圈都有明確的停止條件。

當 AI 開始參與真實的軟體工程時,我們需要的不只是更聰明的模型,更需要能夠約束、觀測、驗證與恢復的工程系統。

而這正是我希望透過 Laravel 12 與 RentFlow 展示的方向。


專案與展示

  • 專案:RentFlow — Multi-Tenant Rental SaaS Platform

  • 技術基礎:Laravel 12、PHPUnit、Symfony Process、Laravel Queue、SQLite、Google Gemini API

  • Demo 入口:php artisan ai:demo

  • 真實 Gemini 分析:php artisan ai:demo --real

  • 恢復任務:php artisan ai:demo --resume=ID

  • 迴圈上限展示:php artisan ai:demo --max-loops=1

注意: 上述命令與流程以專案 README 所描述的實作為基礎。實際發布前,仍應確認目前分支中的命令參數、測試結果與狀態轉移實作一致;架構描述本身不代表所有測試情境都已在實際環境通過驗證。

2026年10月20日 星期二

SMTMS 技術分享:從 AI Coding Agent 開發到資料一致性,打造供應商品質與材料追溯系統

 

SMTMS 技術分享:從 AI Coding Agent 開發到資料一致性,打造供應商品質與材料追溯系統

一、為什麼要做 SMTMS?

在製造業的供應商品質管理中,管理供應商、物料與進料檢驗只是基本需求。真正困難的地方,是當物料發生品質異常時,系統能否提供足夠的資料,說明物料從哪裡來、經過哪些檢驗,以及目前處於什麼狀態。

例如,一批物料收到工廠後,會經過收料、內部批次拆分與 IQC(Incoming Quality Control,進料品質檢驗)等流程。如果後續發現品質問題,就必須能夠回頭查明來源,而不是只找到一筆孤立的檢驗紀錄。

因此,我以 SMTMS(Supplier Material Traceability Management System)作為專案,嘗試整合供應商管理、物料管理、進料作業、品質檢驗、異常處理與追溯相關功能。

這個專案的重點不是單純完成 CRUD,而是思考如何讓系統中的資料具有可追溯性、業務規則具有一致性,以及權限控制不會因為 AI 生成程式碼而被忽略。

二、技術架構與選型

SMTMS 採用前後端分離的架構,後端負責業務規則、資料驗證與 API,前端負責操作介面與資料呈現。

技術用途
FastAPI後端 API 與請求處理
SQLAlchemy 2.xORM 與資料存取
Alembic資料庫結構版本管理
MySQL業務資料儲存
RedisJWT Token 撤銷等相關狀態管理
React 19 + TypeScript前端介面
Vite前端開發與建置
Tailwind CSS介面樣式
Docker Compose開發環境服務編排
Nginx前端與服務入口相關配置
JWT + RBAC身分驗證與角色權限控制
uvPython 依賴管理

資料庫使用既有的外部 MySQL,Redis 則透過 Docker Compose 提供開發環境服務。這樣的安排也讓資料庫與應用程式容器的生命週期可以分開管理。

在資料存取層,使用 SQLAlchemy 管理 ORM 與資料庫操作,透過 Alembic 管理 Schema 變更,避免開發過程中只修改程式模型,卻忘記同步資料庫結構。

三、核心設計:資料關聯必須反映真實業務流程

在材料追溯系統中,最重要的不是能查出多少筆資料,而是查詢結果是否有實際紀錄支持。

SMTMS 的核心資料關係包含:

Supplier Lot → Material Receipt → Internal Material Lot → IQC Record

各個環節分別代表供應商批次、實際收料、工廠內部批次,以及進料檢驗紀錄。

這些關係必須透過實際建立的資料與關聯取得,不能只依照物料編號或 BOM(Bill of Materials,物料清單)推測某批物料實際使用在哪裡。

這個設計原則可以歸納為:

  • 資料關聯必須有明確來源。

  • 批次與收料紀錄必須保持一致。

  • 檢驗結果與批次放行狀態必須符合業務規則。

  • 缺少實際紀錄時,系統應明確反映資料不足,而不是自行推論。

這些原則比單純增加查詢畫面更重要,因為它們決定了系統提供的資訊能否被信任。

四、資料一致性:不能只依賴前端驗證

在收料與批次管理中,數量錯誤可能直接影響後續的品質管理與庫存資料。

例如,假設某次收料的數量為 100 件,系統允許建立內部批次時拆分數量,但所有拆分數量的總和不能超過實際可分配的收料數量。

如果只在前端檢查數量,使用者仍可能透過直接呼叫 API、重複送出請求,或同時執行多筆操作,造成資料不一致。

因此,這類規則必須在後端進行驗證,並根據操作的資料依賴關係設計交易與併發控制。

在開發過程中,我特別關注以下問題:

  1. 收料與內部分批之間的數量限制。

  2. 同一物料與供應商批次之間的關聯一致性。

  3. IQC 檢驗結果與放行狀態的同步。

  4. 多筆資料更新失敗時,是否可能留下部分完成的結果。

  5. 重複請求或併發操作是否可能突破既有驗證。

這些問題不能只靠增加欄位驗證解決,還需要檢查資料庫約束、交易邊界及實際的資料更新順序。

尤其在併發情境下,單元測試通過不代表真實 MySQL 多連線操作一定安全。涉及資料競爭的功能,仍需要適當的整合測試與併發測試,才能進一步確認其正確性。

五、權限設計:驗證身分不等於授權成功

SMTMS 使用 JWT 進行身分驗證,並透過 RBAC(Role-Based Access Control)管理角色與權限。

除了確認使用者是否登入,還必須判斷使用者能否執行特定操作,以及是否有權存取指定供應商的資料。

例如,供應商使用者不應只因為知道其他供應商的資料 ID,就能讀取或修改對方的品質紀錄。

因此,權限檢查不能只存在於前端選單或按鈕。即使前端隱藏了某個功能,後端 API 仍然必須獨立驗證權限與資料範圍。

在這個架構中,需要分別考慮:

  • Authentication: 確認使用者身分。

  • Authorization: 確認使用者是否具有所需權限。

  • Data Isolation: 確認使用者只能存取被授權的資料範圍。

  • Token Revocation: 在登出等情境下,透過 Redis 等機制管理已撤銷的 Token。

這些概念彼此相關,但不能互相取代。通過登入驗證,不代表自動擁有所有 API 的存取權限。

六、品質異常管理:讓異常處理成為可追蹤流程

品質異常管理不只是建立一筆異常紀錄,還涉及調查、處置、確認與結案等不同階段。

如果系統只保留異常描述與目前狀態,卻沒有記錄處置內容或操作歷程,就很難理解異常是如何被處理的。

因此,品質異常相關設計需要考慮:

  • 異常紀錄及其關聯資料。

  • 調查與處置內容。

  • 狀態變更及歷程。

  • 附件上傳、下載與刪除。

  • 使用者的操作權限與供應商資料隔離。

附件也不只是檔案上傳問題。系統必須確認檔案與業務紀錄的關聯、存取權限,以及刪除操作的授權範圍。

不過,品質異常管理與完整 CAPA(Corrective and Preventive Action,矯正與預防措施)並不是同一件事。若尚未具備根因分析、矯正措施、預防措施及有效性驗證等完整流程,就不應把一般異常處理功能描述成已完成的 CAPA 系統。

七、AI Coding Agent:開發速度之外,更重要的是限制錯誤

這個專案的另一個重點,是使用 AI Coding Agent 協助開發。

AI 可以協助建立 API、整理 ORM、撰寫前端頁面、補充測試與處理錯誤,但產出程式碼並不代表業務邏輯一定正確。

尤其當需求涉及資料一致性、批次關聯或權限隔離時,AI 可能產生語法正確、卻違反業務規則的實作。

因此,我採取的開發思路不是讓 Agent 自由擴大功能,而是盡可能明確定義修改範圍與驗證條件。

1. 先理解現有實作,再修改程式

面對既有程式或錯誤訊息,先確認實際執行流程、資料表結構、API 路由與相關測試,再判斷問題出在哪裡。

不應只根據錯誤訊息就直接新增欄位、服務類別或抽象層。

2. 明確定義不可違反的業務規則

例如:

  • 收料數量不可超過允許範圍。

  • 內部分批總數不可超過可分配數量。

  • 供應商資料不可跨租戶或授權範圍存取。

  • IQC 檢驗結果與放行狀態必須一致。

  • 追溯結果必須由實際資料關聯取得。

這些規則應該成為 Agent 修改程式時的明確限制,而不是依賴模型自行猜測。

3. 控制修改範圍

採取 KISS 與最小修改原則,優先重用既有的程式模式,避免為了單一需求就引入不必要的 DTO、Service、Helper 或新的抽象層。

修改範圍越大,回歸測試與理解成本通常也越高。

4. 讓驗證結果有明確依據

透過自動化測試、型別檢查、Lint、Migration 檢查與前端建置,確認修改至少符合已定義的技術條件。

但也必須區分測試通過與功能完整:測試只能證明已覆蓋的情境,不能自動證明所有業務規則都正確。

八、為什麼要拆分規格文件?

隨著專案功能增加,單一 spec.md 容易同時包含需求、目前實作、已知缺陷、資料表結構、測試結果與未來規劃。

這會讓 AI Coding Agent 難以判斷哪些是必須遵守的規則、哪些只是目前的程式行為,以及哪些功能尚未實作。

因此,SMTMS 的文件整理方向是將不同責任分開:

  • 01_SRS.md:系統應該提供什麼功能。

  • 02_DOMAIN_RULES.md:業務上不能違反的規則。

  • 03_ADR.md:架構與技術決策。

  • 04_API_CONTRACT.md:API 契約。

  • 05_DATABASE_SCHEMA.md:資料庫結構。

  • 06_CURRENT_STATE.md:目前的實作狀態與已知限制。

  • 07_ACCEPTANCE.md:如何驗證功能是否符合需求。

  • 08_ROADMAP.md:未來的開發順序與優先級。

這樣的拆分不只是文件管理,而是把原本依賴開發者記憶的知識,轉換成 Agent 可以明確引用的工程約束。

九、目前仍需持續驗證的部分

SMTMS 的開發不能只以功能頁面是否存在作為完成標準。

後續仍需要針對以下項目持續確認:

  • 真實 MySQL 多連線下的併發正確性。

  • 所有關鍵業務規則是否都有負向測試。

  • 追溯查詢是否能完整呈現實際存在的關聯鏈。

  • 品質異常是否具備完整的稽核歷程與 CAPA 流程。

  • 報表與匯出是否符合完整資料集的需求。

  • 部署、安全性與效能是否經過實際環境驗證。

這些項目必須依照實際完成的實作與測試逐步確認,不應因為規格已經列出,就認定功能已經完成。

十、結語

SMTMS 對我而言,不只是練習 FastAPI、React 或資料庫操作的專案,更是一個思考 AI 輔助工程開發方式的實例。

AI Coding Agent 可以加速程式碼產出,但工程上的責任並沒有因此消失。資料是否正確、交易是否一致、權限是否完整,以及系統是否真正符合業務規則,仍然需要透過明確的設計、可驗證的測試與持續的人工判斷來確保。

我認為 AI 輔助開發最有價值的地方,不是讓 AI 一次寫出大量程式碼,而是讓它在明確的規則與邊界下完成工作,並讓每一次修改都能被理解、被驗證,也能在出問題時被追查。

這也是 SMTMS 希望呈現的工程方向:以 AI 提升開發效率,以領域規則控制風險,以測試與證據確保系統的可信度。

用程式碼剪影片?免費開源工具 Concat 結合 AI Agent 的實戰與坑點解析

原來寫 Code,也能拿來剪影片? 最近在研究一款影片剪輯工具 Concat ,除了基本的影片剪輯功能,還能透過 API 讓程式或 AI Agent 操作剪輯流程,讓我對影片製作自動化多了一些想法。 官方網站: https://concat.fun/ 一、Concat 是什麼? ...