SpringAI与LangChain4j的智能应用-(实践篇3)

「鸿蒙心迹」“2025・领航者闯关记“主题征文活动 10w+人浏览 564人参与

企业级AIOps平台(Spring Boot 3.x + Vue3)核心实现方案

一、项目整体定位

聚焦AIOps核心闭环:数据采集→异常检测→根因定位→自动处置,仅实现核心流程,剔除复盘优化、审计等旁支功能,优先保证核心链路可运行。
技术栈:

  • 后端:Spring Boot 3.2.5 + SpringAI 1.0.0-M1 + LangChain4j 0.32.0 + Prometheus Java Client + MyBatis-Plus
  • 前端:Vue3 + Element Plus + ECharts(仅核心可视化)

二、工程目录结构

1. 后端目录结构(Maven多模块,聚焦核心)

aiops-platform/
├── aiops-common/                // 通用模块(核心)
│   ├── src/main/java/com/aiops/common/
│   │   ├── constant/            // 常量(异常等级、处置类型)
│   │   ├── dto/                 // 通用DTO(分页、返回结果)
│   │   ├── enums/               // 枚举(异常类型、处置级别)
│   │   ├── exception/           // 全局异常
│   │   └── utils/               // 工具类(JSON、时间、HTTP)
├── aiops-core/                  // 核心业务模块(核心)
│   ├── src/main/java/com/aiops/core/
│   │   ├── collect/             // 数据采集模块
│   │   │   ├── controller/      // 采集配置接口(仅核心)
│   │   │   ├── service/         // 指标/日志采集服务
│   │   │   └── vo/              // 采集入参VO
│   │   ├── detect/              // 异常检测模块
│   │   │   ├── controller/      // 检测规则/结果接口
│   │   │   ├── service/         // 规则+AI检测服务
│   │   │   └── vo/              // 检测入参VO
│   │   ├── locate/              // 根因定位模块
│   │   │   ├── controller/      // 根因定位接口
│   │   │   ├── service/         // LangChain4j编排推理服务
│   │   │   └── vo/              // 定位入参VO
│   │   ├── dispose/             // 自动处置模块
│   │   │   ├── controller/      // 处置规则/执行接口
│   │   │   ├── service/         // 分级处置服务
│   │   │   └── vo/              // 处置入参VO
│   │   └── entity/              // 核心实体(指标、异常、根因、处置记录)
│   └── src/main/resources/
│       ├── mapper/              // MyBatis-Plus映射文件
│       └── application.yml      // 核心配置(AI模型、Prometheus地址)
├── aiops-api/                   // API网关(简化版,仅路由)
│   └── src/main/java/com/aiops/api/
│       └── GatewayApplication.java
└── pom.xml                      // 父依赖(Spring Boot 3.2.5)

2. 前端目录结构(Vue3 + Vite,聚焦核心)

aiops-front/
├── src/
│   ├── api/                     // 接口请求(采集、检测、定位、处置)
│   ├── assets/                  // 静态资源(图标、样式)
│   ├── components/              // 核心组件
│   │   ├── DataCollect.vue      // 数据采集配置组件
│   │   ├── AnomalyDetect.vue    // 异常检测结果组件
│   │   ├── RootCauseLocate.vue  // 根因定位组件
│   │   └── AutoDispose.vue      // 自动处置组件
│   ├── layout/                  // 基础布局(简化版)
│   ├── router/                  // 路由(核心4个页面)
│   ├── store/                   // Pinia状态管理(仅核心数据)
│   ├── views/                   // 核心页面
│   │   ├── collect/             // 数据采集页
│   │   ├── detect/              // 异常检测页
│   │   ├── locate/              // 根因定位页
│   │   └── dispose/             // 自动处置页
│   ├── App.vue                  // 根组件
│   └── main.js                  // 入口文件
├── package.json
└── vite.config.js

三、核心流程梳理(仅核心链路)

流程总览

数据采集(指标/日志)→ 异常检测(规则+AI)→ 根因定位(多源融合+AI推理)→ 自动处置(分级执行)

1. 数据采集阶段(核心实现)

目标

采集核心指标(接口超时率、CPU使用率)和ERROR日志,标准化存储。

核心实现步骤

① 配置采集源:前端配置Prometheus地址、日志文件路径,后端保存采集规则到数据库;
② 定时采集:后端通过@Scheduled定时调用Prometheus API获取指标,通过FileReader读取日志文件;
③ 数据标准化:将指标/日志转换为统一格式(包含serviceName、metricName、value、timestamp),存入MySQL。

核心代码(指标采集服务)
@Service
public class MetricCollectService {
    @Autowired
    private PrometheusApiClient prometheusApiClient; // 自定义Prometheus客户端
    @Autowired
    private MetricMapper metricMapper;

