你的ChatBI(问数)准确率不到50%?带你深度拆解90%准确率的高德ChatBI案例

"我们的ChatBI上线半个月,准确率不到50%,老板问我们是不是在做假demo..."

如果你在做ChatBI,或正在评估要不要上ChatBI,相信你遇到过类似问题。

很多团队以为"ChatBI就是用大模型做自然语言到SQL的转换"。

有时还会被领导质疑:"找个开源项目3天就能搞定,你们怎么用了这么久?"

几度陷入自我怀疑...

要知道,单纯依赖开源项目做ChatBI,就像指望买辆车就能参加F1比赛。

前不久我研究了高德准确率接近90%的ChatBI方案,和他们对另外10%的完整兜底方案。

这篇文章不仅带你扫盲ChatBI的基础,还会带你深度拆解高德案例。

告诉你为什么只靠text2sql注定走不通,以及如何构建真正可用的ChatBI系统。

看完你就会明白,那些准确率90%的ChatBI产品,背后到底做对了什么。

做了这么多ChatBI项目,我发现:很多人对ChatBI的理解有偏差。

ChatBI分为Chat和BI。

BI,Business Intelligence。

大家第一反应都是"商业智能",高大上,但太抽象。

Business,除了"商业",也指"业务"。

学校有学校的业务,政府有政府的业务,都算Business。

Intelligence除了"智能",还有"情报"的意思。

比如C.I.A,

所以我更倾向于把BI理解为"业务情报"。

情报的本质是提供"洞察",那业务情报的本质就是提供"业务洞察"。比如:

电商平台的运营人员,每天面对海量的销售数据、用户行为数据。

如果只盯着这些原始数据看,很难发现什么规律。

BI系统对这些数据做"采集、存储、处理"等一系列处理,最后生成可视化图表。

运营就能发现:哪个品类表现突出、哪个渠道转化率下滑、用户什么时间最活跃。

这些发现,就是业务洞察。

BI是"通过业务情报,辅助人获得业务洞察的系统",Chat是"聊天",

因此,ChatBI是"通过聊天的方式来获取业务洞察的系统"。

传统BI只能看图表,ChatBI可以直接聊。

以往,使用传统BI,业务部门想了解数据,得找技术部门:

业务:"帮我做个报表,看看上月各品类销售情况。"

技术:"好,明天给你。"

业务:"我很急..."

技术:"大家都很急...你们pk看谁更急..."

业务:"..."

现在通过ChatBI,业务直接问系统:"上月哪个品类卖得最好?",系统立即给出答案和相关图表。

但关键在这里:别把ChatBI简单理解为 " 自然语言查数据库 " 或者 " text2sql "

Chat是使用BI成果的交互方式,真正决定业务洞察效果的,还是背后的BI能力。

数据治理做得怎么样?指标体系建得是否合理?这些基础工作才是关键。

与其把精力都放在text2sql的技术实现上,不如多花点时间在数据基础建设上。

毕竟,再智能的对话交互,也无法从混乱的基础数据中,给出你满意的答案。

ChatBI从来不只text2sql,真正的挑战在BI。

每年年初,公司各部门都会提数据分析需求。

市场部:"我要看每个省份门店销售排行、同比增长、客流变化。"

运营部:"做个库存预警仪表盘,超7天未动销要提醒。"

听起来合理,但这些需求通过邮件、OA、例会,零散汇集到IT部门后,问题就来了。BI项目经理要和数据分析师开需求评审会:梳理优先级、指标定义、可行性...光是怎么算"同比增长",就能讨论半天。

需求讨论后,数据工程师要去各系统找数据。

"订单、销售明细→ POS系统"

"门店、商品信息→ ERP系统"

"会员活跃度→ CRM系统"

"库存变动→ WMS系统"

这里稍微微解释一下这几个系统的作用:

POS系统:处理门店收银和销售交易,记录每笔买卖

ERP系统:统一管理企业核心资源,如商品、门店、财务、采购等基础信息

CRM系统:管理客户资料、消费行为、会员等级和营销活动,提升客户忠诚度

WMS系统:管理商品入库、出库、库存和仓库作业,确保库存准确高效

每个系统数据库结构不同,接口文档也不都齐全。

数据工程师要一个个对接,整理表名、字段含义。

然后开发ETL脚本:凌晨4点定时任务,从源系统抽取数据,第一次全量,后续增量,存入数据仓库。

