Chat2DB实现:Spring AI MCP 直连数据库
引言
在上一篇文章中,我们初步探讨了 Spring AI MCP(Model Context Protocol)的基础概念,并通过操作本地文件的示例,展示了如何使用 MCP 让 AI 模型理解和处理文件内容。本文将进一步深入,探讨 MCP 的进阶应用 ------ 通过 Chat2DB 实现与数据库的自然语言交互。
相比于文件操作,数据库交互往往涉及更复杂的结构和更严格的安全要求。通过 Chat2DB 和 MCP 的结合,我们将展示如何安全、高效地实现 AI 驱动的数据库查询功能。让我们一起看看如何将自然语言查询能力扩展到数据库领域。
什么是 Chat2DB?
Chat2DB 是一个创新的数据库交互方式,它允许我们使用自然语言来查询和操作数据库。通过结合大语言模型(LLM)的能力,Chat2DB 使得与数据库的交互变得更加直观和高效。用户可以用日常语言提问,系统会自动将这些问题转换为相应的数据库查询语句。
MCP (Model Context Protocol) 简介
MCP(Model Context Protocol)是一个专门设计的协议,用于为大语言模型提供数据库访问能力。它的主要特点包括:
- 提供只读数据库访问接口
- 允许 LLM 检查数据库架构
- 支持执行只读查询
- 确保数据安全性
在 PostgreSQL 场景中,MCP 服务器充当了数据库和 LLM 之间的桥梁,使得 AI 模型能够安全地理解和查询数据库结构。
Spring AI 集成实现
依赖配置
首先,需要在项目中添加必要的依赖:
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.experimental</groupId> <artifactId>spring-ai-mcp</artifactId> <version>0.4.1</version> </dependency>
模型信息配置
笔者这里使用 deepseek v3 模型,只需要在 application.properties 中添加以下配置:
spring.ai.openai.chat.options.model=deepseek-chat spring.ai.openai.base-url=https://api.deepseek.com spring.ai.openai.api-key=sk-XXX
核心配置实现
以下是实现 MCP 客户端和聊天功能的核心代码:
@Bean public CommandLineRunner predefinedQuestions(ChatClient.Builder chatClientBuilder, List<McpFunctionCallback> functionCallbacks, ConfigurableApplicationContext context) { return args -> { var chatClient = chatClientBuilder .defaultFunctions(functionCallbacks.toArray(new McpFunctionCallback[0])) .build(); String question1 = "你能链接我的postgres数据库,然后告诉我这个数据库有多少张表吗?"; System.out.println("ASSISTANT: " + chatClient.prompt(question1).call().content()); String question2 = "你能链接我的postgres数据库,然后告诉我这个商品表里面哪个车最贵吗?"; System.out.println("ASSISTANT: " + chatClient.prompt(question2).call().content()); context.close(); }; } @Bean public List<McpFunctionCallback> functionCallbacks(McpSyncClient mcpClient) { return mcpClient.listTools(null) .tools() .stream() .map(tool -> new McpFunctionCallback(mcpClient, tool)) .toList(); } @Bean(destroyMethod = "close") public McpSyncClient mcpClient() { var stdioParams = ServerParameters.builder("npx") .args("-y", "@modelcontextprotocol/server-postgres", "postgresql://postgres:lengleng@localhost:5432") .build(); var mcpClient = McpClient.using(new StdioClientTransport(stdioParams)) .requestTimeout(Duration.ofSeconds(10)).sync(); var init = mcpClient.initialize(); System.out.println("MCP Initialized: " + init); return mcpClient; }
业务表如下
测试执行
工作原理
-
MCP 服务器初始化:
- 通过
McpSyncClient
建立与数据库的连接 - 配置连接参数和超时设置
- 初始化 MCP 协议
- 通过
-
功能回调注册:
- 获取可用的数据库工具
- 将工具转换为功能回调
- 注册到聊天客户端
-
自然语言交互:
- 用户提供自然语言问题
- Spring AI 处理并转换为数据库查询
- 通过 MCP 执行查询并返回结果
使用场景
Chat2DB 结合 Spring AI MCP 特别适用于以下场景:
- 数据分析师快速查询数据
- 开发人员数据库探索
- 非技术人员数据库访问
- 数据库结构审查
安全考虑
在使用 Chat2DB 和 MCP 时,需要注意以下安全事项:
- MCP 默认只提供只读访问
- 建议使用专门的只读数据库账户
- 定期审查访问日志
- 设置适当的超时限制
执行流程分析
以下是 Spring AI MCP 与数据库交互的详细执行流程:
执行步骤详解
-
初始化阶段
- Spring 应用启动
- MCP Client 初始化,使用协议版本 2024-11-05
- 服务器信息:example-servers/postgres v0.1.0
-
工具注册阶段
- 注册 query 工具,用于执行只读 SQL 查询
- 设置查询超时时间为 10 秒
-
数据库交互阶段
- 执行数据库连接检查
- 获取数据库表结构信息
- 执行用户查询并返回结果
-
响应处理阶段
- 将数据库查询结果转换为结构化 JSON
- AI 模型处理结果并生成自然语言回答
- 返回格式化的响应给用户
示例查询执行
-- 查询表数量 SELECT COUNT(*) as count FROM information_schema.tables WHERE table_schema = 'public'; -- 查询表结构 SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'products'; -- 查询商品数据 SELECT id, name, price FROM products ORDER BY price DESC;
这个执行流程展示了 Spring AI MCP 如何无缝地将自然语言查询转换为数据库操作,并将结果转换回用户友好的格式。整个过程是自动化的,用户无需了解底层的 SQL 查询细节。
总结
Chat2DB 配合 Spring AI MCP 为数据库交互提供了一个革新性的解决方案。通过自然语言处理和安全的协议设计,它既保证了易用性,又确保了数据安全。这种方案特别适合需要频繁数据库查询但希望降低技术门槛的场景。
如果您对 Java AI 感兴趣,欢迎订阅我的频道。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
IvorySQL 4.0 之兼容 Oracle 包功能设计思路解读
日前,IvorySQL 4.0 发布,该版本新增了兼容 Oracle 包功能的新特性。 为了大家能够更好地理解和使用 IvorySQL 4.0,本文将简要介绍实现此功能时的设计思路。 Oracle 的包是什么? 包是包含了逻辑上相关的 PL/SQL 类型、变量、常量、子过程、游标和异常的一个模式对象。包被编译并存储在数据库中,多个应用可以共享包的内容。 包总是有一个包规范,包规范中声明了公有对象,这些公有对象可以在包外被引用。 如果公有对象中包含了游标或子过程,则包必须有一个包体。包体必须定义公有游标和公有子过程的代码。包体也可以声明并定义私有对象,私有对象不能在包外被引用,但可用于包内使用。最后,包体可以有一个初始化部分,这部分用于初始化变量,做一些一次性的设置步骤和异常处理。修改包体的时候,可以不修改包规范或引用包的公有对象的数据库对象,因此可以认为包体是一个黑盒。 IvorySQL 中包的实现 从内容来看,包体与嵌套子过程类似,包规范只是定义包体对外的接口,因此,从实现角度来看,包的实现过程可以和嵌套子过程类似。 我们主要处理的工作有如下几个方面:包的创建、更新、实例化、删除以及...
- 下一篇
【GreatSQL优化器-10】find_best_ref
【GreatSQL优化器-10】find_best_ref 一、find_best_ref介绍 GreatSQL的优化器对于join的表需要根据行数和cost来确定最后哪张表先执行哪张表后执行,这里面就涉及到预估满足条件的表数据,在keyuse_array数组有值的情况下,会用find_best_ref函数来通过索引进行cost和rows的估计,并且会找出最优的索引。这样就可能不会继续用后面的calculate_scan_cost()进行全表扫描计算cost,可以节省查询时间。 这个功能是对之前【优化器05-条件过滤】的补充功能,二者有可能一起用,也有可能只选择一种计算,要看具体条件。 下面用一个简单的例子来说明find_best_ref函数获得的结果。 CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT,date1 DATETIME); INSERT INTO t1 VALUES (1,10,'2021-03-25 16:44:00.123456'),(2,1,'2022-03-26 16:44:00.123456'),(3,4,'2023-...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Red5直播服务器,属于Java语言的直播服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启