云舟观测:基于Spring AI的智能SQL助手设计与落地实践

在数字化深度演进时代背景下,为应对企业级数据库管理场景中日益增长的查询优化、性能诊断及运维效率提升需求,云舟观测创新研发了基于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更快审核通道+试用包哦~

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值