Research · Codebase Case Agent Knowledge Infrastructure 解读 / 2026

Open Knowledge
Format

把数据资产周围的 schema、指标、join path、runbook 与业务语境, 沉淀成一束人和 agent 都能读写、可 git 管理、可被多方消费的 markdown 文件。

--- okf-reading.md ---
type
Research Note · OKF v0.1 解读
subject
Open Knowledge Format(Google Cloud Data Cloud)
sources
Google Cloud Blog · GoogleCloudPlatform/knowledge-catalog@2d0bb3f
analyzed
2026-06-16 · 30 concepts / 35 edges
tags
[format, interoperability, agent-knowledge, metadata-as-code]

OKF 不是另一个知识服务, 而是一层 format-first 的 agent 知识交换格式。

企业里 agent 要回答一个业务问题,往往得跨 catalog、wiki、代码、notebook 和专家记忆, 把表 schema、指标定义、join path、runbook、业务口径重新拼一遍。 Google 的关键判断不是“再建一个知识平台”,而是把知识交换层下沉为一种文件格式—— 它能被 git、文件系统、静态站点、搜索索引和各种 agent 直接消费,不需要 API、账号、SDK 与迁移。

标准化的面被压到极小:一个 bundle 就是一棵 markdown 目录树, concept 的身份就是它的文件路径,关系就是普通 markdown 链接, 元数据就是 YAML frontmatter——而规范真正强制的字段只有一个 type。 下面按“为什么是现在 → 格式契约 → 生产线 → 消费端 → catalog 接入 → 样例 → 边界 → 启发”逐层拆开, 并对每个判断保留可核对的源码证据。

§ 01 — 动机与定位

为什么现在

OKF 的起点不是模型不会推理,而是 agent 缺少可携带、可验证、可跨工具复用的上下文。

上下文碎片化是真正的起点。 一个 agent 要回答“这张表能不能用来算复购率”,需要的不只是 schema,还有指标口径、 可用的 join、历史 runbook、以及谁在什么语境下定义了这些。这些知识散落在不同系统里, 每次都要重新拼装——OKF 把这一块拎出来作为要解决的问题。

所以 Google 选择 format,而不是又一个 service。 服务意味着 API、认证、SDK、迁移成本;格式则可以被既有工具链直接吃下。 SPEC 的 non-goals 明确排除了“固定 taxonomy”和“规定存储/查询基础设施”—— OKF references 既有 schema(Avro、Protobuf、OpenAPI),而不试图取代它们。

这其实是给 LLM-wiki 实践上规格。 Obsidian、Notion、AGENTS.md 这类 markdown 知识库早就存在,缺的是一套可交换的最小约定。 Google 的战略叙事,是让生产者、消费者和 catalog 供应商共享一种文件级语言,而不是共享同一个产品—— 一个知识交换的 lingua franca。

Evidence format, not platform
SPEC.md:41–47non-goals:不定义固定 taxonomy、不规定基础设施、不取代领域 schema
SPEC.md:366–379与 LLM-wiki / Obsidian / metadata-as-code 的关系
README.md:5–25vendor-neutral 定位
GC Blogfragmented context · where we go from here
okf/SPEC.md§ Non-goals
# OKF references other schemas;
# it does not subsume them.

 定义固定的 concept 类型表
 规定存储 / 服务 / 查询基础设施
 取代 Avro · Protobuf · OpenAPI
§ 02 — 格式契约

真正被标准化的那一小块

OKF v0.1 标准化的,只是让一个知识语料“自描述”所需的最小结构约定。其余全部交给生产者。

分发单位是 Knowledge Bundle——一棵 markdown 目录树,可以是 git repo、tarball, 或大仓库里的一个子目录。每个 concept 是一个 markdown 文件,由 YAML frontmatter 和正文组成; 它的 Concept ID 就是去掉 .md 后缀的相对路径——身份绑定到文件系统,不需要额外 registry。

