跳到主要内容

3 篇博文 含有标签「Spring-ai」

查看所有标签

用模型上下文协议(MCP)和 Spring AI 构建智能应用

· 阅读需 4 分钟
Kinser
Software Engineer

用模型上下文协议(MCP)和 Spring AI 构建智能应用

1. MCP 架构介绍

MCP(模型上下文协议)标准化了人工智能应用与外部数据源之间的交互,使得像数据库、API 和搜索引擎等工具能够无缝集成。其客户端 - 服务器架构包括:

  • MCP 主机:用户与之交互的人工智能应用层(例如 Claude 聊天机器人)。
  • MCP 客户端:处理主机与服务器之间的通信,将请求格式化为外部系统可识别的格式。 img.png
  • MCP 服务器:连接到外部资源(例如 PostgreSQL、Google Drive)并执行操作的中间件。 img_1.png

2. 安装 MySQL MCP 服务器

第一步:您可以查看这个 GitHub 仓库: ** GitHub 手动安装

pip install mysql-mcp-server

第二步:由于我们将使用 uv 工具,因此需要安装它
请参考这篇文章:UV Installation 安装 uv 工具

3. 使用 Spring AI 进行项目设置

第一步:添加依赖项
build.gradle 中包含 Spring AI MCP 库:

implementation 'org.springframework.ai:spring-ai-mcp-client-spring-boot-starter'
implementation 'org.springframework.ai:spring-ai-mcp-client-webflux-spring-boot-starter' // 用于 SSE 传输

4. 客户端集成

第一步:在 application.yml 中配置 Spring AI 配置

spring:
ai:
mcp:
client:
enabled: true
name: mysqlMCP # MCP 服务器名称
version: 1.0.0
type: SYNC
request-timeout: 20s
stdio:
root-change-notification: true
servers-configuration: classpath:mcp-servers-config.json # 与 Claude 桌面配置相同的 MCP 服务器配置。

第二步:添加 mcp-servers-config.json

{
"mcpServers": {
"mysql": {
"command": "C:\\Users\\xxx\\.local\\bin\\uv.exe",
"args": [
"--directory",
"C:\\Users\\xxx\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\mysql_mcp_server",
"run",
"mysql_mcp_server"
],
"env": {
"MYSQL_HOST": "localhost",
"MYSQL_PORT": "3306",
"MYSQL_USER": "root",
"MYSQL_PASSWORD": "root",
"MYSQL_DATABASE": "test"
}
}
}
}

需要检查 uv.exe 和 mysql_mcp_server 的目录,并检查所有 MySQL 配置。


5. 简单示例

示例将使用 MCP 与 MySQL 数据库进行交互。


@SpringBootApplication(scanBasePackages = "org.openwes")
@EnableDiscoveryClient
public class AiApplication {

public static void main(String[] args) {
SpringApplication.run(AiApplication.class, args);
}

private String userInput = "show all tables";

@Bean
public CommandLineRunner predefinedQuestions(ChatClient.Builder chatClientBuilder, ToolCallbackProvider tools,
ConfigurableApplicationContext context) {
return args -> {

var chatClient = chatClientBuilder
.defaultTools(tools)
.build();

System.out.println(">>> 问题: " + userInput);
System.out.println(">>> 回答: " + chatClient.prompt(userInput).call().content());

context.close();
};
}

}

然后我们会看到日志显示它将自然语言“show all tables”转换为 SQL“show all tables”:

received: 2025-03-27 09:21:19,799 - mysql_mcp_server - INFO - Listing tools...

>>> 问题:show all tables

received: 2025-03-27 09:21:20,602 - mysql_mcp_server - INFO - Calling tool: execute_sql with arguments: {'query': 'show all tables'}

>>> 回答:以下是在 MySQL 服务器上执行 `SHOW TABLES` 命令后返回的所有表名:

- a_api
- a_api_config
- a_api_key
- a_api_log
- d_domain_event
- e_container_task
- e_container_task_and_business_task_relation
- e_ems_location_config
- l_change_log
- l_change_log_lock
...

6. Spring AI MCP 的优势

  • 声明式工具注册:通过注解而非手动 SDK 配置简化集成。
  • 统一协议:通过标准化的 MCP 通信消除数据源碎片化。
  • 可扩展性:添加新工具(例如 Meilisearch、Git)而不会干扰现有工作流。

7. 结论

通过结合 Spring AI 的依赖管理与 MCP 的协议标准化,开发人员可以快速构建企业级人工智能应用。对于高级用例,可以探索混合架构,其中 MCP 服务器同时处理实时数据和批处理。