然后,真正的问题才刚刚开始。

数据搬过来发现:订单表有重复,产品编码历史上变更过,时间格式不统一,某些字段为空...脏数据层出不穷。

数据开发团队要用SQL脚本清洗:去重、补全、类型统一、逻辑校验。每步都要小心,生怕出错。

还要分层管理,ODS、DWD、DWS、ADS...光记住这些缩写就够头疼。

改一个字段,影响十几个下游表是常事。

BI建模师要设计主题数据模型

比如"地区-门店-商品-日期"四维度销售事实表,配上商品、门店、员工维表。

还要定义指标口径:"销售额=售价×数量-折扣"。别小看这个公式,光"折扣"怎么计算,业务方就能争论好几轮。

有经验的建模师会预留扩展字段,因为他们知道:业务需求永远在变。

BI工程师开发可视化报表

比如,销售排行TOP10、品类趋势、库存预警...

设计初版后收集业务反馈,然后反复改:

"这个颜色不好看"、"能加个筛选条件吗"、"响应能快点吗"...

每次修改都要重新测试,确保不影响其他功能。

上线后还要设置定时任务:每日凌晨跑脚本生成日报,月初汇总推送管理层...

你以为这就结束了?这只是开始。

比如,区域经理:"报表数据异常,销售额平时几万今天只有几十。"

数据团队排查发现:"业务系统同步延迟,统计时数据不完整。"

然后和业务IT调整同步策略。

比如,业务部门又有新需求,BI团队评估排期,然后整个流程重新再走一遍。

以上,总结出BI本身的主要流程如下:

1、业务部门提出数据分析需求。

2、数据工程团队定期或实时采集业务系统数据,清洗后统一入数仓。

3、数据分析团队与业务部门反复沟通,基于实际业务场景定义标准的数据模型、指标及统计口径。

4、BI开发团队基于这些模型开发和迭代报表、仪表盘,过程中持续收集业务反馈。

5、最终,通过自动化调度实现报表数据的定期或实时更新,保障各层级数据使用人员及时掌握业务动态。

6、BI团队、数据团队继续接受随时提出的反馈,排查问题、评估新需求能否实现、排期...

这就是传统BI:责任分工清晰,流程规范,但严重依赖人工,自动化有限。

很多时候,业务真正想要的是"告诉我销售为什么下降了?",或者了解一下"某个指标是如何统计的?"

但得到的却是一堆需要自己解读的图表,指标统计口径更是只有问技术人员才能知道,而技术人员不是那么有空的。

而ChatBI的出现,让我们终于可以用聊天的方式和数据交流。

不用记术语、操作步骤,不需要等长开发周期,像和朋友聊天一样说出疑问,就能得到答案。

这是从 " 人适应工具 " " 工具理解人 " 的转变。

ChatBI带来的新可能

以前:写需求邮件→ 开例会解释 → 你说A我听成B → 再拉人解释

现在:直接问"本月库存报警最多的门店有哪些?" → 10秒内得到报表和分析

以前开发新报表要排队半个月,现在简单的数据探索、图表调整、指标变换,只要会打字就行。

想换个角度?随时切换:"去年和今年差异最大的省份是哪个?"AI立即帮你做趋势对比。

以前BI报表满屏专业词汇缩写,业务同事经常问"这活跃用户到底怎么算的?"

现在ChatBI能把复杂指标翻译成人话,业务小白也能看懂。

遇到临时想法,不用写需求文档排队,提出来立马有反馈。这对业务效率的提升是肉眼可见的。

ChatBI让我们终于能用 " 人话 " 和数据对话了。

ChatBI还做不了什么?

数据基础设施仍需人工。比如,后台数据接口对接、源头数据质量治理、 表字段历史变更梳理、源系统更新适配。

AI不可能凭空变出你想要的数据,底层的硬活脏活,还得有人干。

企业级建模需要专家。比如,复杂的数据仓库建模、 跨部门数据定义标准、业务规则的最终拍板。

每家企业业务都不同,AI能建议,但最终决策还得人来做。

权限安全必须人工把控。比如, 数据访问权限设计、不同用户可见范围控制、数据安全策略制定。

数据绝不能"放飞自我",这块AI帮不上忙。

