文章说明:

本文旨在快速介绍如何通过Spring AI让Java项目接入通义千问国产大模型,从而为你的业务增添AI能力。我们将引导您完成从环境准备到代码实现的全过程。

本例子使用spring ai alibaba和Qwen通义千问API完成,您可以先按照示例跑通后替换为您自己的具体实现。

值得一提的是,QWen目前提供100万免费Token额度支持初期开发,并且作为一个开源模型,开发者可以自行部署以实现长期免费使用

Spring AI 介绍:为Java开发者提供统一的AI应用框架

在过去,Java 缺乏一个统一且强大的 AI 应用框架,这使得开发者在集成和切换不同的 AI 服务时面临诸多不便。

Spring AI 的出现弥补了这一空白,它为 Java 开发者提供了一个设计优良的框架来构建 AI 应用程序。Spring AI 核心优势之一在于其通过定义一套标准化接口,实现了对不同 AI 提供商(如 OpenAI, Azure, 阿里云等)的支持,这意味着用户只需编写一次代码,通过简单修改配置即可无缝迁移至其他 AI 服务。

此外,该框架完美地融入了现有的 Spring 生态系统,并保持了与 Java 面向对象编程范式的高度兼容性,允许开发人员继续利用熟悉的 POJOs 来构建复杂的 AI 功能。这种设计不仅简化了开发流程,还极大减少了维护成本和技术债务。

Spring AI Alibaba介绍

Spring AI Alibaba 是一个基于 Spring AI 框架的实现,专为接入阿里云通义千问系列+百炼云产品的大模型而设计的阿里最佳实践。

它支持包括对话、文生图、文生语音等多种生成式AI能力,并提供了诸如OutputParser、Prompt Template等实用工具,方便开发者快速构建AI应用。

其核心优势在于标准化了不同AI提供者的接口实现,使得一次编码即可通过更改配置来切换不同的AI服务供应商。

特别地,Spring AI Alibaba 对国产大模型如阿里云通义千问支持尤为突出,让开发者能够轻松利用这些强大的本土化资源进行创新和开发。

阿里通义千问大模型介绍

通义Qwen不仅在开放程度上领先,提供了全尺寸的多模态大模型开源版本,而且在多项重要的基准测试中表现出色。

在MMLU、TheoremQA、GPQA等评测指标下,通义Qwen超过了Llama 3 70B,并且在Hugging Face的Open LLM Leaderboard上占据了首位。这表明通义Qwen在理解和生成复杂内容方面具有强大的能力。

此外,结合RAG(检索增强生成)技术后,通义Qwen展现了优秀的指令遵从性及其他关键性能指标,能够满足广泛的应用需求。

对于开发者而言,阿里云为新用户提供了100w以上的的免费token试用额度,这降低了初次尝试的成本。同时,无论是通过API调用来访问服务还是自行部署运行该模型,其成本效益都很高。

特别是对于希望利用先进的语言模型但又受限于预算的情况,通义Qwen提供了一个极具吸引力的选择。因此,在考虑使用大模型进行开发时,强烈建议评估并考虑采用通义Qwen及其相关的多模态扩展如Qwen vl。

基于Spring AI Alibaba构建聊天应用的详细step by step 

为了实现基于Spring AI Alibaba生成一个具有Prompt和流式返回的聊天API,我们将根据已有的知识来详细说明每一个步骤。

这里我们假设你已经有一个符合要求的JDK环境(版本17或以上)以及对应的Spring Boot项目设置(至少3.3.x版本)。以下是具体的实施步骤:

一、配置阿里云通义千问API KEY

首先,你需要在阿里云上申请并获取通义千按的API KEY。这一步骤包括登录阿里云账号、开通“百炼大模型推理”服务等操作。完成之后,请记录下生成的API KEY。

export AI_DASHSCOPE_API_KEY=你的API-KEY

接着,在application.properties文件中添加如下配置,以确保Spring Boot应用能够读取到该密钥值:

spring.ai.dashscope.api-key=${AI_DASHSCOPE_API_KEY}

二、添加仓库及依赖

由于Spring AI Alibaba的相关库尚未发布至Maven中心仓库,因此我们需要额外指定一些仓库地址,并引入必要的依赖项。

1. 修改pom.xml以包含特定仓库:

<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>

2. 在同一文件内添加所需依赖:

<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>

三、创建控制器处理聊天请求

接下来定义一个RESTful API接口,允许用户发送消息并通过Flux对象接收实时响应。

ChatController.java:

@RestController
@RequestMapping("/ai")
@CrossOrigin(origins = "*")
public class ChatController {

    private final ChatClient chatClient;

    @Autowired
    public ChatController(ChatClient.Builder builder) {
        this.chatClient = builder.build();
    }

    @GetMapping("/chatStream")
    public Flux<String> chatSteam(@RequestParam String input, HttpServletResponse response) {
        // 设置响应字符编码为UTF-8防止乱码
        response.setCharacterEncoding("UTF-8");

        return chatClient.prompt().user(input).stream().content();
    }
}

上述代码展示了如何构造一个简单的聊天接口,其中使用了ChatClient类提供的方法来发起与AI模型的对话请求,并通过Flux对象返回数据流。

按照以上步骤操作后,你应该能够在本地环境中成功搭建起一个基于Spring AI Alibaba框架支持下的简易聊天应用程序。注意,实际部署时可能还需要考虑安全性等问题,比如对敏感信息进行加密处理等。

Spring AI的其他核心核心功能

模型(Model)

一句话说明:模型是指通过阿里云通义大模型提供的语言理解和生成能力,支持文本生成、对话等任务。
输入输出举例:输入为一段用户的问题文本,输出是基于问题的详细回答或相关建议。

提示(Prompt)

一句话说明:提示是与AI交互时发送给模型的一段文本,用于引导模型产生特定类型的响应。
输入输出举例:输入是一句提问“请给我讲一个关于猫的故事”,输出则是关于猫的一个小故事。

提示词模板(Prompt Template)

一句话说明:提示词模板是一种结构化的提示方式,允许开发者预定义模板,并在运行时替换具体的参数值。
输入输出举例:模板可能是“告诉我一个{adjective}笑话关于{topic}”,其中{adjective}和{topic}会在实际使用时被替换成如“搞笑”、“程序员”。

嵌入(Embedding)

一句话说明:嵌入是将文本转换成向量表示的过程,使得计算机能够处理并理解自然语言。
输入输出举例:输入为任意文本句子,输出是一个固定长度的数值向量,该向量捕捉了输入文本的核心含义。

结构化输出(Structured Output)

一句话说明:结构化输出指利用大模型的能力将非结构化数据(如自由格式的文本)转化为结构化形式(如JSON对象)。
输入输出举例:输入可以是对某个演员的描述性信息,输出则为包含演员姓名及代表作列表的JSON对象。

检索增强生成(RAG)

一句话说明:检索增强生成结合了检索技术和生成模型,从私有知识库中提取相关信息来辅助生成更准确的回答。
输入输出举例:输入是用户查询某份财务报告中的特定数字,输出是直接从文档中提取的确切答案以及上下文背景信息。

函数调用(Function Calling)

一句话说明:函数调用允许AI根据需要调用外部工具或函数,以完成更加复杂的任务。
输入输出举例:当用户请求检查一条消息的状态时,输入为消息ID,输出可能包括该消息是否成功发送以及当前状态等信息。

向量存储

一句话说明:向量存储提供了管理和查询文本向量的服务,用于快速检索相似内容。
输入输出举例:输入为待搜索文本及其对应的向量,输出是从数据库中找到的最相似的一系列文档或片段。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