LinkAlign Lite 数据中台 Schema Linking 实验报告

生成日期:2026-06-11
项目目录:D:\AGENT\data-skill-schema-minerpro
实验主题:把 D:\AGENT\DataEngine\LinkAlign 论文解读中的 schema linking 思想,应用到浙江音乐学院数据中台 skill/MCP 项目中,并用全量字典任务与 doops 在线元数据验证做对比评估。

1. 实验结论

这次实验已经从“只看几个例子”升级成了两层评测:

  1. 全量字典离线评测:覆盖 100 条由全量标准字典生成的任务,包含 business、table、relation、field、alias 五类问题,各 20 条。
  2. LinkAlign Lite 在线评测:覆盖 104 条问题,其中包含上述 100 条全量字典任务,以及 4 条真实业务问题;每条都通过 doops 在线读取 Hive Metastore 元数据确认候选表字段。

总体结论:

结论 说明
LinkAlign Lite 能显著减少候选噪声 平均候选表从 7.97 张降到 2.60 张,噪声削减约 67.5%。
过滤后候选表“纯度”提升明显 原始候选集合 precision 为 9.4%,LinkAlign 保留集合 precision 为 23.4%。只看原始召回已命中的 51 条任务,precision 从 19.3% 提升到 47.7%。
召回仍是主要短板 104 条中只有 51 条在原始候选里包含期望表。LinkAlign 后处理只能过滤已有候选,不能凭空找回召回阶段没找出的表。
过滤存在过严问题 11/104 条出现“正确表被过滤”的情况,主要发生在教学任务、组织架构、人员/部门等相邻业务表。
DeepSeek 辅助有效但成本更高 12 条样本中,LLM 版保留集合 precision 从规则版 27.1% 提升到 46.7%,MRR 从 37.5% 提升到 58.3%,但耗时从约 24.7 秒增加到约 206 秒。
doops 在线元数据链路稳定 本次 LinkAlign Lite 104 条评测 doops 验证率为 100%,每条问题都能在线确认候选表元数据。

最适合现在落地的方式:把 LinkAlign Lite 作为“问询前的 schema linking 上下文生成器”,用于给用户、SQL 生成器或后续 Agent 提供更干净的表字段候选,而不是直接替代 SQL 执行。

2. LinkAlign 思想如何映射到本项目

LinkAlign 论文把大规模多库 Text-to-SQL 之前的 schema linking 拆成三个关键步骤:

  1. 语义增强检索:先理解用户真正要什么,再补充隐含实体、属性、约束和改写问题。
  2. 无关 schema 隔离:从候选表里剔除看起来相关但不能直接回答问题的表。
  3. 表字段抽取:从保留表里抽出真正需要的字段,给 SQL 生成或人工复核使用。

本项目的对应实现如下:

LinkAlign 模块 本项目实现 输出
Query/Semantic Enhancement semanticAudit,规则版或 DeepSeek 版语义审计 实体、属性、约束、可能表、可能字段、改写查询
Schema Retrieval 标准字典 + 本地 Hive 元数据 + 业务目录召回 原始候选表列表
Online Verification doops 只读查询 Hive Metastore 表是否在线存在、字段、字段注释、存储位置
Response Filtering kept/rejected 候选过滤 保留表、剔除表、原因、置信度
Schema Extraction selectedColumns 字段角色识别 身份键、状态字段、时间字段、度量字段、维度字段、关联键

流程图:

3. 本次新增与使用方式

新增实验脚本:

1
D:\AGENT\data-skill-schema-minerpro\mcp\evals\run-linkalign-lite-experiment.js

新增 npm 命令:

1
2
cd D:\AGENT\data-skill-schema-minerpro\mcp
npm run eval:linkalign-lite

本次实际运行命令:

1
2
3
4
5
6
cd D:\AGENT\data-skill-schema-minerpro\mcp
npm run check
npm run security:check
npm run eval:full-dictionary
npm run eval:linkalign-lite -- --limit 104 --output evals/linkalign-lite-experiment.latest.json
npm run eval:linkalign-lite -- --limit 12 --llm --output evals/linkalign-lite-experiment.llm-sample.json

