使用 Spring AI 实现通过自然语言调用配置函数

引言

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

自然语言配置的强大功能

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

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

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

技术实现

设置 Spring AI

参考文章:集成 SpringAI 与 DeepSeek

定义工具函数

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

typescript 复制代码
@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);
    }
}

将工具集成到聊天服务中

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

arduino 复制代码
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 对象

java 复制代码
private final List<ITool> tools;
arduino 复制代码
@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 之前,需要判断问题是问答查询还是配置管理查询。

示例交互

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

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

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

安全考虑

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

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

优势和用例

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

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

其他使用函数调用的用例

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

结论

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

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

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

复制代码
相关推荐
金銀銅鐵28 分钟前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
念何架构之路1 小时前
go-grpc设计思想
开发语言·后端·golang
system_error_x2 小时前
SpringBoot 集成 Thymeleaf 简洁入门
java·spring boot·后端
步行cgn3 小时前
Spring MVC 视图机制的核心接口与类
java·开发语言·后端·spring·mvc
码事漫谈4 小时前
AI 读你的提示词,其实很没耐心
后端
用户8356290780515 小时前
如何使用 Python 格式化 Excel 单元格中的长文本
后端·python
我命由我123455 小时前
Python 开发 - Python 的 pathlib
java·开发语言·后端·python·学习·java-ee·学习方法
IT_陈寒5 小时前
Java性能优化完全指南
前端·人工智能·后端
电子IT笔记5 小时前
对接群晖NAS,上传和删除踩坑记录
前端·后端
Mk598785 小时前
P4:把 Agent 的记忆搬进 Redis —— AgentScope-Java 工程化实战
后端