夜雨聆风学习资料网

ARTICLE · 1011666

我用Java写了个AI助手,Spring Boot + DeepLearning4j实战

我用Java写了个AI助手,Spring Boot + DeepLearning4j实战

为什么选择Spring Boot + DL4J?

  • Spring Boot:作为企业级Java开发的事实标准,它提供了现成的Web、REST API和微服务架构,可以把AI能力快速服务化-9。

  • Deeplearning4j:它是专为JVM设计的原生深度学习框架,能完美融入现有Java技术栈(如Maven、Spring)。相比Python方案,在金融风控、智能制造等对稳定性和事务一致性要求极高的企业场景中,Java实现的AI系统具有更高的可靠性-6-9。

项目实战:手写数字识别AI助手

我们以经典的MNIST手写数字识别为切入点,把它做成一个可交互的Spring Boot Web应用-1-7。

第一步:搭建环境与准备模型

在pom.xml中引入核心依赖,这是打通Spring Boot和AI能力的基石-9:

<!-- DL4J 神经网络核心 --><dependency>    <groupId>org.deeplearning4j</groupId>    <artifactId>deeplearning4j-core</artifactId>    <version>1.0.0-beta7</version></dependency><!-- ND4J 是DL4J的高性能数值计算引擎 --><dependency>    <groupId>org.nd4j</groupId>    <artifactId>nd4j-native-platform</artifactId>    <version>1.0.0-beta7</version></dependency><!-- Spring Boot Web 依赖,用于提供API --><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId></dependency>

我们可以直接利用DL4J提供的MNIST数据集迭代器(MnistDataSetIterator)来加载数据,它内部已经处理好了数据的下载和标准化,非常方便-1-3-9。

第二步:构建并训练神经网络

我们用DL4J的API来构建一个简单的神经网络。这个网络包含一个输入层(将28x28像素展平为784个特征)、一个包含1000个神经元的隐藏层,以及一个输出10个数字概率的输出层-1-3。

这里的关键代码体现了DL4J设计的“Java风格”:

MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()    .seed(123) // 随机种子,保证可重复性    .updater(new Nesterovs(0.006, 0.9)) // 使用Nesterovs优化器    .l2(1e-4) // L2正则化,防止过拟合    .list()    .layer(0, new DenseLayer.Builder()            .nIn(784) // 输入特征数:28*28            .nOut(1000) // 隐藏层神经元数            .activation(Activation.RELU) // ReLU激活函数            .build())    .layer(1, new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD)            .nIn(1000)            .nOut(10) // 输出10个类别(数字0-9)            .activation(Activation.SOFTMAX) // Softmax输出概率            .build())    .build();MultiLayerNetwork model = new MultiLayerNetwork(conf);model.init();model.setListeners(new ScoreIterationListener(100)); // 监听训练过程// 开始训练,迭代1次(实际项目可增加epoch)model.fit(mnistTrain, 1);

这段代码看着是不是很熟悉?就像在拼装一个Spring Bean,每个.builder()和.build()都清晰定义了网络的每一层。训练完成后,使用ModelSerializer.writeModel(model, "ocr-model.zip", true)就可以将模型持久化,方便后续直接加载使用-3。

第三步:集成到Spring Boot中提供服务

这是将AI能力产品化的关键一步。我们将训练好的模型加载到Spring Boot服务中,并封装成REST API-1-8。

首先,创建一个Service来加载模型并提供预测方法:

@Servicepublic class OCRService {    private MultiLayerNetwork model;    @PostConstruct    public void init() throws IOException {        // 应用启动时自动加载训练好的模型        this.model = ModelSerializer.restoreMultiLayerNetwork("ocr-model.zip");    }    public int predict(INDArray input) {        INDArray output = model.output(input);        return Nd4j.argMax(output, 1).getInt(0); // 返回概率最高的数字    }}

然后,编写一个Controller来处理HTTP请求:

@RestController@RequestMapping("/api/ocr")public class OCRController {    @Autowired    private OCRService ocrService;    @PostMapping("/predict")    public ResponseEntity<Integer> predict(@RequestBody ImageRequest request) {        // 1. 将前端传来的图片数据(如Base64)处理成INDArray        INDArray input = preprocess(request.getImage());        // 2. 调用AI模型进行预测        int result = ocrService.predict(input);        // 3. 返回识别结果        return ResponseEntity.ok(result);    }}

这样,一个能识别手写数字的AI助手后端就搭建好了。前端(如一个简单的Vue或Thymeleaf页面)只需调用/api/ocr/predict接口并传入图片数据,就能立刻获得AI的识别结果-1。

第四步:用Spring AI让模型更“智能”

如果要更进一步,还可以集成Spring AI框架。它提供了更高层的抽象,能简化与各类大模型(如OpenAI、Ollama)的集成,实现RAG检索增强生成等高级功能-2-6。

比如,我们可以让Spring AI将OCR识别的数字(784)和用户的历史行为数据关联起来,再调用大模型生成一段个性化的营销文案推送出去,让这个助手在电商用户复购预测等场景下发挥更大价值-10。

相关学习资料