单个问题使用示例:

1
2
cd D:\AGENT\data-skill-schema-minerpro\mcp
npm run cli -- linkalign-lite "学生期末评价完成状态应该用哪些表,字段大概是什么含义?" --max-rows 8 --max-fields-per-table 16 --no-llm

4. 数据与字典规模

本次实验使用的全量标准字典:

1
D:\AGENT\data-skill-schema-minerpro\mcp\data\standard-dictionary.full.json

字典规模:

项目 数量
标准概念 488
别名/同义词 4,583
推荐表绑定 624
字段语义关键词 4,550
概念关系 1,387
覆盖业务域 34

全量评测任务:

1
D:\AGENT\data-skill-schema-minerpro\mcp\evals\full-dictionary-tasks.json

任务分布:

任务类型 数量
business:按业务含义找表 20
table:给定资源表解释业务 20
relation:查相邻概念或上下游关系 20
field:按字段语义定位表 20
alias:用简称/别名定位资源 20

LinkAlign Lite 在线评测在这 100 条任务之外,额外加入了 4 条真实业务问题:

真实业务问题 目的
学生期末评价完成状态应该用哪些表 验证状态类业务表和字段角色识别
查一下所有教师的名单 验证教师/教职工名单类主表筛选
教学任务授课教师应该用哪些表 验证教学任务与教师关系表
学生基本信息、学号、姓名、学院和专业应该查哪些表 验证学生基础信息与专业学院字段

5. 指标解释

本次报告里有两组指标,不要混着看。

第一组是排名指标:

指标 含义
P@5 前 5 个结果里有多少比例是期望表。比如前 5 个命中 2 个,就是 2/5 = 40%。
R@5 期望表中有多少比例出现在前 5 个结果里。比如期望表有 4 个,前 5 个命中 2 个,就是 2/4 = 50%。
MRR 第一个正确表排在第几名。第 1 名命中为 1,第 2 名命中为 0.5,第 3 名命中为 0.333;完全没命中为 0。

第二组是集合指标:

指标 含义
set precision 不固定看前 5 个,而是看最终返回的候选集合里,相关表占多少。这个更适合评价 LinkAlign 过滤后的候选纯度。
set recall 期望表中有多少被最终保留下来。
noise reduction 被过滤表数量 / 原始候选表数量。
over-filtered rate 原始候选中有正确表,但过滤阶段把正确表剔除了的任务比例。
role coverage 保留表中有字段角色识别结果的表占比。
doops verified rate 候选表通过 doops 在线 Hive Metastore 验证的比例。

注意:LinkAlign 过滤后通常只保留 2 到 4 张表,如果继续用固定分母的 P@5,它会因为“结果少于 5 个”被天然惩罚。所以对 LinkAlign 更应该看 set precision、set recall、noise reduction 和 over-filtered rate。

6. 全量字典离线评测结果

这一步使用已有的 run-full-dictionary-eval.js,不走 doops,只看业务目录、标准字典和关系字典对候选排序的影响。

模式 P@5 R@5 MRR conceptRecall relationAccuracy
原始目录检索 baseline 26.4% 84.9% 84.8% 无 无
标准字典 21.0% 74.6% 82.2% 88.0% 12.0%
关系增强字典 21.0% 74.6% 82.2% 88.0% 86.0%

解释:

标准字典和关系增强字典没有让 P@5、R@5 直接变高,原因是全量任务的“期望表”很多来自目录生成的伪 gold,字典会把概念、别名、字段语义补全,但排序仍受业务目录和表名相似度影响。

关系增强字典最大的变化在 relationAccuracy:从 12.0% 提升到 86.0%。这说明“概念之间的关系”确实被补上了,但关系补全不等于前 5 张表排序一定更准。

7. LinkAlign Lite 在线评测结果

这一步使用 run-linkalign-lite-experiment.js,覆盖 104 条任务,全部走 doops 在线 Hive Metastore 元数据验证。

