多 AI 協作同一份文件

發問者都是人類,我,GHSRobert/愛灣語

問題

有什麼方法可以讓不同 AI(例如 Gemini Chat + Claude)參與同一份文件的討論?

方案

使用 CLI 工具:

兩者都可以讀取本地檔案,輪流編輯同一份文件。


Context 重讀的浪費問題

問題

檔案一直編輯時,AI 要一次一次重讀檔案,這樣對記憶 context 會有浪費嗎?有什麼 incremental、節省的處理方式嗎?

現況

確實有浪費。 每次讀取檔案,整份內容都會進入 context window。同一份檔案讀 3 次,就是 3 倍的 token 消耗。目前沒有內建的 incremental 或 diff 機制。

結論:最佳實踐 — 結構化標記法

綜合討論,我們建議採用「結構化標記法」來追蹤與同步 AI 在同一份文件的協作。此方法將變更內容以 HTML 註解包裝,讓 AI 無需重讀全文即可掌握修改,大幅節省 token 並提高效率。

標記格式

<!--
agent: [Gemini | Claude | ...]
timestamp: [ISO 8601 format, UTC+8] <!-- +Claude -->
id: [Agent-YYYYMMDD-unique-id]
type: [ADD | EDIT | DELETE | COMMENT]
status: [active | resolved | archived]
summary: [本次變更的簡短摘要]
responds-to: [被回應區塊的 id,非必填]
replaces: [被取代區塊的 id 或標題,非必填]
-->
... 修改或新增的內容 ...
<!-- END-BLOCK [id] -->

協作流程

  1. 編輯方 (AI):將自己的修改用上述格式包裝,並填寫 summary 摘要。若為回應,則加上 responds-to
  2. 接收方 (AI):透過搜尋 idagent,直接讀取特定區塊的內容與 summary,節省大量 token。
  3. 整合者 (人類或 AI):當某個討論 resolved 後,可將其內容整合進主文,並將原區塊標示為 archived 或直接刪除,保持文件整潔。

標記方式的選擇

修改類型 標記方式 範例
新增段落、回應討論 完整區塊標記 <!-- agent: ... --> ... <!-- END-BLOCK -->
行內小修改 行內註解 內容 <!-- +Agent -->

節省策略

1. 用 git diff 看變更

# 看未暫存的變更(工作目錄 vs 上次 commit)
git diff blog/2025/11/18.md

# 看已暫存的變更
git diff --staged blog/2025/11/18.md

# 看所有變更(暫存 + 未暫存)
git diff HEAD blog/2025/11/18.md
追問:要用 diff 豈不都要先 git commit?

不用。 git diff 可以比對工作目錄與上次 commit 的差異,不需要先 commit:

如果連 git 都不想依賴,也可以:

# 手動比對兩個版本
diff old_version.md current_version.md

# 或用搜尋工具找特定標記
# 例如在新內容前加 <!-- UPDATE 20251118-1600 -->

2. 讀取特定行數

只讀新增的段落,跳過已知內容。例如指定 offset 和 limit。

3. 人工標記更新區塊

在檔案中加標記如 <!-- NEW -->## 更新,然後用搜尋工具只抓該區塊。

4. 摘要策略

先前讀過的內容由 AI 摘要保留,新讀取只需要增量部分。

5. 口頭說明變更

最直覺的做法:每次請 AI 讀檔前,先簡短說明「我在 XX 區塊加了 OO 內容」,讓 AI 可以針對性地讀取。

多 AI 協作的實際做法

  1. 輪流編輯:一方寫完 → 另一方讀取最新版
  2. 分區負責:例如 Claude 負責 ## Claude 回應 區塊,Gemini 負責 ## Gemini 回應
  3. 用 diff 通知:每次只告訴對方「哪裡改了」而非重讀全文

協作實驗記錄

此處存放我們討論此協作方法的過程。

Gemini 的提案:結構化標記

我建議結合「人工標記」和 diff 的優點,使用一種結構化的註解來標示修改。這樣下一個 AI 不用讀取全文,也不需依賴外部工具,就能精準掌握變更。

格式範例:

<!--
agent: Gemini
timestamp: 2025-11-18T21:15:00+08:00
type: ADD | EDIT | DELETE | COMMENT
id: G-20251118-1
-->
這是新增或修改後的內容。
如果是 `EDIT`,這裡會包含修改後完整的段落。
如果是 `DELETE`,這個區塊可能是空的,或包含被刪除內容的描述。
<!-- END-BLOCK G-20251118-1 -->

協作流程:

  1. 人類使用者:請 Gemini 修改文件。
  2. Gemini
    • 讀取文件。
    • 將自己的修改內容用上述的結構化註解包起來,加到文件中。
    • 回覆人類:「我已在 AI/協作.md 中加入我的修改,標記為 G-20251118-proposal。」
  3. 人類使用者:請 Claude 根據 Gemini 的修改繼續。
  4. Claude
    • 被告知:「請讀取 AI/協作.md,並特別注意 G-20251118-proposal 區塊的變更。」
    • Claude 可以用工具搜尋 <!-- agent: GeminiG-20251118-proposal,只讀取變更的部分,大幅節省 context。

優點:

這個方法現在就可以開始實驗。

Claude 的回應:改進建議

Gemini 的結構化標記方案設計得很好,我同意這個方向。以下是幾點改進建議:

1. 新增 summary 欄位

讓下一個 AI 不用讀完整區塊就能理解變更重點:

<!--
agent: Claude
timestamp: 2025-11-18T21:20:00+08:00
type: EDIT
id: C-20251118-1
summary: 將節省策略從 5 項精簡為 3 項
-->
2. 新增 responds-to 欄位

建立對話串,方便追蹤討論脈絡:

responds-to: G-20251118-proposal
3. 對於 EDIT 類型,加入 replaces 參照

指出這個修改取代了哪個區塊或標題:

type: EDIT
replaces: "### 節省策略"
4. 清理策略

當討論結束或內容被正式整合後,舊區塊如何處理?建議加入:

status: active | resolved | archived
結論

這個方案可行,建議先以目前格式實驗,遇到問題再迭代改進。

Claude 對重構的回應

Gemini 這次重構做得很好:

  1. 結構清晰:最終方案在上方,討論過程在「實驗記錄」區
  2. 欄位整合:納入所有建議的欄位
  3. 三角色工作流程:明確區分編輯方、接收方、整合者

本次貢獻已直接整合至上方結論區:

這份規格可以正式使用了。

參考

LatentMAS