    // 每1分钟采集核心指标
    @Scheduled(cron = "0 */1 * * * ?")
    public void collectMetric() {
        // 1. 获取采集规则(仅核心服务:trade、pay)
        List<CollectRule> rules = collectRuleMapper.selectList(Wrappers.lambdaQuery(CollectRule.class)
                .in(CollectRule::getServiceName, "trade", "pay"));
        
        // 2. 遍历采集
        for (CollectRule rule : rules) {
            // 调用Prometheus API查询指标(如接口超时率)
            String query = "avg(api_timeout_rate{service=\"%s\"})[1m]".formatted(rule.getServiceName());
            BigDecimal value = prometheusApiClient.queryMetric(query);
            
            // 3. 标准化存储
            MetricDO metricDO = new MetricDO();
            metricDO.setServiceName(rule.getServiceName());
            metricDO.setMetricName("api_timeout_rate");
            metricDO.setValue(value);
            metricDO.setTimestamp(LocalDateTime.now());
            metricMapper.insert(metricDO);
        }
    }
}

2. 异常检测阶段(核心实现)

目标

规则初筛+AI复判,识别真异常(接口超时率>5%)。

核心实现步骤

① 规则检测:后端读取指标数据,判断是否超过阈值(如超时率>5%);
② AI复判:若触发规则,调用SpringAI的ChatClient,整合日志数据判定是否为真异常;
③ 结果存储:将异常结果(服务名、异常类型、判定依据)存入数据库,前端实时展示。

核心代码(异常检测服务)
@Service
public class AnomalyDetectService {
    @Autowired
    private ChatClient chatClient;
    @Autowired
    private MetricMapper metricMapper;
    @Autowired
    private LogMapper logMapper;

    public AnomalyDetectResult detect(String serviceName) {
        AnomalyDetectResult result = new AnomalyDetectResult();
        result.setServiceName(serviceName);

        // 1. 规则检测:查询近5分钟超时率
        BigDecimal timeoutRate = metricMapper.selectAvgTimeoutRate(serviceName, 5);
        if (timeoutRate.compareTo(new BigDecimal("5")) <= 0) {
            result.setIsAnomaly(false);
            return result;
        }

        // 2. AI复判:整合日志数据
        List<LogDO> errorLogs = logMapper.selectRecentErrorLogs(serviceName, 5);
        String logContent = errorLogs.stream().map(LogDO::getContent).collect(Collectors.joining(";"));
        
        String prompt = """
                判定服务%s是否为真异常:
                1. 接口超时率:%s%%
                2. 近5分钟ERROR日志:%s
                要求:仅输出“是/否”+判定依据(≤50字)
                """.formatted(serviceName, timeoutRate, logContent);
        
        String aiResponse = chatClient.call(prompt);
        result.setIsAnomaly(aiResponse.contains("是"));
        result.setReason(aiResponse);
        
        // 3. 存储异常结果
        AnomalyDO anomalyDO = new AnomalyDO();
        BeanUtils.copyProperties(result, anomalyDO);
        anomalyMapper.insert(anomalyDO);
        
        return result;
    }
}

3. 根因定位阶段(核心实现)

目标

LangChain4j编排流程,融合指标+日志数据,定位核心根因。

核心实现步骤

① 数据整合:后端整合异常服务的指标、日志数据,生成故障上下文;
② AI推理:LangChain4j调用大模型,基于模板化Prompt推理根因;
③ 结果返回:前端展示根因+验证方法。

核心代码(根因定位服务)
@Service
public class RootCauseLocateService {
    @Autowired
    private ChatLanguageModel chatModel;

    public RootCauseResult locate(String serviceName) {
        // 1. 整合故障上下文
        String metrics = "接口超时率:8%,数据库CPU:90%";
        String logs = "ERROR - 数据库查询超时(SQL:select * from order where user_id=?)";
        String context = "指标:%s;日志:%s".formatted(metrics, logs);

        // 2. LangChain4j Prompt模板化
        PromptTemplate promptTemplate = PromptTemplate.from("""
                定位服务{{serviceName}}的核心根因:
                {{context}}
                要求:1. 根因仅1个;2. 验证方法1句话
                """);
        
        String prompt = promptTemplate.apply(Map.of("serviceName", serviceName, "context", context));
        String rootCause = chatModel.generate(prompt).content();

        // 3. 组装结果
        RootCauseResult result = new RootCauseResult();
        result.setServiceName(serviceName);
        result.setRootCause(rootCause);
        return result;
    }
}

4. 自动处置阶段(核心实现)

目标

分级处置:低风险自动重启服务,高风险生成建议。

核心实现步骤

① 匹配处置规则:根据根因匹配预设规则(如“数据库慢查询→生成建议”“线程池耗尽→重启服务”);
② 执行处置:低风险调用Ansible重启服务,高风险返回处置建议;
③ 结果校验:处置后校验指标是否恢复,前端展示处置结果。