7.1 总体结果

指标 原始候选 LinkAlign 保留候选
平均候选表数量 7.97 2.60
P@5 12.9% 10.8%
R@5 40.1% 35.8%
MRR 38.4% 35.8%
set precision 9.4% 23.4%
set recall 42.9% 35.8%
平均字段抽取数 无 22.15
字段角色覆盖率 无 95.1%
噪声削减率 无 67.5%
doops 在线验证率 100% 100%

结论:

LinkAlign Lite 的主要收益不是“让前 5 名排名指标全部变高”,而是把一个很吵的候选列表压缩成更适合人工复核或 SQL 生成器使用的 schema 上下文。也就是说,它更像一个候选清洗器,而不是单纯的召回排序器。

7.2 只看“原始召回已经命中”的任务

104 条任务中,有 51 条的原始候选里至少包含 1 张期望表。只看这 51 条,更能看出过滤器本身的效果。

指标 原始候选 LinkAlign 保留候选
任务数 51 51
平均候选表数量 7.94 3.04
set precision 19.3% 47.7%
set recall 87.6% 73.0%
噪声削减率 无 61.9%
过度过滤任务数 无 11

解释:

当召回层已经把正确表放进候选后,LinkAlign Lite 能把候选纯度提升约 2.47 倍,但会损失一部分召回。这个取舍符合 LinkAlign 论文里的核心矛盾:语义增强召回会带来噪声,过滤噪声又可能误伤正确 schema。

8. DeepSeek 辅助样本结果

为了测试大模型放进语义审计和候选过滤后的变化,本次额外跑了 12 条 DeepSeek 样本。这个样本不是主评测,只用于看趋势。

指标 规则版前 12 条 DeepSeek 版前 12 条
任务数 12 12
原始候选 set precision 13.5% 14.6%
原始候选 set recall 45.8% 51.4%
保留候选 set precision 27.1% 46.7%
保留候选 set recall 36.1% 48.6%
保留候选 MRR 37.5% 58.3%
噪声削减率 62.5% 55.2%
过度过滤率 16.7% 8.3%
doops 在线验证率 100% 100%
总耗时 约 24.7 秒 约 206.0 秒

解释:

DeepSeek 版能更好地理解问题意图,尤其是“教学任务授课教师”这类关系表问题,保留集合的 precision 和 MRR 都有明显提升。但是耗时约为规则版的 8 倍以上,所以建议:

  1. 普通查询默认用规则版,速度快、结果稳定。
  2. 候选过多、用户问题模糊、或需要生成 SQL 前上下文时,再启用 DeepSeek。
  3. LLM 输出仍需要 doops 元数据验证兜底,不能只相信模型判断。

9. 典型样例

9.1 学生期末评价完成状态

问题:

1
学生期末评价完成状态应该用哪些表,字段大概是什么含义?

原始候选 8 张:

1
2
3
4
5
6
7
8
ods_mks_xsqmpjwczt_z
ods_mks_xsqmpjwczt
dwd_jwxt_xsjbxx
dwd_mks_xsxx
ods_lxxt_xsxh
dwd_mks_xskb
dwd_zyys_xsxx
dwd_xy_xsxx

LinkAlign Lite 保留 2 张:

表 含义 关键字段
ods_mks_xsqmpjwczt_z 学生期末评价完成状态_总 xh 学号,wid 主键,pjzt 是否完成评价,xnxq 学年学期,updatetime 更新时间
ods_mks_xsqmpjwczt 学生期末评价完成状态 xh 学号,kcmc 课程名称,kch 课程代码,pjzt 是否完成评价

指标:

阶段 precision recall
原始候选集合 25.0% 100.0%
LinkAlign 保留集合 100.0% 100.0%

这个样例是成功案例。用户问的是“评价完成状态”,而不是“学生基本信息”。LinkAlign Lite 把学生基本信息、学生课表、学生画像类表降为噪声候选,只保留真正含 pjzt 状态字段的麦可思评价表。

9.2 查所有教师名单

问题:

1
查一下所有教师的名单

