semlayer 发布自推断开源语义层,供 AI 智能体经 MCP 消费
The SQL ran fine. 58% of the answers were wrong (AI agents on a real warehouse)
开源项目 semlayer 发布可自推断的语义层,指向数据仓库后自动分析每列、发现未声明的外键、解码状态列并提取业务规则,输出带置信度、来源与生命周期的 layer.yaml,供 Claude、Cursor 等 MCP 客户端消费。
自我推断的开源语义层——省去四分之一手写 dbt YAML 的工作。
把它指向你的数据仓库。它会剖析每一列,发现无人声明的外键,解码状态列,找出隐藏在聚合表中的业务规则,并把这一切写成一个开放、可移植的语义层——对每一条断言都带有置信度、来源和生命周期——可供任何 AI agent 通过 MCP 消费。
pip install -e ".[warehouses]" semlayer init snowflake # generates the minimal-grant setup script semlayer infer snowflake -o layer.yaml \ --context ./docs/ --context ./etl-repo/CLAUDE.md # optional: your wikis/dictionaries as priors semlayer review layer.yaml # accept/reject what the engine inferred semlayer mcp layer.yaml # serve it to Claude, Cursor, or any MCP client semlayer lint layer.yaml query.sql # check any SQL (yours or an agent's) against the layer semlayer drift layer.yaml snowflake # catch schema changes (cron- and CI-friendly)
为什么
AI agent 在真实数据仓库上会失败:前沿模型在发布时仅解决了 Spider 2.0 企业级数据仓库任务的 21.3%(而更早的学术版 Spider 1.0 约为 91%)——即便当今最好的 agentic 脚手架也只能达到约 30%。解决办法是语义层——但现有的每一种工具(dbt、LookML、Cube、Snowflake semantic views)都要求人类手写,而且只要有人运行一次 ALTER TABLE,它当天就会过时。
在我们这个混乱数据仓库基准测试上(名称晦涩、零声明约束、隐藏业务规则),使用推断层的 agent 能正确回答 87% 的业务问题,而直接使用原始 schema 只有 42%(相对提升 +107%),若同时运行该层的 SQL linter 则达到 89%——而且它修正的错误是静默的那一类:原始 schema 中的“总收入”会心安理得地把已取消订单也加进去;扇出连接会悄悄把总额变成三倍。完整基准测试、包含方法学变更,以及我们在哪些方面帮不上忙 →
推断出了什么
| 来自测试套件的示例 | |
|---|---|
| 语义类型 + 角色 | sts_cd → 状态码;tot_amt → 带 sum/avg 聚合的货币度量;PII 标记采用召回优先 |
| 键与连接 | 在 TPC-DS 风格命名上 104/104 个未声明外键,在我们的混乱测试夹具上 F1 = 1.0——且零个预置的假外键陷阱被接受(仅凭统计从不自动纳入;命名 + LLM 必须相互印证) |
| 枚举解码 | C=Completed, X=Cancelled——从引擎自身发现的解码维度连接而来 |
| 业务规则 | “这些聚合表只有在 sts_cd <> 'X' 时才对账”——通过假设检验发现,范围限定于收入指标(scope: measures),绝不适用于计数;仅当子事实的行金额可证明汇总为父级总额时,才被其继承 |
| 粒度、SCD2、比率 | “每 ord_id 一行”;cust_mstr 是 SCD2,带有 eff_start_dt/eff_end_dt/is_curr_flg 以及 as-of 连接规则;avg_tot_amt_per_order = 收入 / 订单数 |
| SQL linting | check_sql(MCP)/ semlayer lint(CLI):针对该层对任意 SQL 进行确定性检查——缺少必需过滤器、扇出求和、已弃用表、无有效窗口的 SCD2、幻觉列、空洞的相关子查询——每项都附带修复提示 |
| 指标、路由、弃用 | 带合同合法过滤器的收入/计数指标;“使用 ord_hdr,避免 ord_hdr_legacy(已被取代)” |
| 描述 | 每张表 + 每一列,由 LLM 通过连接图上下文传播从证据中撰写,经独立模型评判为 0.82–0.89 正确且有用 |
| 你的文档作为先验 | --context 摄取数据字典、wiki 导出、CLAUDE.md 文件——并告诉你它们哪里错了:文档与数据的矛盾会进入审查,绝不静默覆盖(指南) |
一切都带着 confidence(已校准,并公开了未命中项)、provenance(由哪些信号产生)和 lifecycle(inferred → reviewed → certified,外加 deprecated/orphaned)落地,并受一份规范性消费者契约约束,该契约使静默误用——跨扇出求和、以当前行连接 SCD2、基于猜测的解码进行过滤——成为不合规,而不仅仅是不明智。
成本与隐私
- 每 100 张表约 $0.70,端到端使用廉价模型层级,需自备 API key(实测成本模型)。LLM 调用仅用于升级处理;约 80% 的列仅凭统计信息即可解析。
--no-llm:完全确定性模式,零 API 调用,仍然可用(在 7 个 fixture 上 typing 0.780 / role 0.834,对比使用模型时的 0.809 / 0.838)——适用于 LLM 访问需要走采购流程的组织。--no-sample-egress:不会将任何从仓库单元格读取的值发送给 LLM,在我们的 7 个 fixture 上没有净准确率损失(typing 0.809 / role 0.842,对比使用样本时的 0.809 / 0.838)。按仓库不同,这是权衡而非普遍免费——在某个点上可能更好或更差。2026-10-03 重新测量;见 docs/cost-model.md。- 只读、最小授权:
semlayer init生成授权脚本;实时测试套件(tests/test_snowflake_live.py,可针对你自己的账户运行)证明 reader 角色无法写入。 - 遥测:匿名命令计数仅在本地暂存——此版本中没有任何内容离开你的机器;使用
SEMLAYER_TELEMETRY=off退出。(详情)
诚实的范围(beta)
- 最适合混乱的仓库。在干净、命名良好的 schema 上,我们的基准测试显示原始 DDL 已经足够——我们公布这一负面结果,而不是隐藏它。如果你的仓库是整洁的 TPC-DS,你可能不需要我们。
- 仓库:Snowflake、BigQuery、DuckDB(+ 通过 DuckDB bridge 在 S3 上的 Iceberg)。导出器:dbt(损失会被报告,绝不静默)。LLM:Anthropic API(Bedrock/Vertex 路由是下一步)。
- 不包含:托管服务、本体增强(它未通过我们自己的消融门槛——凭证)、LookML/RDF 导出器。
- 评估工具随本仓库提供——fixtures、gold layers、能力问题、基准运行器。自己运行我们的数字:
python fixtures/build.py && pytest tests/ -q。
Beta 反馈
正在运行 beta?请提交 Beta 反馈表单(附上 CLI 在你输出旁边写入的 *.report.json——仅包含计时和计数,绝不包含你的 schema 或数据),或就任何敏感事项发送邮件至 hello@semlayer.dev。
布局
spec/ 格式 schema + 消费者契约 · src/semlayer/ 引擎 · fixtures/ 9 个评估仓库 + golds + CQ 套件 · docs/ 基准、成本模型、spike 报告 · ARCHITECTURE.md 工作原理
许可证:Apache-2.0。
来源:Hacker News · github.com