本文综合了最新的 MCP 进展与 Spring AI 的相关内容。完整的代码示例请参考链接中的资源。

代码可在 GitHub 上找到:GitHub - jingsewu/open-wes

使用 Spring AI 构建自然语言系统配置管理器

· 阅读需 7 分钟
Kinser
Software Engineer

引言

系统配置管理通常通过配置文件、环境变量或管理界面来完成。但如果我们可以通过与应用程序聊天来更改系统设置呢?在本文中,我将向您展示如何构建一个能够理解和修改系统配置的聊天机器人,该机器人由 Spring AI 提供支持,并使用自然语言。

自然语言配置的强大功能

传统的配置管理要求用户:

  • 知道确切的参数名称和有效值;
  • 在配置文件或界面中导航;
  • 理解技术语法和格式。

通过使用自然语言处理,我们可以使这一过程更加直观。用户可以简单地说:“将连接超时时间增加到 30 秒”或“为身份验证模块启用调试日志”。

技术实现

设置 Spring AI

参考文章:集成 SpringAI 与 DeepSeek

定义工具函数

Spring AI 支持工具函数,允许 AI 模型执行特定操作。我们将定义用于读取和更新配置的函数:

@Service
@RequiredArgsConstructor
public class SystemConfigTool implements ITool {

private final ISystemConfigApi systemConfigApi;

@Tool(name = "getSystemConfig", description = "检索当前系统配置设置,包括基本配置、EMS 配置、入库配置、出库配置、库存配置和算法配置。返回的 {@link SystemConfigDTO} 提供了所有可配置系统参数的全面快照。")
public SystemConfigDTO getSystemConfig() {
return systemConfigApi.getSystemConfig();
}

@Tool(name = "updateSystemConfig", description = """
更新系统配置设置,使用以下 JSON 结构:
{
"basicConfig": {
"transferContainerReleaseMethod": "AUTOMATED|MANUAL",
"autoReleaseDelayTimeMin": number
},
"inboundConfig": {
"checkRepeatedCustomerOrderNo": boolean,
"checkRepeatedLpnCode": boolean
},
"outboundConfig": {
"checkRepeatedCustomerOrderNo": boolean
},
"stockConfig": {
"stockAbnormalAutoCreateAdjustmentOrder": boolean,
"zeroStockSavedDays": number
},
"emsConfig": {
"allowBatchCreateContainerTasks": boolean
},
"outboundAlgoConfig": {
"useLocalAlgorithm": boolean,
"cutoffTime": number,
"mode": "string",
"orderDispatchStrategy": "string"
}
}
示例:
- “禁用入库订单的重复订单检查” → {"inboundConfig":{"checkRepeatedCustomerOrderNo":false}}
- “将零库存保留期限设置为 3 天” → {"stockConfig":{"zeroStockSavedDays":3}}
- “同时修改容器释放方法和算法超时时间” → {
"basicConfig":{"transferContainerReleaseMethod":"MANUAL"},
"outboundAlgoConfig":{"cutoffTime":5000}
}
""")
public void updateSystemConfig(@ToolParam SystemConfigDTO systemConfigDTO) {
systemConfigApi.update(systemConfigDTO);
}
}

将工具集成到聊天服务中

在聊天服务中处理自然语言:

private final List<ITool> tools;

private String executeAIAndReturnString(String message, String conversationId, PromptTemplate template) {

String relevantHistory = chatMemory.get(conversationId, 10)
.stream()
.map(this::formatMessage)
.collect(Collectors.joining("\n"));

template.add("context", relevantHistory);

chatMemory.add(conversationId, new UserMessage(message));

String content = ChatClient.create(chatModel).prompt(template.create()).tools(tools).call().content();
chatMemory.add(conversationId, new AssistantMessage(content));

return content;
}

我创建了一个接口 ITool,以统一所有Tool class, 这样只需要简单注入,就可以获得所有的Tool class 对象

private final List<ITool> tools;
@Override
public String chat(String message, String conversationId) {

PromptTemplate template = new PromptTemplate(AiPromptTemplate.QA_QUESTION_CLARIFY_TEMPLATE);
template.add("question", message);
String intent = ChatClient.create(chatModel).prompt(template.create())
.call().content();

if ("1".equals(intent)) {
template = new PromptTemplate(AiPromptTemplate.QA_PROMPT_TEMPLATE);
template.add("question", message);
template.add("language", LanguageContext.getLanguage());

} else {
template = new PromptTemplate(QA_TOOL_CALL_TEMPLATE);
template.add("question", message);
template.add("language", LanguageContext.getLanguage());
}

return executeAIAndReturnString(message, conversationId + "chat", template);
}