原始候选 8 张中混入了学生、课表、开学日期等表。LinkAlign Lite 保留:

表 判断
dwd_mks_jzgxx 教职工信息,包含 gh 工号、xm 姓名、zc 职称、xydm 院系代码
dwd_rsxt_jsjbxx 人事系统教师信息,包含姓名、职工号、职称、教职工类别
ods_yjsjw_jsjbxx 研究生教务教师信息,包含教师职称、教师类型、导师状态等字段
dwd_mks_kxrq 被保留但可疑,表注释为开学日期,字段注释里出现教师姓名和职工号,需要后续规则修正

指标:

阶段 precision recall
原始候选集合 37.5% 100.0%
LinkAlign 保留集合 75.0% 100.0%

这个样例说明 LinkAlign Lite 对“名单/主表”类查询有效,但也暴露了一个问题:如果在线元数据里字段注释异常,规则会被误导。dwd_mks_kxrq 应该被降级为可疑候选。

9.3 教学任务授课教师

问题:

1
教学任务授课教师应该用哪些表,字段大概是什么含义?

原始候选包含:

1
2
3
4
5
6
7
8
ods_bksjw_jxrw_skjs
ods_bksjw_jxhd_skjslb
ods_bksjw_jxrw
dwd_jwxt_jxrw
ods_yjsjw_pyjxrw
ods_yjsjw_pyjxrwlw
ods_yjsjw_pyjxrwl
ods_bksjw_jxrw_sj

LinkAlign Lite 只保留:

1
ods_bksjw_jxrw_skjs

原因是这张表注释为“教学任务-授课教师”,字段包含:

字段 含义
lesson_id 教学任务 ID
teacher_id 教师信息 ID
ord 教师在教学任务内的顺序

从业务理解看,这个结果有合理性,因为用户问的是“授课教师”,ods_bksjw_jxrw_skjs 是教学任务和教师之间的桥接表。但是评测期望表包含 dwd_jwxt_jxrw、ods_bksjw_jxrw_sj、dwd_jwxt_kcb,没有把桥接表列入 gold,导致指标上表现为 0。

这个样例说明:后续人工标注 gold 时,不能只标主表,也要标关系表、桥接表,否则会误判 LinkAlign 的结果。

10. 问题分析

10.1 主要问题是召回层不足

104 条在线任务中,只有 51 条原始候选里包含期望表。这意味着 53 条在进入 LinkAlign 过滤前就已经找不到 gold 表。

这类问题不能靠过滤器解决,需要优化:

  1. 标准字典里的 preferredTables 覆盖。
  2. 别名、旧表名、目录资源名和物理表名之间的映射。
  3. 搜索阶段对字段名、字段注释、资源名称的权重。
  4. DataRiver 逻辑表、血缘表与 Hive 物理表之间的桥接。

10.2 过滤规则有时过严

本次过度过滤 11 条,占 10.6%。典型原因:

原因 表现
名单/主表规则过强 对组织架构、部门信息、教学任务这类非名单表误判
目标实体判断过强 问“教职工基本信息”时,把一些同主题学生/课表表直接过滤
gold 标注粒度不够 用户问关系表,但 gold 只标主表,导致正确桥接表被算错
字段注释质量影响 字段注释不准时,规则会保留错误表或误删正确表

10.3 P@5 不能单独评价 LinkAlign

LinkAlign 的目标是“缩小候选上下文”,不是返回固定 5 张表。如果只看 P@5,保留 2 张表时分母仍是 5,天然吃亏。

更合理的评价方式是组合看:

1
2
3
4
召回层:P@5 / R@5 / MRR
过滤层:set precision / set recall / noise reduction / over-filtered rate
字段层:role coverage / selected field count / 人工复核通过率
在线层:doops verified rate

11. 当前能做到什么