ChatBI让数据分析变得"接地气"了,每个人都能随手问、天天用,探索的主动权回到业务手里。但基础设施和数据治理这些"水电煤",还得靠专业团队。只有两边配合,企业才能真正享受到聊天式分析的敏捷体验。

ChatBI不是替代数据团队,而是他们数据治理成果的价值放大器。

ChatBI自身面临的挑战

即使BI基础已经做得很好,想实现ChatBI,仍然要解决这些技术难题:

数据规模

企业级BI系统动辄几百上千张表,每张表几十上百个字段。

这些信息全塞给大模型?就算最新的长上下文模型也会消化不良。

时间语义

用户说"近三年"、"去年同期"、"今年Q1",人类很容易理解,但让系统准确解析就复杂了。

时间基准点、业务日历、财务年度...这些都需要准确建模。

专业术语

每个行业、每家公司都有自己的"黑话":财务说"应收账款周转率"、销售说"漏斗转化"、运营说"留存曲线"。

这些概念背后往往有复杂的计算逻辑和业务规则。

我见过一个零售企业,光"有效客户"就有三套不同定义,分别用于不同业务场景。

实体对齐

用户说"北京地区",数据库里存的可能是:"110000"(行政编码)、"Beijing"(英文)、"BJ"(简称)。

用户说"小米手机",系统里可能是"MI_PHONE"或品牌编码"1001"。

多系统集成环境下,同一概念在不同系统中表示方式完全不同。

复杂推理

最难的是复杂查询推理。

用户问"哪个地区的高价值客户增长最快",系统需要:

-定义"高价值客户"标准

-跨客户表、订单表、地区表关联查询

-计算不同时间段增长率

-排序筛选结果

这种多步推理对模型逻辑能力要求很高,每一步出错都影响最终结果。

ChatBI的核心难点不在Chat,而在于如何让机器真正理解业务。

技术栈可以选择,算法可以优化,但业务理解需要时间积累和不断调试。

这也是为什么很多团队选择先从简单查询开始,逐步扩展到复杂分析。

不要指望一上来就做到100%准确率,先解决60%的常见查询,剩下的再找方案,但必须找方案。

以上,科普部分就这么多。我终于可以开始聊高德是如何做到90%的准确率了。

高德团队认为:"没有一步到位的完美方案,不要想着一上来就解决所有问题。"

他们用"灵活性"和"复杂度"两个维度,将业务场景分成四个象限:

固定场景(第二、三象限)用Chat2API

Chat2SQL在复杂的指标统计下,会涉及"多表关联","嵌套查询","复杂计算公式",导致生成正确sql的概率很低。

Chat2API将复杂逻辑封装在后端服务中,还可通过缓存提高响应速度,对外接口往简单去设计,提高生成正确接口参数的概率。

不管简单还是复杂,业务稳定的场景都用Chat2API。

灵活简单场景(第四象限)用Chat2SQL

比如,临时增加的指标,虽然没有提前存储,但可简单统计得出,则使用Chat2SQL。

如果用Chat2API,则每次需求变化都要开发新接口:

查看代码

复制代码
# 今天的需求:按地区查询销售额
@app.route('/sales/by-region')
def sales_by_region(region):
return db.query(f
"
SELECT SUM(amount) FROM sales WHERE region='{region}'
"
)
# 明天的需求:按时间+地区查询
@app.route('/sales/by-region-time') # 又要新增API
def sales_by_region_time(region, start_date, end_date):
return db.query(f
"
SELECT SUM(amount) FROM sales WHERE region='{region}' AND date BETWEEN '{start_date}' AND '{end_date}'
"
)
# 后天的需求:还要加上产品类型... 
# API数量爆炸!

而采用Chat2SQL可灵活应对:

查看代码

复制代码
-- 今天:按地区查询
SELECT SUM(amount) FROM sales WHERE region = '华东';
-- 明天:按时间+地区查询 
SELECT SUM(amount) FROM sales 
WHERE region = '华东' AND date >= '2024-07-01';
-- 后天:再加产品类型
SELECT SUM(amount) FROM sales 
WHERE region = '华东' 
AND date >= '2024-07-01' 
AND product_type = '电子产品';

临时查询、简单统计场景用Chat2SQL。

灵活且复杂的场景(第一象限),用Agent

对于复杂逻辑的,比如问一些为什么、怎么做、怎么选类似的场景,通常需要多步骤推理。

这不是Chat2API、Chat2SQL这种一次调用/查询,一次生成能搞定的事情。

