作者:王斐 枫清科技资深AI架构师
在智能问数领域,text2sql是应用最为广泛的一个技术方向,其特点是严重依赖数据库元数据,灵活但是准确率堪忧。而指标问数作为text2sql的一个特殊场景,处理的不再是杂乱无序的数据库原始数据,以经过治理的数据模型为底座,目的是实现更精准的数据问答。指标问数对智能体更为友好,能大大的简化问答的复杂度。通常,指标问数需要解决指标识别、时间维度识别、业务维度识别、构建dsl和数据查询这五大问题。
作为AI+的实践者,Fabarta始终以企业智能化升级的核心需求为导向,构建了以数据为中心的AI能力体系。接下来会有一系列文章,结合在企业实践的业务案例,介绍Fabarta的智能指标分析产品。而本文就是从时间维度识别出发,介绍Fabarta的智能指标分析产品的设计思路和技术实践。
探索时间维度识别的业务场景
在时间识别上,指标问数经常有以下复杂场景:时间虚指、时间上卷和下钻、时间对比等。
时间虚指指的是用户查询的时间不是一个具体的时间,可能需要基于当前时间,计算偏移量。时间上卷和下钻指的是在指标建设中,会按照不同的时间粒度计算指标。从细粒度到粗粒度,通常有:日、月、季度、半年、年这五种粒度。不同的业务场景、用户习惯以及指标体系中,用户的问题会涉及到跨时间粒度的查询,对于细粒度的指标,查询其粗粒度的结构,叫做时间上卷。而对于粗粒度的指标,查询其更细粒度的结果,叫做时间下钻。时间对比则是指数据的同环比、增长率、变化率等。此外,银行、金融等行业通常按照t+1的方式统计数据,需要AI能够识别用户的问题中查询的具体日期。
从业务实践上来看,用户在时间维度上的表达方式多种多样,以下是一些典型代表:
- 过去三年营业收入是多少
- 过去三年的月营业收入之和是多少
- 近三年营业收入是多少
- 2025年营业收入是多少,分月列示一下
- 2025年每月月初的营业收入是多少
- 去年末的营业收入是多少
- 当月营业收入是多少
- 截止到上月,营业收入是多少
- 2025年前五个月营业收入是多少
- 最近的营业收入是多少
- 营业收入同比去年是多少
- 营业收入今年和去年的同比是多少
- 今年和前年的营业收入同比
- 上半年营业收入是多少
对这些场景归类:
设计有效的DSL是解决问题的核心
Fabarta智能指标分析具有强大的数据处理能力和分析能力,能够理解用户的问题,并将用户的问题转化成查询语言(DSL,Domain Specific Language),再由指标语义层转换,将DSL翻译成SQL,从而查询出期望的数据。 因此,设计合适的DSL,是解决时间维度识别的关键。在DSL中与时间维度相关的有:
- 起始时间:本次查询的日期中,最早的日期。
- 结束时间:本次查询的日期中,最新的日期。
- 离散的时间点:本次查询中,涉及到不连续的离散的时间
- 期望的时间粒度:本次查询希望展示的日期粒度,可以设置为:日、月、季度、半年、年、无。“无”表示最终结果中不显示时间列,例如:过去三年营业收入的和是什么?这个问题最终期望的查询结果中,用户不关心时间维度是什么。换句话说,无表示时间上卷到最高层级,消除时间维度。
- 聚合方式:当涉及到时间上卷时,以何种方式聚合数据。因为时间上卷可能存在跨越多个粒度的上卷,所以聚合方式也有多个层级。例如:今年各月的平均【日营业收入】的最大值是多少?这个查询需要对指标【日营业收入】按照AVG的方式聚合上卷到月,再按照MAX的方式聚合上卷到年。
- 周期对比:表示同环比。
- 特定日期的对比:表示特定的日期对比。具体有1对1,1对多,多对1,多对多。
针对以上提到的时间维度的场景和dsl,在Fabarta智能指标分析中,分别由三个不同角色的智能体分工和协作,识别用户问题中的时间维度信息。分别是时间范围识别、对比识别、聚合识别。
确定的计算不要交给不确定的LLM
在时间范围识别这一步,智能体会识别用户问题中涉及到的起始时间和结束时间。同时为了减少大模型幻觉,准确识别出基于当前时间的偏移量,我们采用了特殊变量+结构化输出+规则引擎驱动的方式,识别准确的时间维度信息。这里一个重要的思考是,让大模型直接计算日期的偏移是有幻觉的,即使明确地告知了大模型当前的时间,大模型也无法准确给出x个月前或n天前是什么日期。而使用特殊的变量,有助于减少大模型的计算,减弱模型幻觉。同时,规则引擎里也可以针对特定日期变量设置不同的值,能够解决特殊业务中t+1类型的需求。
-
特定时间场景:由大模型直接提取具体的时间范围或时间点。
-
不特定时间场景:大模型输出包含特殊变量的时间表达式,由规则引擎计算具体时间。例如:
-
- "过去三年" → {current_year - 3}
-
- "上个月月末" → {current_month - 1}-{last_day_of_the_month}
-
- "最近的数据" → {latest_date} 当确定时间范围识别后,后续的时间维度识别就可以基于准确的时间范围做进一步识别了。
在一个表达式中支持多种对比方式在时间对比这一步,智能体会识别用户的问题是否涉及到同环比还是特定日期的对比,从而给出不同的输出。
- 周期对比:智能体将输出startDate, endDate, step, interval, unit五个属性,从而能够表达出复杂的周期比较的概念。例如,今年每月的营收同比是多少?
- 固定日期对比:如果用户问题中明确提到了特定日期的对比,可以用固定日期对比的dsl来表达。支持1对1,1对多,多对多的对比方式。
最终DSL中会识别用户查询中所有的对比意图,以一个数组的形式,生成所有的对比dsl。
时间上卷和下钻比想象中要更复杂
在时间聚合这一步,智能体会判断用户希望的时间展示方式。在dsl中,智能体会识别用户问题所希望的时间粒度(Day / Month / Quarter / Half_year / Year / Overall)。如果用户希望的时间颗粒度与指标本事的时间粒度不同,那么会给出上卷和下钻的判断:
用户期望的时间粒度:用户希望最终回答中展示的时间粒度。时间上钻:根据指标的时间属性,最多给出2级的时间上卷的聚合方式。分别是指标从Day上卷到期望的粒度,从期望的粒度上卷到Overall,这两级的上卷。支持按照SUM,AVG,MAX,MIN四种不同的聚合方式处理数据。时间下钻:如果用户希望展示更细粒度的时间属性的数据,那么会从指标库中检索同一个指标的细粒度计算的值,给出时间下钻后的结果。
结语
指标问数智能体的核心价值在于弥合了业务语言与数据查询之间的鸿沟。通过自然语言交互,业务人员无需掌握复杂的查询语法或理解底层数据结构,即可高效获取所需的指标分析结果。
在技术实现上,我们通过多角色协作的架构将复杂的 DSL 生成任务拆解为多个聚焦的子问题,每个角色专注于 DSL的一个维度,既降低了单个环节的复杂度,也通过交叉验证提升了整体的准确性与鲁棒性。受限于篇幅,此次介绍了时间维度识别场景的技术设计和业务实践。其中利用大模型结构化输出、规则引擎的确定性计算能力,在时间维度识别等关键场景中显著减少了幻觉问题;设计了完善的dsl结构,将各种复杂的用户问题转化成dsl描述语言,避免了text2sql导致的业务不确定性,又增加了识别的准确率。
欢迎登录下方链接申请试用Fabarta智能指标分析。接下来会有多期技术文章,揭秘Fabarta指标智能分析产品,请大家敬请期待。(fabarta.com/products/in…
参考
资料背景
企业数字化建设中,指标系统作为重要的数据资产,整合了企业运营过程中的各类业务数据,覆盖生产、销售、财务、人力资源等各个关键环节。这些数据经过系统的整理、分析与加工,转化为具有明确指向性的指标,如销售额增长率、生产效率提升率、客户满意度得分等。这些指标不仅直观地反映了企业当前的经营状况,还能够帮助企业决策者透过数据背后的现象,洞察潜在的市场趋势、客户需求变化以及内部管理的薄弱环节。 但是,在企业中,指标系统往往具有一定的复杂度,数据层级深,数据关系错综复杂,往往需要穿透多级指标或维度才能定位数据变化的真实原因。数据之间存在着多种关联,如因果关系、相关性关系、层级关系等,这些关系相互交织,使得单纯依靠人工分析变得极为困难且效率低下。例如,一个企业的销售数据可能受到产品质量、价格、市场推广、竞争对手策略、宏观经济环境等多种因素的综合影响,这些因素之间又相互作用,形成了一个复杂的网络。在这种情况下,传统的数据分析方法往往难以快速准确地定位问题的根源。
指标问数智能体
此时,引入智能体就显得尤为重要。Fabarta提供了智能指标分析,指标智能体凭借其强大的数据处理能力和分析能力,能够理解用户的问题,并将用户的问题转化成查询语言(DSL,Domain Specific Language),快速地在海量数据中进行数据挖掘和分析。例如,智能体可以理解“贷款余额较同期”中的时间和意图,识别出这是一个查询当前贷款余额及同比的问题,在指标库中精准地查询出期望的结果。
而如果用户希望了解具体是哪些因素导致贷款余额的上升时,智能体能够分析各个影响因素的变化率和贡献度,找出影响指标的具体的因素。
通过以上的例子看出,智能体能够理解用户的问题,将输入的信息转化为特定的查询内容,分析查询的结果,给出分析和总结等,为企业的决策提供有力支持。此外,利用智能体还可以实时监测数据的变化,一旦发现异常波动,能够立即触发预警机制,并自动启动数据分析流程,快速找出问题所在,大大提高了企业的运营效率和决策的及时性。通过AI智能体的辅助,企业能够更好地应对数字化转型过程中遇到的各种复杂数据问题,实现更加智能化、高效化的运营管理。
技术方案
智能体包含五大核心模块:识别用户问题→ 检索指标 → 生成 DSL → 查询指标结果 → 给出分析结论。 在这五大过程中,最重要的一步就是生成指标查询的DSL。DSL指在某些特定领域中的查询语法,在指标问答智能体中,我们实现了一套指标DSL,能够实现多种指标查询语法,包括:
- 指标单日期、多日期查询
- 指标同环比查询
- 指标多日期对比、变化率查询
- 指标维度排名查询
- 指标值过滤、指标维度过滤指标聚合查询
- 指标维度分析
- 指标链路分析
- 指标血缘分析
- 指标定义查询
智能体根据DSL语法的规则,拆解、分析用户输入的问题的意图,结合历史对话和提示词,给出正确的检索式。在指标系统中执行检索式,查询出用户期望的数据,由大模型对数据做润色和总结。 在实现指标问答智能体的过程中,有四点核心的设计理念:
- 冗余设计:由于大模型对输入信息较为敏感,需要在实现时增加冗余设计。对于大多数DSL中的字段,设计了不同的环节尝试提取信息。这些环节之间交叉验证,保证模型输出的dsl语法、格式、含义正确。
- 高内聚低耦合:在智能体中内置了多个角色,每个角色负责一部分特定的DSL子集。同时不同角色之间隔离,不互干扰DSL中不同字段之间的识别,减少提示词开发的难度。
- 分层设计:将指标问答智能体抽象成五层,逐层递进,但是严格遵循依赖倒置原则。下一层依赖上一层的抽象接口,而非具体实现。这样方便后续扩展,每当升级特定的层时,不会对后续的层造成大的影响。
- 螺旋式开发模式:开发过程分成四个阶段,代码开发/优化、构建/更新benchmark数据集、效果评测、提示词调优。每个阶段依次递进,螺旋式上升。