&lt;?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Stan Wu 吳信典</title><link>https://blog.stanwu.org/tags/token/</link><description>拆解被包裝過的東西、數位自主權實踐、非典型理財觀</description><language>zh-TW</language><lastBuildDate>Tue, 14 Apr 2026 21:50:31 +0800</lastBuildDate><atom:link href="https://blog.stanwu.org/tags/token/feed.xml" rel="self" type="application/rss+xml"/><item><title>用高階模型設計 Skill，讓 GPT-4.1 穩定執行：Copilot Token 節省策略</title><link>https://blog.stanwu.org/posts/claude-skill-gpt41-copilot-token-strategy/</link><pubDate>Tue, 14 Apr 2026 00:02:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/claude-skill-gpt41-copilot-token-strategy/</guid><description>&lt;p&gt;GitHub Copilot 的 GPT-4.1 是吃到飽方案，但模型本身相對保守，遇到複雜任務容易輸出不穩定。&lt;/p&gt;
&lt;p&gt;解法不是換模型，而是換策略：用聰明的模型把工作定義清楚，讓便宜的模型負責執行。&lt;/p&gt;
&lt;h2 id="問題的本質"&gt;問題的本質&lt;/h2&gt;
&lt;p&gt;在 AI 工具的日常使用裡，有兩件事常常被混在一起：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;思考這件事該怎麼做&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;照著計畫把事情做完&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;高階模型（Claude Sonnet 4.6、GPT-4o 等）在「思考」上很強，但 token 有成本。GPT-4.1 在 Copilot 裡是吃到飽，適合「執行」，但如果讓它自己思考怎麼做，品質容易漂移。&lt;/p&gt;
&lt;p&gt;這個觀察直接指向一個架構：&lt;strong&gt;把思考和執行分層&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="策略核心skill-是智力的容器"&gt;策略核心：Skill 是智力的容器&lt;/h2&gt;
&lt;p&gt;Skill 本質上是一份「執行說明書」：告訴模型這個任務的目標是什麼、輸出格式長什麼樣、遇到邊界情況怎麼處理。&lt;/p&gt;
&lt;p&gt;當 skill 設計得夠好，GPT-4.1 的工作就從「想清楚再做」變成「照著做」。這個轉換非常關鍵，因為模型能力的差距，在格式遵循和結構輸出上遠比在自由推理上小。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;高階模型（Claude Sonnet 4.6）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 設計 skill：定義輸出格式、邊界條件、fallback 邏輯
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 產出：可重複使用的 skill 文件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GPT-4.1（Copilot 吃到飽）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 照 skill 執行：填入、套用、輸出
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 產出：穩定、符合格式的結果
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;設計一次，執行百次。智力成本集中在設計端，執行端的 token 消耗幾乎是免費的。&lt;/p&gt;
&lt;h2 id="一個具體範例"&gt;一個具體範例&lt;/h2&gt;
&lt;p&gt;假設你需要每天做 code review 摘要，格式固定：問題分類、嚴重程度、建議改法。&lt;/p&gt;
&lt;h3 id="讓-gpt-41-自己跑沒有-skill"&gt;讓 GPT-4.1 自己跑（沒有 skill）&lt;/h3&gt;
&lt;p&gt;輸出會長這樣——每次都不同：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;這段程式碼有幾個問題需要注意。首先&amp;hellip;（自由發揮三段）&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;格式不固定，無法批次處理，每次都要重新審閱。&lt;/p&gt;
&lt;h3 id="讓-claude-先設計-skill"&gt;讓 Claude 先設計 skill&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Code Review 摘要 Skill
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gs"&gt;**輸入**&lt;/span&gt;：一段程式碼或 diff
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gs"&gt;**輸出格式**&lt;/span&gt;（嚴格遵循）：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; 每個問題獨立一條
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; 格式：&lt;span class="sb"&gt;`[嚴重度: HIGH/MED/LOW] 問題描述 → 建議改法`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; 嚴重度定義：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;-&lt;/span&gt; HIGH = 安全漏洞、資料遺失風險
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;-&lt;/span&gt; MED = 邏輯錯誤、效能問題
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;-&lt;/span&gt; LOW = 風格、可讀性
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; 沒有問題時輸出：&lt;span class="sb"&gt;`✓ 無發現問題`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; 禁止加前言、後語、摘要段落
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="交給-gpt-41-執行"&gt;交給 GPT-4.1 執行&lt;/h3&gt;
&lt;p&gt;輸出變成：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[HIGH] SQL query 未參數化，存在注入風險 → 改用 prepared statement
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[MED] 迴圈內重複呼叫 DB，N+1 問題 → 改用 batch query
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[LOW] 變數命名不一致（camelCase vs snake_case）→ 統一為 snake_case
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;穩定、可解析、可自動化處理。GPT-4.1 沒有變聰明，只是工作被定義清楚了。&lt;/p&gt;
&lt;h2 id="skill-設計的幾個關鍵原則"&gt;Skill 設計的幾個關鍵原則&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;一、輸出格式要「防呆」&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;越少解釋空間越好。與其說「用條列方式呈現」，不如直接給模板：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;好的：`格式：[{嚴重度}] {問題} → {建議}`
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;不好的：`請條列出問題和建議`
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;二、把邊界條件寫進去&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;GPT-4.1 遇到 edge case 最容易偏離格式。與其事後修正，不如在 skill 裡預先定義：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;沒有輸入時怎麼處理&lt;/li&gt;
&lt;li&gt;遇到不確定時輸出什麼&lt;/li&gt;
&lt;li&gt;哪些情況輸出空值而非猜測&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;三、明確禁止多餘輸出&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;語言模型天生喜歡加前言和總結。要在 skill 裡明確說：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;禁止加「以下是分析結果：」之類的前言。禁止在結尾加摘要。直接輸出結果。&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;四、用範例而非描述&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一個具體的輸出範例，比三段文字描述更有效。Claude 在設計 skill 時，可以幫你產生幾個 few-shot 範例，附在 skill 裡給 GPT-4.1 參考。&lt;/p&gt;
&lt;h2 id="哪些任務適合這個策略"&gt;哪些任務適合這個策略&lt;/h2&gt;
&lt;p&gt;這個分層架構在&lt;strong&gt;格式明確、重複性高&lt;/strong&gt;的任務上效果最好：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;適合&lt;/th&gt;
&lt;th&gt;不太適合&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;程式碼生成（固定模板）&lt;/td&gt;
&lt;td&gt;開放式創意發散&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;文件整理、摘要&lt;/td&gt;
&lt;td&gt;需要即時推理的除錯&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;結構化資料提取&lt;/td&gt;
&lt;td&gt;高度 context-aware 的一次性任務&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;固定流程的 code review&lt;/td&gt;
&lt;td&gt;需要跨多個 context 推理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;批次重複作業&lt;/td&gt;
&lt;td&gt;第一次設計 skill 本身&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;判斷方法很簡單：如果這件事你可以寫成 SOP，就適合做成 skill 交給 GPT-4.1。如果需要即興判斷，就留給高階模型。&lt;/p&gt;
&lt;h2 id="如何驗證-skill-設計是否有效"&gt;如何驗證 skill 設計是否有效&lt;/h2&gt;
&lt;p&gt;Skill 設計完，讓 GPT-4.1 跑三到五次同類任務。觀察：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;格式一致性&lt;/strong&gt;：關鍵欄位每次都在嗎？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;長度穩定性&lt;/strong&gt;：輸出長度有沒有大幅波動？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;邊界行為&lt;/strong&gt;：空輸入、異常輸入有沒有按 skill 定義處理？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果通過，skill 設計就算過關。如果 GPT-4.1 每次都在「自由發揮」，通常是 skill 留了太多解釋空間，回頭讓 Claude 再修一次。&lt;/p&gt;
&lt;h2 id="成本結構的轉換"&gt;成本結構的轉換&lt;/h2&gt;
&lt;p&gt;這個策略本質上是改變了 AI 工具的成本結構：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;舊模式&lt;/strong&gt;：每次任務都讓高階模型從頭思考
→ 每次都花高階模型 token，成本線性增長&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;新模式&lt;/strong&gt;：高階模型投資在 skill 設計，GPT-4.1 負責執行
→ 設計成本一次性，執行成本趨近零（Copilot 吃到飽）&lt;/p&gt;
&lt;p&gt;越是重複性高的工作，這個策略的 ROI 越高。第一次做 skill 的 token 成本，會在第十次執行時回本。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;這個思路其實不算新——工程師很熟悉「框架 vs 業務邏輯」的分工。框架由架構師設計，工程師照框架寫業務邏輯。現在只是把同樣的概念，用在 AI 模型的分工上。&lt;/p&gt;
&lt;p&gt;設計一次好的 skill，比每次讓 AI 猜你要什麼，省事得多。&lt;/p&gt;</description></item><item><title>從文言文到 AST：AI Agent Memory 語義壓縮的可行性分析</title><link>https://blog.stanwu.org/posts/wenyan-to-ast-ai-memory-compression/</link><pubDate>Tue, 14 Apr 2026 00:01:00 +0800</pubDate><guid>https://blog.stanwu.org/posts/wenyan-to-ast-ai-memory-compression/</guid><description>&lt;p&gt;古代人刻竹簡、抄手稿，每個字的儲存成本都極高。這個物理限制直接塑造了文言文的語言風格——用最少的字，傳遞最密集的語意。&lt;/p&gt;
&lt;p&gt;這不只是文化，是工程決策。&lt;/p&gt;
&lt;p&gt;當我開始思考 AI agent 的 memory 管理問題，這個古老的邏輯突然變得非常現代。&lt;/p&gt;
&lt;h2 id="文言文是一種有損壓縮格式"&gt;文言文是一種有損壓縮格式&lt;/h2&gt;
&lt;p&gt;從資訊理論的角度看，文言文是一套&lt;strong&gt;高壓縮比、高解碼成本&lt;/strong&gt;的編碼系統。&lt;/p&gt;
&lt;p&gt;竹簡有重量，有體積，刻寫需要工時。這些都是實體成本。當儲存成本極高時，語言會朝向低熵方向演化：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;虛詞能省則省&lt;/li&gt;
&lt;li&gt;語境依賴極重（解碼需要大量背景知識）&lt;/li&gt;
&lt;li&gt;歧義換取密度（讀者端承擔解壓縮負擔）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;對比白話文：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;文言文&lt;/th&gt;
&lt;th&gt;白話文&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;壓縮率&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;td&gt;低&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;自解釋性&lt;/td&gt;
&lt;td&gt;低（需訓詁）&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;儲存成本&lt;/td&gt;
&lt;td&gt;低&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;解碼門檻&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;td&gt;低&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;有趣的是，活版印刷大幅降低了複製成本，照理說語言應該走向白話——但文言文仍然主導書面世界數百年。因為&lt;strong&gt;寫作者的習慣與社會認可機制的慣性，遠比技術變革的速度慢&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;白話文運動最終發生，更多是政治與教育普及的需求，而非技術成本。&lt;/p&gt;
&lt;p&gt;這個觀察本身就是一個警示：即使最優解存在，系統切換的成本可能讓它長期無法落地。&lt;/p&gt;
&lt;h2 id="token-是現代的竹簡"&gt;Token 是現代的竹簡&lt;/h2&gt;
&lt;p&gt;AI agent 每次被呼叫，都需要把 memory 塞進 context window。Token 是直接成本：計費、速度、context 容量，都和 token 數量正相關。&lt;/p&gt;
&lt;p&gt;現有的 memory 格式大多長這樣：&lt;/p&gt;
&lt;blockquote class="callout callout-note"&gt;
&lt;div class="callout-title"&gt;memory 範例：prose 格式&lt;/div&gt;
&lt;div class="callout-body"&gt;
&lt;p&gt;&lt;strong&gt;name:&lt;/strong&gt; 回應風格偏好
&lt;strong&gt;type:&lt;/strong&gt; feedback&lt;/p&gt;
&lt;p&gt;使用者偏好簡潔回應，不喜歡在結尾加摘要總結。
&lt;strong&gt;Why:&lt;/strong&gt; 他說他可以自己讀 diff，不需要 AI 重複說明已完成的事。
&lt;strong&gt;How to apply:&lt;/strong&gt; 每次回應結尾不要加「以上是本次修改的摘要」之類的段落。&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;&lt;p&gt;這是白話文。結構清晰，人讀得懂，但對機器來說充滿冗餘。&lt;/p&gt;
&lt;p&gt;如果我們用文言文的邏輯重新設計：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;no-trailing-summary; trigger=response_end; reason=user_reads_diff
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同樣的語意，token 省了 70% 以上。&lt;/p&gt;
&lt;h2 id="關鍵洞察memory-的唯一讀者是-ai-agent"&gt;關鍵洞察：memory 的唯一讀者是 AI agent&lt;/h2&gt;
&lt;p&gt;這裡有一個根本性的問題值得釐清：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;memory 是為誰而寫的？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;傳統 memory 設計預設「人需要能讀懂」，所以用完整句子、加 Why 說明、保留上下文。但仔細想，memory 的實際讀者是 agent 本身。人審查 memory 是偶發需求，不是主流路徑。&lt;/p&gt;
&lt;p&gt;這意味著：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;human-readable 在大多數情境下是&lt;strong&gt;偽需求&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;壓縮的唯一硬性約束是：&lt;strong&gt;agent 能 100% decode&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;其餘的可讀性成本，都是在為一個低頻需求買單&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這個邏輯和 LLM embedding 是一樣的：向量記憶體對人完全不可讀，但 agent 的 retrieve 語意還原率反而更高。文字 memory 之所以還在用，是因為人需要 audit 能力，而不是因為它對機器更好。&lt;/p&gt;
&lt;h2 id="從-ast-借鑑結構化表示"&gt;從 AST 借鑑結構化表示&lt;/h2&gt;
&lt;p&gt;這時候自然會想到 AST（Abstract Syntax Tree，抽象語法樹）。&lt;/p&gt;
&lt;p&gt;在編譯器領域，AST 是把原始碼轉成**結構化中間表示（IR）**的標準手法。原始碼是給人讀的（高冗餘），AST 是給編譯器處理的（結構化、可操作）。&lt;/p&gt;
&lt;p&gt;把這個概念移植到 memory：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;flowchart TD
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; A[&amp;#34;自然語言 memory（原始碼）&amp;#34;] --&amp;gt;|encode| B[&amp;#34;AST memory node（IR）&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; B --&amp;gt;|retrieve + decode| C[&amp;#34;agent 行為&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;具體長這樣：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;behavior_rule&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;trigger&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;context&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;response_end&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;action&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;suppress&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;summary&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;condition&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;user_action&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;reads_diff&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;confidence&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.95&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;raw&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;user reads diff directly, finds summaries redundant&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ast-相對於-prose-memory-的優勢"&gt;AST 相對於 prose memory 的優勢&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;可 diff&lt;/strong&gt;：兩條 rule 衝突時，agent 比較節點而非解析自然語言，衝突偵測可以程式化。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;可 merge&lt;/strong&gt;：新 observation 進來時，patch 特定節點而非整段重寫，incremental update 成本低。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;可 query&lt;/strong&gt;：&lt;code&gt;trigger.context == &amp;quot;response_end&amp;quot;&lt;/code&gt; 精確 retrieve，不依賴語義相似度，查詢結果確定。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;可繼承&lt;/strong&gt;：子節點 override 父節點，類似 CSS cascade，可以做 context-specific 的行為覆寫。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;可版本化&lt;/strong&gt;：節點帶 schema version，memory 格式演化時可以做 migration 而非全部重寫。&lt;/p&gt;
&lt;h2 id="這個設計的根本張力"&gt;這個設計的根本張力&lt;/h2&gt;
&lt;p&gt;AST 設計看起來很美，但有一個繞不開的核心問題：&lt;/p&gt;
&lt;h3 id="張力一固定-schema-vs-表達彈性"&gt;張力一：固定 schema vs 表達彈性&lt;/h3&gt;
&lt;p&gt;程式語言的 AST 有嚴格 grammar，語義確定。Memory 的 schema 需要人工設計，而觀察的種類是開放的——你無法預先定義所有可能的 node type。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed ontology：查詢效率高，但遇到 schema 外的觀察無處放&lt;/li&gt;
&lt;li&gt;Emergent schema：表達彈性高，但查詢一致性差&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這是一個目前沒有標準答案的開放問題。&lt;/p&gt;
&lt;h3 id="張力二壓縮率-vs-decode-完整性"&gt;張力二：壓縮率 vs decode 完整性&lt;/h3&gt;
&lt;p&gt;文言文的問題是「解壓縮密鑰丟失後語義崩潰」。過度壓縮的 memory：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;換模型或換 session 可能 decode 失敗&lt;/li&gt;
&lt;li&gt;Edge case 無法判斷適用性&lt;/li&gt;
&lt;li&gt;encode 錯誤無聲無息傳播&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最優解不是最大壓縮，而是「&lt;strong&gt;剛好能讓同等智力的讀者正確 decode 的最小表達&lt;/strong&gt;」——這其實也是文言文的設計目標，只是它的「同等智力讀者」預設了四書五經作為共同解碼器。&lt;/p&gt;
&lt;p&gt;AI agent 的「共同解碼器」是 pre-training，這個基礎是穩定的，但並非無限可靠。&lt;/p&gt;
&lt;h3 id="張力三auditability-vs-壓縮上限"&gt;張力三：auditability vs 壓縮上限&lt;/h3&gt;
&lt;p&gt;如果完全移除「人要能審查」的約束，理論上可以讓 agent 自己設計一套極度壓縮的內部語言，壓縮率可以趨近理論上限。但你同時失去了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;偵測 encode 錯誤的能力&lt;/li&gt;
&lt;li&gt;理解 agent 行為的能力&lt;/li&gt;
&lt;li&gt;手動修正錯誤 memory 的能力&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;auditability 的要求，決定了壓縮的上限。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="hybrid-格式務實的折衷"&gt;Hybrid 格式：務實的折衷&lt;/h2&gt;
&lt;p&gt;考慮以上三個張力，純 AST 和純 prose 都不是最優解。Hybrid 格式更接近實際可落地的方向：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;behavior_rule&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;trigger&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;response_end&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;action&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;suppress_summary&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;raw&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;user reads diff directly, finds summaries redundant&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;結構化 header 負責 routing 和 query，&lt;code&gt;raw&lt;/code&gt; 欄位保留自然語言作為 decode 邊界情況的 fallback。&lt;/p&gt;
&lt;p&gt;這類似文言文後來發展出的注疏傳統——正文高度壓縮，注疏提供解碼上下文，兩者合讀才是完整資訊。&lt;/p&gt;
&lt;h2 id="python-作為統一引擎"&gt;Python 作為統一引擎&lt;/h2&gt;
&lt;p&gt;如果要實作這個 memory 系統，Python 是自然的選擇。&lt;/p&gt;
&lt;p&gt;更進一步，可以設計&lt;strong&gt;單一引擎、雙介面&lt;/strong&gt;的架構：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;memory_engine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;CLI&lt;/span&gt; &lt;span class="n"&gt;interface&lt;/span&gt; &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="n"&gt;Bash&lt;/span&gt; &lt;span class="k"&gt;tool&lt;/span&gt; &lt;span class="err"&gt;直接呼叫&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;memory_engine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;encode&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;memory_engine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;response_end&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;memory_engine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;merge&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;node_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;memory_engine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;audit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="n"&gt;Skill&lt;/span&gt; &lt;span class="n"&gt;interface&lt;/span&gt; &lt;span class="err"&gt;←&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="err"&gt;透過&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="err"&gt;觸發&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;複合操作、判斷&lt;/span&gt; &lt;span class="n"&gt;subcommand&lt;/span&gt;&lt;span class="err"&gt;、串接多個操作&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同一份邏輯，兩個 entry point，DRY 原則。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;argparse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ArgumentParser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;encode&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;merge&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;audit&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;input&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nargs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse_args&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ensure_ascii&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;encode 時需要 LLM 做語義解析，這裡有一個設計選擇：由 Python 內部發 API call，還是由 agent 自己解析後把結果傳給 script？前者讓引擎更自治，後者讓引擎更確定性。這個選擇影響整個依賴架構，值得獨立討論。&lt;/p&gt;
&lt;h2 id="可行性小結"&gt;可行性小結&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;面向&lt;/th&gt;
&lt;th&gt;結論&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;基本邏輯&lt;/td&gt;
&lt;td&gt;成立。memory 本來就是給 agent 讀的，改成更結構化、更省 token 的格式是合理方向&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;實作難度&lt;/td&gt;
&lt;td&gt;可控。LLM 已經能穩定輸出 structured output，Python 也足夠處理 encode、query、merge、audit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;主要風險&lt;/td&gt;
&lt;td&gt;encode 錯誤傳播、schema 太硬、壓得太短導致 agent decode 失敗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;需要取捨的地方&lt;/td&gt;
&lt;td&gt;壓縮率、可讀性、可審查性三者不可能同時最大化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可參考方向&lt;/td&gt;
&lt;td&gt;MemGPT、Knowledge Graph + LLM、Minimum Description Length（MDL）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;核心結論&lt;/strong&gt;：方向可行，但不適合一開始就追求極限壓縮。比較務實的做法，是先用 hybrid 格式保留必要上下文，再逐步把穩定、重複出現的 memory 壓成結構化節點。&lt;/p&gt;
&lt;h2 id="後記"&gt;後記&lt;/h2&gt;
&lt;p&gt;文言文撐了兩千年，不是因為它最好讀，而是因為它在當時的成本結構下是最優解。當成本結構改變（印刷術、白話文運動），語言才真正轉型。&lt;/p&gt;
&lt;p&gt;AI memory 目前的「白話文」格式，是在 context window 相對充裕、token 成本可接受的前提下成立的。當 agent 開始大規模運作、memory 數量指數成長，成本結構會變，最優解也會跟著變。&lt;/p&gt;
&lt;p&gt;現在思考壓縮，不是為了立刻重寫所有 memory，而是為了在成本結構改變的時候，不用從零開始想。&lt;/p&gt;</description></item></channel></rss>