通过Agent可以在Chat2API、Chat2SQL以及其它tools基础上,灵活组合、多轮调用,然后综合所有结果,得到最终答案。

用户问:"为什么A产品的销量下降了?"

仅用Chat2API或Chat2SQL,无法实现。

举个例子:

查看代码

复制代码
# 用Chat2API,需要预设所有可能的API组合
# 但用户的需求可能是这些的任意组合!
# 且只能调用预设的API,无法进行下一步执行
{
  "apis": [
    "sales-trend-analysis",
    "competitor-analysis", 
    "market-factor-analysis",
    "recommendation-engine",
  ]
}
# 用Chat2SQL,只能查到数据,然后呢?SQL无法进行下一步分析...
SELECT sales FROM products WHERE name='A'

再看看如果用Agent:

为了简化Agent过程,这里把问题收窄,加入时间维度"6月比5月"。

用户问:"为什么A产品6月比5月销量下降了?"

首先,Agent会思考到需要搞清楚具体下降了多少;

然后,Agent会调用SQL查询工具获取5月和6月的销量数据;

接着,Agent发现5月1000件,6月800件,下降了20%;

然后,Agent判断20%的下降已经超出正常波动范围,需要深入分析。

接着,Agent思考:这个下降是我们独有的问题,还是整个市场都在下降? 然后,Agent先调用年同比分析工具,发现去年6月是950件,今年确实下降了。

但这还不够,Agent又调用市场趋势分析工具,发现整个行业实际上增长了2%。

为了进一步确认,Agent还查了竞品数据,发现竞品B增长8%,竞品C持平,竞品D增长3%。

这下Agent明白了:市场整体向好,竞品表现不错,问题确实出在自己身上。

然后,Agent开始拆解问题。

Agent知道"销量=访客数×转化率×客单价",于是调用销售漏斗分析工具。 结果显示访客数从10000降到8500(下降15%),转化率从5%降到4.7%(下降6%),客单价没变。

Agent分析这些数据后推理:访客大幅下降但转化率相对稳定,说明来的人还是愿意买的,产品本身没问题,主要是来的人少了。

这通常是流量获取的问题。

于是,Agent调用流量来源分析工具,发现付费广告流量下降了35%,而自然搜索和社交媒体流量都在增长5%。

问题锁定了:是广告流量出了问题。

Agent继续深挖,调用广告投放分析工具,发现6月的广告预算从50万减少到35万,下降了30%,但广告的点击率和转化率都保持稳定。

最后,Agent验证整个逻辑链:广告预算削减30%导致广告曝光减少,进而使付费流量下降35%,总访客减少15%,最终销量下降20%。

Agent得出结论:根本原因是广告预算被削减,解决方案就是恢复广告预算,预计恢复后7月销量可以回升到950件。

以上只是示例,具体什么效果,取决我们在Agent上的各种选型和改进策略,以及业务规则、基础数据的完善程度。

具体到Agent策略、机制、主流框架的使用等,后面会专门写文章讲。

这就是高德90%准确率的第一个思路:"不同场景用不同策略,而不是一套算法解决所有问题。"

高德数据分析场景中面临的ChatBI挑战

1. Chat2S QL目前仅达到"小学生"水平,但用户总会问"高考题"。

用户不管你能力如何,该问的还是会问。

这就是为什么要用四象限策略,让Chat2SQL只处理它能处理好的简单场景。

2. 元数据质量参 差不齐

现实中的数据表结构有很多历史遗留问题。

不同表或业务线的字段定义规范不一致。

有的描述清晰、口径统一,有的描述模糊、计算规则不明确。

同名字段在不同场景下含义可能完全不同。

3. 相似字段的语 义陷阱

"驾车完成率":完整用完一次导航的占比;

"驾车成功率":成功到达目的地的占比。

听起来差不多,但统计口径完全不同,业务含义差异很大。

4. 专业术语的理 解困难

像"导航完成度"、"路线覆盖率"、"实走覆盖率"这些专业术语,模型缺乏足够上下文时很容易理解错误。

5. 模型幻觉问题

生成稍微复杂的SQL时,可能出现:自己造字段、造表别名、造查询条件。

6. 结果一致性问

同一个问题,模型可能生成不同SQL,导致结果不同,甚至完全矛盾。

7.错误率10%, 依然影响用户使用

理论上90%准确率听起来不错,但实际业务中:

