AI 问数做 Demo 不难,但真正能进入生产环境的产品,必须保证结果稳定、可复核。本期我们就详细拆解亿问 Data Agent 智能问数板块的核心算法。
这套系统的核心目标,是将自然语言查询稳定、可控地转化为结构化 SQL,并在复杂真实业务环境中,同时兼顾"确定性执行能力"和"语义不确定性处理能力"。
整体系统并不是单一的 NL2SQL 模型,而是由主链路确定性算法流程 + 异常语义增强机制共同构成的双层架构体系。
亿问 Data Agent 的核心设计原则可以概括为一句话:用确定性链路保证结果可信,用增强机制覆盖真实世界的不确定性。
因此,系统被划分为两层:
主链路是整个系统的核心执行路径,保证从自然语言到 SQL 的稳定转换。
用户输入业务查询,例如:
该阶段有三个特点:
因此,系统需要先进入语义标准化阶段。
在这一阶段,系统的目标是将用户的自然语言问题,转换为结构化的业务语义表达,并补全缺失信息。
例如用户输入"我要看下销售额,去年的",标准化后,系统会拆出几类信息:
输出可表达为:
在真实分析场景中,用户的提问往往是连续的,而不是孤立的。例如:
此时系统不会重新理解"这些产品",而是会进行上下文继承与指代消解,把问题自动补全为:
Data Agent 在该阶段需要具备三类能力。
第一类:实体继承
系统要自动继承上一轮对话中的关键业务实体,例如商品(SKU)、客户、门店、渠道、区域、活动。像"这些客户""上述门店""刚才提到的产品"这类表达,都需要映射回上一轮真实实体集合。
第二类:条件继承
系统要继承上一轮的筛选条件,例如时间范围、区域范围、人群标签。比如:
第三类:语义补全
在用户表达不完整时,系统结合业务语义自动补全缺失信息:
在亿问 Data Agent 的架构中,这一层有一个非常关键但容易被忽略的设计原则:不需要给大模型任何业务知识。
大模型在这里仅承担"语言规范化器"的角色,而不是业务推理引擎:
它只做一件事:把自然语言"翻译"为结构统一的标准表达。
由于这一层不依赖业务知识与复杂提示词工程,因此会带来一个非常重要的系统优势:提示词越少,系统越稳定。
原因在于:
这一设计使得系统具备一个非常关键的工程特性:在不牺牲理解能力的前提下,把大模型的输出"压缩为稳定接口"。因此,这一层不是"智能增强层",而是系统稳定性的入口控制层(Stability Gate)。
Alisa 是系统的核心语义解析引擎,其特点包括:
其核心任务是接受自然语言,将标准意图转换为结构化 LogicForm:
{
"preds": [
{
"name": "总销售金额",
"pred": "销售金额",
"operator": "$sum"
}
],
"query": {
"日期": {
"$offset": {
"year": -1
}
}
},
"schema": "fact_sales"
}该阶段完成三件关键工作:
同时,LogicForm 的语义表达能力并不仅限于简单的单表查询。它还可以表达企业黑话、多表、嵌套查询、临时定义维度、跨数据源(多数据库 + API 调用)等复杂分析语义。
在"嵌套查询"场景中,可以先筛选出"销售额同比大于 0 的产品",再在外层继续做计数统计:
{
"schema": "sales",
"preds": [
{
"name": "产品数量",
"operator": "$count"
}
],
"from": {
"schema": "sales",
"groupby": "产品",
"preds": [
{
"name": "销售额同比",
"pred": "销售额",
"operator": "$yoy"
}
],
"query": {
"日期": { "year": 2023 }
},
"having": {
"销售额同比": { "$gt": 0 }
}
}
}在"临时定义维度"场景中,LogicForm 可以在查询时动态生成"金额段"这样的分析维度,而不要求这些维度必须预先固化在底层表结构中。这意味着 Alisa 输出的不是简单字段映射结果,而是一种具备强表达能力、可直接执行、可跨数据源迁移的统一语义结构。
{
"schema": "sales",
"preds": [
{
"pred": "销售金额",
"operator": "$sum",
"name": "总销售金额"
}
],
"groupby": [
{
"_id": "用户_年龄",
"name": "用户年龄段",
"cases": [
{
"name": "18岁以下",
"query": { "$lt": 18 }
},
{
"name": "18-35岁",
"query": { "$gte": 18, "$lt": 35 }
},
{
"name": "35岁以上",
"query": { "$gte": 35 }
}
],
"default": "其他"
}
]
}LogicForm 进入 SemanticDB 模块后,开始进行 SQL 生成。该模块的核心能力包括:
SQL 示例:
SELECT SUM(s.amount) AS 总销售金额 FROM fact_sales s WHERE s.date >= '2025-01-01 00:00:00' AND s.date <= '2025-12-31 23:59:59';
SQL 在数据库执行后,会完成查询、聚合计算与结构化结果返回。最终输出业务指标结果,例如:
主链路体现的是系统的工程化能力。
第一是确定性:相同输入应稳定得到一致 SQL 结果。
第二是可解释性:每一步语义都可追踪,包括指标来源、时间转换逻辑、schema 映射关系。
第三是结构收敛能力:系统将自然语言逐层压缩为可执行 SQL,而不是让大模型一次性"猜"到底。
企业问数里最危险的错误,不是系统回答不了,而是给出一个看起来合理、实际口径错误的数字。
真实业务中,大量问题无法在主链路中一次性解析,因此系统设计了增强机制,用于处理语义边界问题。
当 Alisa 遇到以下情况时,系统会进入增强流程:
增强流程分为三步:
第一步,向量数据库召回。系统从语义向量库中检索相似指标、历史定义、企业标准口径。
第二步,候选语义返回。系统将多个可能解释返回给大模型。
第三步,LLM 进行澄清。大模型负责解释不同候选含义,向用户发起确认,或基于上下文做推荐判断。
例如:
它的本质价值,是用"语义召回 + LLM 交互"替代直接失败。
当 Alisa 无法识别输入语义时,比如无 schema 匹配、无指标路径、无结构化可能性,系统会进入失败回退机制。
第一步,回传大模型。Alisa 返回"无法解析"状态。
第二步,大模型二次处理。大模型执行问题改写、意图拆解,或引导用户补充信息。
例如用户输入:
系统可以反馈:
也可以给出候选建议:
它的本质价值,是用大模型能力补齐结构化系统的语义边界。
亿问 Data Agent 本质上是一个"双层语义系统"。
第一层是确定性执行层,也就是主链路:
目标:稳定、可控、可解释
第二层是不确定性增强层,也就是异常链路:
目标:提升真实业务覆盖率
整个系统的本质设计思想是:不让大模型承担查数方面的语义理解,仅让大模型处理语言的泛化理解,以及出问题后的用户交互。
这也是可信问数的核心:
大模型负责让问题说清楚,确定性链路负责让答案算明白。