注意:聊天机器人具有两种功能:首先,它是一个问答机器人;其次,它是一个配置管理机器人。因此,在调用 LLM 之前,需要判断问题是问答查询还是配置管理查询。

示例交互

以下是一些与聊天机器人的示例交互: function_call_1.png

我们输入:查询系统参数,系统会自动调用getSystemConfig接口,获取参数,并返回

function_call_2.jpg 我们输入:设置成7天,系统则调用updateSystemConfig接口,修改参数,并返回成功修改

安全考虑

在实现此类系统时,请考虑以下安全方面:

  1. 身份验证和授权
    • 确保只有授权用户可以访问配置聊天机器人;
    • 为不同配置类别实施基于角色的访问控制。
  2. 验证和约束
    • 为配置值添加验证规则;
    • 实施约束,防止修改关键系统设置。
  3. 审计日志
    • 记录所有配置更改;
    • 记录谁进行了更改以及更改的时间。

优势和用例

这种配置管理方法具有以下优势:

  1. 提升用户体验
    • 自然语言交互降低了学习曲线;
    • 用户无需记住确切的配置键;
    • 无需在复杂界面中导航即可快速更改配置。
  2. 减少人为错误
    • AI 可以验证和清理输入;
    • 对无效配置提供即时反馈;
    • 为复杂设置提供引导体验。
  3. 适用于 DevOps 和系统管理
    • 在部署期间快速更改配置;
    • 更轻松地进行故障排除和系统维护;
    • 减少文档需求。

其他使用函数调用的用例

  • 客户支持:自动创建支持工单、获取订单详情或提供常见问题解答。
  • 电子商务:推荐产品、处理支付或跟踪发货。
  • 医疗保健:安排预约、检索患者记录或发送用药提醒。
  • 金融:获取账户余额、执行交易或提供投资见解。

结论

通过将 Spring AI 与系统配置管理相结合,我们创建了一种更直观、更用户友好的方式来管理应用程序设置。这种方法展示了 AI 如何简化传统技术任务,并使其对更广泛的受众开放。

该项目的完整源代码可在 GitHub OpenWES 上找到。欢迎尝试并根据您的需求进行调整!

在将其用于生产环境之前,请务必处理边缘情况、添加适当的错误处理并实施安全措施。

将 SpringAI 与 DeepSeek 集成

· 阅读需 7 分钟
Kinser

引言

随着企业越来越依赖高级数据分析和机器学习来进行决策,将强大的 AI 模型集成到现有系统中变得至关重要。一个这样的强大集成是将 Spring AI(一个用于构建 AI 驱动应用程序的框架)与 DeepSeek(一个先进的大模型)结合起来。

在本文中,我们将介绍如何将 Spring AI 与 DeepSeek 进行集成,解释关键概念、优势以及如何让这种集成无缝工作的逐步指南。

什么是 Spring AI?

Spring AI 是一个框架,允许开发人员利用 Spring 生态系统的强大功能和灵活性来创建 AI 应用程序。它提供了将大型语言模型集成到基于 Spring 的应用程序中的工具和能力,使开发人员能够更轻松地构建和部署 AI 驱动的解决方案,而无需陡峭的学习曲线。

为什么将 Spring AI 与 DeepSeek 集成?

将 Spring AI 与 DeepSeek 结合起来,为您的应用程序打开了一个充满可能性的世界,使您能够:

  • 访问先进的语言模型:将 DeepSeek 的最新模型集成到基于 Spring 的应用程序中,增强自然语言理解和生成能力。
  • 实时 AI 响应:结合 DeepSeek 强大的 AI 模型和 Spring 的后端服务,为您的应用程序提供智能、实时的响应。
  • 可扩展的 AI 解决方案:使用 Spring 的强大基础设施和 DeepSeek 的先进语言模型,构建能够随着业务需求扩展的 AI 系统。

前提条件

在开始集成过程之前,请确保您具备以下前提条件:

  • Spring Boot:一个正在运行的 Spring Boot 应用程序,因为 Spring AI 是基于它构建的。
  • DeepSeek API 密钥:访问 DeepSeek 的 API 以利用其模型和服务。
  • Java 17+:由于 Spring AI 最适合与 Java 17 及更高版本一起使用。

逐步集成指南

第一步:设置您的 Spring Boot 应用程序

如果您还没有设置 Spring Boot 应用程序,可以使用 Spring Initializr 创建一个。选择 Spring WebSpring Boot DevToolsSpring AI 等依赖项。

