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 分为四个类型分别是
- SYSTEM:指导大模型的行为和回应风格,为大模型如何解释和回复输入内容设置参数或规则。这类似于在发起对话之前向人工智能提供指令
- USER:即用户发送的消息。例如问大模型:今天天气怎么样
- ASSISTANT:大模型用户输入的回应。这不仅仅是一个答案或反应,对于维持对话的流畅性至关重要。通过跟踪大模型之前的回应(其 “助手角色” 消息),系统确保交互具有连贯性和上下文相关性。助手消息也可能包含函数工具调用请求信息。这就像是人工智能中的一项特殊功能,在需要执行特定功能(如计算、获取数据或其他不仅仅是交谈的任务)时使用
- TOOL:方法调用,受限于训练的语料,大模型的知识只能截止到训练结束的那一刻。如果不借助外部的同居大模型甚至不知道今天是几号,TOOL则是用于告知大模型有哪些工具可以被调用
由于这些知识和后续的内容关系比较大,这里暂时不展开讲解,再后面用到的时候会详细讲解。
三、小结
至此我们对SpringAI有了一个初步的了解,后续的文章会深入SpringAI的各个组件,例如Advisors、Structured Output Converter、Embedding、RAG等等。今天只是一个小小的Demo,希望对你有所帮助。