用 cz-cli 驱动 Agent 建模分析域

如何阅读本指南

本指南教你如何与 Agent 协作完成分析域的工作,而不是教你怎么操作 Web 页面或背 CLI 命令。

和 Agent 协作的方式是对话。你描述想做什么——"给客户表加个别名""补几个指标""检查域的完整性"——Agent 理解意图后执行操作并反馈结果。你不需要知道配置项在哪个菜单下、命令有几个参数、表名是什么格式。你需要知道的是分析域有哪些概念、每一步需要你提供什么样的信息和判断。

本指南分三个部分:

  • 第二章:分析域的概念模型——它由哪些部分组成,每部分做什么,建好后能回答什么问题
  • 第三章 + 第四章:两个实践案例——单域深度打磨(银行域,从 40 分到 92 分)和四域批量建设(物流/保险/医疗/制造),展示完整的对话协作过程
  • 第五章:域建成后的持续治理场景——日常维护中常见的问题和对应的对话模式

Agent 在背后执行的 CLI 命令列在附录,供你了解工作机制,但不要求记忆。


一、引言

痛点

分析域不是建完就完了。数据持续接入、规则不断调整、用户反馈迭代——治理是长期的。但传统方式(Web 页面逐项操作)让这件事变得让人不想做

场景实际操作心理感受
用户反馈"搜不到客户名"可能只是某个字段缺了别名。但修复它需要:打开页面 → 找到域 → 找到那张表 → 找到那个字段 → 点编辑 → 输入别名 → 保存"又要去点一遍..."
5 个域需要巡检检查指标覆盖率、字段描述率。页面只能逐个打开查看"等有空再说吧..."
加了一张新表加表、补别名、定义指标、配 JOIN——每次同样的组合"我先忙别的,这个不急"
监管规则变更改一条知识描述。要上传文件、建文件夹、重新绑定"才改一行字而已至于吗"

每次操作本身不难,也不久。但琐碎、重复、流程不连贯——积累起来就是负面情绪。 用户会拖延、跳过非紧急的维护任务,最终导致分析域质量退化,Data Analytics Agent 回答问题开始变得不准确。不是因为能力问题,是因为让人烦

负担从操作转向决策

Agent + CLI 不消除工作量——它转移工作量

传统 Web 页面方式 ────────────→ Agent + CLI 方式 难点:知道在哪操作 难点:精确表达需求 (表在哪个 schema? (需要给哪些字段加别名? 字段在哪个配置页? 别名叫什么? 指标表达式怎么写? 指标表达式正确吗? 知识怎么上传绑定? 知识内容准确吗?) ...)

工作中心的转移:从"操作页面"转向"描述需求"。用户不再需要知道配置项在哪个菜单下、表名是什么格式、参数有几个——这些由 Agent 和 CLI 处理。但用户需要能清楚表达:我要改什么、改成什么样、期望什么结果。

这并不比学页面操作更容易或更难——难度类型变了。需要的是对分析域概念的准确理解(知道有"字段别名"这个东西),以及对业务需求的准确表述(知道这个字段在业务上应该叫什么)。

实际体验:

  • 改别名:不需要知道表在哪个 schema、字段在哪。但需要知道加的是"别名"而不是"描述",以及正确的业务名称
  • 加指标:不需要知道
    --table-name
    --table-name
    的格式。但需要理解指标的含义(COUNT 还是 SUM?需要 ROUND 吗?)
  • 质量巡检:不需要逐个域点开。但需要理解各维度的评分含义,判断哪些缺失项需要优先处理

从"操作型负担"转向"决策型负担"。操作的烦被拿掉了,决策的难度还在——这是合理的,因为决策本来就需要人来判断。

解决方案

用 Agent 承接操作,人只负责决策。

人:描述意图 Agent:理解上下文 + 执行操作 + 反馈结果 ───────────────── ───────────────────────────────────── "把客户表的 customer_name 查域详情 → 找到 customers 表 → 加个别名叫客户名" 定位 customer_name 字段 → 执行修改 → 确认别名生效 "检查四个域的指标覆盖率" 逐一查域 → 对比各域指标数 → 输出对比表 → 标注哪些域缺失

Agent 的方法论基于三个设计原则:

把操作层交给机器。67 个字段加别名——人不需要做重复的体力劳动。Agent 按照同样的标准执行每一个,不会疲劳、不会跳过。

把记忆交给系统。治理是碎片化的:今天加个表,下周改条规则。人不需要回忆"上次改到哪了""这个域的表名叫什么"——Agent 从当前域状态出发,上下文不中断。

把推断交给 LLM。看到

loans
loans
表有
principal
principal
interest_rate
interest_rate
列,Agent 能推断出该定义"贷款总额""平均利率",不需要人一条条指定。但表达的表达式是否正确,最终的判断权在人。

