使用 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 上找到。欢迎尝试并根据您的需求进行调整!

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

复制代码
相关推荐
Seven9721 分钟前
【设计模式】使用解释器模式简化复杂的语法规则
java·后端·设计模式
李长渊哦40 分钟前
Spring Boot 接口延迟响应的实现与应用场景
spring boot·后端·php
Seven971 小时前
【设计模式】通过访问者模式实现分离算法与对象结构
java·后端·设计模式
Seven971 小时前
【设计模式】遍历集合的艺术:深入探索迭代器模式的无限可能
java·后端·设计模式
小杨4041 小时前
springboot框架项目应用实践五(websocket实践)
spring boot·后端·websocket
浪九天1 小时前
Java直通车系列28【Spring Boot】(数据访问Spring Data JPA)
java·开发语言·spring boot·后端·spring
bobz9652 小时前
IKEv1 和 IKEv2 发展历史和演进背景
后端
大鹏dapeng2 小时前
Gone v2 goner/gin——试试用依赖注入的方式打开gin-gonic/gin
后端·go
tan180°3 小时前
版本控制器Git(1)
c++·git·后端
GoGeekBaird3 小时前
69天探索操作系统-第50天:虚拟内存管理系统
后端·操作系统