最近在探索自动化数仓工具时,注意到了一个很有意思的开源 CLI 工具 ——Schemalytics。它可以将现有的 PostgreSQL 数据库 Schema 自动转化为符合Kimball 维度建模+Medallion(Bronze → Silver → Gold)架构的完整dbt 项目。最重要的是,它主打本地优先,数据不会离开本地机器(默认配合 Ollama 使用)。
在实际部署和测试过程中,我踩了不少关于大模型 Token 限制、表过滤以及多智能体纠偏的坑。本文将复盘整个部署、调优、测试的全过程,并对其优缺点做一个真实的测评。
一、 快速部署与自定义 LLM 配置
1. 下载与安装
项目开源地址:GitHub - NiChr0/schemalytics
安装支持两种方式:
- 常规安装:
pip install schemalytics - 源码安装(推荐):由于该工具官方主要适配 Ollama 和 Anthropic,如果想连自定义的本地大模型网关,或者通过环境变量灵活调整,推荐把源码 clone 到本地进行编辑:
- 将项目在 PyCharm 或其他 IDE 中打开。
- 执行
pip install .(或pip install -e .以可编辑模式安装)。
2. 连接本地/自定义大模型
如果你没有使用默认的 Ollama,而是通过其他方式部署了本地 LLM(例如通过 vLLM、OneAPI 或本地转发),可以通过以下两种方式让 Schemalytics 成功连接:
方式 A:通过环境变量注入(推荐)
在 PowerShell 中设置以下环境变量:
$env:SCHEMALYTICS_OLLAMA_MODEL ="your_model_name"$env:SCHEMALYTICS_LLM_API_KEY ="your_api_key"$env:SCHEMALYTICS_LLM_BASE_URL="http://localhost:port/v1"方式 B:直接修改源码
在源码的llm.py中找到对应参数进行修改:
SCHEMALYTICS_LLM_BASE_URLSCHEMALYTICS_LLM_API_KEY(出于安全考虑,不建议写死在代码中)SCHEMALYTICS_OLLAMA_MODEL
💡注意:如果采用了源码安装(
pip install .),每次修改源码后都需要重新执行一遍pip install .才会生效。
二、 核心踩坑记录:解决 Token 截断与表过滤
在实际跑数仓生成命令前,先来看两个在测试中几乎必然会遇到的“拦路虎”:表过多导致输出截断与Token 限制过小。
1. 痛点一:表数量过多与 Token 截断报错
当你直接对一个有几十甚至上百张表的生产库执行生成时,极容易遇到如下报错:
<exception>The output is incomplete due to a max_tokens length limit.</exception>解决方案:修改postgres.py进行表过滤与裁剪
为了测试方便,我们需要主动过滤掉无效表、测试表或行数为 0 的空表。
打开postgres.py,找到pg_stat_user_tables的查询逻辑,加入过滤条件:
try:withengine.connect()as_conn:_rows=_conn.execute(text(""" SELECT schemaname, relname, n_live_tup FROM pg_stat_user_tables WHERE relname NOT LIKE ('%fordel') AND schemaname IN ('public') AND n_live_tup > 0 LIMIT 5 0"""))同时,在表遍历的逻辑中加上过滤规则:
forschema_nameinuser_schemas:fortable_nameininspector.get_table_names(schema=schema_name):iftable_name.endswith("fordel")or"%fordel"intable_name:continue# 仅保留有数据的表rc=row_counts.get((schema_name,table_name),0)ifrc<=0:continue(注:%fordel是我业务中自定义的无效表标识,你可以替换为自己的过滤规则)。本次测试中,我最终仅筛选了 3 张表进行验证(字段数分别为:订单表 71 个、入库表 37 个、客户维度表 58 个)。
2. 痛点二:调大 Token 限制
即使过滤了表,大模型的max_tokens默认配置也常常支撑不住多智能体层层传递的庞大元数据,导致中途崩溃、全部重来。我们需要在源码中调大限制:
llm.py:
将默认的max_tokens: int = 4096提升至8192。planner.py:- Agent 1 & Agent 2:将默认的
512改为4096。 - Agent 3 ~ Agent 5:这些智能体的 Token 是通过公式动态计算的(例如
_AGENT3_MAX_TOKENS_PER_BATCH = _AGENT3_BATCH_SIZE * 300 + 512)。建议将基础加数(如512、1024)全部调大至4096以上。 - Agent 6:原配置为 5000,为防万一可适当调大。
三、 连接数据库与生成命令
配置妥当后,执行以下命令开始生成 dbt 项目:
schemalytics generate-c"postgresql://postgres:postgres@localhost:port/database_name"-o./project_name-n 新项目名⚠️避坑指南:如果你的数据库用户名或密码中包含特殊符号,必须先将其转换为URL 编码,否则连接会报错。常见符号编码对照表:
字符 URL编码 字符 URL编码 #%23%%25@%40空格%20或+:%3A&%26/%2F?%3F
四、 多智能体(Multi-Agent)运行表现复盘
Schemalytics 内部采用了多智能体协同工作流,来看看它们在实测中的表现:
Agent 1(行业与领域推断):
表现:根据元数据自动推断所属行业和业务领域。测试结果比较接近,但不够精准,需要后期校准。
Agent 2(指标、目标与颗粒度建议):
表现:提出业务指标和报表颗粒度建议。测试表现优秀,一次通过。
Agent 3(分类智能体 - 核心):
表现:负责将表精准识别为事实表(Fact)、维度表(Dimension)、桥接表(Bridge)或引用表(Reference)。默认使用微调模型
nichr0/schemalytics-classification-agent。实测:表现一般,把我的订单事实表误判成了维度表。好在工具支持交互式校准,纠错后会重新输出校验表格。
Agent 4a(Silver 层规划):
表现:负责 Silver 层星型模型规划(如
dim_*和fct_*),使用模型nichr0/schemalytics-silver-agent。实测:初始测试依然把订单事实表错判成了维度表。不过它的亮点在于支持自然语言反馈。当我把问题反馈回去(“订单表必须是事实表,如果非要当成维度表,就得先和入库表联合成大宽表”),AI 真的按照这个逻辑把两张表进行了关联,最终生成的表结构确实包含了必要的事实数据。
Agent 4b(Gold 层规划):
表现:负责 Gold 层预聚合指标模型(如
agg_*聚合表)。表现稳定,没出什么幺蛾子。Agent 5 & 6(编排与语义层组装):
表现:配合通用大模型(默认
gemma3:4b)组装并输出完整的 dbt 文件夹。最终会在本地生成一个结构规范的 dbt 项目,并贴心地附带了执行提示:
cd dbt_project_test dbt deps dbt run五、 测评总结:优缺点与适用场景
👍 优点
- 自动分层清晰:生成的 dbt 项目严格遵循 Medallion 架构(Bronze、Silver、Gold),且 Silver 层能够智能区分维度与事实表,Gold 层自动产出日/月不同颗粒度的聚合指标。
- 支持 SCD(缓慢渐变维):令人惊喜的是,它会自动帮你用 dbt snapshot 来处理缓慢渐变维。
👎 缺点与痛点
- 注释丢失:原数据库元数据中自带的中文注释在生成后基本丢失。Bronze 层仅标记数据来源,Silver 层的注释变成了单纯的字段名,Gold 层则用英文简述指标含义,本土化体验较差。
- 配置较重:底层数据进来默认是视图形式,且每次调整都需要重新初始化并完整走一遍配置流程。
- 规模化扩展隐患(最大痛点):仅仅测试了3张表就遇到了各种模型分类偏误、需要人工介入纠错,以及
max_tokens频繁截断的问题。如果面对生产环境中100+张表的复杂数仓,Token 消耗量和人工校准成本将会呈指数级上升,max_tokens可能会被拉到一个极其夸张的量级。
💡 结论
Schemalytics 是一个创意十足且极具潜力的“AI + dbt”辅助建库工具,非常适合用于小型项目快速原型搭建或是个人学习 Kimball 维度建模的参考。但在企业级大型数仓的复杂场景下,指望它“一键全自动生成生产级代码”目前还有所欠缺,更多的价值在于作为数仓架构师的智能副驾驶(Copilot),帮我们快速生成骨架,再由人工进行精细化打磨。