这三件事解决了"操作型负担"——重复、记忆、推断。剩下的"决策型负担"——判断改什么、改对了吗、优先级怎么排——仍然是人负责的部分。


二、分析域是什么

一个分析域是把物理表翻译成业务语言的六层模型。每层不需要达到完美才能用——可以一步步叠加,每一层建完就立即生效。

第一层:表接入

做什么:告诉 Agent 数据在哪个 schema、有哪些表。

用户需要提供:schema 位置、要接入的表。

完成后能回答

"customers 表有多少条记录?""有哪些字段?"

此时 Agent 只知道表和列名,不理解业务含义。

第二层:字段语义

做什么:给字段加中文别名和业务描述。

用户需要提供:哪些字段是业务关键字段(名称、金额、状态、日期类)。Agent 可以推断哪些字段需要别名,但业务描述需要用户确认。

完成后能回答

"客户分哪几类?""哪个账户余额最高?"

Agent 现在知道"客户类型"对应

customer_type
customer_type
,"余额"对应
balance
balance
。自然语言和物理列名之间的翻译建立起来了。

额外收获:虚拟列。有些字段在表中不存在,但业务上需要——比如"信用使用率 = 欠款/信用额度"。Agent 可以帮你定义这些派生字段。

第三层:表关联

做什么:告诉 Agent 表之间的 JOIN 关系。

用户需要提供:描述关联——"customers 通过 customer_id 关联到 accounts"。Agent 能自动发现同名列之间的关联,但需要你确认。

完成后能回答

"各分行存款总额?""这个客户的贷款逾期情况?"

Agent 现在能跨表查询,自动生成正确的 JOIN SQL。

第四层:指标

做什么:定义业务上关心的统计值。

用户需要提供:需要哪些指标——"交易总额、平均利率、逾期率"。Agent 能根据表结构推断常见指标,然后你确认表达式是否正确。

完成后能回答

"交易总额是多少?""各分行逾期率对比?"

Agent 不再需要每次推理聚合逻辑——指标已经定义好了,直接给出数值。

第五层:知识

做什么:告诉 Agent 业务规则、术语含义、判断标准。

用户需要提供:行业知识——"逾期超过 30 天算严重""风险评分 60 以上为高风险""房贷逾期率警戒线是 3%"。通常以文档形式提供。

完成后能回答

"逾期率 4.1% 严重吗?""这个客户的风险等级?"

Agent 不仅给出数值,还能做出业务判断——把数据放进行业语境中解释。

第六层:Answer Builder

做什么:把高频分析场景固化为预置模板。

用户需要提供:哪些分析是反复需要的——"贷款逾期监控""卡消费商户分析"。Agent 帮你生成 SQL 和分析面板配置。

完成后:用户说"贷款逾期监控"即可打开完整分析面板,不需要每次描述分析需求。


三、实践示例一:单域深度打磨

银行数据在

bnk_banking
bnk_banking
schema,9 张表:customers / accounts / branches / credit_cards(维度)+ transactions / card_transactions / loans / loan_payments / audit_log(事实)。

3.1 先看现状

域已经建好了(ID 28),但只做了最基础的表接入。

用户:"帮我看下新建的 banking domain 的语义建设情况"

Agent 查看域详情:

→ 9 张表已接入 → 67 个字段自动推断类型全部正确 → 字段描述全空、别名全空 → 指标: 0,知识: 0,示例问题: 0 → 评分: 40/100

这就是起点——表有了,但 Agent 完全不懂业务含义。用户决定继续建设。

3.2 开始补全

在 Agent 报告了域的状态(9表/0指标/0知识/40分)后:

用户:需要

就两个字。Agent 理解了——需要把银行域从当前 40 分状态补全到可用水平。Agent 列出接下来要做的事:67 个字段描述、16 个指标、6 条知识、8 条 JOIN、4 个虚拟列,然后开始逐项执行。

字段描述和别名。Agent 给 67 个字段逐一设置业务描述,给 27 个关键字段加中文别名。期间不需要用户逐一确认——Agent 根据字段名(

customer_name
customer_name
→ "客户名",
risk_score
risk_score
→ "风险分",
balance
balance
→ "余额")推断合适的别名,执行完后汇报结果。

指标。Agent 在每张事实表上定义核心聚合。需要用户判断的(如"逾期率的分子用哪个字段?"),Agent 会停下来问。

知识。Agent 用文件路径创建了 6 条业务知识(客户分类、贷款类型、逾期率计算、信用卡指标、商户类别、交易类型)。创建完后——

3.3 知识不可见

用户:页面上还是看不到知识

Agent 检查:CLI 的

knowledge list --domain-id 28
knowledge list --domain-id 28
能查到 6 条。但 Web 页面的"数据知识"标签下是空的。

