在Java中,使用Spring AI Alibaba框架调用国产大模型通义千问,实现流式输出,是一种高效的方式。通过Spring AI Alibaba,开发者可以轻松地集成通义千问模型,并利用其流式处理能力,实时获取模型生成的文本。这种流式输出方式,使得模型能够持续不断地生成文本,直到达到指定的长度或满足特定的条件。通过这种方式,开发者可以更灵活地处理模型生成的文本,提高应用程序的响应速度和用户体验。
本例子使用spring ai alibaba + QWen千问api 完成,你可以跑通以后换自己的实现。
QWen 目前 有100万免费Token额度,可以快速实现需求。同时,因为qwen 也是个开源的模型,我们可以自己搭建模型来实现免费使用
Spring AI概述
在当前Java调用大模型时,缺乏优秀的AI应用框架是一个显著的问题。Spring作为老牌的Java应用框架厂商,提出了Spring AI以解决这一问题。它参考了langchain的核心理念,并结合了Java面向对象编程的优势,为开发者提供了统一且灵活的接口来与不同的大模型交互。这种设计使得用户能够轻松切换底层实现,同时享受到由专门团队维护的好处。本次样例将演示如何使用Spring AI Alibaba接入通义大模型,但请记住,一旦掌握了基本配置方法,您也可以方便地更换为自己所需的其他Java大模型实现。
Spring AI Alibaba功能概览及接入指南
Spring AI Alibaba 是基于 Spring AI 的实现,专门为阿里云的百炼大模型服务提供支持。作为国内最佳的 Spring AI 实现之一,它继承了 Spring 生态系统的可移植性和模块化设计原则,并整合了阿里巴巴在AI领域的最佳实践。Spring AI Alibaba 主要完成了对话、文生图、文生语音、模型输出解析(OutputParser)、Prompt模板等功能。通过使用 Spring AI Alibaba,开发者可以轻松接入阿里云通义提供的聊天、图片或语音生成等AI应用。Spring AI Alibaba 有很多不同的功能和能力,比如模型调用、Prompt模板、RAG、文生图以及文字识别等。本文将以 Prompt 模板和模型调用两个能力为例,展示如何接入 Spring AI Alibaba。
阿里巴巴云开发的通义千问Qwen:在多项基准测评中表现卓越的语言模型
通义千问Qwen是阿里巴巴云开发的预训练语言模型,在MMLU、TheoremQA、GPQA等基准测评中表现优异,超越了Llama 3 70B。它在Hugging Face开源大模型排行榜Open LLM Leaderboard上荣登榜首,展示了其卓越的能力。该模型在多个客观评测指标上表现出色,为用户提供了强大的自然语言处理能力。
使用SpringBoot整合Spring AI Alibaba
要基于Spring Boot集成Spring AI Alibaba并完成一个简单的对话模型,构建支持Prompt的流返回接口,我们需要遵循以下步骤。此过程将涉及配置环境、添加依赖、设置API密钥以及编写Controller代码等步骤。
1. 环境准备
-
确保你的JDK版本在17(含)以上。
-
确保你的Spring Boot版本在3.3.x以上。
2. 在阿里云申请通义千问的API Key
访问阿里云百炼页面,登录您的阿里云账号,选择开通“百炼大模型推理”服务。开通成功后,创建一个新的API Key,并记录下来以备后续使用。
3. 配置API Key
设置环境变量AI_DASHSCOPE_API_KEY
或直接在application.properties
中配置API Key:
spring.ai.dashscope.api-key=${AI_DASHSCOPE_API_KEY}
4. 添加Spring仓库及依赖
因为Spring AI Alibaba的M1版本尚未提交到Maven中央仓库,所以需要手动添加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>
然后,在项目中添加spring-ai-alibaba-starter
依赖项和其他必需的Spring Boot依赖项:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
<version>1.0.0-M2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
5. 创建Controller类
为了实现GET接口且支持CORS跨域请求,我们需要定义一个Controller类来处理聊天逻辑。这里我们将注入ChatClient
实例,并利用其prompt()
方法生成响应流。
@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(value = "/steamChat")
public Flux<String> steamChat(@RequestParam String input) {
PromptTemplate promptTemplate = new PromptTemplate(resource);
Prompt prompt = promptTemplate.create(Map.of("input", input));
return chatClient.prompt(prompt)
.stream().content();
}
}
这里的PromptTemplate
用于读取模板文件,并根据传入的参数动态生成实际的Prompt内容。
6. 运行与测试
确保所有配置无误后,启动Spring Boot应用。您现在可以通过如下URL访问新建的聊天接口:
http://localhost:8080/ai/steamChat?input=你好
这将会触发服务器端的聊天逻辑,并返回由通义千问生成的回答作为Flux数据流输出。
通过上述步骤,我们已经成功地基于Spring Boot集成了Spring AI Alibaba,并实现了基本的聊天功能。