核心代码(自动处置服务)
@Service
public class AutoDisposeService {
    @Autowired
    private RootCauseLocateService rootCauseService;
    @Autowired
    private AnsibleClient ansibleClient;

    public DisposeResult dispose(String serviceName) {
        DisposeResult result = new DisposeResult();
        RootCauseResult rootCause = rootCauseService.locate(serviceName);
        
        // 1. 匹配处置规则
        if (rootCause.getRootCause().contains("线程池耗尽")) {
            // 低风险:自动重启服务
            boolean success = ansibleClient.restartService(serviceName);
            result.setDisposeAction("自动重启服务");
            result.setSuccess(success);
        } else {
            // 高风险:生成建议
            result.setDisposeAction("人工处置建议:优化数据库索引");
            result.setSuccess(true);
        }
        
        return result;
    }
}

四、核心流程前端交互(简化版)

  1. 数据采集页:输入服务名、Prometheus地址,点击“启动采集”,实时展示采集的指标数据(折线图);
  2. 异常检测页:选择服务名,点击“检测”,展示是否异常+判定依据;
  3. 根因定位页:选择异常服务,点击“定位”,展示根因+验证方法;
  4. 自动处置页:选择根因结果,点击“处置”,展示处置动作+执行结果。

五、核心配置(application.yml)

spring:
  application:
    name: aiops-core
  # 数据库配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/aiops?useUnicode=true&characterEncoding=utf8
    username: root
    password: root123
  # SpringAI配置
  ai:
    openai:
      api-key: ${OPENAI_API_KEY}
      chat:
        model: gpt-4o
        temperature: 0.1
# Prometheus配置
prometheus:
  url: http://localhost:9090
# 定时任务配置
spring:
  task:
    scheduling:
      pool:
        size: 5

六、核心实现注意事项

  1. 优先保证核心链路通:采集→检测→定位→处置,暂不考虑高并发、容错、审计;
  2. 前端仅实现核心交互,无需复杂样式,聚焦数据展示;
  3. AI模型优先用OpenAI(快速验证),本地模型可后续替换;
  4. 数据存储仅用MySQL,时序数据库、ES等后续扩展。

此方案聚焦核心流程,剔除所有非必要功能,可快速落地验证AIOps平台的核心能力,后续可基于此扩展复盘、审计、高可用等能力。

### SpringAILangChain4J 的对比分析 #### 1. **SpringAI** SpringAI 是基于 Java 生态系统的 AI 开发框架,旨在简化开发者在构建企业级应用中的机器学习和自然语言处理流程。它利用了 Spring Framework 的强大功能来管理依赖关系并提供模块化设计[^1]。 以下是其主要特点: - 集成性强:能够轻松其他 Spring 组件协同工作。 - 支持多种模型部署方式:无论是本地运行还是云端服务调用都提供了良好的支持。 - 社区资源相对较少:由于专注于特定领域(Java),因此相较于 Python 社区可能更小众。 ```java // 示例代码展示如何加载预训练模型 Model model = new Model(); model.loadPretrained("path/to/model"); ``` --- #### 2. **LangChain4J** LangChain4J 则是 LangChain 官方推出的针对 JVM 平台的支持库,允许开发人员通过熟悉的 Java 或 Kotlin 编程环境访问强大的链式推理能力以及各种大语言模型接口[^2]。它的核心优势在于继承自 LangChain 的设计理念——即灵活组合不同组件完成复杂任务的能力。 特性概述如下: - 提供统一 API 接口用于连接多个 LLMs; - 原生兼容 OpenAPI 标准的服务端实现方案; - 对表达式语言进行了优化改进以适应静态类型语言需求; ```java // 使用 LangChain4J 构建简单对话系统 Conversation conversation = Conversation.builder() .addPrompt(new StringTemplate("You are Qwen")) .build(); String response = conversation.call("Tell me about yourself."); System.out.println(response); ``` --- #### 3. **两者之间的差异** | 方面 | SpringAI | LangChain4J | |-----------------|---------------------------------------|---------------------------------------| | 主要用途 | 更适合传统 ML/NLP 应用场景 | 特别擅长于生成式人工智能应用 | | 技术栈 | Java | Java/Kotlin | | 模型集成 | 自定义较多 | 已内置对主流 LLM 的良好支持 | | 学习曲线 | 较陡峭 | 中等 | 值得注意的是,在实际项目选型过程中还需要考虑团队技术背景、现有基础设施等因素的影响[^3]。 --- ### 结论 对于希望快速上手并充分利用当前最先进 NLP 技术的企业来说,LangChain4J 可能会是一个更好的选择因为它不仅拥有活跃的社区还有丰富的文档资料可供参考。而如果目标群体主要是熟悉整个 spring ecosystem 的工程师们,则可能会倾向于采用 springai 来保持一致性减少迁移成本等问题的发生几率。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder_Boy_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值