tables/orders.mdfrontmatter + body
---
type: BigQuery Table            # REQUIRED — 唯一强制字段
title: Orders
description: One row per completed order.
resource: https://console.cloud.google…
tags: [sales, orders, revenue]
timestamp: 2026-05-28T14:30:00Z
---

# Schema
| order_id    | STRING  | 唯一订单号           |
| customer_id | STRING  | FK → [customers](/tables/customers.md) |

# Joins
Joined with [customers](/tables/customers.md) on customer_id.
Evidence 最小契约
SPEC.md:50–68terminology:bundle / concept / concept-id = path
SPEC.md:122–162frontmatter:仅 type 必填,其余推荐 + 允许自定义
SPEC.md:233–267cross-linking:markdown 链接即关系,类型由上下文承载
SPEC.md:341–362conformance:宽容消费,断链 / 未知 type 不算非法
my_bundle/directory tree
my_bundle/
├── index.md      # 可选 · 渐进浏览
├── log.md        # 可选 · 变更时间线
├── datasets/
│   └── sales.md
└── tables/
    ├── orders.md
    └── customers.md

bundle = directory tree

分发单位是一棵 markdown 目录树。知识被降到软件团队已经熟悉的协作原语:clone、diff、review、blame、tarball、静态托管。

concept id = path

概念身份就是 bundle 内相对路径,无需中心 registry;移动、链接、代码审查仍服从文件系统语义。

frontmatter type 必填

只强制 type,推荐 title / description / resource / tags / timestamp,其余字段生产者自定义、消费者宽容保留。

links = the graph

普通 markdown 链接是唯一的图边;A→B 断言一种关系,具体类型由周围 prose 承载,而不编码在链接里。

index.md · log.md

保留文件名:index 支持渐进披露,log 记录局部变更时间线。两者都非必需,消费者可按需即时合成。

permissive consumption

conformant 门槛被刻意压低:未知 type、额外字段、断链、缺 index 都不得让消费者拒绝 bundle。为生态早期增长让路。

— 一张总览图 —

从 source metadata 多方消费

仓库里的 reference 实现把这套格式落成一条可运行的生产—消费链路;格式本身不要求其中任何一环。

PRODUCER FORMAT CONSUMERS Source BigQuery metadata schema · samples BQ pass 写基础文档 web pass 增强引用 · 指标 · join OKF bundle markdown + frontmatter + links · git-able write-once guardrails Static visualizer 单文件 HTML 图谱 Knowledge Catalog DocumentsLayout → Dataplex Agents & humans cat · git clone · read/write write-once
Source metadata → BQ pass + web pass → OKF bundle → visualizer / catalog / agent · 每个消费者都只读同一束文件
§ 03 — 生产端

一条受约束的知识增量循环

reference enrichment agent 是一个 proof-of-concept 生产者:用 Google ADK + Gemini,把 source metadata 写成 OKF 文档,并靠写入约束保证结构不退化。

Source interface src/enrichment_agent/sources/base.py:8–32

生产端被抽象成三件事:列出概念、读取概念 metadata、可选采样行。 BigQuery 只是第一个实现——这把“知识从哪来”做成了可插拔的接口。

BigQuerySource sources/bigquery.py:29–208

它把 dataset 与 table/view 映射为 concepts,并对日期分片表族(events_YYYYMMDD) 做 wildcard family 聚合,提供 schema、partition、clustering、sample rows 等原始事实。

两段式 runner runner.py:155–280

先 BQ pass:逐个 concept 跑 BQ agent 写出基础文档; 再 web pass:当存在 seed URL 时,抓取权威页面,把指标、join path、引用与语义说明补进去。 收尾自动 regenerate 各级 index.md

write_concept_doc guardrails tools/bundle_tools.py:73–161

最有工程味的部分:agent 不能自由写文件系统,只能通过一个窄工具落盘。 web pass 更新已有文档时,不能删 schema 字段、不能减少 citations, 必须在旧结构上增强——这是让增强保持单调性的反馈控制器。