每100个查询就有10个是错的,用户往往不知道哪个是错的。

8.用户发现问题后 ,往往希望能立即解决

为了不被动响应,需要主动监控查询质量,收集用户反馈,持续迭代优化。

面对这些挑战,高德 团队的思路很清晰:

用户输入无法控制,通过路由分发来使用不同象限的策略;

模型能力有天花板,交给大模型厂商迭代,模型只会越来越强;

剩下的关键战场,就是"元数据质量"和"反馈迭代"。

这就是高德90%准 确率的第二个思路:"把有限的精力投入到能控制的关键环节。"

那高德怎么做元数据的?

刚做ChatBI的团队,往往认为只要把表结构这种元数据喂给大模型,就能生成各种想要的查询sql。

而传统表结构信息对ChatBI远远不够。

就像让新同事直接上手复杂业务查询,只给一份表结构说明,他也是一头雾水。

以"上周用户导航UV是多少"为例,模型需要理解:

  • 导航UV是什么?对应哪个字段?
  • 时间范围如何定义?

高德团队设计了四层元数据:

1. 业务域层,快速定位场景

识别这是导航业务、搜索业务还是路况业务。

2. 表结构层,提供数据基础

表业务含义、字段取值范围、关联关系(决定多表查询准确性)。

3. 业务知识层,处理专业术语和"黑话"

像"导航UV"这种导航业务特有概念,没有专门解释,模型可能理解成网站导航。

4. 通用知识层、标准化常用概念

数据分析常用概念、时间格式定义。

用户提问后,大致会经过下面5步,来得到生成sql 需要的上下文:

  1. 分析指标项,识别所属业务域
  1. 分析查询对象和筛选条件,在业务域范围内确定需要的表和字段
  1. 匹配业务知识,根据指标项找到对应的业务解释
  1. 标准化通用概念,如时间条件的标准取值
  1. 上下文生成,将以上信息与用户问题一起给模型生成SQL

做个简单总结:

一般方式:只提供表结构 + 用户问题 → 模型生 成SQL

高德方式:业务域 + 表结构 + 业务知识 + 通用知识 + 用户问题 → 模型生成SQL

模型本身能力有限,但通过精心设计的多层元数据,可大幅提升它对业务的理解能力。

这是高德90%准确率的第三个思路:"比起让模型 更聪明,不如给更多上下文。"

尝试过 Chat2SQL 的应该都有感触: 在生成多表关联的sql方面,准确率很 低。

因此,为了降低查询复杂度,通常把多张相关表的字段,构建成一张物理宽表,查询时直接查单表,避免复杂关联。

而物理宽表的问题在于:

存储成本高:字段多、数据量大

维护成本高:底表变化或宽表更改都要重新刷全表

针对这个问题,高德团队提出了"虚拟宽表"的思路。

把"多张底表怎么拼、口径怎么取、权限怎么控"预先写成可查询的"视图"。

虚拟宽表带来的优势很明显:

1. 不用自己写复杂join、最新分区、去重逻辑

2. 口径统一,大家都用同一套视图,统计标准一致

3. 行列权限与脱敏内置到视图中,统一控制

4. 底表变更或接入自定义特征,只改视图即可

5. 需要时,仍可对热点查询进行物化提速

比如,用户问:"最近7天各导航策略的活跃用户数?"

数据工程师一次性创建虚拟宽表

查看代码

复制代码
CREATE VIEW vw_nav_virtual_wide AS  
SELECT   
  a.user_id, a.strategy, a.ds,
  p.activity,           -- 从用户画像取活跃度  
  b.select_path,        -- 从用户行为取选择路径  
  c.custom_label        -- 预留自定义特征挂接点  
FROM nav_detail a       
LEFT JOIN user_profile p ON a.user_id = p.user_id   
LEFT JOIN user_behavior b ON a.user_id = b.user_id  
LEFT JOIN custom_features c ON a.user_id =c.user_id;--灵活扩展点 

那么,AI只需要生成下面这个简单的单表查询sql

查看代码

复制代码
SELECT strategy, custom_label, COUNT(DISTINCT user_id) AS dau
FROM vw_nav_virtual_wide  
WHERE ds >= current_date - 7 AND custom_label IS NOT NULL
GROUP BY strategy, custom_label;

如果要对宽表添加新业务字段,单独更新custom_features 表即可,

