S3数据不搬家,Agent先补语义层
很多企业做数据 Agent 时,第一反应是:
先把数据搬到一个新平台
↓
再做统一建模
↓
再接AI
项目很快变成一个大规模数据迁移工程。
Google Cloud 8 月 24 日公开的 SOAP Architecture 提供了另一条路径:数据可以继续留在 S3 等原位置,先把访问、语义和业务关系层建立起来,再让 Agent 使用。
SOAP 是:
Semantic
Ontology
Agent
Platform
它的核心并不是某一个新产品,而是一张组合架构:
S3 / Iceberg
↓
Borderless Lakehouse
↓
BigQuery
↓
LookML Semantic Layer
+
BigQuery Graph
+
Knowledge Catalog / OKF
↓
Conversational Analytics
↓
Gemini Enterprise / A2A / Coding Agent
真正值得研究的是它把“数据迁移”和“AI可用”拆开了。
第一层:先解决能不能查,不先解决搬不搬
如果 S3 上已经有 Apache Iceberg 表,Google 给出的路径是:
S3 Iceberg
↓
Cross-Cloud Interconnect
↓
BigQuery直接查询
同时通过 Catalog Federation 同步:
AWS Glue Data Catalog
Databricks Unity Catalog
Snowflake Horizon
的元数据。
这意味着:
数据物理位置
和:
查询入口
可以分开。
对 Agent 来说,它真正需要的是:
可查询
可授权
可解释
不一定要求:
全部复制到同一个Bucket
什么时候“先不搬”特别有价值
比如企业有:
120TB S3历史数据
3000张表
多个业务系统
其中很多表已经很少使用。
如果先全量搬:
网络
存储
ETL
校验
停机窗口
权限重建
成本非常高。
更现实的步骤:
1. 只读连接
2. 统计访问频率
3. 建立语义层
4. 让Agent先能解释和查询
5. 再决定哪些真的值得迁
迁移从前置条件变成后续优化。
先做Access Inventory
我会先生成:
Table
Size
Last Query
Query Count 30d
Query Count 365d
Owner
Data Class
例如:
select
table_name,
size_bytes,
last_access_at,
query_count_30d,
query_count_365d
from inventory;
然后分类:
HOT
WARM
COLD
UNKNOWN
如果:
12个月无人访问
它至少应该进入:
Archive / Delete Candidate
而不是默认迁移。
第二层:最重要的不是Schema,而是Metric Definition
一个数据 Agent 最容易犯的错不是 SQL 写错。
而是:
“销售额”
到底指什么?
财务:
已确认收入
销售:
订单金额
运营:
GMV
如果 Agent 只看数据库字段:
amount
revenue
gmv
它很可能自己猜。
SOAP 把 LookML 作为 Semantic Layer,目的就是把:
指标
维度
业务定义
放在模型之外。
一个简单语义对象
metric: active_customer
definition:
customer with at least one
paid order in last 90 days
source:
orders
filter:
status = PAID
owner:
revenue-analytics
version:
v12
Agent 问:
活跃客户有多少?
不需要自己发明定义。
语义层必须版本化
今天:
90天有支付订单
明天业务改成:
60天
如果不保存版本,历史报告无法解释。
所以每次 Agent Answer 都应该记录:
metric_version
例如:
{
"metric": "active_customer",
"version": "v12",
"value": 18291
}
第三层:关系不是JOIN猜出来的
很多 NL2SQL Agent 会做:
Schema
↓
LLM猜JOIN
例如:
customer.id
orders.customer_id
简单场景没问题。
一旦企业有:
Account
Customer
Organization
Contract
Store
Distributor
关系语义非常复杂。
SOAP 用 BigQuery Graph 表达实体和关系,目的是让 Agent 不再自己猜:
Customer → Order
Order → Product
Customer → Organization
Organization → Region
这些关系可以明确建成 Property Graph。
为什么Graph比“把Schema给模型”更稳
Schema 只能说明:
有什么字段
Graph 说明:
哪些实体
通过什么业务关系
连在一起
Agent 问:
哪些华东客户购买了A产品,
但最近90天没有续购?
需要走:
Region
→ Organization
→ Customer
→ Order
→ Product
如果关系来自显式图模型,错误 JOIN 的空间会小很多。
第四层:OKF把业务知识变成可Review资产
SOAP 里还有 Open Knowledge Format(OKF)和 Knowledge Catalog。
Google 的思路是:
表的含义
指标背景
运维知识
Wiki信息
可以生成成 Markdown Bundle,并进入 Git 管理。
这个方向我很认同。
因为数据知识最怕:
只存在某个分析师脑子里
或者:
散落在Wiki
没人知道是否过期
如果 OKF 进入 Git:
变更
→ PR
→ Review
→ Version
Agent 使用的是明确版本。
一个OKF目录可以长这样
knowledge/
├── customer/
│ ├── entity.md
│ ├── metrics.md
│ └── relationships.md
├── order/
│ ├── entity.md
│ └── status.md
└── governance/
└── data-classification.md
metrics.md:
# Active Customer
Definition:
At least one paid order in 90 days.
Owner:
Revenue Analytics.
Source:
orders.status = PAID.
Do not use:
crm.last_contact_at.
最后一句:
Do not use
对 Agent 很重要。
Knowledge也需要Owner
每个定义至少有:
Owner
Source
Updated At
Review Cycle
没有 Owner 的知识条目:
不能作为高置信生产依据
可以标记:
UNVERIFIED
三种入口共享一套Grounding
SOAP 提到三个入口。
第一类:
Looker Dashboard
+
Conversational Analytics
第二类:
BigQuery Conversational Analytics
+
BigQuery Graph
+
Gemini Enterprise
第三类:
VS Code / Claude Code
+
Data Agent Kit
真正重要的是:
入口不同
Grounding相同
不要为:
BI Agent
Coding Agent
Slack Agent
各自维护一套指标定义。
那样很快就会:
三个Agent
三个答案
权限也应该复用数据平台原有控制
SOAP 明确强调:
不需要为Agent重新发明一套数据权限
BigQuery 和 Looker 已有访问控制继续生效。
这是数据 Agent 很重要的边界。
不要因为 Agent 需要方便查询,就创建:
super_reader
给它全库读权限。
更合理:
User Identity
→ Existing Data Policy
→ Agent Delegation
Agent 看到的范围不超过用户和业务目的允许范围。
我会把查询分成三阶段
Stage 1:Metric Resolution
先确定:
用户问的业务概念是什么
例如:
活跃客户
映射到:
active_customer:v12
Stage 2:Relationship Resolution
确定实体路径:
Region
→ Customer
→ Order
Stage 3:Query Generation
最后才生成:
SQL / GQL
很多系统一上来就:
自然语言 → SQL
中间两个步骤都省了。
这就是幻觉入口。
Query Plan最好可见
例如 Agent 输出:
{
"metrics": [
"active_customer:v12"
],
"dimensions": [
"region:v4"
],
"relationship_path": [
"region->organization",
"organization->customer"
],
"filters": [
"region=华东"
]
}
确认后再生成查询。
这让 Review 容易很多。
可以做Semantic Gate
public record SemanticQueryPlan(
Set metrics,
Set dimensions,
List joins,
List filters) {
}
Gate:
所有Metric必须存在
所有Relationship必须在Graph中
所有字段必须有权限
不通过:
禁止SQL执行
语义版本变化需要Regression
比如:
active_customer:v12
→ v13
所有依赖这个 Metric 的:
Dashboard
Agent Eval
Report
Workflow
都应该重新跑。
可以维护:
Metric → Consumer
依赖图。
Agent生成迁移计划也值得借鉴
SOAP 还提出一个很实用的思路:Agent 先只读收集元数据和查询历史,再把表分成:
Migrate
Archive
Keep
Delete Candidate
Need Review
并生成机器可读 Migration Manifest。
例如:
table: legacy_order_2018
decision: ARCHIVE
reasons:
- no_query_18_months
- replaced_by_order_v2
confidence: 0.94
human_review: required
这比:
让AI写一份迁移PPT
实际得多。
Manifest应该能直接驱动下一阶段
例如:
table: customer_profile
decision: MIGRATE
target:
format: ICEBERG
dataset: customer_core
ddl_ref:
ddl/customer_profile.sql
validation:
row_count: true
checksum: true
批准后自动生成 DDL、验证任务。
这才叫:
Executable Migration Plan
“零复制”也不是完全免费
不要误解成:
跨云查询没有任何成本
仍然要考虑:
Interconnect
Query Cost
Cache
Latency
Availability
Network
所以工作负载要分。
高频低延迟:
可能最终值得搬
低频历史:
继续跨云查
不要宗教化“永不迁移”。
一个迁移决策公式
Migration Score
=
Query Frequency
× Latency Sensitivity
× Cost Delta
× Strategic Importance
再减:
Migration Complexity
不是:
只要在S3就全部搬
语义层才是Agent真正需要的“API”
数据库 Schema 是技术接口。
Agent 更需要:
业务语义接口
例如:
metric.active_customer
entity.customer
relation.customer_orders
这样模型在不同底层平台上都可以复用。
未来换:
BigQuery
Snowflake
Databricks
只要语义 Contract 保持,Agent 上层变化会小很多。
我会给语义对象做测试
例如:
metric: revenue
tests:
- fixture: 2026-08-01
expected: 1829102.18
- fixture: canceled_orders
expected_exclusion: true
Semantic Layer 也应该有 CI。
最后一个关键指标:Answer Provenance
Agent 回答:
华东活跃客户 18291
至少携带:
Metric:
active_customer:v12
Data Snapshot:
2026-08-25T08:00
Relationship:
region→organization→customer
Query ID:
BQ-9182
不是只返回一句自然语言。
数据 Agent 真正难的地方,不是“模型会不会写 SQL”。
而是:
指标定义
实体关系
权限
知识版本
有没有统一。
SOAP Architecture 最值得借鉴的地方,是它把“先大迁移、再AI”的顺序反过来了:
先连接
→先补语义
→先建立关系
→先让Agent在原数据上工作
→再决定什么真的值得迁
这会让很多原本几年才能看到 AI 价值的数据现代化项目,先从只读、低风险、可验证的一层开始。
对企业来说,真正要先搬的可能不是数据。
而是把散落在人脑、Wiki 和 SQL 里的业务含义,搬进一套可以版本化和被 Agent 直接读取的语义层。
更多企业级 AI 应用、Agent、RAG 与模型工程化内容,我会继续整理在 智元界:
https://www.zyentor.com/