一句话:把「知识目录」变成一堆普通的 Markdown 文件,让人和 AI Agent 用完全相同的方式生产、审查、消费它。
仓库由三部分组成,重要性依次递减——格式是贡献,Agent 和可视化只是让它摸得着的两端。
| 组成部分 | 位置 | 角色 |
|---|---|---|
| OKF 格式规范 v0.2核心 | SPEC.md | 知识如何表示:目录树 + Markdown 文件 + YAML frontmatter。不绑定任何 agent、框架、厂商 |
| Reference Agent生产者 PoC | src/reference_agent/ | 从 BigQuery 元数据 + 官方文档网页自动生成 OKF bundle |
| 可视化查看器消费者 PoC | viewer/ · bundles/*/viz.html | 把 bundle 渲染为单文件交互式知识图谱 |
仓库自带 4 个可直接浏览的成品 bundle:bundles/ga4/(GA4 电商)、bundles/stackoverflow/、bundles/crypto_bitcoin/、bundles/acme_retail/(演示 Attested Computation 完整家族)。
cat 一下就能看;LLM 可以原样塞进上下文index.md 让 Agent 逐层浏览,而不是把整个 bundle 塞进上下文bundle/
index.md # 可选:目录清单(渐进披露)
log.md # 可选:按日期倒序的更新日志
<concept>.md # 一个概念 = 一个 .md 文件
<子目录>/ # 按领域自由组织
index.md
<concept>.md
保留文件名只有两个:index.md 和 log.md。分发方式:git 仓库(推荐)、tar/zip、或大仓库的子目录。
唯一必填字段是 type,只带 type 的概念即完全合规。推荐字段:title、description(一句话,会被 index.md 原样引用)、resource(底层资产 URI)、tags。
---
type: BigQuery Table
title: Customer Orders
description: One row per completed customer order across all channels.
resource: https://console.cloud.google.com/bigquery?p=acme&d=sales&t=orders
tags: [sales, orders, revenue]
generated: { by: reference_agent/gemini-2.5-pro, at: 2026-05-28T14:30:00Z }
---
# Schema
| Column | Type | Description |
|---------------|-----------|------------------------------------------|
| `order_id` | STRING | Globally unique order identifier. |
| `customer_id` | STRING | Foreign key into [customers](customers.md). |
# Common query patterns
```sql
SELECT * FROM orders WHERE total_usd > 100
```
约定俗成的正文标题:# Schema(字段结构)、# Examples / # Common query patterns(示例)、# Computation(见 2.5)。
| 字段 | 作用 | 示例 |
|---|---|---|
sources | 来源。每条含 resource(必填)、id(正文脚注关联键)、title,及可选可信度信号 author / usage_count / last_modified | { id: ga4-schema, resource: https://... } |
usage_window | 给所有 usage_count 加 {from, to} 时间窗 | { from: 2026-06-01, to: 2026-06-30 } |
generated | 内容怎么产生:{ by, at } | { by: reference_agent/gemini-2.5-pro } |
verified | 谁确认过内容:{ by, at } 列表 | [{ by: human:ahormati, at: ... }] |
status | draft / stable(默认)/ deprecated | status: draft |
stale_after | 绝对时刻,now ≥ stale_after 即过期 | 2026-09-23T00:00:00Z |
usage_count 应读作「活跃度与趋势」,不是精确排名。信任层级由 verified 推导:无 verified → unverified;仅被 process: / 工具确认 → machine-confirmed;被 human:<id> 确认 → human-reviewed。Actor 命名约定:Agent 用 <producer>/<version>、人用 human:<id>、自动流程用 process:<id>——信任分级靠 human: 前缀判断,人工确认必须用这个前缀。
逐条断言溯源:正文论断用脚注关联 sources[].id。用稳定 id 而非 sources[0] 位置索引,因为 Agent 会不断重写文档,位置索引在重排后会静默错配:
The `events_` table is sharded daily as `events_YYYYMMDD`.[^ga4-schema]
[^ga4-schema]: GA4 BigQuery Export schema
概念之间用普通 Markdown 链接互指,构成超越目录树的有向图。绝对形式(相对 bundle 根,移动文档时稳定)与相对形式均可;本仓库的 Agent 实际写文件相对路径(如 ../references/metrics/daily_active_users.md),保证 GitHub 直接渲染时链接可用。关系类型(joins-with、depends-on…)由周围散文表达,链接本身不携带类型。消费者必须容忍死链——死链可能只是「尚未写出的知识」。
references/ 子目录是命名约定:把外部材料、运行说明、代码镜像为 bundle 内一等概念(如 references/attesters/revenue.py)。
v0.2 最有特色的类型:不只记录一个值是什么,还记录官方认可的算它的方法,让消费者能机械地确认「Agent 跑的是被批准的计算,而不是即兴发挥」。
verified 与 attestation 的区别:前者确认定义仍符合政策(文档级、慢、落盘);后者确认某次运行按官方方式产生值(每次调用、运行时、不落盘)。定义过期也能干净通过 attestation;定义刚确认过也每次运行仍需 attestation——所以两者都要。
Agent 基于 Google ADK + Gemini(默认 gemini-flash-latest),分两个独立 pass 运行,最后统一重生成索引。
| 限制 | 默认 | 说明 |
|---|---|---|
--web-max-pages | 100 | 页数硬上限 |
--web-max-depth | 2 | 距任意 seed 的跳数上限 |
| allowed-hosts | 仅 seed 主机名 | 同域过滤,--web-allowed-host 可追加 |
--web-allowed-path-prefix | 无限制 | 路径前缀白名单 |
--web-denied-path-substring | 无 | 路径黑名单(如 /login) |
fetch_url 拒绝。页面要立为 references/<slug> 新概念,须同时满足:①主题可被主概念点名引用;②非 bundle 级元页面(slug 含 overview / quickstart / faq 等直接跳过);③通过「引用测试」(能写出 See the [X reference](…) for …);④复用测试(≥2 个概念会引用它)。
强制的结构化抽取则绕过四道门:页面上的聚合指标、维度、join 路径必须捕获——指标写 references/metrics/<slug>.md(拥有 SQL 公式),join 写 references/joins/<a>__<b>.md(双下划线、按字母排序),且立了引用就必须回链:相关表的 # Metrics / # Joins 章节必须链接它,会话结束前校验无孤儿 reference。
tools/bundle_tools.py 的 write_concept_doc 内置三层防御:缺 type 等必需键拒写;web pass 中新 # Schema 丢失 BQ pass 从真实元数据填充的字段 → 拒写并列出缺失字段;新 sources 条目数少于现存 → 拒写。提示词同时约定:「拒写不代表失败——读回旧文档、原样保留全部内容、只做增量,然后重试。」
python3.13 -m venv .venv
.venv/bin/pip install \
--index-url https://pypi.org/simple/ \
-e .[dev]
gcloud auth application-default login
gcloud config set project <billing-project>
# Gemini 二选一:
export GEMINI_API_KEY=...
# 或 Vertex AI:
export GOOGLE_GENAI_USE_VERTEXAI=true
export GOOGLE_CLOUD_PROJECT=<id>
export GOOGLE_CLOUD_LOCATION=<region>
.venv/bin/python -m reference_agent enrich \
--source bq \
--dataset <project>.<dataset> \
--web-seed-file <path/to/seeds.txt> \
--out ./bundles/<name>
不提供 seed 或加 --no-web → 只跑 BQ pass。公共数据集可读,但查询按字节计费到你的项目。
以 GA4 为例(samples/ga4_merch_store/ 是完整配方):
.venv/bin/python -m reference_agent enrich \
--source bq \
--dataset bigquery-public-data.ga4_obfuscated_sample_ecommerce \
--web-seed-file samples/ga4_merch_store/seeds.txt \
--out ./bundles/ga4
seed 文件每行一个 URL(支持 # 注释),指向该数据集的官方文档。产出:每个 BQ 概念一个文档 + 从官方文档立出的 references/metrics/*、增补的字段语义 + 各级自动 index.md。三个官方样例覆盖三种形态:GA4(单张去规范化大表)、Stack Overflow(大量独立实体表)、Bitcoin(少数紧密关联的事实表,锻炼跨表外键的表达)。
.venv/bin/python -m reference_agent enrich \
--source bq --dataset my-company.sales \
--no-web --out ./bundles/sales
只从 BigQuery 元数据生成(Schema、分区、字段类型),零网页依赖。适合内部敏感数据或不具备文档站的场景。
.venv/bin/python -m reference_agent enrich \
--source bq --dataset bigquery-public-data.crypto_bitcoin \
--concept tables/transactions \
--out ./bundles/crypto_bitcoin
--concept 可重复。注意:它依然会触发 web pass(除非同时 --no-web)。Bitcoin 的表动辄几百 GB,官方样例明确建议迭代期用 --concept 做冒烟测试、控制 --web-max-pages。
.venv/bin/python -m reference_agent visualize --bundle ./bundles/crypto_bitcoin
# 写出 bundles/crypto_bitcoin/viz.html
# 自定义输出与标题:
.venv/bin/python -m reference_agent visualize \
--bundle ./bundles/crypto_bitcoin --out /tmp/btc.html --name "Bitcoin OKF"
生成单文件自包含 HTML(bundle 解析后序列化为 JSON 内嵌;Cytoscape.js 画力导向图、marked 渲染 Markdown,均走 CDN)。功能:按类型着色的概念图谱、详情面板、反向链接(Cited by)、搜索框、类型过滤、5 种布局切换。直接发给同事、放静态服务器、或提交到 bundle 旁边。
connectors/gcp-knowledge-catalog.md 提供与 Dataplex Knowledge Catalog 双向同步的完整教程:用 kcmd CLI 把 bundle 推入 EntryGroup、拉回做 round-trip 校验。
.md;cross-links 原样存储不解析;以 git 为权威——合并后推送,不要反向 pull 进受 git 管理的 bundle。首拉会有一次 YAML 风格归一化 diff,提交一次后即字节稳定。格式本身零工具依赖:手写——任何编辑器建 .md 填 frontmatter,只带 type 也合规;脚本生产——walk 数据库、导出 Dataplex / Unity Catalog / Collibra 目录后写 md;消费——cat、LLM 直接读进上下文、Obsidian/Notion/MkDocs/Hugo 原生浏览、自建搜索索引、仓库自带的 viz 图谱。
enrich| Flag | 默认 | 说明 |
|---|---|---|
--source | 必填 | 目前仅 bq |
--dataset | 必填(bq 时) | project.dataset |
--out | 必填 | bundle 根目录(自动创建) |
--billing-project | ADC 默认 | 查询计费项目 |
--concept | 全部 | 只处理指定概念 id(如 tables/events_),可重复 |
--model | gemini-flash-latest | Gemini 模型 id |
--web-seed / --web-seed-file | 无 | seed URL / 每行一 URL 的文件,均可重复 |
--web-max-pages / --web-max-depth | 100 / 2 | 爬取页数 / 跳数硬上限 |
--web-allowed-host | 仅 seed 主机 | 额外允许的主机名,可重复 |
--web-allowed-path-prefix / --web-denied-path-substring | 无 / 无 | 路径白名单前缀 / 黑名单子串,可重复 |
--no-web | — | 完全跳过 web pass |
-v | — | 详细日志(完整 JSON 工具调用) |
visualize| Flag | 默认 | 说明 |
|---|---|---|
--bundle | 必填 | bundle 根目录 |
--out | <bundle>/viz.html | 输出 HTML 路径 |
--name | 目录名 | 查看器标题栏显示名 |
regenerate_indexes 生成各级目录;可选手工维护 log.mdhuman:<id> 补 verified;信任层级从 unverified 升到 human-reviewedgenerated.at 刷新;过时定义设 status: deprecated(保留供链接与历史);有时效的知识设 stale_afterkcmd 推到 Knowledge Catalogindex.md → 按需加载概念;或开 viz.html 交互探索;确定性代码扫 frontmatter 建索引;运行 Attested Computation 时由 attester 背书.venv/bin/pytest # 7 个测试文件:BQ source、bundle 工具、文档解析、
# index、viewer、web fetcher、web 工具
| 模块(src/reference_agent/) | 职责 |
|---|---|
cli.py | 参数解析、seed 收集、组装 Runner |
runner.py | 两 pass 编排、事件日志(紧凑/详细两种格式) |
agent.py | 构建 BQ agent 与 web agent(ADK Agent + FunctionTool) |
prompts/ | 两个 pass 的完整系统提示词 |
tools/bundle_tools.py | read_existing_doc / write_concept_doc + 守卫 |
tools/source_tools.py | BQ 元数据读取、采样 |
tools/web_tools.py | fetch_url(预算/域/深度强制) |
bundle/ | OKF 文档解析、路径、index 重生成 |
viewer/ | 单文件 viz.html 生成器 |
timestamp 被 generated.at 取代;正文 # Citations 列表被 frontmatter sources 取代。旧 bundle 可被 v0.2 消费者降级读取。type 值不注册;消费者必须容忍未知类型、未知键、缺任何可选家族、死链、缺 index.md——都不能拒绝 bundle。description 保持一句话——它会被原样进 index.md;seed 文件选「权威文档页」而非营销页,Agent 会跟随 cookbook / metric / reference 类链接;大表数据集迭代期务必 --concept + 适度 --web-max-pages。