在数字化深度演进时代背景下,为应对企业级数据库管理场景中日益增长的查询优化、性能诊断及运维效率提升需求,云舟观测创新研发了基于AI技术的智能SQL助手解决方案。该方案深度融合AI技术,通过构建AI驱动的智能诊断引擎,可自动完成查询语句的语法解析、索引优化建议生成及执行计划可视化,能够满足不同用户的需求,无论是开发人员、运维人员还是业务人员,都可以通过该助手进行SQL相关的操作和管理。
SQL生成
将不同SQL方言的语句转换为标准SQL或特定数据库的SQL语法。SQL诊断
检测SQL语句中的潜在错误和性能问题,并提供优化建议。SQL解释
解释SQL语句的执行计划,帮助用户理解查询的执行过程。
01
架构设计
智能SQL助手技术架构采用分层/模块设计理念,主要分为交互层和核心引擎层以及后续即将扩展RAG模块,各层协同工作,实现从用户交互到核心功能处理的高效流程。
交互层:采用Spring WebFlux实现非阻塞式API。在高并发场景下,非阻塞式API能够显著提升系统的响应性能,避免线程阻塞导致的资源浪费。同时,它还支持流式响应,使得数据能够以流的形式实时传输,增强了用户体验。
核心引擎:运用Spring AI ChatClient + PromptTemplate动态提示构建。Spring AI ChatClient提供了与AI模型的交互能力,而PromptTemplate则用于动态生成提示信息。通过这种方式,我们能够根据不同的业务需求和用户输入,灵活调整提示内容,从而引导AI模型生成更准确的结果。
02
核心模块实现
2.1 路由模块 (意图识别,当前采用通过参数强识别)
路由模块在系统中起着关键的引导作用,它能够根据用户的输入识别其意图,并将请求路由到相应的处理模块。当前采用通过参数强识别的方式,这种方式简单直接,在一定程度上能够准确识别用户意图。
private Prompt createSystemPrompt(SQLIntentAssistant nameByIntent, ChatParamRequest chatParamRequest, String schema) { String templateKey = switch (nameByIntent) { case EXPLAIN -> PromptConstant.SQL_EXPLAIN; case DIAGNOSIS -> PromptConstant.SQL_DIAGNOSTIC; case GENERATE -> PromptConstant.TEXT_TO_SQL; }; return createPrompt(templateKey, chatParamRequest, schema); }
在上述代码中,根据SQLIntentAssistant
枚举类型的值,选择不同的提示模板。例如,当意图为解释SQL时,使用PromptConstant.SQL_EXPLAIN
模板;当意图为诊断SQL时,使用PromptConstant.SQL_DIAGNOSTIC
模板;当意图为生成SQL时,使用PromptConstant.TEXT_TO_SQL
模板。这种方式使得系统能够根据不同的意图生成合适的提示信息,为后续的处理提供基础。
2.2 SQL生成模块
2.2.1 元数据注入示例
SQL智能助手模块维护了一套全局定义的函数字典,这些函数用于获取元数据信息。
{ //函数1 "getYunZhouMetaInfo": { "url": "http://xxx.xxx.xx.x/openapi/api/logstore/getSchema", //当前元数据接口提供的参数列表 "paramsSchema": { "taskId": { "type": "String" } }, "authorization": "Basic xxx" }, //函数2 "getCdwMetaInfo": { "url": "http://xxx.xxx.xx.x/api/cdw/table", "paramsSchema": { "datasourceId": { "type": "Integer" } }, "authorization": "" } }
通过这些函数,系统能够从不同的数据源获取元数据,为SQL生成提供必要的信息。例如,getYunZhouMetaInfo
函数可以根据taskId
获取云周相关的元数据信息,getCdwMetaInfo
函数可以根据datasourceId
获取CDW相关的元数据信息。
2.2.2 采用ToT思维树多阶段提示工程(生成SQL提示词举例)
采用ToT(Tree of Thoughts)思维树多阶段提示工程,能够引导AI模型逐步生成SQL语句。
// prompts/sql-gen.st 表结构:{{meta_data}} 用户需求:{{query}} 要求:主要指定生成的过程,按照思维树方式给出,比如: 1、表结构分析 2、语法要求 3、输出要求
在这个提示词模板中,明确了生成SQL的步骤和要求。首先进行表结构分析,了解数据的组织方式;然后根据语法要求生成符合规范的SQL语句;最后根据输出要求确定SQL语句的返回结果。这种方式使得SQL生成过程更加有条理,提高了生成结果的准确性。
2.2.3 支持动态上下文切换(提示词变量注入)
系统支持动态上下文切换,根据不同的场景选择合适的元数据注入方式。
小规模数据库/表:直接内嵌元数据。在小规模场景下,数据量相对较小,直接内嵌元数据可以减少额外的查询开销,提高生成效率。
大规模场景:RAG检索增强(预留)。对于大规模场景,数据量庞大,直接内嵌元数据可能会导致性能问题。因此,预留了RAG(Retrieval Augmented Generation)检索增强功能,通过检索相关的元数据信息,为AI模型提供更准确的上下文。
PromptTemplate promptTemplate = new PromptTemplate(templateKey); return promptTemplate.create(Map.of( "meta_data", schema.replace("\"", ""), "query", chatParamRequest.getQuery() ));
上述代码实现了提示词变量的注入,将元数据和用户需求动态地插入到提示词模板中,使得生成的提示信息更加符合实际情况。
功能演示:
可以看出,基于提示词的思维顺序,AI进行了完整输出和结果响应,经检验,SQL的逻辑和查询结果也是正确的。
2.3 SQL解释模块
SQL解释模块用于对用户输入的SQL语句进行详细解释,帮助用户理解SQL语句的执行过程和性能情况。
public static String SQL_EXPLAIN = """ 你作为Trino SQL解释专家,请按先分析用户需求,然并按照以下框架分析: 输入参数: - 待解释SQL:{{query}} 1. 语句解析: - 分解SELECT/FROM/JOIN等子句 - 标注涉及的表和字段来源 - 说明执行顺序 2. 执行逻辑: - 数据流分析(从读取到输出的处理过程) - 关联关系图解(使用文字描述) - 潜在性能瓶颈 3. 优化建议: - 索引使用建议 - 分区策略建议 - 缓存利用建议 4. 特别注意: - 未检测SQL,请直接输出: ``` 未发现需要解释的SQL ``` 输出格式:检测到SQL,则按上述分析完,请直接输出Markdown内容,不要使用代码块包裹: ## 语法解析 ## 执行流程 ## 优化建议 """;
该模块采用逆向提示工程模板,通过详细的分析框架,对SQL语句进行全面的解释。首先进行语句解析,将SQL语句分解为各个子句,标注表和字段的来源,并说明执行顺序;然后进行执行逻辑分析,包括数据流分析、关联关系图解和潜在性能瓶颈的识别;最后给出优化建议,如索引使用、分区策略和缓存利用等方面的建议。如果未检测到SQL语句,则直接输出相应的提示信息。
功能演示:
按照提示词,先分析表结构,然后执行逻辑,最后完整输出响应,并贴心给出优化的建议。
2.4 SQL诊断模块
SQL诊断模块用于对SQL语句进行故障排查,找出潜在的问题并提供解决方案。
public static String SQL_DIAGNOSTIC = """ 你作为Trino SQL 故障排查专家,请根据输入参数按优先级分析: 输入参数: 待诊断SQL:{{query}} 1. 错误分类: - [语法错误] 检查保留字冲突/符号使用 - [对象缺失] 验证元数据合理性,结合元数据 - [类型冲突] 检查CAST操作和类型兼容性 - [资源问题] 检查内存/时间配额限制 2. 诊断步骤: (1) 验证SQL基础语法 (2) 单独执行子查询定位问题段 (3) 检查相关表DDL (4) 查看查询执行计划 3. 特别注意: - 如果SQL诊断正常,则直接输出 '未发现当前SQL语法错误或潜在逻辑缺陷' 输出格式:如果SQL是错误的,请直接输出Markdown内容,不要使用代码块包裹: ## 错误原因 ## 解决方案 """;
该模块的关键技术包括执行计划流程可视化和错误反馈迭代机制。通过对错误进行分类,按照优先级进行诊断,能够快速定位问题所在。诊断步骤包括验证SQL基础语法、单独执行子查询、检查相关表DDL和查看查询执行计划等。如果SQL诊断正常,则直接输出相应的提示信息;如果SQL存在错误,则按照指定的格式输出错误原因和解决方案。
功能演示:
按照错误诊断分类以及反馈迭代机制,快速分析定位SQL异常点,并给出结论。
03
技术能力分析
3.1 融入传统运维体系
将AI能力作为一等公民角色融入传统运维体系,是助手的一大创新点。传统的SQL运维主要依赖人工经验,效率低下且容易出错。通过引入AI技术,SQL助手能够自动识别用户意图、生成SQL语句、解释SQL执行过程和诊断SQL故障,大大提高了运维效率和准确性。例如,在处理大量SQL语句时,AI可以快速分析和处理,减少人工干预,降低运维成本。
3.2 自然语言到SQL的编译式转换
实现自然语言到SQL的编译式转换,使得非专业的用户也能够方便地使用SQL进行数据查询和分析。用户只需要用自然语言描述自己的需求,智能助手就能够自动将其转换为SQL语句并执行。这种方式降低了SQL使用的门槛,扩大了SQL的应用范围。例如,业务人员可以直接用自然语言提出数据查询需求,而无需编写复杂的SQL语句。
3.3 多产品平台嵌入
多个产品平台可直接嵌入,遵循助手SQL接入标准即可。当前结构具有良好的扩展性和兼容性,能够与其他产品平台进行集成。有需求可以随时对接,只需要对api侧进行统一标准即可。
04
未来优化和可能方向
4.1 RAG体系扩展
RAG体系扩展是未来优化的重要方向之一。将FAQ/技术手册等文档作为辅助AI辅助检索,通过向量化元数据管理提升复杂场景下的生成准确率。在实际应用中,用户可能会遇到各种复杂的问题,仅依靠现有的元数据和提示信息可能无法满足需求。通过扩展RAG体系,助手可以从更多的文档资源中获取相关信息,为AI模型提供更丰富的上下文,从而提高生成结果的准确性。
4.2 多方言扩展
目前助手支持了TrinoSQL,可扩展为SQL-BOX支持多方言接入。如FlinkSQL/HiveSQL/PQL等等。随着大数据技术的不断发展,不同的数据库和数据处理框架采用了不同的SQL方言。为了满足更广泛的用户需求,后续我们会根据需求场景,考虑需要支持多种SQL方言。通过扩展为SQL-BOX套件,来兼容不同的SQL方言,兼容各种SQL场景下,使用对应的SQL方言进行数据处理和分析。
4.3 智能问数方向
智能问数方向是助手未来演进的另一个重要方向。从语义 --> SQL --> 数据返回,实现更加智能化的数据查询和分析。用户只需要用自然语言提出问题,助手就能够自动理解问题的语义,将其转换为SQL语句,并返回相应的数据结果。这种智能化的问数方式将大大提高用户获取数据的效率和便捷性,为数据分析和决策提供更有力的支持。
05
关于云舟观测
云舟观测是由360智汇云推出的一款一站式数据采集与监控观测产品,可以对基础设施、应用性能,以及云原生下业务指标和日志进行全面的监控和观测,构建全链路的可观测性服务,帮助用户及时发现和解决系统及应用性能问题,提高系统的稳定性和可靠性。
使用地址:https://zyun.360.cn/guance/intro
(请复制链接后在浏览器中打开)
更多技术干货,
请关注“360智汇云开发者”👇
360智汇云官网:https://zyun.360.cn(复制在浏览器中打开)
更多好用又便宜的云产品,欢迎试用体验~
添加工作人员企业微信👇,get更快审核通道+试用包哦~