大模型时代的智能问数:多策略召回与精排技术实践
本文介绍了一套面向业务用户的智能问数系统,旨在通过自然语言交互实现高效、准确的数据查询。系统融合大语言模型(LLM)、检索增强生成(RAG)、NL2SQL及数据治理等技术,构建了从问题理解、语义改写、Schema链接到SQL生成与执行的完整技术链路。针对用户提问中常见的模糊表达、行业术语和时间指代等问题,系统首先通过RAG知识库进行关键词替换与语义规范化;随后采用多阶段向量召回与大模型重排序策略,
一、背景
随着企业数字化转型的深入,业务部门和管理层对数据洞察的需求日益增长。传统的数据分析方式依赖专业人员编写SQL或使用可视化工具,门槛较高,难以满足非技术人员快速获取数据支持的需求。为此,构建一个支持自然语言交互的“智能问数”系统成为提升数据服务效率的重要方向。
旨在打造一套面向业务用户的自然语言查询平台,使用户能够以日常语言提问,系统自动理解语义、解析意图、关联数据模型并生成准确的SQL查询,最终返回结构化结果。该系统通过融合大模型能力与知识增强技术,实现从“人找数据”到“数据主动服务”的转变。
二、整体架构设计
系统采用分层架构设计,分为场景层、平台层、大模型层与基础硬件层,形成完整的端到端智能问答闭环。
1. 场景层
- 支持多种典型业务场景下的自然语言查询需求。
- 典型输入包括:“3月份xx相关事件有多少?”、“最近一周客户投诉量趋势如何?”等。
- 用户可直接输入问题,系统自动完成后续处理流程。
2. 平台层(核心功能模块)
(1)Agent平台 —— 知识问数工具链
作为系统的调度中枢,负责协调各子系统协同工作:
- 接受问题:接收原始自然语言输入。
- 对接RAG平台进行问题改写:结合上下文与领域知识优化表达。
- 对接NL2SQL获取答案:调用下游组件生成执行SQL。
- 答案返回:将查询结果以结构化形式反馈给用户。
- 问题建议:基于当前问题推荐相似或扩展性问题。
- 多轮对话:支持上下文理解,实现连续追问与澄清机制。
(2)NL2SQL平台
实现自然语言向SQL的转换,包含以下关键步骤:
- 意图识别:判断用户是否为统计类、趋势类、对比类等问题。
- 元数据检索:根据问题内容匹配相关表和字段信息。
- SQL生成:基于DSL中间表示生成标准SQL语句。
- 查询结果返回:执行SQL后返回结果集。
(3)RAG平台(Retrieval-Augmented Generation)
增强模型推理能力,提供精准的知识支撑:
- 知识库:存储行业术语、分类体系、工单类别等结构化/半结构化知识。
- 提示工程:设计高质量prompt模板,引导大模型输出更符合业务逻辑的结果。
(4)数据平台
保障数据质量与AI训练底座:
- 数据治理:统一管理元数据、血缘关系、权限控制。
- AI知识工程:构建可被大模型理解的知识图谱与语义映射。
3. 大模型层
- 使用两个主流大模型作为核心推理引擎:
- Deepseek R1满血版:用于文本理解、意图分析、实体抽取等任务。
- Qwen-QwQ-32B:承担重排序(reranker)、问题改写、DSL转SQL等高阶任务。
4. 基础硬件层
- 提供高性能计算资源支持:
- 鲲鹏VM(10VM):部署轻量级服务及部分推理任务。
- 昇腾910B(2卡):专用于大模型推理加速,保障响应速度与吞吐能力。
三、核心技术流程详解
整个智能问数流程遵循“理解 → 改写 → 检索 → 转换 → 执行 → 返回”的闭环路径。
步骤1:用户输入与初步处理
用户提出自然语言问题,例如:
“3月份xxx相关事件有多少?”
系统首先进行如下处理:
(1)意图识别
利用大模型分析问题类型(如计数、聚合、时间序列等),确定查询目标。
(2)问题改写
由于用户可能使用模糊表达或行业黑话,需先进行规范化处理:
- 从RAG知识库中提取关键词替换规则(如“电驴”→“电动自行车”)。
- 将时间词“3月份”转化为具体日期范围(如
2024-03-01 至 2024-03-31)。 - 利用大模型进一步润色问题,使其更贴近标准查询格式。
改写后示例:
“查询2024年3月期间,涉及‘电动自行车’的事件数量。”
步骤2:Schema Linking(表列匹配)
这是系统最关键的环节之一,确保自然语言能正确映射到数据库中的实际字段。
(1)实体切分与分类
调用大模型对改写后的句子进行实体识别,并划分为两类:
- 指标类:如“数量”、“总数”、“平均值”等,对应SELECT中的聚合函数。
- 维度类:如“时间”、“地区”、“类别”等,对应GROUP BY或WHERE条件。
(2)向量化召回(三阶段策略)
为了避免单一召回导致漏检,引入多向量召回机制,共三个阶段:
表格
| 召回类型 | 方法说明 |
|---|---|
| 类型一 | 将所有指标实体合并成数组,进行批量向量召回(Top10) |
| 类型二 | 对相邻实体两两组合,生成新实体组合进行召回(Top10) |
| 类型三 | 将完整用户问题本身作为查询向量进行召回(Top10) |
所有召回均使用同一嵌入模型 bge-m3 进行编码,保证一致性。
(3)去重与精排
- 对上述三组召回结果分别进行去重,整合为候选列集合。
- 使用 Qwen-QwQ-32B 作为重排序器(Reranker),构建Prompt如下:
请根据用户问题和候选列列表,评估每列的相关性分数,输出JSON格式:
[
{ "column": "event_count", "score": 0.95 },
{ "column": "event_date", "score": 0.87 }
]
- 依据得分排序,选取TopN作为最终选中的列。
(4)选表与选列
- 表选择:基于候选表的相关性评分,取最高分者作为主表。
- 列选择:结合精排结果,确定参与查询的具体字段。
此过程即为 Schema Linking 的完整实现。
步骤3:SQL生成与执行
(1)Text2DSL2SQL 流程
为了提高SQL生成准确性,避免直接从自然语言生成复杂SQL带来的错误,采用两阶段转化:
-
Text → DSL:将自然语言转化为内部定义的领域特定语言(Domain-Specific Language),例如:
{ "action": "count", "from": "events", "where": { "type": "electric_bike", "time_range": ["2024-03-01", "2024-03-31"] } } -
DSL → SQL:由大模型将DSL翻译为标准SQL语句:
SELECT COUNT(*) FROM events WHERE type = 'electric_bike' AND event_date BETWEEN '2024-03-01' AND '2024-03-31';
(2)执行SQL
将生成的SQL提交至数据库执行,获取结果集。
(3)结果返回
将查询结果以表格、图表等形式呈现给用户,并支持导出与分享。
四、关键技术亮点
表格
| 技术点 | 实现方式 | 优势 |
|---|---|---|
| 多向量召回 | 分别对指标、组合实体、原始问题进行召回 | 提升召回完整性,减少遗漏 |
| 大模型重排序 | 使用Qwen-QwQ-32B进行相关性打分 | 强化语义理解,提升匹配精度 |
| RAG增强 | 结合行业术语库与工单分类文档 | 支持黑话识别与模糊匹配 |
| DSL中间层 | 引入DSL作为过渡语言 | 解耦自然语言与SQL语法,降低生成误差 |
| 多轮对话支持 | 记录上下文状态,支持追问与澄清 | 提升用户体验与交互灵活性 |
更多推荐

所有评论(0)