SuperSonic提示词设计与实现深度解析
📖 文档概述
本文深入解析 SuperSonic 文本到 SQL 流程中的提示词(Prompt)体系,从核心机制到实际应用,全面剖析提示词如何引导大语言模型准确生成 SQL 查询。
🎯 核心内容导览
- � 提示词构建机制:Few-shot 示例选择、Schema 格式化、上下文信息注入
- � 多场景模板设计:SQL 解析、语义纠错、物理优化、语义建模
- ⚙️ 工程化实践:源码解析、最佳实践、风险防控策略
- � 实际案例分析:基于真实数据的完整流程演示
📚 阅读指南
- 初学者:建议从第一部分的架构概述开始,了解整体流程
- 开发者:重点关注第三部分的源码解析和第四部分的实际案例
- 架构师:可直接阅读第二部分的模板设计和第五部分的最佳实践
🏗️ 第一部分:架构与核心机制
1.1 🔄 提示词在 Text2SQL 流程中的关键位置
SuperSonic 的 Text2SQL 流程是一个精心设计的多阶段处理管道,提示词在其中发挥着关键的引导作用:

核心组件职责:
- 请求构建:
LLMRequestService#getLlmReq将查询语句、数据集 Schema、当前日期、术语/实体值映射等准备为LLMReq
- Prompt 构造:
OnePassSCSqlGenStrategy#generatePrompt通过PromptHelper拼装 Few-shot 示例、结构化 Schema 串、侧边信息,并套用ChatApp里的模板
- 自一致性推理:
OnePassSCSqlGenStrategy#generate并行多次推理,ResponseHelper.selfConsistencyVote投票选出最优 SQL
- 纠错与优化:
LLMSqlCorrector、LLMPhysicalSqlCorrector根据专用模板对 SQL 进行规则化纠错与性能优化
- 语义建模:
LLMSemanticModeller使用建模模板,生成模型名、字段类型与聚合建议等
1.2 🎯 Few-shot 示例构建的智能机制
源码位置:PromptHelper#getFewShotExemplars
Few-shot 示例是提示词系统的核心组成部分,通过精心设计的示例选择和组合策略,确保模型能够理解查询意图并生成准确的 SQL。
🔄 核心流程
- � 示例来源合并
-
- 动态示例:来源于请求
LLMReq.dynamicExemplars(如 Agent 预置问法/记忆)
- 动态示例:来源于请求
-
- 向量召回:若未达召回阈值
PARSER_EXEMPLAR_RECALL_NUMBER,使用ExemplarService.recallExemplars(query, num)通过向量检索补齐
- 向量召回:若未达召回阈值
- �️ 智能分桶与筛选
-
- 以相似度阈值
0.989划分为"极高相似"与"普通相似"两组
- 以相似度阈值
-
- 对普通相似组按相似度升序,剔除低分段,保留靠后的高分样本(保证代表性)
- � 最相似样本保障
-
- 无"极高相似"时,至少保证包含一个
mostSimilar
- 无"极高相似"时,至少保证包含一个
- � 多次自一致性采样
-
- 依据
PARSER_SELF_CONSISTENCY_NUMBER进行多次随机采样
- 依据
-
- 每次选择至多
PARSER_FEW_SHOT_NUMBER个示例,形成多组 Few-shot 列表
- 每次选择至多
💡 工程价值
- �️ 稳定性保障:保证每次推理都有"强约束"样本,减少漂移与幻觉
- � 多样性增强:通过随机与多次投票提升稳定性,结合
ResponseHelper投票策略选优
- �️ 场景隔离:召回实现依赖嵌入向量(参考
EmbeddingServiceImpl),结合 collection 维度可做 Agent/场景隔离
1.3 📊 Schema 信息构建与格式化
源码位置:PromptHelper#buildSchemaStr
Schema 信息的结构化表示是确保 SQL 生成准确性的关键基础。
📋 输出格式示例
DatabaseType=[MySQL], DatabaseVersion=[8.0], Table=[sales],
PartitionTimeField=[dt FORMAT 'yyyy-MM-dd'], PrimaryKeyField=[order_id],
Metrics=[<gmv ALIAS 'GMV,' FORMAT 'DECIMAL' COMMENT '总成交额' AGGREGATE 'SUM'>],
Dimensions=[<brand ALIAS '品牌;' DATATYPE 'STRING' COMMENT '品牌名称'>],
Values=[<brand='Apple'>]
🎨 设计要点
- �️ 结构化包裹:指标/维度均以
<...>包裹,属性以关键词与引号呈现,降低 LLM 解析歧义
- �️ 别名与格式:
ALIAS、FORMAT、COMMENT、AGGREGATE明确声明,保障生成 SQL 字段与聚合一致性
- � 分区与主键:
PartitionTimeField与PrimaryKeyField单独列出,支持时间范围与去重场景
- � 关联值:当启用
PARSER_LINKING_VALUE_ENABLE,在Values段提供<field='value'>,加强实体对齐与过滤
⚙️ 工程实践
- � 字段数量控制:通过
PARSER_FIELDS_COUNT_THRESHOLD控制是否下采样到"匹配字段子集",避免 prompt 过长
- �️ 数据库适配:带上
DatabaseType/Version便于规则与语法适配(与侧边信息的WITH支持校验联动)
1.4 🌐 上下文与侧边信息构建
源码位置:PromptHelper#buildSideInformation
侧边信息为模型提供必要的上下文约束和业务知识,确保生成的 SQL 符合实际业务需求。
组成部分
- CurrentDate:以
yyyy-MM-dd注入当前日期,配合时间范围规则
- PriorKnowledge:可注入外部知识/历史上下文(如策略、业务规则)
- 数据库能力提示:若不支持
WITH(基于EngineType与版本比较),注入[Database does not support with statement],对齐模板中的规则约束
- DomainTerms:来自匹配到的术语(
LLMReq.Term),以<name COMMENT 'desc'>结构提示领域概念,帮助同义词/别名解析
核心价值
- 语法边界明确:提前给出语法能力边界,降低错误推理概率
- 领域知识注入:将域内术语与知识显式化,减少幻觉与字段误用
🎨 第二部分:多场景提示词模板设计
2.1 🔍 语义 SQL 解析模板(S2SQL_PARSER)
源码位置:OnePassSCSqlGenStrategy.INSTRUCTION
这是 SuperSonic 最核心的提示词模板,负责将自然语言查询转换为语义 SQL。
📝 模板结构
#Role: You are a data analyst experienced in SQL languages.
#Task: ... convert natural language question to SQL ...
#Rules:
1. SQL columns and values must be mentioned in the `Schema`, DO NOT hallucinate.
2. ALWAYS specify time range using `>`,`<`,`>=`,`<=` operator.
3. DO NOT include time range if not explicitly expressed in the `Question`.
4. DO NOT calculate date range using functions.
5. ALWAYS use `with` statement if nested aggregation is needed.
6. ALWAYS enclose alias declared by `AS` command in underscores.
7. Alias created by `AS` command must be in the same language as the `Question`.
🔑 关键变量
- Exemplars:Few-shot 示例集合
- Question:用户的自然语言查询
- Schema:结构化的数据库模式信息
- SideInfo:侧边信息和上下文约束
2.2 🔧 语义 SQL 纠错模板(S2SQL_CORRECTOR)
源码位置:LLMSqlCorrector.INSTRUCTION
专门用于对初步生成的 SQL 进行语义层面的纠错和优化。
🎯 核心特点
- �💼 Role/Task:资深数据工程师对"初级工程师写的 SQL"进行审阅与纠正
- � Rules:时间范围显式比较、禁止函数计算时间、字段必须在
#Schema中
- � 变量:
#Question、#Schema、#InputSQL、#Response
- ⚙️ 实现要点:从
Text2SQLExemplar注入dbSchema,以严格字段集约束纠错范围