Agent 判断根因:知识有两种存储路径——API 文本条目和知识空间文件节点。当前用的是 API 方式,页面只渲染文件节点。Agent 切换方式:把知识内容写成 Markdown 文件,按文件上传路径重新创建(上传 → 建文件夹 → 移入 → 绑定域)。

用户:这次可以了。所以还是命令有问题?

Agent 确认:是的,

knowledge create
knowledge create
创建的条目进不了页面文件树。后续所有知识都应该走文件上传路径。

3.4 表关联失败

用户:表关联关系的命令的问题是?

Agent 尝试用自动发现:

domain joins discover
domain joins discover
,返回 FAIL。连续重试 3 次,全部失败。尝试切到不同 profile,仍然 FAIL。

用户:换个方式去发现表的join关系,然后再配置上表关联

Agent 改变思路:不再依赖自动发现。切到数据所在的实例,用 SQL 逐对验证 FK 数据匹配度(

SELECT COUNT(DISTINCT a.customer_id), COUNT(DISTINCT c.customer_id) FROM accounts a LEFT JOIN customers c...
SELECT COUNT(DISTINCT a.customer_id), COUNT(DISTINCT c.customer_id) FROM accounts a LEFT JOIN customers c...
)。7 对关系全部 100% 匹配。

确认 FK 存在但自动发现引擎有 bug。Agent 的临时方案:把 8 条 JOIN 规则写入 domain 的 custom prompt,让 Agent 生成 SQL 时参照这些规则。功能等效,但不走正式的 JOIN 元数据配置。

后续升级到 v1.17.18 后,

domain join create
domain join create
命令可用。Agent 用新命令重建了全部 8 条 JOIN,替换掉 prompt 临时方案。

3.5 持续追加

用户:给关键字段加上别名

Agent 给 27 个字段加了中文别名(客户名、风险分、余额、贷款类型、本金、年利率...)。

用户:帮我创建几条知识

Agent 补了 6 条业务知识。

用户:可以继续补一些

Agent 理解为补 Answer Builder 和虚拟列。创建了 3 个 AB(贷款逾期监控、卡消费商户分析、客户存款总览)和 4 个虚拟列(信用使用率、交易月份、逾期标记、卡交易月份)。

3.6 最终检查

用户:"看一下银行域的完整状态"

表: 9 字段描述: 67 别名: 27 指标: 16 复杂指标(AB): 3 知识: 6 JOIN: 8 虚拟列: 4 评分: 92/100

3.7 这个过程的真实模式

回看整个对话,不是"一句指令 → 完美结果"的直线,而是:

了解现状 → 开始建设 → 发现问题 → 诊断根因 → 修复 → 继续建设 → 发现新问题 → ... ↑ ↓ └──────────────────── 每轮都回到"检查现状" ────────────────────────────┘

这是分析域治理的常态——边建边验、遇到问题就解决、解决完继续。Agent 的价值不在于一次做对所有事,而在于每轮迭代中:人只需要描述问题和需求,Agent 负责诊断、执行、反馈结果。


四、实践示例二:批量工业化复制

4.1 先探索数据

银行域完成后,用户在 62 个 schema 中系统性地寻找其他可建域的数据。

用户:你看下我有哪些schemas?

Agent 切换实例后列出全部 62 个 schema。

用户:logistics_dw ins_insurance hrc_healthcare mfg_manufacturing 这些schema里各自有哪些表?

Agent 逐一列出四个 schema 下的表,每个都是标准星型模型。筛选后四域可用表分别为 9 / 8 / 10 / 8 张。

4.2 开始批量建设

用户:建四个对应的domain

Agent 并行创建四个域(ID 29-32)。每个域配了名称、描述、3-5 个示例问题。然后批量加表——银行域的教训已经知道参数格式,四个域顺利加完。

用户:需要

Agent 理解了——和银行域一样,四个域都需要从当前骨架状态补全到可用水平。Agent 开始为四个域补指标(每域 5-8 个)、JOIN(每域 4-5 条)、知识(每域 4 条)。

4.3 建设中发现的问题

漏加的表。Agent 在做最终检查时发现数据不一致:

保险域 targetCounts.dataset = 7,但应该 8 张(policies 表缺失)。制造域同理,quality_inspections 没加上。两张表在批量加表时静默失败了——返回成功但未实际生效。Agent 立即补加。

列名对不上。创建物流域的"发货趋势分析"Answer Builder 时,SQL 报列名错误。Agent 查

table columns
table columns
后发现:物理表的
shipment_date
shipment_date
在 v_gpt 视图中被重命名为
stat_date
stat_date
。修正列名后重新创建成功。

dataset ID 映射。创建保险域的 JOIN 时,Agent 把