视图会自动包含新字段,无需改底表或重新建模。

相比物理宽表,虚拟宽表避免了:大规模冗余存储、变更响应慢、数据治理困难。

这就是高德90%准确率的第四个思路:"一个完美平衡'物理宽表简 单但同步困难'和'关联查询灵活但生成困难'的方案。"

元数据、虚拟宽表等基础设施就绪后,高德开始了ChatBI的三 阶段演化之路。

第一阶段:人怎么写SQL,就用COT(思维链)教大模型怎么写

把所有信息(同义词映射、时间规则、表结构信息、业务口径定义),塞进一个巨大的prompt,期望模型一步到位写出SQL。

就像让一个人同时做翻译、建模、写代码,任何环节出错都会影响最终结果,规则越加越容易产生冲突。

比如,用户问:"帝都昨儿订单多少?"

模型需同时完成:

  • "帝都" → "Beijing"
  • "昨儿" → 日期
  • 选表、聚合、过滤

任一步掉链子就失败。

这个阶段的准确率一般能达到60%就很不错了。

而且维护困难 、对提示词敏感,经常改动提示词后原来正常的地方又出错了。

但好处是,可以快速跑通系统。

第二阶段:引入单Agent + 设计原子工具

给模型设计一箱工具,模型只负责任务理解、规划和工具选择,具体执行逻辑由各个工具负责。

不过仍有痛点:

复杂问题导致工具调用链路变长,准确率峰值波动;

原子工具的提示词依然会膨胀;

对规划与参数一致性要求上升,稳定性需要继续优化。

这个阶段每个工具只负责自己的逻辑,且工具错 误在工具间被隔离,端到端准确率峰值突破到90%,但也常有波动。

第三阶段:设计分子化工具+引入多Agent

将多个相关的原子级工具(元数据检索、语法检查、示例检索等)与特定提示词组合,封装成专门的SQL生成Agent。

这种方式的优势在于:

保持了调用多种工具的灵活性;

通过专门提示词降低单个Agent认知复杂度;

不再需要一个Agent掌握几十上百个工具;

让每个Agent专注使用相关的几个工具,分工更明确、出错率更低

同时,这个阶段设计了 三种不同策略的SQL生成Agent,通过一个独立的SQL仲裁Agent选择最佳方案执行。

策略1:Query Plan CoT(查询计划)

按人的习惯将任务分解成三个关键步骤:

"确定要使用的表"、"在表上做计数、过滤或匹配操作"、"通过选择适当的列返回最终结果"。

策略2:Divide and Conquer CoT (分治)

将复杂问题分解成较小的子问题,先分别生成伪SQL查询(强调逻辑正确而非语义正确),然后组装起来生成最终可执行的SQL。

策略3:Example Generation(示例生 成)

将用户需求、相关表字段、筛选逻辑,以及与用户需求相似的SQL示例给模型(去除特定业务信息)。

举个例子,用户问:"找出2023年北京客户的平均订单金额"

策略1:Query Plan CoT(查询计划)

  1. 分析出需要 orders 表和 customers 表,通过 customer_id 关联;

  2. 分析出需要过滤:city = '北京'、order_date 在2023年;

  3. 分析出需要聚合:计算 total_amount 的平均值;

  4. 分析出需要返回"平均订单金额";

  5. 生成SQL:

查看代码

复制代码
SELECT AVG(o.total_amount) as avg_amount
FROM orders o 
JOIN customers c ON o.customer_id = c.customer_id
WHERE c.city = '北京' AND YEAR(o.order_date) = 2023;

策略2:Divide and Conquer CoT(分治)

查看代码

复制代码
一、分解成子问题,用伪SQL表达

-- 子问题1:获取北京客户,伪SQL1: 
SELECT 客户编号 FROM 客户表 WHERE 城市 ='北京'

--子问题2:获取2023年订单,伪SQL2:
SELECT 订单编号, 客户编号, 订单金额 FROM 订单表 
WHEREYEAR(订单日期) =2023

--子问题3:合并并计算平均值,伪SQL3: 
SELECTAVG(订单金额)
FROM 订单表
WHERE 客户编号 IN (SELECT 客户编号 FROM 客户表 WHERE 城市 ='北京')
ANDYEAR(订单日期) =2023


二、汇总生成最终SQL
SELECTAVG(o.total_amount) as avg_amount
FROM orders o
WHERE o.customer_id IN (
    SELECT customer_id FROM customers WHERE city ='北京') 
