303-Spring AI Alibaba NL2SQL 向量管理示例

本示例展示了如何使用 Spring AI Alibaba 构建一个完整的数据库 Schema 管控模块,提供证据(evidence)及 schema 的管理能力,用于初始化数据库的 schema 信息,并支持对业务逻辑解释(evidence)进行增删改查操作。
1. 项目概述
向量管理模块是 Spring AI Alibaba NL2SQL 示例项目的一部分,主要功能包括:
- 数据库 Schema 初始化:提供一键初始化功能,快速生成指定的数据库表结构。
- 业务逻辑管理:支持对业务逻辑的增删改查操作,方便开发者维护复杂的业务规则。
- RESTful API 接口:基于 Spring Boot 提供标准的 RESTful API,便于与其他系统集成。
- 图形化管控页面:提供蓝白色调的图形化界面,包含业务逻辑解释管控和 Schema 管控两个 Tab 页面。
2. 技术栈与核心依赖
- Spring Boot 3.x
- Spring AI Alibaba (用于对接阿里云 DashScope 通义大模型)
- Spring AI Alibaba NL2SQL (自然语言转SQL功能)
- AnalyticDB 向量存储 (用于存储和检索向量数据)
- Thymeleaf (模板引擎)
- Maven (项目构建工具)
在 pom.xml 中,核心依赖如下:
<dependencies><!-- Spring AI Alibaba NL2SQL 核心依赖 --><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter-nl2sql</artifactId><version>${spring-ai-alibaba.version}</version></dependency><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-nl2sql-management</artifactId><version>${spring-ai-alibaba.version}</version></dependency><!-- Spring Web 用于构建 RESTful API --><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>6.2.5</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>3.3.1</version></dependency><!-- Thymeleaf 模板引擎 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId><version>3.4.0</version></dependency>
</dependencies>3. 项目配置
在 src/main/resources/application.yml 文件中,配置 DashScope API Key 和向量存储相关信息。
server:port: 8061 # 服务器端口配置
spring:thymeleaf:enabled: truecheck-template-location: trueprefix: classpath:/static/mvc:view:prefix: /static/suffix: .htmlstatic-path-pattern: /static/**resources:static-locations: classpath:/static/web:resources:static-locations: classpath:/static/ai:dashscope:api-key: ${DASHSCOPE_API_KEY} # 建议使用环境变量,更安全mcp:server:name: xiyan-server    # MCP服务器名称version: 0.0.1           # 服务器版本号vectorstore:analytic:collectName: chatBiregionId: cn-hangzhoudbInstanceId: ${ANALYTICDB_INSTANCE_ID}managerAccount: ${ANALYTICDB_MANAGER_ACCOUNT}managerAccountPassword: ${ANALYTICDB_MANAGER_PASSWORD}namespace: chatnamespacePassword: chatdefaultTopK: 6defaultSimilarityThreshold: 0.75accessKeyId: ${ACCESS_KEY_ID}accessKeySecret: ${ACCESS_KEY_SECRET}openai:base-url: https://dashscope.aliyuncs.com/compatible-modeapi-key: ${DASHSCOPE_API_KEY}model: qwen-max
chatBi:dbConfig:url: ${DATABASE_URL}username: ${DATABASE_USERNAME}password: ${DATABASE_PASSWORD}schema: ${DATABASE_SCHEMA}connection-type: jdbcdialect-type: mysql重要提示:请将上述配置中的环境变量设置为你从阿里云获取的有效 API Key 和数据库连接信息。你也可以直接将其写在配置文件中,但这不推荐用于生产环境。
4. 项目结构
项目的主要结构如下:
src/
└── main/├── java/│   └── com.alibaba.cloud.ai.example/│       ├── Application.java              # 应用程序入口│       ├── controller/                   # 控制器层│       │   ├── AnalyticDbVectorManagementController.java  # AnalyticDB向量管理控制器│       │   ├── HomeController.java       # 首页控制器│       │   └── SimpleVectorManagementController.java     # 简单向量管理控制器│       └── request/                      # 请求对象│           ├── DeleteRequest.java        # 删除请求│           ├── EvidenceRequest.java      # 证据请求│           ├── SchemaInitRequest.java    # Schema初始化请求│           └── SearchRequest.java        # 搜索请求└── resources/├── application.yml                   # 应用配置└── static/└── index.html                    # 前端页面5. 核心代码实现
5.1 应用程序入口
Application.java 是 Spring Boot 应用程序的入口点:
package com.alibaba.cloud.ai.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication(scanBasePackages = {"com.alibaba.cloud.ai"})
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}5.2 AnalyticDB 向量管理控制器
AnalyticDbVectorManagementController.java 提供了基于 AnalyticDB 的向量管理功能:
package com.alibaba.cloud.ai.example.controller;import com.alibaba.cloud.ai.request.SchemaInitRequest;
import com.alibaba.cloud.ai.request.SearchRequest;
import com.alibaba.cloud.ai.service.AnalyticDbVectorStoreManagementService;import org.springframework.ai.document.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
public class AnalyticDbVectorManagementController {@Autowiredprivate AnalyticDbVectorStoreManagementService vectorStoreManagementService;@PostMapping("/add/evidence")public Boolean addEvidence(@RequestBody List<com.alibaba.cloud.ai.request.EvidenceRequest> evidenceRequests) {return vectorStoreManagementService.addEvidence(evidenceRequests);}@PostMapping("/search")public List<Document> search(@RequestBody SearchRequest searchRequestDTO) throws Exception {return vectorStoreManagementService.search(searchRequestDTO);}@PostMapping("/delete")public Boolean deleteDocuments(@RequestBody com.alibaba.cloud.ai.request.DeleteRequest deleteRequest) throws Exception {return vectorStoreManagementService.deleteDocuments(deleteRequest);}@PostMapping("/init/schema")public Boolean schema(@RequestBody SchemaInitRequest schemaInitRequest) throws Exception {return vectorStoreManagementService.schema(schemaInitRequest);}
}5.3 简单向量管理控制器
SimpleVectorManagementController.java 提供了基于内存的简单向量管理功能:
package com.alibaba.cloud.ai.example.controller;import com.alibaba.cloud.ai.request.EvidenceRequest;
import com.alibaba.cloud.ai.request.SchemaInitRequest;
import com.alibaba.cloud.ai.service.SimpleVectorStoreManagementService;
import org.springframework.ai.document.Document;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
@RequestMapping("/simple")
public class SimpleVectorManagementController {@Autowiredprivate SimpleVectorStoreManagementService simpleVectorStoreService;@PostMapping("/add/evidence")public Boolean addEvidence(@RequestBody List<EvidenceRequest> evidenceRequests) {return simpleVectorStoreService.addEvidence(evidenceRequests);}@PostMapping("/search")public List<Document> search(@RequestBody SearchRequest searchRequestDTO) throws Exception {return simpleVectorStoreService.search(searchRequestDTO);}@PostMapping("/delete")public Boolean deleteDocuments(@RequestBody com.alibaba.cloud.ai.request.DeleteRequest deleteRequest) throws Exception {return simpleVectorStoreService.deleteDocuments(deleteRequest);}@PostMapping("/init/schema")public Boolean schema(@RequestBody SchemaInitRequest schemaInitRequest) throws Exception {simpleVectorStoreService.schema(schemaInitRequest);return true;}
}5.4 请求对象
项目中定义了多个请求对象,用于接收前端传来的数据:
5.4.1 EvidenceRequest
package com.alibaba.cloud.ai.example.request;import java.io.Serializable;public class EvidenceRequest implements Serializable {private String content;private Integer type;public Integer getType() {return type;}public void setType(Integer type) {this.type = type;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}
}5.4.2 SchemaInitRequest
package com.alibaba.cloud.ai.example.request;import java.io.Serializable;
import java.util.List;import com.alibaba.cloud.ai.connector.config.DbConfig;public class SchemaInitRequest implements Serializable {private DbConfig dbConfig;private List<String> tables;public DbConfig getDbConfig() {return dbConfig;}public void setDbConfig(DbConfig dbConfig) {this.dbConfig = dbConfig;}public List<String> getTables() {return tables;}public void setTables(List<String> tables) {this.tables = tables;}
}5.4.3 SearchRequest
package com.alibaba.cloud.ai.example.request;import java.io.Serializable;public class SearchRequest implements Serializable {private String query;private int topK;private String vectorType;public int getTopK() {return topK;}public void setTopK(int topK) {this.topK = topK;}public String getQuery() {return query;}public void setQuery(String query) {this.query = query;}public String getVectorType() {return vectorType;}public void setVectorType(String vectorType) {this.vectorType = vectorType;}
}5.4.4 DeleteRequest
package com.alibaba.cloud.ai.example.request;import java.io.Serializable;public class DeleteRequest implements Serializable {private String id;private String vectorType;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getVectorType() {return vectorType;}public void setVectorType(String vectorType) {this.vectorType = vectorType;}
}5.5 前端页面
index.html 提供了一个蓝白色调的图形化界面,包含两个主要 Tab 页面:
- 业务逻辑解释管控:新增、召回、删除业务逻辑解释。
- Schema 管控:初始化数据库 Schema。
页面主要功能包括:
- 新增业务逻辑解释:填写内容和类型,选择存储类型(AnalyticDB 或 Memory)。
- 召回业务逻辑解释:输入查询关键词,选择存储类型进行搜索。
- 删除业务逻辑解释:输入 ID,选择存储类型进行删除。
- 初始化数据库 Schema:填写数据库连接信息和表名,选择存储类型进行初始化。
6. API 接口文档
6.1 初始化当前数据库的 Schema
- 请求方法: POST
- URL: /init/schema或/simple/init/schema
- 请求体:{"dbConfig": {"url": "jdbc:mysql://ip:port/database","username": "username","password": "password", "connectionType": "jdbc","dialectType": "mysql" },"tables": ["customers"] }
- 返回示例:true
6.2 新增业务逻辑解释
- 请求方法: POST
- URL: /add/evidence或/simple/add/evidence
- 请求体:[{"content": "冬天指的是今年11月到第二年的3月","type": 1 },{"content": "计算销量时只统计收货状态为已收货的订单","type": 2 } ]
- 返回示例:true
6.3 召回业务逻辑解释
- 请求方法: POST
- URL: /search或/simple/search
- 请求体:{"query": "冬季","vectorType": "evidence","topK": 100 }
- 返回示例:[{"id": "33280667-0aad-449d-b1ad-78cf140ff134","text": "计算销量时只统计收货状态为已收货的订单","media": null,"metadata": {"vectorType": "evidence","evidenceType": 2},"score": null} ]
6.4 删除业务逻辑解释
- 请求方法: POST
- URL: /delete或/simple/delete
- 请求体:{"id": "33280667-0aad-449d-b1ad-78cf140ff134" }
- 返回示例:true
7. 运行与测试
7.1 启动应用
- 确保已配置好 application.yml中的所有必要参数。
- 运行 Application.java中的 main 方法启动 Spring Boot 应用。
- 应用将在端口 8061 上启动。
7.2 访问管控页面
打开浏览器,访问以下地址:
http://localhost:8061/index.html7.3 测试功能
7.3.1 测试业务逻辑解释管控
- 切换到"业务逻辑解释管控" Tab。
- 在"新增业务逻辑解释"部分填写内容和类型,点击"新增业务逻辑"按钮。
- 在"召回业务逻辑解释"部分输入查询关键词,点击"搜索业务逻辑"按钮。
- 在"删除业务逻辑解释"部分输入 ID,点击"删除业务逻辑"按钮。
7.3.2 测试 Schema 管控
- 切换到"Schema 管控" Tab。
- 在"初始化当前数据库的 schema"部分填写数据库连接信息和表名,点击"初始化 Schema"按钮。
8. 实现思路与扩展建议
8.1 实现思路
本示例的核心思想是向量存储与检索。我们将业务逻辑解释和数据库 Schema 信息转换为向量,并存储在向量数据库中,实现高效的语义检索。这使得:
- 语义搜索:能够根据语义相似性而非关键词匹配来检索相关内容。
- 上下文感知:NL2SQL 系统可以根据检索到的业务逻辑解释更好地理解用户意图。
- 灵活扩展:可以轻松添加新的业务逻辑解释,无需修改核心代码。
8.2 扩展建议
- 多向量存储支持:可以扩展支持更多的向量存储系统,如 Milvus、Chroma 等。
- 权限管理:添加用户权限管理,控制不同用户对业务逻辑解释和 Schema 的访问权限。
- 版本控制:为业务逻辑解释和 Schema 添加版本控制功能,支持历史版本查看和回滚。
- 批量操作:支持批量导入和导出业务逻辑解释,提高管理效率。
- 智能推荐:基于用户查询历史和业务逻辑解释的使用情况,提供智能推荐功能。
