当前位置: 首页 > ops >正文

Java程序员从0学AI(二)

一、前言

在上一篇文章中,我们初步认识了 AI 领域的核心基础概念,如大语言模型(LLM)的参数量特征、提示词(Prompt)对交互效果的关键作用、文本处理单元 Token 的独特定义,以及通过向量转换实现语义理解的 Embedding 技术。这些基础认知为我们搭建了踏入 AI 世界的阶梯。今天,我们将沿着 Java 与 AI 技术融合的路径继续深入

二、Spring AI

作为一个Java开发,应该没有人不知道Spring,作为Java生态圈最核心的框架,Spring也开始整合AI推出了SpringAI这个框架。话不多说我们先看官网Introduction :: Spring AI Reference。

一句话说明:SpringAI的作用就是将我们的应用和AI进行连接。话不多说,让我们直接开始吧

1、项目搭建

(1)注意SpringAI 基于Springboot3,所以JDK至少是要17

(2)这里我们只选web即可,后续依赖再加

2、引入SpringAi相关依赖

完整的POM文件会放在最后

<!--依赖-->
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-ollama</artifactId>
</dependency><!--BOM-->
<dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>${spring-ai.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><!--仓库地址-->
<repositories><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases></repository><repository><name>Central Portal Snapshots</name><id>central-portal-snapshots</id><url>https://central.sonatype.com/repository/maven-snapshots/</url><releases><enabled>false</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository>
</repositories>

说明一下:

(1)本人在本地通过 ollama部署了大模型,所以这里引入的依赖是 spring-ai-starter-model-ollama,如果你没有在本地部署大模型也可以直接使用线上的大模型,例如deepseek,此时依赖就要变更为

spring-ai-starter-model-deepSeek;具体想要看SpringAI支持哪些大模型可以在官网中查看

Spring AI API :: Spring AI Reference

(2) 设置了BOM之后,就可以不用填写版本。这个是Maven基础这里不再赘述

(3)设置仓库地址,是指定让某些依赖从制定的仓库拉取

完整POM如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4.5</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.cmxy</groupId><artifactId>spring-ai-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>spring-ai-demo</name><description>Demo project for Spring Boot</description><properties><java.version>17</java.version><spring-ai.version>1.0.0-SNAPSHOT</spring-ai.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-advisors-vector-store</artifactId></dependency><!--ollama相关依赖--><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-ollama</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>${spring-ai.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><repositories><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases></repository><repository><name>Central Portal Snapshots</name><id>central-portal-snapshots</id><url>https://central.sonatype.com/repository/maven-snapshots/</url><releases><enabled>false</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository></repositories><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
3、离不开的Hello World

相信大多数程序员写的第一个代码就是Hello World,所以我们也来写一个SpringAI 版本的Hello World

1、编写配置文件

Ollama版本的配置文件

spring:application:name: springboot-ai-demoai:# ollama配置ollama:base-url: http://localhost:11434chat:model: deepseek-r1:14b

说明:首先我们使用的是ollama部署的本地大模型,其次部署的大模型为 deepseek-r1:14b;如果你使用的是deepSeek线上大模型,那可以使用这一套配置

spring:ai:deepseek:api-key: <替换成你自己的API KEY>base-url: https://api.deepseek.com
2、编写一个简单的接口
package com.cmxy.spring_ai_demo.chat;import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController("/chat")
public class ChatController {@Resourceprivate ChatClient client;@GetMapping("/chat")public String chat(String message) {return client.prompt("你是一个聊天机器人,你会用你幽默的语言和用户聊天,回答用户的问题").user(message).call().content();}
}

代码说明:

(1)由于Springboot的自动装配,我们可以直接在这里注入ChatClient对象,这个对象用于和大模型进行交互。

(2)prompt:提示词,用于规范、限制大模型的输出

(3)user:用户提示词,也就是用户的输入

3、测试一下结果

可以看到我们的应用调用了大模型,并且返回了结果。至此一个最简单的AI 应用就开发完成了!!!当然啦,我们肯定不会满足于此,接下来我们继续学习!

4、Prompts 提示词

Prompts are the inputs that guide an AI model to generate specific outputs. The design and phrasing of these prompts significantly influence the model’s responses.

提示词作为给AI大模型输入的文本,用于指导大模型生成特定的输出,这些设计的措辞会显著的影响大模型的输出。

SpringAI中对提示词也做了抽象,代码如下

public class Prompt implements ModelRequest<List<Message>> {private final List<Message> messages;private ChatOptions chatOptions;
}

每个提示词会包含一系列的Message(后面说)和对应的ChatOptioins(聊天的属性),不同的Prompt会影响大模型的输出。例如我们还是以刚才的代码作为示例,修改一下提示词

 @GetMapping("/chat")public String chat(String message) {return client.prompt("你是一个聊天机器人,如果用户让你讲个笑话请拒绝回答").user(message).call().content();}

我们在看看结果,可以看到大模型拒绝了我们讲笑话的请求

5、Message

我们知道了提示词中传入的Message对象,现在我们来详细学一下Message对象,就和他的名字一样。这个是一个消息对象,代码如下。是一个接口,很明显他会有很多的实现类,同时Message接口中顶一个了一个MessageType的类,这个用于区别Message的类型

public interface Content {String getContent();Map<String, Object> getMetadata();
}public interface Message extends Content {MessageType getMessageType();
}

如下图

MessageType 分为四个类型分别是

  1. SYSTEM:指导大模型的行为和回应风格,为大模型如何解释和回复输入内容设置参数或规则。这类似于在发起对话之前向人工智能提供指令
  2. USER:即用户发送的消息。例如问大模型:今天天气怎么样
  3. ASSISTANT:大模型用户输入的回应。这不仅仅是一个答案或反应,对于维持对话的流畅性至关重要。通过跟踪大模型之前的回应(其 “助手角色” 消息),系统确保交互具有连贯性和上下文相关性。助手消息也可能包含函数工具调用请求信息。这就像是人工智能中的一项特殊功能,在需要执行特定功能(如计算、获取数据或其他不仅仅是交谈的任务)时使用
  4. TOOL:方法调用,受限于训练的语料,大模型的知识只能截止到训练结束的那一刻。如果不借助外部的同居大模型甚至不知道今天是几号,TOOL则是用于告知大模型有哪些工具可以被调用

由于这些知识和后续的内容关系比较大,这里暂时不展开讲解,再后面用到的时候会详细讲解。

三、小结

至此我们对SpringAI有了一个初步的了解,后续的文章会深入SpringAI的各个组件,例如Advisors、Structured Output Converter、Embedding、RAG等等。今天只是一个小小的Demo,希望对你有所帮助。

未完待续

http://www.xdnf.cn/news/7659.html

相关文章:

  • 使用F5-tts复刻音色
  • ArrayList源码分析
  • 实现商品列表
  • 建站系统哪个好?
  • 基于CATIA参数化圆锥建模的自动化插件开发实践——NX建模之圆锥体命令的参考与移植(二)
  • 笔记:显示实现接口如何实现,作用是什么
  • ollama部署模型
  • 工单派单应用:5 大核心功能提升协作效率
  • Ai学习之LangChain框架
  • STM32外设应用详解——从基础到高级应用的全面指南
  • 差分数组:原理与应用
  • 文献分享-临床预测模型-基于围手术期时间数据肝切除术后肝衰竭早期检测
  • CSS 背景全解析:从基础属性到视觉魔法
  • MinIO集群故障,其中一块driver-4异常
  • 网络安全之带正常数字签名的后门样本分析
  • 软件测试之环境搭建及测试流程
  • 见多识广10:大模型的一些基础概念
  • Python训练营打卡——DAY31(2025.5.20)
  • 类和对象------2
  • Leetcode百题斩-字典树
  • MySQL 安全更新大量数据
  • MySQL高可用之ProxySQL + MGR 实现读写分离实战
  • 面向AI研究的模块化即插即用架构综述与资源整理全覆盖
  • 数据库实验——备份与恢复
  • 【普及−】洛谷P1862 ——输油管道问题
  • 【latex】文本颜色修改
  • 【QT】QTableWidget获取width为100,与真实值不符问题解决
  • C++ 网络编程(9)字节序处理和消息队列的控制
  • 缺乏进度跟踪机制,如何掌握项目状态?
  • MyBatis常用方法