policyholders
policyholders
的数字 ID 记成了
reinsurance_treaties
reinsurance_treaties
的 ID,导致 "column not found"。Agent 改用自己的方法:先
domain detail
domain detail
列出全部 8 张表的 ID 映射,再逐条创建 JOIN,不再凭记忆。

4.4 继续补全

用户:可以继续补一些

Agent 给四个域补了 Answer Builder(每域 2 个)和虚拟列(跨域 9 个)。其中制造域的"质检合格率分析"第一次创建失败——

CASE WHEN result='PASS'
CASE WHEN result='PASS'
中字符串常量与 JSON 引号冲突。Agent 换用虚拟列封装后重新创建。

4.5 最终状态

Agent 汇总四个域的建设成果:

物流Demo(29): 8表 8+2指标 4JOIN 82分 保险Demo(30): 8表 6+1指标 5JOIN 78分 医疗Demo(31): 9表 6+2指标 4JOIN 82分 制造Demo(32): 8表 6+2指标 4JOIN 84分

4.6 批量建设的真实模式

探索数据 → 确认表结构 → 批量建域加表 → 批量配置语义 → 发现问题(漏表、列名错误、ID映射) ↓ 修复 → 重新验证 → 继续补全

银行域的教训被复用(知识走文件路径、JOIN 手动创建、加表参数一次带全),但每个新域仍然有自己的问题——列名对不上、表静默失败、ID 映射混乱。Agent 的价值在于:每次发现问题后,不需要人去翻页面找原因,Agent 查详情、诊断根因、执行修复,人只需要确认"修得对不对"。


五、持续治理

域建成后,日常维护同样通过 Agent 完成:

加新表。"bnk_banking 新增了 investment_portfolio 表,加入 banking 域并补字段别名和指标。"

修改别名。"customers 表的 customer_type 别名从'客户类型'改成'客户分类'。"

更新知识。"逾期率警戒线从 3% 更新为 2.5%,更新 banking 域的知识文件。"

质量巡检。"检查五个域的指标覆盖率,列出每个域的分数和缺失项。"

每次操作后,Agent 会返回执行结果和域的最新状态,用户可以立即确认是否达到预期。


附录 A:行业域实体清单

银行 (banking)

维度: customers / accounts / branches / credit_cards 事实: transactions / card_transactions / loans / loan_payments + audit_log FK: accounts→customers | credit_cards→customers/accounts | transactions→accounts loans→customers | loan_payments→loans | card_transactions→credit_cards | customers→branches

物流 (logistics_dw)

维度: dim_carrier / dim_customer / dim_shipment_method / dim_warehouse 事实: fact_shipment / fact_inventory + gld_carrier_kpi / gld_daily_shipment

保险 (ins_insurance)

维度: policyholders / agents / insurance_products 事实: policies / claims / claim_payments / underwriting / reinsurance_treaties

医疗 (hrc_healthcare)

维度: patients / providers / facilities / medications 事实: encounters / diagnoses / procedures + lab_orders / lab_results / allergies

制造 (mfg_manufacturing)

维度: products / components / suppliers 事实: bill_of_materials / work_orders / inventory / quality_inspections / supplier_components


附录 B:Agent 背后的 CLI 命令

日常使用中你不需要执行这些命令——Agent 会帮你调。此处列出供查阅,帮助你理解 Agent 的工作方式。

操作Agent 执行的命令
建域
domain create --name "..." --datasource-id ... --description "..." --sample-question "..."
domain create --name "..." --datasource-id ... --description "..." --sample-question "..."
加表
domain table add <id> --datasource-id ... --workspace ... --schema ... --table ...
domain table add <id> --datasource-id ... --workspace ... --schema ... --table ...
字段描述
table semantics set <ds> <attr> --description "..."
table semantics set <ds> <attr> --description "..."
字段别名
table semantics set <ds> <attr> --alias "..."
table semantics set <ds> <attr> --alias "..."
虚拟列
column virtual set <ds> --name "..." --type "..." --expression "..."
column virtual set <ds> --name "..." --type "..." --expression "..."
指标
metric create --domain-id ... --table-name "..." --name "..." --expression "..."
metric create --domain-id ... --table-name "..." --name "..." --expression "..."
JOIN
domain join create <id> --dataset-id ... --attr-code ... --relation "n:1"
domain join create <id> --dataset-id ... --attr-code ... --relation "n:1"
知识
knowledge file upload 1 file.md
knowledge file upload 1 file.md
folder create
folder create
file move
file move
node bind-domain
node bind-domain
AB
answer-builder create --analysis-name "..." --content '{...}'
answer-builder create --analysis-name "..." --content '{...}'
验证
domain detail <id>
domain detail <id>
联系我们
预约咨询
微信咨询
电话咨询
邮件咨询