跳到正文
Hacker News· rajdevnath·· 10 天前AI 评分71

semlayer 发布自推断开源语义层,供 AI 智能体经 MCP 消费

The SQL ran fine. 58% of the answers were wrong (AI agents on a real warehouse)

AI 导读

开源项目 semlayer 发布可自推断的语义层,指向数据仓库后自动分析每列、发现未声明的外键、解码状态列并提取业务规则,输出带置信度、来源与生命周期的 layer.yaml,供 Claude、Cursor 等 MCP 客户端消费。

正文 · AI 翻译

自我推断的开源语义层——省去四分之一手写 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