Skip to content

Spring Boot 集成

本指南介绍如何在 Spring Boot 项目中集成 SuperSQL。

添加依赖

pom.xml 中添加 SuperSQL Spring Boot Starter 依赖:

xml
<dependency>
    <groupId>com.aispace.supersql</groupId>
    <artifactId>super-sql-spring-boot-starter</artifactId>
    <<version>1.0.0-M1</version>
</dependency>

自动配置

SuperSQL Starter 提供了自动配置,会自动创建以下 Bean:

  • SpringSqlEngine: SQL 引擎
  • SpringVectorStore: 向量存储
  • SpringRagEngine: RAG 引擎
  • RerankModel: 重排序模型(如果配置)

配置属性

application.yml 中配置 SuperSQL:

yaml
super-sql:
  init-train: false
  scope: ALONE
  schemas:
    - schema: your_schema
  temperature: 0.0

配置项说明

配置项类型默认值说明
init-trainBooleanfalse是否在启动时自动训练
scopeScopeTypeALONE训练范围
schemasList[]指定训练的 schema
temperatureDouble0.0生成 SQL 的温度参数

使用示例

Controller 示例

java
@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
public class SuperSqlController {

    private final SpringSqlEngine sqlEngine;
    private final ChatModel chatModel;

    @PostMapping("/query")
    public ResponseEntity<?> query(@RequestBody QueryRequest request) {
        try {
            String sql = sqlEngine.setChatModel(chatModel)
                    .setOptions(RagOptions.builder()
                            .topN(request.getTopN())
                            .rerank(request.isRerank())
                            .limitScore(request.getLimitScore())
                            .build())
                    .generateSql(request.getQuestion());
            
            List<Map<String, Object>> result = sqlEngine.executeSql(sql);
            
            return ResponseEntity.ok(Map.of(
                    "sql", sql,
                    "result", result
            ));
        } catch (Exception e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body(Map.of("error", e.getMessage()));
        }
    }

    @PostMapping("/train")
    public ResponseEntity<String> train(@RequestBody TrainRequest request) {
        try {
            sqlEngine.setChatModel(chatModel)
                    .train(TrainBuilder.builder()
                            .content(request.getContent())
                            .question(request.getQuestion())
                            .policy(request.getPolicy())
                            .build());
            return ResponseEntity.ok("训练成功");
        } catch (Exception e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body("训练失败: " + e.getMessage());
        }
    }
}

Service 示例

java
@Service
@RequiredArgsConstructor
public class QueryService {

    private final SpringSqlEngine sqlEngine;
    private final ChatModel chatModel;

    public QueryResult query(String question) {
        String sql = sqlEngine.setChatModel(chatModel)
                .generateSql(question);
        
        List<Map<String, Object>> result = sqlEngine.executeSql(sql);
        
        return QueryResult.builder()
                .sql(sql)
                .result(result)
                .build();
    }

    public void trainDatabase(String ddl) {
        sqlEngine.setChatModel(chatModel)
                .train(TrainBuilder.builder()
                        .content(ddl)
                        .policy(TrainPolicyType.DDL)
                        .build());
    }
}

自定义配置

禁用自动配置

如果需要自定义配置,可以禁用自动配置:

java
@SpringBootApplication(exclude = {
    SuperSqlAutoConfiguration.class
})
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

手动配置 Bean

java
@Configuration
public class CustomSqlEngineConfig {

    @Bean
    public SpringSqlEngine customSqlEngine(
            IExecuteSqlService executeService,
            ChatModel chatModel,
            SpringVectorStore vectorStore,
            SpringRagEngine ragEngine,
            ResourceLoader resourceLoader,
            RerankModel rerankModel) {
        
        return new SpringSqlEngine(
                executeService,
                chatModel,
                vectorStore,
                ragEngine,
                resourceLoader,
                rerankModel
        );
    }
}

条件配置

基于配置的条件

yaml
super-sql:
  enabled: true
java
@Configuration
@ConditionalOnProperty(name = "super-sql.enabled", havingValue = "true")
public class SuperSqlConfiguration {
    
}

基于 Bean 的条件

java
@Configuration
@ConditionalOnBean(ChatModel.class)
public class SuperSqlWithChatModelConfiguration {
    
}

测试

单元测试

java
@SpringBootTest
@AutoConfigureMockMvc
class SuperSqlControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private SpringSqlEngine sqlEngine;

    @Test
    void testQuery() throws Exception {
        QueryRequest request = new QueryRequest("查询所有用户", 5, true, 0.4);
        
        when(sqlEngine.setChatModel(any()))
                .thenReturn(sqlEngine);
        when(sqlEngine.setOptions(any()))
                .thenReturn(sqlEngine);
        when(sqlEngine.generateSql(any()))
                .thenReturn("SELECT * FROM user");
        when(sqlEngine.executeSql(any()))
                .thenReturn(List.of());

        mockMvc.perform(post("/api/query")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(objectMapper.writeValueAsString(request)))
                .andExpect(status().isOk());
    }
}

下一步

最近更新

基于 Apache 2.0 许可证发布