curl https://start.spring.io/starter.zip -d dependencies=web,devtools -d name=SpringDeepSeek -o SpringDeepSeek.zip` 

第二步:添加依赖项

在您的 build.gradle 文件中,添加 Spring AI 和 DeepSeek 所需的依赖项。对于 Spring AI,使用 spring-ai-openai-spring-boot-starter 依赖项。由于 Spring AI 没有专门针对 DeepSeek 的客户端,您可以直接用 OpenAI API 进行交互。

示例:

implementation 'org.springframework.ai:spring-ai-openai-spring-boot-starter'

第三步:配置 DeepSeek API

要与 DeepSeek 交互,您需要一个 API 密钥。将您的密钥添加到 application.propertiesapplication.yml 中,以便安全访问。

spring:
ai:
openai:
base-url: https://api.deepseek.com
api-key: xxx
chat:
options:
model: deepseek-chat
temperature: 0
embedding:
enabled: false

第四步:实现 DeepSeek 集成

创建一个服务,与 DeepSeek 的 API 交互以获取数据洞察。

@Service
public class AiChatService {

private final ChatModel chatModel;

private Flux<String> executeAI(String message, String conversationId, PromptTemplate template) {

String relevantHistory = chatMemory.get(conversationId, 10)
.stream()
.map(this::formatMessage)
.collect(Collectors.joining("\n"));

// 将上下文添加到模板
template.add("context", relevantHistory);

chatMemory.add(conversationId, new UserMessage(message));

// 创建一个 StringBuilder 来累积响应
StringBuilder fullResponse = new StringBuilder();

return this.chatModel.stream(template.createMessage()).map(chunk -> {
fullResponse.append(chunk);
return chunk;
}).doOnComplete(() -> {
// 只有在获得完整响应后才保存到聊天记忆中
chatMemory.add(conversationId, new AssistantMessage(fullResponse.toString()));
});
}
}

第五步:结合 Spring AI 和 DeepSeek

现在,将两项服务结合起来,使您的应用程序能够使用 DeepSeek 的洞察并将其应用于您的 AI 模型。

@RestController
@RequestMapping("/ai")
public class AIController {

@GetMapping("chat")
public Flux<String> chat(@RequestParam(value = "message") String message) {
String currentUser = UserContext.getCurrentUser();
return aiService.chat(message, currentUser);
}

@PostMapping("analysis")
@CrossOrigin
public AnalysisResult sqlAnalysis(@RequestBody AnalysisQueryVO analysisQueryVO) throws SQLException {
String currentUser = UserContext.getCurrentUser();
return aiService.analysis(analysisQueryVO.getQuery(), currentUser);
}

@PostMapping("generateJsFunction")
@CrossOrigin
public Flux<String> generateJsFunction(@RequestBody JsFunctionGenerationRequest jsFunctionGenerationRequest) {
String currentUser = UserContext.getCurrentUser();
return aiService.generateJsFunction(jsFunctionGenerationRequest, currentUser);
}

@PostMapping("generateCode")
@CrossOrigin
public Flux<String> generateCode(@RequestBody CodeGenerationRequest codeGenerationRequest) {
String currentUser = UserContext.getCurrentUser();
return aiService.generateCode(codeGenerationRequest, currentUser);
}
}

第六步:测试集成

启动您的 Spring Boot 应用程序,并通过调用 API 端点来测试集成:

curl "http://localhost:8080/ai/chat?message=some_data_to_analyze"

您应该会收到一个包含 DeepSeek 的数据和您的 AI 模型分析的响应。

第七步:一些使用场景

AI 助手:

AI 助手使用 AI 模型根据用户输入提供自动化、实时的响应或洞察。它通过回答问题、提供建议或协助任务来帮助用户,从而提高客户支持或虚拟助手等应用程序的效率。

chat.png

AI 数据分析

AI 数据分析使 AI 模型能够处理和提取大型数据集的洞察。它识别模式和趋势,助力数据驱动的决策。这对于需要快速准确分析数据以获得更好业务成果的应用程序至关重要。

data_analysis.png

结论

Spring AIDeepSeek 集成,为构建能够分析大型数据集、做出实时决策并随着业务需求扩展的 AI 驱动应用程序提供了强大的解决方案。通过这种设置,您可以利用深度学习和机器学习的力量来改进您的仓库执行系统或其他任何数据驱动的应用程序。

您可以在 GitHub 上进一步探索该项目,并在 modules-ai 部分找到更多信息。 或者访问 OpenWes 体验AI 助手 与 数据分析

此外,您可以根据您项目的具体需求,自由定制步骤和使用的模型。