Evidence producer pipeline
runner.py:155–280EnrichmentRunner:BQ pass → web pass → index 重建
agent.py:27–53build_bq_agent / build_web_agent
bundle_tools.py:73–161write_concept_doc:frontmatter 校验 · 字段顺序 · 不缩水
web_ingestion_instruction.md:88–134augmentation rules:只增不删
web_ingestion · augmentation
# web pass 被约束为「只增强,不重写」
keep   existing schema fields
keep   existing citations
add    metrics · joins · references
add    business context (cited)
write  once, at the very end
Perspective cybernetic loop
source 给事实骨架 → BQ agent 写文档 → web pass 加语义与引用 → guardrails 防退化 → index/viewer 让人和 agent 继续浏览。 这不是一次性导出 metadata,而是一个可 review、可继续读写的增量循环。
§ 04 — 消费端

一个静态 HTML 就能读懂整束知识

visualizer 同样在证明 format-first:它只是一个把 bundle 预解析进单个 HTML 的离线视图——OKF 本身并不要求它存在。

graph = concepts + markdown links。 visualizer 读取所有非 index 的 markdown 文件作为节点,再从正文里的 .md 链接 抽取 directed edges 和 backlinks,用 Cytoscape.js 画图、marked 渲染正文——无需后端

detail panel 重放 OKF 文档。 选中节点后展示 type、title、description、resource、tags 与 markdown body, 并把内部绝对 .md 链接改写成图内跳转。图谱只是导航,详情面板才是真正阅读知识的地方。

这一端的意义不在于 viewer 本身有多强,而在于它证明了:这种文件束可以被任何人用一段静态代码转成可浏览的知识图谱

Evidence static visualizer
viewer/generator.py:48–126graph builder:节点 + 从链接抽边
viewer/generator.py:139–175generate_visualization:bundle → 内嵌 JSON
viewer/static/viz.js:138–235detail panel + 内链改写
README.md:157–214visualize 子命令 · 单文件 HTML
okf visualize ./bundle
# 输出一个自包含 HTML
parse   *.md (≠ index)  → nodes
extract [..](.md) links  → edges + backlinks
embed   graph JSON      → <script>
render  Cytoscape.js · marked
no server · no build step
§ 05 — Catalog 接入

Knowledge Catalog 只是其中一个消费者

Dataplex 侧能 ingest OKF,但它不是 OKF 的唯一宿主——这个姿态对一个开源格式很关键。

DocumentsLayout 把文件映射成 entry。 mdcode 的 DocumentsLayout 把每个 .md 映射为 Knowledge Catalog entry: frontmatter 映射到资源字段,markdown body 映射到 overview aspect。 路径如 references/metrics/event_count.md 会变成同名 entry。

CatalogSnapshot + CatalogSync。 mdcode 用 manifest 选择 source/layout,再通过 pull/push 在本地文件快照和 Dataplex API 之间 同步 entry 与 aspect——一条标准的 metadata-as-code 路径,把 OKF 从 repo artifact 推向服务内可用知识。

但接入也暴露了一个代价:OKF 的自由 type 进入 Dataplex 的 type 系统时会被保守映射。 只有合法的三段式 type ref 会被保留,否则 fallback 到 dataplex-types.global.generic—— ingest 变简单,却牺牲了一部分领域类型语义。(见 §07)

Evidence documents layout
mdcode/layouts/documents.ts:16–95DocumentsLayout load:md → entry
documents.ts:185–219parseMarkdown · type fallback → generic
mdcode/sync.ts:30–119pull / push 同步 entry + aspect
mdcode/demo/README.md:121–163okf_ga4 EntryGroup demo
DocumentsLayout · mapping
references/metrics/event_count.md
        
          DocumentsLayout
entry:   event_count
type:    <3-part ref> || generic
aspect:  overview ← md body
fields:  ← frontmatter
§ 06 — 样例

价值在使用语义,不只在 schema

仓库里的三个样例 bundle 展示了 OKF 能在不同密度上工作——从轻量表族,到把指标和 join 实体化为一等概念。

