一文读懂:SpringAI - Java 开发的AI智能新利器
使用Spring AI集成国产大模型 到 Java项目指南
本文旨在快速介绍如何通过Spring AI让Java项目接入大模型,从而为你的业务增添AI能力。我们将引导您完成从环境准备到代码实现的全过程。通过代码展示如何创建一个简单的聊天应用,提供智能对话支持。
本例使用spring ai + alibaba QWen千问 api 完成,你可以跑通以后换自己的实现。
QWen 目前 有100万免费Token额度,可以快速实现需求。同时,因为qwen 也是一个开源的模型,我们可以自己搭建模型来实现免费使用。
Spring AI 介绍:简化AI应用开发的Java框架
在过去,Java 缺乏一个优秀的AI应用框架,这使得开发人员在构建AI应用程序时面临着较大的挑战。Spring AI 是一个专为AI工程设计的应用框架。它将Spring生态系统的设计原则,例如可移植性和模块化设计,引入到AI领域。通过这种方式,Spring AI 使得使用POJOs作为构建块成为可能。其核心优势在于提供了一套统一的接口,这意味着开发者只需编写一次代码,并通过更改配置即可轻松切换不同的AI服务提供商。此外,由于该框架与现有的Spring生态和Java面向对象编程完美兼容,因此极大减少了程序员在对接不同AI供应商时查阅文档的工作量。
Spring AI 的核心功能介绍:
能力名字:模型 Model
一句话说明:Spring AI提供了一种统一的接口来接入各种AI模型,使得开发者能够轻松地在不同AI供应商之间切换。
输入:配置信息(如API密钥、模型名称等)和请求数据(例如对话内容、图片生成描述等)。
输出:根据所选模型的能力,输出可以是文本、图像、语音等形式。
举例:使用阿里云通义大模型进行文本生成或文生图。
能力名字:提示 Prompt
一句话说明:Prompt是与AI模型交互时传递给模型的信息,用来引导模型生成预期的结果。
输入:一段文本或一组参数。
输出:基于Prompt的响应,形式取决于使用的模型类型。
举例:向聊天机器人发送一个问题作为Prompt,以获得相应的答案。
能力名字:提示词模板 Prompt Template
一句话说明:通过定义可复用的模板,简化了Prompt的创建过程,支持动态填充内容。
输入:模板字符串及需要替换的具体值。
输出:格式化后的Prompt文本。
举例:利用包含变量的模板来构造一个查询用户信息的Prompt,如"请告诉我用户{id}的信息"。
能力名字:嵌入 Embedding
一句话说明:将非结构化的文本转换为数值向量表示,便于机器学习模型理解和处理。
输入:原始文本。
输出:对应的向量表示。
举例:将一段描述转换成向量后,用于相似度计算或其他下游任务。
能力名字:结构化输出 Structured Output
一句话说明:允许从AI模型中直接获取结构化数据,比如Java Bean对象,从而简化数据处理流程。
输入:指定的数据结构定义。
输出:符合定义的结构化数据实例。
举例:让模型返回一个包含演员及其电影列表的对象。
能力名字:检索增强生成 RAG
一句话说明:结合检索系统与生成模型,利用私有知识库增强回答质量。
输入:查询请求及相关上下文信息。
输出:基于检索结果生成的回答。
举例:询问特定财务报告中的数据,并从预构建的知识库中提取相关信息作答。
能力名字:智能体 Agent
一句话说明:代表一种能够执行复杂任务并通过调用外部工具扩展其功能的实体。
输入:任务描述或指令。
输出:完成任务所需的操作序列及其结果。
举例:设计一个智能客服助手,它能自动查找订单状态并回复客户。
能力名字:函数调用 Function Calling
一句话说明:允许大型语言模型根据需要调用开发者定义的功能,如数学运算、数据库查询等。
输入:函数签名以及必要的参数。
输出:函数执行的结果。
举例:当遇到涉及日期计算的问题时,让模型调用日历相关的函数来得出正确答案。
能力名字:向量存储
一句话说明:提供高效管理和查询文档向量的服务,支持多种文件类型的导入。
输入:待存储的文档集合。
输出:经过处理后的向量数据库索引。
举例:上传一系列PDF文件至向量存储服务,以便后续快速检索相关内容。
Spring AI Alibaba:简化阿里云AI产品接入,助力快速开发智能应用
Spring AI Alibaba 是一个针对Spring AI的实现,它基于Spring AI的API完成阿里云百炼系列云产品的大模型接入。
通过Spring AI Alibaba,开发者能够轻松开发基于阿里云通义提供的聊天、图片或语音生成AI应用。其核心优势在于提供了包括对话、文生图、文生语音、模型输出解析OutputParser、使用Prompt Template以及让AI模型接入外部数据等实用能力。
这些功能极大简化了AI应用的开发流程,减少了程序员在不同AI提供者间对接接口的工作量。
通义千问介绍
通义千问是由阿里集团推出的开源大模型服务,支持全尺寸、多模态的大规模模型。在中文开源模型领域,通义千问表现出色,在国内的思南大模型竞技场排名中名列前茅。
通义千问的核心优势在于其能力排名靠前,QWen在MMLU、TheoremQA、GPQA等客观评测指标上超越了Llama 3 70B。此外,通义千问具有良好的可访问性和合规性,在API调用时具备安全保护措施,降低了恶意攻击的风险。同时,它是最开放的模型之一,提供了全尺寸的多模态大模型开源版本,并且有100万免费token可供使用,调用API的成本较低,甚至可以免费自行构建。
对于大模型的能力评估,主要通过基准测试和人类评估两种方式进行。基准测试包括GSM-8K(数学问题解决)、MMLU(广泛学科知识测试)、TheoremQA(定理证明与逻辑推理)以及GPQA(常识理解)。而人类评估则采用竞技场模式,即由人根据偏好选择更优答案。结合这两种方法可以获得全面的大模型性能评价。
可以参考Hugging Face提供的基准测试 :
https://huggingface.co/spaces/open-llm-leaderboard/open_llm_leaderboard
国外竞技场排行榜 :
https://lmarena.ai
或者国内的思南平台:
CompassArena https://arena.opencompass.org.cn/ 进行了解。
基于Spring AI Alibaba构建聊天API的全流程指南,涵盖环境搭建、依赖配置及代码实现
基于spring ai alibaba完成一个有Prompt和流flux返回的聊天API实现,允许用户输入信息然后流式返回的过程包括环境准备、依赖配置、代码编写等几个步骤。下面是详细的步骤说明:
1. 环境准备
- JDK版本要求:确保你的开发环境使用的是JDK 17(含)以上版本。
- Spring Boot版本要求:项目需要基于Spring Boot 3.3.x及以上版本构建。
- 申请阿里云API Key:
- 访问阿里云百炼页面并登录您的阿里云账号。
- 选择开通“百炼大模型推理”服务,并等待开通成功的通知短信。
- 开通成功后再次访问该页面,点击右上角个人图标 -> API-KEY -> 创建新的API-KEY来生成一个新的Key。请妥善保存此Key。
2. 配置环境变量
将刚才申请到的API Key设置为环境变量,以便于在应用程序中引用:
export AI_DASHSCOPE_API_KEY=YOUR_API_KEY_HERE
同时,在application.properties文件中添加如下配置项以应用该API Key:
spring.ai.dashscope.api-key=${AI_DASHSCOPE_API_KEY}
3. 添加Maven仓库
由于spring-ai-alibaba-starter可能还未正式发布至Maven中央仓库,请在项目的pom.xml文件中加入Spring官方提供的临时仓库地址:
<repositories>
<repository>
<id>sonatype-snapshots</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
4. 添加项目依赖
接下来,在pom.xml中添加spring-ai-alibaba-starter以及其他必要的依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.4</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
<version>1.0.0-M3.1</version>
</dependency>
<!-- 其他依赖 -->
</dependencies>
5. 编写Controller
创建一个REST控制器类,注入ChatClient实例,并定义处理请求的方法。这里提供了一个简单的例子,展示了如何接受用户输入并通过流的方式异步响应:
@RestController
@RequestMapping("/ai")
@CrossOrigin(origins = "*")
public class ChatController {
private final ChatClient chatClient;
@Value("classpath:correct-and-expand.st")
Resource resource;
public ChatController(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
@GetMapping("/chat")
public String chat(String input) {
return this.chatClient.prompt().user(input).call().content();
}
@GetMapping(value = "/chatStream")
public Flux<String> chatSteam(@RequestParam String input, HttpServletResponse response) {
// 如果出现中文乱码问题,则需设置编码
response.setCharacterEncoding("UTF-8");
PromptTemplate promptTemplate = new PromptTemplate(resource);
Prompt prompt = promptTemplate.create(Map.of("input", input));
return chatClient.prompt(prompt).stream().content();
}
}
在这个示例中,我们定义了两个端点:
- /ai/chat 接收GET请求,直接返回一次性的回复。
- /ai/chatStream 同样接收GET请求,但通过Flux对象实现了数据流式的异步响应。
至此,您已经完成了基于Spring AI Alibaba集成通义千问模型,实现支持Prompt和流式返回聊天功能的所有必要配置及编码工作。上述过程涵盖了从基础环境搭建到实际业务逻辑实现的全流程,希望对您有所帮助。