ANDYEAR(o.order_date) = 2023;

策略3:Example Generation(根据上下文+sql示例生成)

提供给模型的信息:

(1)用户的需求是要"计算特定城市特定年份的平均订单金额"

(2)相似SQL示例(去除具体业务信息)

查看代码

复制代码
-- 示例: 地区+时间筛选的聚合查询
SELECTAVG(订单表.金额字段) FROM 订单表
JOIN 客户表 ON 订单表.客户ID = 客户表.客户ID
WHERE 客户表.地区字段 ='某城市' ANDYEAR(订单表.日期字段) = 某年份;

模型基于示例生成最终SQL:

查看代码

复制代码
SELECT AVG(o.total_amount) as avg_amount
FROM orders o 
JOIN customers c ON o.customer_id = c.customer_id
WHERE c.city ='北京' 
ANDYEAR(o.order_date) = 2023;

最后,由一个仲裁Agent从三个不同策略的Agent分别生成的SQL中,选出一个最合适的来执行,而且这个独立的仲裁Agent只会选择一条最合理的sql,不会对这条sql做任何修改。

这就是高德90%准确率的第五个思路:"通过多个不同SQL生成Agent之间相互补充,将准确率峰值稳定在接近90%的状态。"

回顾一下高德ChatBI演化的三个阶段:

第一阶段:通过prompt + 数据基础设施建设,快速达到60分水平的ChatBI;

第二阶段:通过引入Agent和原子工具,拆解复杂prompt,降低错误率,达到90分峰值水平;

第三阶段:通过引入多Agent和分子工具,增加流程稳定性,降低Agent认知复杂度,将准确率稳定在峰值水平。

以上,就是高德90%准确率的思路。

那剩下的10%的错误率可以不管吗?答案是不能。

在生产环境,90%准确率意味着每10个查询就有1个出错,用户体验仍不够理想。

高德的理念是:"与其让AI攻克这10%,不如用人机协同 。"

通过有限合理地提高人的参与度,来弥补这10%的问题。

首先,在用户输入前,提供"提问助手引导",从源头减少奇怪的问题输入;

然后,在回答过程中,给出SQL的逻辑解释,让用户明白SQL是在干什么;

最后,在产出结果后,提供人工介入通道,用户无法判断SQL准确性或对结算结果有疑义时,可以申请人工介入,确保用户总是能走完需求闭环,同时收集用户反馈数据,为系统持续优化提供素材。

这是高德90%准确率的第六个思路:"不是让AI做到100%完美,而是让整个系统达到100%可用。"

基于元数据、Agent等构建ChatBI的核心技术思路拆解完毕。

持续优化迭代方面,除了收集用户反馈,高德也提出了ChatBI的主动评测原则。

1)重视评测集的构建

用真实用户的问法 + 基础能力模块(例如时间解析类、地理范围类、业务口径类)测试案例来搭建评测数据集。

注意保持鲜度(定期更新)、做难度划分(简单/中等/困难分类)。

就像考试要有标准答案一样,我们需要收集各种真实问题和标准SQL,这样才能客观衡量系统好不好用。

2)自动化冒烟测试

模拟真实环境,让系统自己跑一遍,看结果对不对;

特别关注大模型生成SQL的准确性和稳定性。

人工测试太慢,自动化能快速发现问题,确保每次改动都不会把系统搞坏。

3)自动化归因分析

SQL生成出错时,自动分析是哪个环节的问题(召回、生成、还是中途某个步骤)

不用人工一个个排查,系统告诉你"问题出在第几步",Bug修复效率显著提升。

想要持续达到高准确率,就要建立持续优化的机制。

到此,高德目前的所有思路都拆解完了,回顾一下:

  1. 四象限策略:不同复杂度问题用不同方案解决
  1. 多层元数据:让AI理解业务而不只是数据
  1. 虚拟宽表:降低多表关联查询复杂度的同时控制数据更新的复杂度
  1. 三阶段演化:从60%到90%的渐进式优化路径
  1. 多Agent协作:三种策略并行+仲裁选择最优方案
  1. 人机协同:用有限人工介入补齐最后10%

高德90%准确率的本质:不是单一技术突破,而是系统工程的胜利。

最后,是高德数据团队下一步优化方向。

方向一:Graph-RAG + NER,优化召回精准度