bundles/ga4/

GA4:指标与 join 被实体化

只有一张主表,却生成了多个 metric / reference 文档,并从主表链接过去。OKF 的价值显现在“怎么用”,而非仅仅 schema。

bundles/stackoverflow/

Stack Overflow:reference 爆发

把帖子类型、投票类型、审核状态、license 等从主表周边抽为 reference,适合解释结构复杂的公共数据集。

bundles/crypto_bitcoin/

Bitcoin:轻量表族 bundle

更接近传统 catalog:dataset + blocks / transactions / inputs / outputs 四张表。说明 OKF 可以从轻量 schema 起步,不必一次语义化到底。

bundles/ga4/tables/events_.md真实样例节选
# Metrics
- [Event Count](../references/metrics/event_count.md) — 事件总数
- [New User Count](../references/metrics/new_user_count.md) — 首访用户数
- [Avg Pageviews](../references/metrics/avg_pageviews.md) — 人均浏览

# Joins
- [Events → Ads Clicks](../references/joins/events___ads_clickstats.md)
  join on collected_traffic_source.gclid

# Citations
- developers.google.com/analytics/bigquery/…
Evidence samples
ga4/tables/events_.md:18–31主表 → metrics / joins 的链接群
ga4/references/metrics/event_count.md指标作为一等 concept
stackoverflow/tables/posts_questions.mdreference 扩展
crypto_bitcoin/index.md:1–10轻量表族 bundle

这正是 §02 那条“markdown links 形成知识图”的具象化:一张表通过普通链接, 指向围绕它的指标与 join——而这些指标本身又是可被独立引用、独立消费的概念。

§ 07 — 边界

v0.1 的设计张力

现在该看的不是“能不能跑”,而是“标准极简”与“工具可用”之间的张力。它更像一份标准提案 + 一个可运行 PoC。

规范 ↔ 工具漂移

SPEC.md:136–162 · viewer/generator.py:48–66

SPEC 最小只要求 type,但 writer 工具实际要求 title / description / timestamp;SPEC 推荐 bundle-relative 绝对链接,generator 的 edge extractor 目前却跳过 /…md、偏好相对链接。链接规范仍需收敛。

Web enrichment 脆弱

web/fetcher.py:10–87 · web_ingestion_instruction.md

web pass 依赖 HTML 抓取、40KB markdown 截断,以及 LLM 判断哪些是权威链接、哪些页面值得写入。适合 PoC,但还不是有强保证的引用管线。guardrails 能降低覆盖真实 schema 的风险,却不能证明外部内容本身正确。

Catalog 接入时 type 坍缩

mdcode/layouts/documents.ts:185–219

OKF 的自由 type 进入 Dataplex 时,只有合法三段式 type ref 才保留,否则 fallback 到 generic。ingest 简单了,却丢掉一部分领域类型语义。

生态仍在 v0.1

README.md:22–25 · SPEC.md:382–396 · GC Blog

博客与 README 都明确:reference agent 和 visualizer 是 proof-of-concept。OKF 能不能成立,关键不在工具完整,而在多方生产者和消费者是否写出兼容实现。宽容消费降低了参与成本,但也延后了强一致语义的形成。

§ 08 — 启发

对 agent infrastructure 意味着什么

抛开 Google Cloud 这一具体宿主,OKF 给出的是一个关于“知识控制点放在哪里”的判断。

i.

把控制点放在格式

OKF 真正的产品判断,是把知识互操作的控制点从服务 API 移到文件格式——牺牲强中心化能力,换来最低集成成本、最高可移植性、以及更容易被 agent 写入的协作面。

ii.

知识即代码

当知识是 git 里的 markdown,它就能 diff、review、blame、回滚。生产由受约束的 agent loop 完成,消费由静态工具完成,人始终在环内可改可读。

iii.

人与 agent 同读同写

frontmatter 给机器,正文给人,链接给两者。一束文件同时是人类文档、agent 上下文和 catalog 数据源——这是它区别于任何单一知识平台的地方。