<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Context Engineering on 鬼哥的空间</title><link>https://guige.ai/tags/context-engineering/</link><description>Recent content in Context Engineering on 鬼哥的空间</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Mon, 22 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://guige.ai/tags/context-engineering/index.xml" rel="self" type="application/rss+xml"/><item><title>OKF：AI Agent 缺的不是模型，是可交接的上下文</title><link>https://guige.ai/p/open-knowledge-format/</link><pubDate>Mon, 22 Jun 2026 00:00:00 +0000</pubDate><guid>https://guige.ai/p/open-knowledge-format/</guid><description>&lt;img src="https://guige.ai/" alt="Featured image of post OKF：AI Agent 缺的不是模型，是可交接的上下文" /&gt;&lt;p&gt;AI Agent 最怕的不是模型不够强，而是它每次开工前，都像一个刚入职的新同事：&lt;strong&gt;不知道表在哪，不知道指标怎么算，也不知道谁脑子里藏着关键规则。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Google Cloud 最近发布的 Open Knowledge Format（OKF），表面上看只是一个“Markdown + YAML frontmatter”的小规范。&lt;/p&gt;
&lt;p&gt;但我觉得它真正值得关注的地方在于：它把 AI 时代最难交接的东西，重新变成了文件。&lt;/p&gt;
&lt;p&gt;&lt;img alt="OKF 把散落的企业知识整理成 AI Agent 可读取的上下文地图" class="gallery-image" data-flex-basis="135px" data-flex-grow="56" height="1672" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/open-knowledge-format/context-map.webp" srcset="https://guige.ai/p/open-knowledge-format/context-map_hu_a3aa6030697ea511.webp 800w, https://guige.ai/p/open-knowledge-format/context-map.webp 941w" width="941"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="问题不是没有知识而是知识没法交给-agent"&gt;问题不是没有知识，而是知识没法交给 Agent
&lt;/h2&gt;&lt;p&gt;今天大多数公司的知识并不少。&lt;/p&gt;
&lt;p&gt;表结构在数据目录里，指标定义在 BI 文档里，事故处理流程在 runbook 里，API 变更写在 release note 里，一些关键口径藏在老员工脑子里。&lt;/p&gt;
&lt;p&gt;问题是：这些知识对人来说都已经够散了，对 AI Agent 来说更是灾难。&lt;/p&gt;
&lt;p&gt;当一个 Agent 要回答：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;怎么从事件流里计算 weekly active users？
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;它可能要同时知道：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;哪张表是事件源；&lt;/li&gt;
&lt;li&gt;用户 ID 用哪个字段；&lt;/li&gt;
&lt;li&gt;bot 流量怎么排除；&lt;/li&gt;
&lt;li&gt;时区按 UTC 还是业务地区；&lt;/li&gt;
&lt;li&gt;老口径有没有废弃；&lt;/li&gt;
&lt;li&gt;这个指标和看板上的 WAU 是否一致；&lt;/li&gt;
&lt;li&gt;如果 join 用户表，应该走哪条路径。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些信息往往分布在不同系统里：metadata catalog、Notion、Google Drive、代码注释、SQL 文件、Slack 历史消息，甚至某个资深工程师的记忆里。&lt;/p&gt;
&lt;p&gt;所以，Agent 真正缺的不是“再聪明一点”。&lt;/p&gt;
&lt;p&gt;它缺的是一份能被读取、能被链接、能被版本管理、能被不同工具交接的 &lt;strong&gt;上下文资产&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="okf-是什么不是服务是格式"&gt;OKF 是什么：不是服务，是格式
&lt;/h2&gt;&lt;p&gt;Google Cloud 对 OKF 的定义很克制。&lt;/p&gt;
&lt;p&gt;OKF v0.1 把知识表示成一个目录，目录里是一组 Markdown 文件，每个文件都有 YAML frontmatter。它不要求新 runtime，不要求 SDK，不绑定某个云厂商，也不要求你把知识搬进一个新平台。&lt;/p&gt;
&lt;p&gt;最小形态大概长这样：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sales/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── index.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── datasets/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── index.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── orders_db.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── tables/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── index.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── orders.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── customers.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── metrics/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── index.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── weekly_active_users.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;一个概念就是一个文件。&lt;/p&gt;
&lt;p&gt;文件路径就是这个概念的身份。&lt;/p&gt;
&lt;p&gt;文件头部放少量可查询字段，正文放人和 Agent 都能读的解释：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;type: BigQuery Table
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;title: Orders
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;description: One row per completed customer order.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;resource: https://console.cloud.google.com/bigquery/...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tags: [sales, revenue]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;timestamp: 2026-05-28T14:30:00Z
&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gh"&gt;# Schema
&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;| Column | Type | Description |
&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="sb"&gt;`order_id`&lt;/span&gt; | STRING | Globally unique order identifier. |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| &lt;span class="sb"&gt;`customer_id`&lt;/span&gt; | STRING | FK to [&lt;span class="nt"&gt;customers&lt;/span&gt;](&lt;span class="na"&gt;/tables/customers.md&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="gh"&gt;# Joins
&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;Joined with [&lt;span class="nt"&gt;customers&lt;/span&gt;](&lt;span class="na"&gt;/tables/customers.md&lt;/span&gt;) on &lt;span class="sb"&gt;`customer_id`&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;OKF 的野心不在“文件格式很复杂”，恰恰相反，它的野心在于 &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;Markdown&lt;/td&gt;
 &lt;td&gt;人能读，Agent 也能读&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;YAML frontmatter&lt;/td&gt;
 &lt;td&gt;少量结构化字段可检索、可过滤&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;普通目录&lt;/td&gt;
 &lt;td&gt;能进 Git，能打包，能挂载，能同步&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Markdown 链接&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;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这就是 OKF 最有意思的地方：&lt;strong&gt;它不是想成为新的知识平台，而是想成为知识平台之间的交换格式。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="OKF bundle 的目录、frontmatter、markdown 链接三层结构" class="gallery-image" data-flex-basis="135px" data-flex-grow="56" height="1672" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/open-knowledge-format/okf-structure.webp" srcset="https://guige.ai/p/open-knowledge-format/okf-structure_hu_ad3a1d6d3f855640.webp 800w, https://guige.ai/p/open-knowledge-format/okf-structure.webp 941w" width="941"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="为什么是-markdown因为-agent-时代需要知识即代码"&gt;为什么是 Markdown？因为 Agent 时代需要“知识即代码”
&lt;/h2&gt;&lt;p&gt;这几年很多团队都在重新发现一个模式：LLM wiki。&lt;/p&gt;
&lt;p&gt;人类维护 wiki 很痛苦，因为我们会忘记更新链接，懒得补充引用，也不想每次改完一个文档还去同步另外 15 个文件。&lt;/p&gt;
&lt;p&gt;但这些事情恰好是 LLM 擅长的。&lt;/p&gt;
&lt;p&gt;它不会嫌整理 cross-reference 无聊，也不会因为要批量改十几个文件就开始摆烂。只要你给它一个清晰的文件结构、约束和审查机制，它可以把知识维护变成一个持续循环：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&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;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;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;span class="line"&gt;&lt;span class="cl"&gt;提交 Pull Request
&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&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;Agent 下次直接读取更新后的上下文
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这就是“知识即代码”的味道。&lt;/p&gt;
&lt;p&gt;代码为什么能长期演进？不是因为代码天然比文档高级，而是因为它有一套成熟的协作机制：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Git 记录历史；&lt;/li&gt;
&lt;li&gt;PR 承载讨论；&lt;/li&gt;
&lt;li&gt;diff 暴露变化；&lt;/li&gt;
&lt;li&gt;review 把关质量；&lt;/li&gt;
&lt;li&gt;CI 做基础校验；&lt;/li&gt;
&lt;li&gt;blame 能追溯责任。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OKF 想做的，是让企业知识也进入这套机制。&lt;/p&gt;
&lt;p&gt;不是再建一个“大家都不会更新”的知识库，而是让知识文件和代码、SQL、配置、runbook 一起被管理。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="okf-和-rag-的区别一个是切片一个是概念"&gt;OKF 和 RAG 的区别：一个是切片，一个是概念
&lt;/h2&gt;&lt;p&gt;很多人第一反应会是：这不就是 RAG 吗？&lt;/p&gt;
&lt;p&gt;不完全是。&lt;/p&gt;
&lt;p&gt;RAG 通常做的是：把文档切 chunk，做 embedding，查询时召回相关片段，再交给模型综合。&lt;/p&gt;
&lt;p&gt;OKF 更像是提前把知识整理成 &lt;strong&gt;概念级资产&lt;/strong&gt;。一个表、一个指标、一个 runbook、一个 API、一个 join path，都可以是独立概念。概念之间用 Markdown 链接互相指向。&lt;/p&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;RAG 常见做法&lt;/th&gt;
 &lt;th&gt;OKF 的思路&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;基本单位&lt;/td&gt;
 &lt;td&gt;文档切片 chunk&lt;/td&gt;
 &lt;td&gt;概念 concept&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;人和 Agent 都能读&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;版本管理&lt;/td&gt;
 &lt;td&gt;往往在索引外部&lt;/td&gt;
 &lt;td&gt;天然进 Git&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;适合场景&lt;/td&gt;
 &lt;td&gt;大规模检索&lt;/td&gt;
 &lt;td&gt;稳定知识、指标、 schema、runbook&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;RAG 像是让 Agent 在图书馆里临时找资料。&lt;/p&gt;
&lt;p&gt;OKF 像是给 Agent 一本经过整理、带目录、带交叉引用、能持续更新的工作手册。&lt;/p&gt;
&lt;p&gt;两者不是互斥关系。OKF bundle 完全可以被索引进 RAG 系统。但它的价值在于：进入索引之前，知识已经被整理成可审查、可迁移、可复用的形态。&lt;/p&gt;
&lt;p&gt;&lt;img alt="RAG chunk 与 OKF concept 的差异对比" class="gallery-image" data-flex-basis="135px" data-flex-grow="56" height="1672" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/open-knowledge-format/rag-vs-okf.webp" srcset="https://guige.ai/p/open-knowledge-format/rag-vs-okf_hu_2b3d08bef8fafdc6.webp 800w, https://guige.ai/p/open-knowledge-format/rag-vs-okf.webp 941w" width="941"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="okf-真正解决的是上下文交接成本"&gt;OKF 真正解决的是“上下文交接成本”
&lt;/h2&gt;&lt;p&gt;我觉得 OKF 的关键词不是 Markdown，也不是 YAML。&lt;/p&gt;
&lt;p&gt;它的关键词是：&lt;strong&gt;handoff&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;一个企业里最贵的成本，往往不是模型调用费，而是上下文交接费。&lt;/p&gt;
&lt;p&gt;新同事入职，要问一堆人。&lt;/p&gt;
&lt;p&gt;新 Agent 上线，要重新接一堆系统。&lt;/p&gt;
&lt;p&gt;换一个工具，要重新导出、清洗、适配。&lt;/p&gt;
&lt;p&gt;换一个供应商，原来的知识资产又被锁在对方的数据模型里。&lt;/p&gt;
&lt;p&gt;OKF 试图把这些上下文从“平台内资产”变成“文件资产”。&lt;/p&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;OKF 想推动的状态&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;Agent 依赖专用 SDK&lt;/td&gt;
 &lt;td&gt;Agent 直接读目录&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;更新走 PR 和 review&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;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这也是为什么 Google Cloud 在官方文章里反复强调：OKF 是 format，不是 platform。&lt;/p&gt;
&lt;p&gt;如果一个格式只能在某家云、某个数据库、某个 Agent 框架里跑，那它解决不了上下文迁移问题。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="databricks-和-snowflake-都很强但知识仍然不可复用"&gt;Databricks 和 Snowflake 都很强，但知识仍然不可复用
&lt;/h2&gt;&lt;p&gt;这里可以拿两个今天业界很强的产品来对照：Databricks Genie One 和 Snowflake Cortex Analyst。&lt;/p&gt;
&lt;p&gt;先说清楚：这两个方向都很顶。&lt;/p&gt;
&lt;p&gt;Databricks Genie One 的定位是面向业务团队的 AI coworker。它强调“grounded in your data”，能让业务用户提问、拿到上下文相关的答案，并进一步把洞察转成 action、agent 或 app。它背后的 Genie Ontology 被 Databricks 描述为一个持续改进、自动推断的业务术语、实体和 KPI 知识图谱，用来支撑 Genie 的回答和动作。Databricks 文档里的 Genie Spaces，也明确要求数据分析师用 Unity Catalog 数据集、示例 SQL、业务语义表达式和组织术语说明来 curate 一个 domain-specific 的问答空间。&lt;/p&gt;
&lt;p&gt;Snowflake Cortex Analyst 也在解决同一个核心问题：业务用户用自然语言问数据问题，但数据库 schema 本身不足以告诉模型“业务到底是什么意思”。所以 Cortex Analyst 依赖 semantic model / Semantic Views，把业务实体、维度、事实、指标、表关系、verified queries 等语义信息显式建出来。Snowflake 官方文档也明确说，semantic model 是用来弥合 business users 和 database 之间的差距。&lt;/p&gt;
&lt;p&gt;这两套东西都不是玩具。&lt;/p&gt;
&lt;p&gt;它们代表了企业数据 AI 的一个共识：&lt;strong&gt;自然语言问数想要靠谱，必须有业务语义层。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;但问题也在这里。&lt;/p&gt;
&lt;p&gt;如果你的团队在 Databricks 里花了很多时间维护 Genie Space、Genie Ontology、Unity Catalog Semantics；同时另一个团队在 Snowflake 里维护 Semantic Views、Cortex Analyst semantic model、verified queries，那么这些业务知识很难天然复用。&lt;/p&gt;
&lt;p&gt;不是因为 Databricks 或 Snowflake 做得不好。&lt;/p&gt;
&lt;p&gt;恰恰相反，是因为它们都做得太完整了：语义层、权限、执行引擎、治理、Agent 体验，都和自家平台深度耦合。&lt;/p&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;在 Databricks 里&lt;/th&gt;
 &lt;th&gt;在 Snowflake 里&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;Genie / Unity Catalog 语义体系&lt;/td&gt;
 &lt;td&gt;Semantic Views / semantic model&lt;/td&gt;
 &lt;td&gt;需要重新映射&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;表关系&lt;/td&gt;
 &lt;td&gt;Databricks 平台上下文&lt;/td&gt;
 &lt;td&gt;Snowflake semantic layer&lt;/td&gt;
 &lt;td&gt;不能直接通用&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Verified queries&lt;/td&gt;
 &lt;td&gt;Genie Space 示例和验证&lt;/td&gt;
 &lt;td&gt;Cortex Analyst verified queries&lt;/td&gt;
 &lt;td&gt;格式不同&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;业务术语&lt;/td&gt;
 &lt;td&gt;Genie Ontology&lt;/td&gt;
 &lt;td&gt;Semantic View definitions&lt;/td&gt;
 &lt;td&gt;各自维护&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Agent 行为&lt;/td&gt;
 &lt;td&gt;Genie Agents / apps&lt;/td&gt;
 &lt;td&gt;Cortex Analyst API / apps&lt;/td&gt;
 &lt;td&gt;体验绑定平台&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;对企业来说，选择 Databricks 或 Snowflake 当然都可以。&lt;/p&gt;
&lt;p&gt;真正麻烦的是：&lt;strong&gt;一旦业务语义被写进某个平台的私有结构里，它就很难成为企业自己的可迁移资产。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;今天你可能还在二选一。&lt;/p&gt;
&lt;p&gt;明天你可能是多云、多仓、多团队并存；有的团队在 Databricks，有的团队在 Snowflake，有的知识还在 Obsidian、Notion、dbt repo、GitHub、Confluence 里。&lt;/p&gt;
&lt;p&gt;这时候 OKF 的价值就出来了。&lt;/p&gt;
&lt;p&gt;OKF 不试图取代 Databricks Genie，也不试图取代 Snowflake Cortex。它更像一个中间层协议：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Databricks Genie / Unity Catalog
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ export / sync
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; OKF bundle
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↑ import / consume
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Snowflake Cortex / Semantic Views
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;理想情况下，企业可以把最核心的业务知识沉淀成 OKF bundle：指标定义、表关系、术语、runbook、verified query、历史变更、负责人、引用来源。&lt;/p&gt;
&lt;p&gt;然后 Databricks 可以读它，Snowflake 可以读它，内部 Agent 可以读它，未来换一个新的数据平台也能读它。&lt;/p&gt;
&lt;p&gt;这样，平台仍然可以竞争体验、性能、治理和执行引擎。&lt;/p&gt;
&lt;p&gt;但业务知识本身，不再被锁死在某一个平台里。&lt;/p&gt;
&lt;p&gt;这才是 OKF 最值得期待的地方：&lt;strong&gt;它让企业有机会把“语义层”从平台能力，升级成自己的知识资产。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Databricks Genie 和 Snowflake Cortex 各自强大，但 OKF 让业务语义有机会跨平台复用" class="gallery-image" data-flex-basis="135px" data-flex-grow="56" height="1672" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/open-knowledge-format/platform-semantics.webp" srcset="https://guige.ai/p/open-knowledge-format/platform-semantics_hu_f66177ccb2ac1269.webp 800w, https://guige.ai/p/open-knowledge-format/platform-semantics.webp 941w" width="941"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="它现在还很早但方向很对"&gt;它现在还很早，但方向很对
&lt;/h2&gt;&lt;p&gt;OKF 目前是 v0.1。&lt;/p&gt;
&lt;p&gt;Google Cloud 同时发布了几个参考实现：一个 BigQuery enrichment agent，一个静态 HTML visualizer，以及 GA4、Stack Overflow、Bitcoin public dataset 等 sample bundles。Google Cloud 的 Knowledge Catalog 也已经支持 ingest OKF 并服务给自家 Agent。&lt;/p&gt;
&lt;p&gt;这说明它已经不只是一个 PDF 规范，而是有了可跑的 producer、consumer 和样例。&lt;/p&gt;
&lt;p&gt;但我们也要清醒：OKF 还不是事实标准。&lt;/p&gt;
&lt;p&gt;它接下来要面对的问题不少：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;各家 catalog 和 wiki 是否愿意导出 OKF；&lt;/li&gt;
&lt;li&gt;企业内部是否愿意把知识当代码维护；&lt;/li&gt;
&lt;li&gt;frontmatter 字段会不会逐渐膨胀；&lt;/li&gt;
&lt;li&gt;权限、隐私、敏感信息如何和文件分发兼容；&lt;/li&gt;
&lt;li&gt;Agent 自动更新知识时，怎样保证审查和可信度；&lt;/li&gt;
&lt;li&gt;不同行业的概念模型能否在“最小约束”下保持互操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以，OKF 不是答案的终点。&lt;/p&gt;
&lt;p&gt;但它至少指出了一个很重要的方向：&lt;strong&gt;Agent 的能力边界，不只取决于模型，也取决于知识能不能被规范地交给它。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="OKF 从 v0.1 走向企业知识交换标准的演进路线" class="gallery-image" data-flex-basis="135px" data-flex-grow="56" height="1672" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/open-knowledge-format/okf-roadmap.webp" srcset="https://guige.ai/p/open-knowledge-format/okf-roadmap_hu_ed2fdbe0b487c563.webp 800w, https://guige.ai/p/open-knowledge-format/okf-roadmap.webp 941w" width="941"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="我们可以怎么用"&gt;我们可以怎么用？
&lt;/h2&gt;&lt;p&gt;如果你在团队里做 AI Agent、数据平台、知识库、内部工具，我建议不要急着问“要不要全面采用 OKF”。&lt;/p&gt;
&lt;p&gt;更实际的做法是：先挑一个小场景试。&lt;/p&gt;
&lt;p&gt;比如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;把一个核心指标做成 OKF bundle：
&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;metrics/weekly_active_users.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tables/events.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tables/users.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;runbooks/data-quality-check.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;references/product-definition.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;log.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后让 Agent 基于这些文件回答问题、生成 SQL、检查口径、解释异常。&lt;/p&gt;
&lt;p&gt;你很快就会发现：真正困难的不是写 Markdown，而是把团队脑子里的隐性知识显性化。&lt;/p&gt;
&lt;p&gt;这也是 OKF 最有价值的地方。&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;li&gt;哪些知识应该进版本控制？&lt;/li&gt;
&lt;li&gt;哪些更新必须经过人类 review？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些问题，本来就是企业做 AI Agent 绕不开的问题。&lt;/p&gt;
&lt;p&gt;OKF 只是给了一个足够朴素、足够可落地的容器。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="takeaway先别急着堆-agent先整理上下文"&gt;Takeaway：先别急着堆 Agent，先整理上下文
&lt;/h2&gt;&lt;p&gt;如果只记住一句话，我希望是这句：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AI Agent 的下一场竞争，不只是模型能力，而是上下文工程。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;模型会越来越强，工具调用会越来越顺，multi-agent 框架也会越来越多。&lt;/p&gt;
&lt;p&gt;但真正能让 Agent 在企业里稳定工作的，往往是那些看起来不性感的东西：指标定义、表关系、runbook、决策记录、历史变更、权限边界、业务口径。&lt;/p&gt;
&lt;p&gt;OKF 的启发是：不要把这些东西继续锁在工具里、聊天记录里、某个人脑子里。&lt;/p&gt;
&lt;p&gt;把它们变成文件。&lt;/p&gt;
&lt;p&gt;让人能读，让 Agent 能读，让 Git 能管理，让工具能迁移。&lt;/p&gt;
&lt;p&gt;这可能就是 AI 时代知识管理最朴素、也最关键的一步。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="参考资料"&gt;参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://cloud.google.com/blog/products/data-analytics/how-the-open-knowledge-format-can-improve-data-sharing" target="_blank" rel="noopener"
 &gt;Introducing the Open Knowledge Format, Google Cloud Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/GoogleCloudPlatform/knowledge-catalog/tree/main/okf" target="_blank" rel="noopener"
 &gt;GoogleCloudPlatform/knowledge-catalog: Open Knowledge Format repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.databricks.com/product/genie/one" target="_blank" rel="noopener"
 &gt;Databricks Genie One&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.databricks.com/aws/en/genie/" target="_blank" rel="noopener"
 &gt;Databricks Genie Spaces documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-analyst" target="_blank" rel="noopener"
 &gt;Snowflake Cortex Analyst documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.marktechpost.com/2026/06/16/google-cloud-introduces-open-knowledge-format-okf-a-vendor-neutral-markdown-spec-for-giving-ai-agents-curated-context/" target="_blank" rel="noopener"
 &gt;Google Cloud Introduces Open Knowledge Format, MarkTechPost&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f" target="_blank" rel="noopener"
 &gt;llm-wiki, Andrej Karpathy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>后端上下文工程：一个开源工具把 Claude Code 的账单砍掉 2/3</title><link>https://guige.ai/p/backend-context-engineering/</link><pubDate>Wed, 22 Apr 2026 00:00:00 +0000</pubDate><guid>https://guige.ai/p/backend-context-engineering/</guid><description>&lt;img src="https://guige.ai/" alt="Featured image of post 后端上下文工程：一个开源工具把 Claude Code 的账单砍掉 2/3" /&gt;&lt;p&gt;最近我一直在观察一件事：&lt;strong&gt;模型越来越强，但 Agent 的账单却越来越贵&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这听起来像个悖论。按理说模型更聪明了，应该一步到位，少走弯路，反而更省 token 才对。但现实里，我自己跑 Claude Code 也好，同事跑 Cursor Agent 也罢，同一个任务，换了更强的模型之后 token 账单反而涨了一截。&lt;/p&gt;
&lt;p&gt;前两天刷到 Avi Chawla 写的这篇 &lt;a class="link" href="https://x.com/_avichawla/status/2046500537584218438" target="_blank" rel="noopener"
 &gt;How to cut Claude Code costs by 3x&lt;/a&gt;，一下子把我憋了好久的一个直觉讲清楚了——&lt;strong&gt;问题不在模型，在后端。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更具体点：问题在后端是怎么把自己的状态&amp;quot;交代&amp;quot;给 Agent 的。这件事 Karpathy 在讲上下文工程（context engineering）的时候其实提过，但大部分人只把它当成一个&amp;quot;写 prompt 的技巧&amp;quot;，没意识到后端本身就是上下文的一部分。&lt;/p&gt;
&lt;h2 id="一个反直觉的数字"&gt;一个反直觉的数字
&lt;/h2&gt;&lt;p&gt;先看一张图，这是 MCPMark V2 跑的基准测试，21 个数据库任务，Supabase 的 MCP server 被调用产生的后端 token 消耗：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sonnet 4.5：11.6M tokens&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sonnet 4.6：17.9M tokens&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Sonnet 4.5 到 4.6，后端 token 反而涨了 50%" class="gallery-image" data-flex-basis="525px" data-flex-grow="218" height="548" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/backend-context-engineering/token-gap.webp" srcset="https://guige.ai/p/backend-context-engineering/token-gap_hu_b0cc01d1b6c97101.webp 800w, https://guige.ai/p/backend-context-engineering/token-gap.webp 1199w" width="1199"&gt;&lt;/p&gt;
&lt;p&gt;模型变聪明了，消耗反而多了 50%。&lt;/p&gt;
&lt;p&gt;这个结果第一次看到我是懵的，但仔细想一下其实合理：&lt;strong&gt;当后端给出的信息不完整时，更聪明的模型不会&amp;quot;跳过空白&amp;quot;，它会花更多 token 去推理那个空白&lt;/strong&gt;——多跑几次发现式查询，多重试几次，多尝试几种 workaround。&lt;/p&gt;
&lt;p&gt;换句话说，&amp;ldquo;缺失的上下文&amp;quot;不会因为你换了更好的模型就消失，它只会变得更贵。&lt;/p&gt;
&lt;h2 id="为什么-supabase-的-mcp-是个-token-黑洞"&gt;为什么 Supabase 的 MCP 是个 token 黑洞
&lt;/h2&gt;&lt;p&gt;Supabase 本身是个好产品，但它&lt;strong&gt;不是为 AI Agent 设计的&lt;/strong&gt;——MCP server 是后来贴上去的，继承了所有面向人类开发者的设计假设。三个机制直接导致 token 爆炸：&lt;/p&gt;
&lt;h3 id="1文档检索给一勺米端来一锅饭"&gt;1）文档检索：给一勺米，端来一锅饭
&lt;/h3&gt;&lt;p&gt;当 Claude Code 要在 Supabase 上配 Google OAuth，它会去调用 &lt;code&gt;search_docs&lt;/code&gt; 这个 MCP tool。Supabase 的实现是——&lt;strong&gt;每次调用都返回整块 GraphQL schema metadata&lt;/strong&gt;，token 量是 Agent 实际需要的 5-10 倍。&lt;/p&gt;
&lt;p&gt;&lt;img alt="每次 search_docs 都把整块域的文档全砸过来" class="gallery-image" data-flex-basis="480px" data-flex-grow="200" height="599" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/backend-context-engineering/docs-overhead.webp" srcset="https://guige.ai/p/backend-context-engineering/docs-overhead_hu_864d64815bc06072.webp 800w, https://guige.ai/p/backend-context-engineering/docs-overhead.webp 1200w" width="1200"&gt;&lt;/p&gt;
&lt;p&gt;你问 OAuth 怎么配，它把 email/password、magic link、phone auth、SAML、SSO 全给你一遍。&lt;/p&gt;
&lt;p&gt;这个模式发生在每一次 &lt;code&gt;search_docs&lt;/code&gt; 调用上——查数据库、查 storage 配置、查 edge function 部署……每次都是一整片 domain 的 metadata dump 下来。一个 session 里光这部分的&amp;quot;文档 overhead&amp;quot;就能消耗掉几千 token，而这些 token 里真正被用上的不到两成。&lt;/p&gt;
&lt;h3 id="2后端状态agent-看不到仪表盘"&gt;2）后端状态：Agent 看不到仪表盘
&lt;/h3&gt;&lt;p&gt;当你作为人类开发者用 Supabase 时，你打开 dashboard，一眼扫过去就知道：启用了哪些 auth provider，有哪些表，RLS 策略是什么，storage bucket 怎么配的，edge function 部署到哪一步了……&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agent 看不到 dashboard。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Supabase 没有\"一次性返回整个后端拓扑\"的接口" class="gallery-image" data-flex-basis="466px" data-flex-grow="194" height="617" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/backend-context-engineering/no-backend-visibility.webp" srcset="https://guige.ai/p/backend-context-engineering/no-backend-visibility_hu_9b7ac3a2612e1bcf.webp 800w, https://guige.ai/p/backend-context-engineering/no-backend-visibility.webp 1200w" width="1200"&gt;&lt;/p&gt;
&lt;p&gt;Supabase 的 MCP 确实暴露了一些状态查询接口——&lt;code&gt;list_tables&lt;/code&gt;、&lt;code&gt;execute_sql&lt;/code&gt; 之类——但&lt;strong&gt;没有一个接口能回答&amp;quot;我这个后端整体长什么样&amp;rdquo;&lt;/strong&gt;。Agent 只能一个个工具串着调，每次拿回来一小块，部分信息（比如哪些 auth provider 启用了）甚至根本不在 MCP 里。&lt;/p&gt;
&lt;p&gt;这个&amp;quot;拼图式&amp;quot;的状态发现过程本身就烧 token，而且经常拼不完整，要回头补查。&lt;/p&gt;
&lt;h3 id="3错误信息只告诉你-401不告诉你为什么-401"&gt;3）错误信息：只告诉你 401，不告诉你为什么 401
&lt;/h3&gt;&lt;p&gt;出错是必然的，因为 Agent 在猜。而 Supabase 返回的错误是&lt;strong&gt;原始错误信息&lt;/strong&gt;：RLS 拒绝了个 403，edge function 配错了给你 500，就这些。&lt;/p&gt;
&lt;p&gt;人类开发者看到错误，会去翻 dashboard、交叉比对日志、查 Supabase 的状态面板，最后定位问题。Agent 没有这个路径，它只能&lt;strong&gt;根据错误信息的字面意思去猜可能的原因，改一遍代码，再试一次&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;猜错了，再来一轮。&lt;strong&gt;每一轮重试都会把之前整个对话历史重新发一遍&lt;/strong&gt;，token 成本像滚雪球一样涨。&lt;/p&gt;
&lt;p&gt;这三个机制一叠加，Sonnet 4.6 这种&amp;quot;推理更深入&amp;quot;的模型反而会把 token gap 拉得更大——因为它每一步探索都更细、更花 token。&lt;/p&gt;
&lt;h2 id="上下文工程在后端长什么样"&gt;上下文工程在后端长什么样
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;修复方案不是换模型，而是给 Agent 一个结构化的后端上下文&lt;/strong&gt;，让它不用探索、不用猜。&lt;/p&gt;
&lt;p&gt;这正是 Karpathy 说的那句话：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;Context engineering: the delicate art and science of filling the context window with just the right information for the next step.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;Karpathy 明确把&lt;strong&gt;工具和状态&lt;/strong&gt;列入了 context 的一部分。大部分人把这个概念用在 prompt 和 RAG 检索上，但&lt;strong&gt;后端也是上下文窗口的一部分&lt;/strong&gt;——而且是目前几乎没人在优化的那部分。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/InsForge/InsForge" target="_blank" rel="noopener"
 &gt;InsForge&lt;/a&gt;（开源，8k star）就是冲这个问题去设计的。&lt;/p&gt;
&lt;p&gt;&lt;img alt="InsForge 的三层架构：Skills + CLI + MCP" class="gallery-image" data-flex-basis="257px" data-flex-grow="107" height="847" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/backend-context-engineering/insforge-overview.webp" srcset="https://guige.ai/p/backend-context-engineering/insforge-overview_hu_7fbe3ce946f7e7a7.webp 800w, https://guige.ai/p/backend-context-engineering/insforge-overview.webp 910w" width="910"&gt;&lt;/p&gt;
&lt;p&gt;它提供和 Supabase 类似的原语——Postgres + pgvector、auth、storage、edge functions、realtime——但&lt;strong&gt;信息层是按&amp;quot;Agent 消费效率&amp;quot;来组织的&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;核心架构是三层协作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Skills&lt;/strong&gt; 承载静态知识&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLI&lt;/strong&gt; 负责直接执行后端操作&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP&lt;/strong&gt; 只用来做实时状态查询&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;每一层解决一个具体问题，为不同原因省 token。&lt;/p&gt;
&lt;h3 id="1skills静态知识零往返"&gt;1）Skills：静态知识零往返
&lt;/h3&gt;&lt;p&gt;InsForge 选择用 Agent Skills 作为主要的知识承载方式——&lt;strong&gt;在 session 启动时就直接加载进 Agent context&lt;/strong&gt;，SDK 用法、代码示例、各种边界情况都不用走 tool call 就能拿到。&lt;/p&gt;
&lt;p&gt;而且 Skills 用的是&lt;strong&gt;渐进式披露&lt;/strong&gt;：初始只加载元信息（name、description，大概 70-150 token/skill），只有当 Agent 判断当前任务匹配才加载完整内容。这意味着你可以装上百个 Skills 也不会把 context 撑爆——这是 MCP 的&amp;quot;要么全加载要么不加载&amp;quot;做不到的。&lt;/p&gt;
&lt;p&gt;&lt;img alt="四个 Skill 各司其职" class="gallery-image" data-flex-basis="416px" data-flex-grow="173" height="650" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/backend-context-engineering/insforge-four-skills.webp" srcset="https://guige.ai/p/backend-context-engineering/insforge-four-skills_hu_2a67fca0f3631f3b.webp 800w, https://guige.ai/p/backend-context-engineering/insforge-four-skills.webp 1128w" width="1128"&gt;&lt;/p&gt;
&lt;p&gt;四个 Skill 覆盖全栈，每个都有明确的边界：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Skill&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;code&gt;insforge&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;前端代码怎么和后端对话&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;insforge-cli&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;后端基础设施管理&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;insforge-debug&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;结构化错误诊断（auth 错、慢查询、edge function 失败、RLS 拒绝等）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;insforge-integrations&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;第三方 auth provider（Clerk、Auth0、WorkOS、Kinde、Stytch）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;一行命令全装：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx skills add insforge/insforge-skills
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="2cli给-agent-的命令行手柄"&gt;2）CLI：给 Agent 的&amp;quot;命令行手柄&amp;quot;
&lt;/h3&gt;&lt;p&gt;真正执行后端操作——建表、跑 SQL、部署 function、管理 secret——InsForge 把 &lt;strong&gt;CLI 作为主要入口&lt;/strong&gt;，而不是 MCP。&lt;/p&gt;
&lt;p&gt;每个命令都支持 &lt;code&gt;--json&lt;/code&gt; 输出结构化结果，&lt;code&gt;-y&lt;/code&gt; 跳过确认，返回&lt;strong&gt;语义化的 exit code&lt;/strong&gt;，让 Agent 能直接通过返回码判断是 auth 失败、项目不存在还是权限问题。&lt;/p&gt;
&lt;p&gt;这个设计的好处是 Claude Code 可以把 CLI 输出接到 &lt;code&gt;jq&lt;/code&gt;、&lt;code&gt;grep&lt;/code&gt;、&lt;code&gt;awk&lt;/code&gt; 管道里，这是同样功能要用 MCP 实现时得连续调用好几次的事情。&lt;/p&gt;
&lt;p&gt;Scalekit 跑的对比基准显示：&lt;strong&gt;CLI+Skills 在单用户 workflow 里的 token 效率比等价 MCP 方案高 10-35 倍&lt;/strong&gt;，成功率接近 100%。&lt;/p&gt;
&lt;p&gt;一些典型的 Agent 实际执行的命令长这样：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 后端状态探查（Agent 第一件事就干这个）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx @insforge/cli metadata --json
&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="c1"&gt;# 数据库操作&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx @insforge/cli db query &lt;span class="s2"&gt;&amp;#34;CREATE TABLE posts (...)&amp;#34;&lt;/span&gt; --json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx @insforge/cli db policies
&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="c1"&gt;# Edge functions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx @insforge/cli functions deploy my-handler
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx @insforge/cli functions invoke my-handler --data &lt;span class="s1"&gt;&amp;#39;{&amp;#34;action&amp;#34;:&amp;#34;test&amp;#34;}&amp;#39;&lt;/span&gt; --json
&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="c1"&gt;# Storage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx @insforge/cli storage create-bucket documents --json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx @insforge/cli storage upload ./file.pdf --bucket documents
&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="c1"&gt;# 诊断&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx @insforge/cli diagnose db --check connections,locks,slow-queries
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Agent 直接 parse JSON，然后根据 exit code 处理错误——干净、确定、可脚本化。&lt;/p&gt;
&lt;h3 id="3mcp只用来看活的状态"&gt;3）MCP：只用来看&amp;quot;活的状态&amp;quot;
&lt;/h3&gt;&lt;p&gt;MCP 这个路径也保留了，但&lt;strong&gt;用途变得很窄&lt;/strong&gt;——只用来查后端当前的实时状态。&lt;/p&gt;
&lt;p&gt;InsForge 的 MCP server 只暴露了一个轻量的 &lt;code&gt;get_backend_metadata&lt;/code&gt; 工具，一次调用返回整个后端的拓扑：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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;auth&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&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;providers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;google&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;github&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;jwt_secret&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;configured&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;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tables&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&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="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;users&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;columns&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;email&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;created_at&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;rls&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;enabled&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="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;posts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;columns&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;body&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;author_id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;rls&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;enabled&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="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;storage&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;buckets&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;avatars&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;documents&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&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;ai&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;models&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;id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;gpt-4o&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;capabilities&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;chat&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;vision&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]}]&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;hints&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Use RPC for batch operations&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Storage accepts files up to 50MB&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="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;一次调用、大约 500 token，Agent 就掌握了整个后端拓扑&lt;/strong&gt;。其中 &lt;code&gt;hints&lt;/code&gt; 字段是 Agent 专用的使用提示，能直接减少 API 误用。&lt;/p&gt;
&lt;p&gt;关键的设计选择是：&lt;strong&gt;MCP 只做&amp;quot;会变化的状态查询&amp;quot;，不做&amp;quot;静态文档检索&amp;quot;&lt;/strong&gt;——这和业界默认的用法正好反过来，也是 InsForge 比 Supabase 省 token 的根本原因。&lt;/p&gt;
&lt;h2 id="实战对比用-claude-code-造同一个-rag-应用"&gt;实战对比：用 Claude Code 造同一个 RAG 应用
&lt;/h2&gt;&lt;p&gt;作者选了一个应用叫 DocuRAG：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Google OAuth 登录&lt;/li&gt;
&lt;li&gt;上传 PDF&lt;/li&gt;
&lt;li&gt;自动 chunk + embed（&lt;code&gt;text-embedding-3-small&lt;/code&gt;，1536 维）&lt;/li&gt;
&lt;li&gt;向量存进 pgvector&lt;/li&gt;
&lt;li&gt;用户问问题，系统 embed 查询、检索相关 chunk、GPT-4o 生成回答&lt;/li&gt;
&lt;li&gt;RLS 隔离不同用户的文档&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一次覆盖：&lt;strong&gt;auth、storage、documents 表、vector embedding、embedding 生成、chat completion、retrieval edge function、RLS&lt;/strong&gt;——几乎所有后端原语都碰上了。&lt;/p&gt;
&lt;p&gt;同一份 prompt，唯一的差别是 Supabase 版本要声明&amp;quot;LLMs/embedding models via the OpenAI API&amp;quot;（两套系统要接），InsForge 版本只需要&amp;quot;also for the model gateway&amp;quot;（一套系统）。&lt;/p&gt;
&lt;p&gt;作者把两次完整的 Claude Code session 录下来了：&lt;/p&gt;
&lt;p&gt;&lt;img alt="video" class="gallery-image" data-flex-basis="315px" data-flex-grow="131" height="822" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/backend-context-engineering/video-poster.webp" srcset="https://guige.ai/p/backend-context-engineering/video-poster_hu_4a361166cee4e3ef.webp 800w, https://guige.ai/p/backend-context-engineering/video-poster.webp 1080w" width="1080"&gt;&lt;/p&gt;
&lt;video controls style="max-width:100%;height:auto;"&gt;
 &lt;source src="video-001.mp4" type="video/mp4"&gt;
&lt;/video&gt;
&lt;p&gt;&lt;strong&gt;顺便提一句录像里没捕捉到的细节&lt;/strong&gt;：Supabase 那次，Google OAuth 需要手动在 Google Cloud Console 里建 OAuth 2.0 Client ID、配 consent screen、加测试用户、复制 Client ID 和 Secret 粘回 Supabase dashboard——这些都不在 Claude Code 的控制范围内。InsForge 则完全不用这一步。&lt;/p&gt;
&lt;p&gt;先看最后的账单：&lt;/p&gt;
&lt;p&gt;&lt;img alt="最终 token 和成本对比" class="gallery-image" data-flex-basis="679px" data-flex-grow="283" height="424" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/backend-context-engineering/final-stats.webp" srcset="https://guige.ai/p/backend-context-engineering/final-stats_hu_c477a596566a29d3.webp 800w, https://guige.ai/p/backend-context-engineering/final-stats.webp 1200w" width="1200"&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;后端&lt;/th&gt;
 &lt;th&gt;Token&lt;/th&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;Supabase&lt;/td&gt;
 &lt;td&gt;10.4M&lt;/td&gt;
 &lt;td&gt;$9.21&lt;/td&gt;
 &lt;td&gt;12 条&lt;/td&gt;
 &lt;td&gt;10 条&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;InsForge&lt;/td&gt;
 &lt;td&gt;3.7M&lt;/td&gt;
 &lt;td&gt;$2.81&lt;/td&gt;
 &lt;td&gt;1 条&lt;/td&gt;
 &lt;td&gt;0 条&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;3x 的差距&lt;/strong&gt;。现在我们看看两次 session 具体发生了什么。&lt;/p&gt;
&lt;h2 id="supabase104m-token-的大部分都花在调错上"&gt;Supabase：10.4M token 的大部分都花在调错上
&lt;/h2&gt;&lt;p&gt;初始构建其实很顺。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Supabase 首次构建：schema、edge function 都搞定了" class="gallery-image" data-flex-basis="427px" data-flex-grow="177" height="503" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/backend-context-engineering/supabase-initial-build.webp" srcset="https://guige.ai/p/backend-context-engineering/supabase-initial-build_hu_b57ce3bf2ff2b9f6.webp 800w, https://guige.ai/p/backend-context-engineering/supabase-initial-build.webp 895w" width="895"&gt;&lt;/p&gt;
&lt;p&gt;Agent 加载了 &lt;code&gt;supabase&lt;/code&gt; skill，用 MCP 的 &lt;code&gt;list_tables&lt;/code&gt;、&lt;code&gt;list_extensions&lt;/code&gt;、&lt;code&gt;execute_sql&lt;/code&gt; 把后端状态摸了一遍，scaffold 了 Next.js 项目，建了库表，写了两个 edge function（&lt;code&gt;ingest-document&lt;/code&gt; 和 &lt;code&gt;query-document&lt;/code&gt;），部署完成，build 通过。&lt;/p&gt;
&lt;p&gt;然后开始翻车。&lt;/p&gt;
&lt;h3 id="第一个坑登录直接不工作"&gt;第一个坑：登录直接不工作
&lt;/h3&gt;&lt;p&gt;&lt;img alt="Google OAuth 登录失败" class="gallery-image" data-flex-basis="602px" data-flex-grow="251" height="358" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/backend-context-engineering/supabase-login-error.webp" srcset="https://guige.ai/p/backend-context-engineering/supabase-login-error_hu_b1bf3ebfcc2a8a3.webp 800w, https://guige.ai/p/backend-context-engineering/supabase-login-error.webp 899w" width="899"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="OAuth 回调报错" class="gallery-image" data-flex-basis="602px" data-flex-grow="251" height="358" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/backend-context-engineering/supabase-oauth-fail.webp" srcset="https://guige.ai/p/backend-context-engineering/supabase-oauth-fail_hu_b1bf3ebfcc2a8a3.webp 800w, https://guige.ai/p/backend-context-engineering/supabase-oauth-fail.webp 899w" width="899"&gt;&lt;/p&gt;
&lt;p&gt;问题在于 Next.js 下 OAuth 回调跑在 server 端，但 Agent 给你装的是&lt;strong&gt;客户端 Supabase 库&lt;/strong&gt;，把 session 存在浏览器里——server 端拿不到，登录整个崩了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="换成 @supabase/ssr 后重新连通" class="gallery-image" data-flex-basis="297px" data-flex-grow="123" height="742" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/backend-context-engineering/supabase-ssr-fix.webp" srcset="https://guige.ai/p/backend-context-engineering/supabase-ssr-fix_hu_db5246a124c81120.webp 800w, https://guige.ai/p/backend-context-engineering/supabase-ssr-fix.webp 920w" width="920"&gt;&lt;/p&gt;
&lt;p&gt;Agent 切到 &lt;code&gt;@supabase/ssr&lt;/code&gt;，重写了 session 处理，重新构建——算是过了。&lt;/p&gt;
&lt;h3 id="第二个坑上传文档连续-8-轮失败"&gt;第二个坑：上传文档，连续 8 轮失败
&lt;/h3&gt;&lt;p&gt;登录修好之后试上传，edge function 报错。我报错 → Agent 改 → 失败 → 再报错 → 再改 → 同一个错。&lt;strong&gt;这个循环跑了 8 次&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;img alt="8 轮修复尝试" class="gallery-image" data-flex-basis="326px" data-flex-grow="136" height="881" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/backend-context-engineering/supabase-retry-loop.webp" srcset="https://guige.ai/p/backend-context-engineering/supabase-retry-loop_hu_af9d4f675ad9a206.webp 800w, https://guige.ai/p/backend-context-engineering/supabase-retry-loop.webp 1200w" width="1200"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;加 auth header → 同样错误&lt;/li&gt;
&lt;li&gt;加日志重新部署 → 同样错误&lt;/li&gt;
&lt;li&gt;打印真实错误信息 → 变成 CORS 错误&lt;/li&gt;
&lt;li&gt;修 CORS → 回到原来的错误&lt;/li&gt;
&lt;li&gt;换一种读取用户 token 的方法 → 同样错误&lt;/li&gt;
&lt;li&gt;换另一种鉴权方式 → 同样错误&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;8 轮之后，Agent 终于说了句：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&amp;ldquo;The 401s may be happening at the platform&amp;rsquo;s verify_jwt gate before our code even runs.&amp;rdquo;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="verify_jwt 在平台层直接拒绝了请求" class="gallery-image" data-flex-basis="543px" data-flex-grow="226" height="445" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/backend-context-engineering/supabase-verify-jwt.webp" srcset="https://guige.ai/p/backend-context-engineering/supabase-verify-jwt_hu_5d533ab5d1ab6f7b.webp 800w, https://guige.ai/p/backend-context-engineering/supabase-verify-jwt.webp 1008w" width="1008"&gt;&lt;/p&gt;
&lt;p&gt;翻译一下：&lt;strong&gt;Supabase 在平台层有个自动 token 检查，发生在你的 edge function 代码执行之前&lt;/strong&gt;。前面换 &lt;code&gt;@supabase/ssr&lt;/code&gt; 的时候，新库发送的 token 格式平台层不认，所有请求在&amp;quot;门口&amp;quot;就被拒了，function 代码根本没跑起来——所以 8 轮代码级别的修复全都不对。&lt;/p&gt;
&lt;p&gt;解法很简单：&lt;strong&gt;关掉平台的自动 token 检查，在 function 内部自己做鉴权&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;但这 8 轮里 edge function 被重新部署了 8 次（加上最初的 2 次就是 10 次），每一次重新部署、每一次看日志、每一次重试，&lt;strong&gt;都会把越来越长的对话历史重新塞进 context&lt;/strong&gt;——token 就是这么滚起来的。&lt;/p&gt;
&lt;p&gt;Supabase 的最终统计：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;12 条用户消息（其中 10 条是报错）&lt;/li&gt;
&lt;li&gt;135 次 tool call&lt;/li&gt;
&lt;li&gt;30+ 次 MCP 调用&lt;/li&gt;
&lt;li&gt;10.4M token&lt;/li&gt;
&lt;li&gt;$9.21&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="insforge37m-token零错误干预"&gt;InsForge：3.7M token，零错误干预
&lt;/h2&gt;&lt;p&gt;InsForge 这边，&lt;strong&gt;全程没有一次需要我介入的错误&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;Agent 第一件事是 &lt;code&gt;npx @insforge/cli metadata --json&lt;/code&gt;：&lt;/p&gt;
&lt;p&gt;&lt;img alt="一次调用拿到整个后端状态" class="gallery-image" data-flex-basis="312px" data-flex-grow="130" height="739" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/backend-context-engineering/insforge-metadata.webp" srcset="https://guige.ai/p/backend-context-engineering/insforge-metadata_hu_318261f56e5bc32d.webp 800w, https://guige.ai/p/backend-context-engineering/insforge-metadata.webp 962w" width="962"&gt;&lt;/p&gt;
&lt;p&gt;一次返回：auth provider、现有表、storage bucket、可用 AI 模型、realtime channel。&lt;strong&gt;Agent 在写任何代码之前就已经对这个后端有了完整认知&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;对比 Supabase 那次要调多个 MCP tool 才能拼出类似认知，而且还漏掉了 &lt;code&gt;verify_jwt&lt;/code&gt; 这种关键细节——差距在这里就已经拉开了。&lt;/p&gt;
&lt;p&gt;Schema 建立跑了 6 条 CLI 命令，全部成功：&lt;/p&gt;
&lt;p&gt;&lt;img alt="6 条 CLI 命令一次过" class="gallery-image" data-flex-basis="252px" data-flex-grow="105" height="896" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/backend-context-engineering/insforge-schema.webp" srcset="https://guige.ai/p/backend-context-engineering/insforge-schema_hu_75da054265089458.webp 800w, https://guige.ai/p/backend-context-engineering/insforge-schema.webp 942w" width="942"&gt;&lt;/p&gt;
&lt;p&gt;启用 pgvector、建 &lt;code&gt;documents&lt;/code&gt; 和 &lt;code&gt;chunks&lt;/code&gt; 表（带 &lt;code&gt;vector(1536)&lt;/code&gt; 列）、在两张表上开 RLS、创建访问策略、建 &lt;code&gt;match_chunks&lt;/code&gt; 相似度搜索函数。每一条都返回结构化输出确认执行了什么，Agent 逐步验证。&lt;/p&gt;
&lt;p&gt;&lt;img alt="两个 edge function 一次部署成功" class="gallery-image" data-flex-basis="316px" data-flex-grow="132" height="858" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/backend-context-engineering/insforge-functions.webp" srcset="https://guige.ai/p/backend-context-engineering/insforge-functions_hu_15aca105a5864f57.webp 800w, https://guige.ai/p/backend-context-engineering/insforge-functions.webp 1133w" width="1133"&gt;&lt;/p&gt;
&lt;p&gt;Supabase 那边的 auth 和 edge function 坑——这边一个都没撞上：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;insforge&lt;/code&gt; skill 自带了 Next.js 下正确的客户端库用法，Agent 一次写对&lt;/li&gt;
&lt;li&gt;两个 edge function（&lt;code&gt;embed-chunks&lt;/code&gt; 和 &lt;code&gt;query-rag&lt;/code&gt;）因为 &lt;strong&gt;embedding 和 chat completion 都在同一个 model gateway 里&lt;/strong&gt;，直接调就行，不用单独接 OpenAI、不用管第二套 API key、不用处理跨服务鉴权&lt;/li&gt;
&lt;li&gt;metadata 里已经列出了 &lt;code&gt;text-embedding-3-small&lt;/code&gt; 和 &lt;code&gt;gpt-4o&lt;/code&gt;，Agent 通过 InsForge SDK 直接调用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最终：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1 条用户消息&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;77 次 tool call&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;0 次 MCP 调用&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;3.7M token&lt;/li&gt;
&lt;li&gt;$2.81&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;作者让 Claude 生成的对照表：&lt;/p&gt;
&lt;p&gt;&lt;img alt="完整对照表" class="gallery-image" data-flex-basis="308px" data-flex-grow="128" height="933" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/backend-context-engineering/summary-table.webp" srcset="https://guige.ai/p/backend-context-engineering/summary-table_hu_961c980bfd773236.webp 800w, https://guige.ai/p/backend-context-engineering/summary-table.webp 1200w" width="1200"&gt;&lt;/p&gt;
&lt;h2 id="我自己的体感"&gt;我自己的体感
&lt;/h2&gt;&lt;p&gt;看完这个对比，我最大的感慨不是&amp;quot;InsForge 比 Supabase 强&amp;quot;——&lt;strong&gt;这不是产品优劣的问题，是架构假设的问题&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img alt="给人用的后端，和给 Agent 用的后端，根本不是一回事" class="gallery-image" data-flex-basis="466px" data-flex-grow="194" height="617" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://guige.ai/p/backend-context-engineering/assumption-broken.webp" srcset="https://guige.ai/p/backend-context-engineering/assumption-broken_hu_9b7ac3a2612e1bcf.webp 800w, https://guige.ai/p/backend-context-engineering/assumption-broken.webp 1200w" width="1200"&gt;&lt;/p&gt;
&lt;p&gt;我过去几个月用 Claude Code 跑全栈任务，有个特别直观的感受：&lt;strong&gt;Agent 花在&amp;quot;搞清楚现在是什么状态&amp;quot;上的 token，常常比&amp;quot;写代码&amp;quot;还多&lt;/strong&gt;。你看它在那里 &lt;code&gt;ls&lt;/code&gt; 来 &lt;code&gt;ls&lt;/code&gt; 去，&lt;code&gt;grep&lt;/code&gt; 来 &lt;code&gt;grep&lt;/code&gt; 去，尝试各种命令去探测配置……每一步都是 token。&lt;/p&gt;
&lt;p&gt;Supabase 这类后端本来就是给人类开发者设计的：人类可以看 dashboard、可以翻多个 tab 对比、可以凭经验&amp;quot;感觉到&amp;quot;问题大概在哪一层。Agent 一样都做不到——&lt;strong&gt;它只能从你返回给它的字节里推理&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;如果后端返回的字节里不包含&amp;quot;verify_jwt 把请求在门口挡掉了&amp;quot;这个信号，它就永远不知道问题在上游，只会在代码层打转。&lt;/p&gt;
&lt;p&gt;这件事反过来对我写代码也有启发：&lt;strong&gt;当你给 Agent 提供接口或工具的时候，得用&amp;quot;Agent 视角&amp;quot;重新设计一遍返回值&lt;/strong&gt;——错误信息要结构化、状态查询要原子化、成功失败要有明确的语义码、文档要按任务切片而不是按资源切片。&lt;/p&gt;
&lt;p&gt;这不是 nice-to-have，是 cost driver。&lt;/p&gt;
&lt;h2 id="takeaway"&gt;Takeaway
&lt;/h2&gt;&lt;p&gt;如果要我用一句话总结这篇文章的价值：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;修的不是模型，也不是 context window，是后端怎么把自己交代给 Agent 这件事本身。&lt;/strong&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;几个可以直接拿走的判断：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Token 账单涨了不一定是模型的锅&lt;/strong&gt;。先去看看 tool call 的 input/output 形状——尤其是那些每次 dump 一大坨 metadata 的&amp;quot;便利接口&amp;quot;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP 不该用来查文档&lt;/strong&gt;。静态知识走 Skills（进 context 一次就够），MCP 只留给&amp;quot;活的状态&amp;quot;。这和业界默认用法是反的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLI 是被低估的 Agent 接口&lt;/strong&gt;。&lt;code&gt;--json&lt;/code&gt; 输出 + 语义化 exit code + 标准 Unix 管道，在大多数场景比 MCP 工具链更省 token、更易验证。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;错误信号的结构，比错误信息的文字更重要&lt;/strong&gt;。如果你的平台只告诉 Agent &amp;ldquo;401&amp;rdquo;，它会花 8 轮去猜 401 是谁发的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;设计后端接口的时候，问自己一个问题&lt;/strong&gt;：一个刚接入的 Agent，看完我的 metadata/docs/error，能不能一次就知道&amp;quot;下一步该干什么&amp;quot;？如果不能，你的 token 账单就在这里。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;InsForge 本身只是这个思路的一个落地，但&lt;strong&gt;这个思路是通用的&lt;/strong&gt;——无论你用什么后端、什么 Agent 框架，&amp;ldquo;把上下文主动喂过去&amp;quot;永远比&amp;quot;让 Agent 探索式发现&amp;quot;便宜一个量级。&lt;/p&gt;
&lt;p&gt;Karpathy 说得对：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;填满 context window 的&amp;quot;正确信息&amp;rdquo;，是做 Agent 最核心的技能。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;而后端基础设施，是这些&amp;quot;正确信息&amp;quot;最大的一块来源——而这恰恰是大多数人都还没开始做的地方。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="参考资料"&gt;参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;原推文：&lt;a class="link" href="https://x.com/_avichawla/status/2046500537584218438" target="_blank" rel="noopener"
 &gt;Avi Chawla — How to cut Claude Code costs by 3x&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;InsForge 开源仓库：&lt;a class="link" href="https://github.com/InsForge/InsForge" target="_blank" rel="noopener"
 &gt;github.com/InsForge/InsForge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Karpathy 的 Context Engineering 原贴（作者引用的出处）&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>