让AI听懂业务话:语义映射层的设计方法

6次阅读
没有评论

数据底层已经整齐,双ID打通了所有关联通道。但老板不会写 SQL,他只对着聊天框说”上个月智慧园区花超了没”。本篇是「企业数据查询助手」系列第二篇,解决中间层的核心问题:如何在结构化数据和自然语言之间搭一座”语义映射桥”,让大模型把口语化提问准确翻译成可执行的 SQL。


一、先承认一个现实:大模型读不懂你的字段名

把一张主档表和五张事实表的结构丢给大模型,它能直接回答业务问题吗?不能。

老板问”上个月智慧园区花了多少钱”,大模型需要先搞清三件事:

  • 「智慧园区」对应哪个项目ID?(实体未知)
  • 「花了多少钱」对应哪张表的哪个字段?(语义未知)
  • 「上个月」是哪个月?(时间未知)

这三件事,大模型没法靠猜。它需要你提前把”业务语言”和”数据字段”之间的对应关系喂给它。

语义映射的本质:把老板说的”人话”,翻译成 SQL 能执行的”数据库语言”。 这层映射不建好,大模型只能自由发挥——也就是幻觉。


二、语义映射的三层架构

我们把这层桥拆成三个独立配置,各管一件事,互不耦合。

【第一层:数据字典(Schema 描述)】

告诉大模型有哪些表、每个字段的中文含义、类型、取值范围。这是最底层的事实陈述,不带任何业务解读:

# 这段在做:定义财务事实表的字段级语义
tables:
- name: finance_fact
  description: 财务事实表,记录每月营收与成本
  fields:
  - {name: project_id, desc: 项目ID, type: varchar}
  - {name: product_id, desc: 产品ID, type: varchar}
  - {name: revenue,    desc: 本月确认收入, unit: 元}
  - {name: cost,       desc: 本月成本, unit: 元}
  - {name: period,     desc: 账期, format: YYYY-MM}

【第二层:业务术语表(口语 → 字段)】

老板不会说”查询 finance_fact.cost”,他说”花了多少””成本””花超了没”。这些口语化表达必须显式映射到字段:

# 这段在做:把业务口头语映射到具体字段
terms:
- {alias: [花了多少, 成本, 花费], target: finance_fact.cost}
- {alias: [营收, 收入, 赚了多少], target: finance_fact.revenue}
- {alias: [进度, 做完了吗], target: progress_fact.completion_pct}

术语表是防幻觉的第一道闸门。 没有它,大模型会把”花超了”理解成 expense、cost、budget 任意一个,结果每次都不一样。

【第三层:实体映射(名称 → ID)】

项目名、产品名、客户名等业务实体,必须映射到精确ID或主键值:

# 这段在做:把项目名称映射到项目ID
entities:
- {name: 智慧园区, id: PRJ-2024-001}
- {name: 数据中台, id: PRJ-2024-005}
- {name: AI客服,   id: PRJ-2025-003}
▸ 小贴士:理论上可让大模型去主档表里实时查”智慧园区”对应的ID,但稳定性差。把高频实体写死在配置里,省去一次多余查询,准确率显著提升。低频实体再走动态查询。

三层各自独立的好处:数据字典变了不动术语表,术语表扩了不动实体映射。维护成本最低。


三、提示词工程:固化翻译流程

三层配置拼成一段系统提示词,告诉大模型它的角色与固定工作流:

  1. 接收用户问题 → 先用业务术语表翻译成字段名
  2. 用实体映射找到对应的项目ID/产品ID
  3. 根据数据字典确定查询哪张表
  4. 生成 SQL,用双ID关联(参见第一篇范式)
  5. 执行查询 → 用自然语言返回结果

【防幻觉机制】

  • 禁止使用术语表和实体映射之外的字段名
  • 禁止臆造表名或表别名
  • 查询必须带账期范围,否则拒绝执行
  • 无法映射的术语必须显式回报”未识别”,而不是猜

流程一旦固化,大模型就只能在你划定的语义边界内生成 SQL,而不是自由发挥。


四、完整查询链路走查

老板问:”上个月智慧园区花了多少,赚了多少?”

大模型的处理过程:

  1. 术语匹配:「花了多少」→ finance_fact.cost;「赚了多少」→ finance_fact.revenue
  2. 实体匹配:「智慧园区」→ PRJ-2024-001
  3. 时间推断:「上个月」→ 当前月-1 = 2026-06
  4. 生成 SQL:
-- 这段在做:查指定项目指定月份的营收与成本
SELECT p.项目名称, f.revenue AS 收入, f.cost AS 成本
FROM master_dim p
JOIN finance_fact f
  ON p.项目ID=f.项目ID AND p.产品ID=f.产品ID
WHERE p.项目ID='PRJ-2024-001' AND f.period='2026-06'

5. 返回自然语言:”智慧园区项目 2026 年 6 月收入 580 万、成本 320 万、盈余 260 万。”

老板只输入了一句话,全程不知任何表名或字段名。 这就是语义映射层的价值。


五、边界与局限

这套方案不是万能的,有明确适用边界:

【适用场景】

  • 业务术语相对稳定、字段语义清晰
  • 实体集合有限(项目/产品/客户可枚举)
  • 查询以聚合统计为主,不涉及复杂多跳关联

【不适用场景】

  • 业务术语频繁变更、字段含义模糊
  • 需要跨库关联、多跳 JOIN 超过三层
  • 涉及实时流计算或复杂窗口函数

准确率提升策略:术语表覆盖度决定 80% 的准确率,实体映射覆盖度决定剩余 20%。 先把团队最常问的 50 个问题反向拆解,补齐术语和实体,比堆模型参数有效得多。

▸ 小贴士:上线后建立”失败问答日志”,每周复盘一次未识别的术语和实体,持续回填到映射表。这是一个长期工程,不是一次性配置。

写在最后

本篇搭建的是数据查询助手的第二层——语义映射层。它的唯一作用:让大模型在”业务语言”和”数据库语言”之间准确翻译。

三层架构至此成型:第一层是数据地基(双ID+主档表),第二层是翻译桥梁(语义映射),第三层才是调用大模型真正起飞。地基不牢,桥梁不稳,模型再强也只是放大错误。

如果你正在规划公司内部的 AI 数据查询功能,下周可做一件事:列出团队最常被问的 10 个业务问题,反向拆解每个问题需要哪些表、哪些字段、哪些口语化表达。这就是你的第一份语义映射表草稿。

你们业务里最常被问到的”自然语言查询”是什么?欢迎评论区分享,看看大家的语义映射够不够用。

正文完
 0
评论(没有评论)