这次实验后,项目已经可以做到以下具体事情:

  1. 输入一个中文业务问题,先用标准字典定位业务概念、别名、推荐表和字段关键词。
  2. 从本地目录和 Hive 元数据缓存中召回候选表。
  3. 使用 doops 在线查询 Hive Metastore,确认候选表真实存在,并拿到字段、注释、存储位置。
  4. 对候选表给出 kept 或 rejected 判断。
  5. 对每张表给出保留或剔除原因。
  6. 对保留表抽取关键字段,并标注字段角色,例如身份键、状态字段、时间字段、维度字段、度量字段、关联键。
  7. 对一个问题输出可复核 JSON,前端页面也可以展示 LinkAlign 增强结果。
  8. 批量跑 100 条以上问题,生成可追溯的 JSON 实验结果。
  9. 可选启用 DeepSeek,让模型参与语义审计和候选过滤。

它还不能稳定做到:

  1. 自动生成最终生产 SQL 并保证执行正确。
  2. 自动判断所有 join 路径。
  3. 自动发现召回阶段完全没有进入候选集的正确表。
  4. 替代人工对标准字典和 gold 期望表的审核。

12. 后续优化建议

优先级从高到低:

  1. 修召回层:把未命中的 53 条任务分组,补充标准字典 preferredTables、别名、旧表名映射。
  2. 建人工复核 gold:至少抽 50 条问题,人工标注“主表、关系表、辅助表、噪声表”,不要只标一个主表。
  3. 优化过度过滤:针对教学任务、组织架构、部门信息、人员基础信息增加专门规则。
  4. 引入 DataRiver 血缘:把逻辑表、结果表、来源表和 Hive 物理表关系并入候选排序。
  5. LLM 分级启用:普通查询走规则版,低置信或高风险问题再启用 DeepSeek。
  6. 增加人工复核页:把 kept/rejected、字段角色、doops 证据做成可勾选的审核表,用人工反馈反向更新字典。
  7. 加 SQL 草稿阶段:在 LinkAlign 结果稳定后,再让 SQL 生成器基于保留表和字段生成只读 SQL 草稿。

13. 实验产物

代码与脚本:

文件 作用
D:\AGENT\data-skill-schema-minerpro\mcp\src\linkalign-lite.js LinkAlign Lite 主流程
D:\AGENT\data-skill-schema-minerpro\mcp\evals\run-linkalign-lite-experiment.js 批量在线评测脚本
D:\AGENT\data-skill-schema-minerpro\mcp\package.json 新增 eval:linkalign-lite 命令

实验结果:

文件 说明
D:\AGENT\data-skill-schema-minerpro\mcp\evals\full-dictionary-eval.latest.json 100 条全量字典离线评测结果
D:\AGENT\data-skill-schema-minerpro\mcp\evals\linkalign-lite-experiment.latest.json 104 条 LinkAlign Lite + doops 在线评测结果
D:\AGENT\data-skill-schema-minerpro\mcp\evals\linkalign-lite-experiment.llm-sample.json 12 条 DeepSeek 辅助样本结果

验证结果:

1
2
3
4
5
npm run check              通过
npm run security:check 通过
npm run eval:full-dictionary 完成 100 条
npm run eval:linkalign-lite -- --limit 104 完成 104 条,失败 0 条
npm run eval:linkalign-lite -- --limit 12 --llm 完成 12 条,失败 0 条

14. 最终判断

LinkAlign 的思想可以用于本项目,而且适合放在“自然语言问询”和“SQL/数据查询”之间,作为 schema linking 中间层。

本次实验说明它已经能解决一个很实际的问题:用户问一个业务问题时,系统不再只是返回一堆相似表,而是能把候选表压缩、解释为什么保留或剔除,并给出关键字段角色。它的短板也很清楚:召回层还不够全,规则过滤有误伤,gold 标注需要更贴近真实业务问法。

所以目前最稳妥的落地方式是:

1
2
3
4
标准字典召回候选
-> doops 在线元数据验证
-> LinkAlign Lite 过滤和字段抽取
-> 人工复核或 SQL 生成器使用

不要直接把它当成“自动 SQL 正确率已经解决”的模块。它现在解决的是“先找对表、少给噪声、解释字段”的问题,这是后续做可靠问询和自动 SQL 的前置条件。