一文读懂:SpringAI - Java 开发的AI智能新利器

createh52个月前 (01-14)技术教程33

使用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和流式返回聊天功能的所有必要配置及编码工作。上述过程涵盖了从基础环境搭建到实际业务逻辑实现的全流程,希望对您有所帮助。



相关文章

Spring框架全面详解|Spring快速入门指南

Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。 本课程将深入浅出讲解Spring的核心技术IoC、AOP,剖析框架...

Java Spring操作多种数据库,原来如此简单

在项目中我们经常会操作不同的数据库,原来Java Spring操作不同的数据库,如此简单;主要是引用不同数据库的驱动,你学会了,快动手试试吧。数据库连接部分代码:spring: applicati...

Java面试:应聘Java开发工程师的基本要求是什么?

根据技术水平不同,Java程序员可以分为初级、中级、高级、资深等。不同级别的Java程序员,企业的要求也是有区别。下面整理了初级Java程序员和中级Java程序员的应聘要求,供大家参考:(具体要求结合...