首先,在系统建设阶段,需要用NER(命名实体识别)对所有的知识文档进行信息要素抽取。

包括数据库表结构、字段说明、业务文档、SQL示例等等,从中提取出各种实体,比如表名、字段名、指标名、业务概念这些。

然后,基于这些实体之间的关系来构建知识图谱。

比如,某个字段属于哪张表、某个指标需要哪些字段来计算、不同业务术语之间是同义词关系等等,这样就把原本分散的知识片段通过实体和关系连接成一个网络。

当用户提问的时候,系统再次使用NER从问题中识别出关键实体。

比如,用户说"北京近7天新用户复购率",就能识别出"北京"、"近7天"、"新用户"、"复购率"这些关键实体。

接着,就是在已经构建好的知识图谱中,以这些问题实体为起点进行搜索。

这个搜索过程是分轮进行的。

第一轮:先找到这些实体在图中对应的节点;

第二轮:从这些节点向外扩展一跳,找到直接相关的其他实体。比如"新用户"会连接到"用户注册表"、"复购率"会连接到"订单表"等等。

第三轮:继续扩展,这时候可能会加入关系强度的过滤,只保留那些与用户问题强相关的知识片段。

第四轮:主要做质量控制,确保召回的知识既完整又干净。

最终形成一个知识图,喂给模型作为上下文信息。

方向二:预训练、微调、强化学习

这块做起来成本就非常高了,感兴趣、有实力的朋友可以进一步了解相关论文。

以上,这篇文章已经写了近11000字。

能看到这里,你对ChatBI的理解,已经超过90%的人。

当再有人跟你说找个开源项目三天就能搞出来ChatBI,就把这篇文章怼他脸上。

写在最后

写完后我自己的感觉是,ChatBI这个赛道确实有前景,但坑也确实不少。

技术能解决大部分问题,但剩下那10%往往决定了产品的生死。

AI再强,也永远是辅助人类,承认这一点,才能做出真正好用的东西。

概念可以炒,PPT可以做得很漂亮,但产品得实打实地解决问题。

ChatBI也好,什么AGI也好,最终还是要回到用户价值这个原点。

用户不会为了你的技术有多牛逼而买单,他们只关心自己的问题有没有被解决。

这个行业变化太快,今天的最佳实践可能明天就过时了,今天的独角兽可能下个月就倒了。但有些东西不会变,比如对业务的理解,对用户的敬畏,还有那份工程师的较真劲儿。

ChatBI也好,其他AI应用也好,都不是银弹,但也不是骗局。

它们是我们手中的工具,用得好能创造价值,用不好就是在浪费时间和金钱。

关键是要知道自己在做什么,为什么要做,以及怎么做得更好。

愿每一个在AI路上前行的朋友,都能找到属于自己的那个90%,也都能优雅地处理好剩下的10%。

以上,既然看到这里了,如果觉得不错,随手点个赞、分享、推荐三连吧,我们,下次再见。

作者:秋水,互动交流,请联系邮箱:fennenqiushui@qq.com

相关推荐
張萠飛3 个月前
NL2SQL代表,Vanna
nl2sql·chatbi
qq_436962183 个月前
奥威BI:打破AI数据分析伪场景,赋能企业真实决策价值
人工智能·数据挖掘·数据分析·ai数据分析
qq_436962184 个月前
AI数据分析中的伪需求场景:现状、挑战与突破路径
人工智能·数据挖掘·数据分析·ai数据分析
qq_436962184 个月前
奥威BI+AI数据分析解决方案
人工智能·数据挖掘·数据分析·ai数据分析
qq_436962184 个月前
AI数据分析的利器:解锁BI工具的无限潜力
人工智能·数据挖掘·数据分析·ai数据分析
zandy10115 个月前
解码ChatBI技术形态:独立对话框、插件式与IM集成模式的技术优劣
sql·crm·im·chatbi·场景交互
程序员一一涤生6 个月前
ChatBI≠NL2SQL:关于问数,聊聊我踩过的坑和一点感悟
chatbi·问数
keshihuachenlie1 年前
数图亮相第三届中国区域零售创新峰会:共绘零售新蓝图,携手迈向新征程
可视化陈列·ai数据分析
机器玄学实践者1 年前
【ChatBI】超轻量Python库Vanna快速上手,对接oneapi
oneapi·vanna·chatbi