有详细可执行的例子,你可以参考

Spring AI:简化Java大模型调用的标准化框架
在当前Java调用大模型时,缺乏一个成熟且易于使用的AI应用框架。Spring作为老牌的Java应用框架提供商,提出了Spring AI来解决这个问题。Spring AI借鉴了langchain的核心理念,并结合了Java面向对象编程的特点,提供了一个标准化、模块化的解决方案。通过统一接口和随时可替换实现的方式,开发者可以轻松切换不同的AI提供者(如OpenAI、阿里云等),并享受专门团队的支持与维护。本次样例将以Spring AI Alibaba接入通义大模型为例进行说明,但开发者也可以根据需求更换为其他Java大模型实现。这种方式不仅简化了开发流程,还提高了代码复用性和灵活性。
Spring AI Alibaba简介及其AI服务优化
Spring AI Alibaba 是 Spring AI 的一个具体实现,它将 Spring 生态系统的设计原则应用到了AI领域,并特别针对阿里云的AI服务进行了优化。与 Spring Cloud Alibaba 类似,Spring AI Alibaba 整合了阿里的最佳实践,为开发者提供了一套简洁且强大的工具来快速构建和部署AI应用程序。作为国内最好的Spring AI实现之一,Spring AI Alibaba 支持多种AI能力的集成,包括但不限于模型调用、Prompt模板定义、检索增强生成(RAG)、文生图以及图像识别等。通过本文我们将重点介绍如何利用Prompt模板和模型调用来接入Spring AI Alibaba,展示其在简化AI功能开发过程中的强大作用。
通义千问Qwen简介:
通义千问Qwen是阿里巴巴云开发的大型语言模型,在MMLU、TheoremQA、GPQA等基准测评中表现出色,超越了Llama 3 70B。该模型在Hugging Face开源大模型排行榜Open LLM Leaderboard上位居榜首,展示了其卓越的能力和性能。

基于SpringBoot整合Spring AI Alibaba实现对话模型与流式返回接口
基于SpringBoot集成Spring AI Alibaba以完成一个简单的对话模型,并构建支持prompt的流返回接口项目,需要按以下步骤操作:
1. 确认环境要求
- 确保你的JDK版本在jdk17(含)以上。
- 确保你的Spring Boot版本在3.3.x以上。
2. 获取通义千问API Key
访问阿里云百炼页面,登录您的阿里云账号,选择开通“百炼大模型推理”服务。成功开通后,创建一个新的API Key并妥善保存,这个key将用于配置与阿里云AI平台的通信。
3. 配置API Key
设置环境变量或直接在application.properties文件中添加如下行来配置API Key:
spring.ai.dashscope.api-key=${YOUR_API_KEY}请将${YOUR_API_KEY}替换为你从阿里云获得的实际API Key值。
4. 添加Maven仓库和依赖
由于Spring AI Alibaba尚未提交至Maven中心仓库,你需要添加Spring官方提供的仓库到你的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>接着,在同一pom.xml文件里加入spring-ai-alibaba-starter依赖以及Spring Boot父依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.4</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId></groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
<version>1.0.0-M2</version>
</dependency>
<!-- 其他依赖 -->
</dependencies>5. 创建Controller及注入ChatClient
定义一个REST控制器ChatController,通过构造器注入ChatClient,并且实现一个GET方法处理请求,该方法接受用户输入并通过Flux返回响应流。同时启用跨域资源共享(CORS)支持。
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import .ChatClient;
@RestController
@RequestMapping("/ai")
@CrossOrigin(origins = "*")
public class ChatController {
private final ChatClient chatClient;
public ChatController(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
@GetMapping("/steamChat")
public Flux<String> steamChat(@RequestParam String input) {
return chatClient.prompt().user(input).stream().content();
}
}这里我们使用了chatClient.prompt().user(input).stream().content()来发送消息给AI模型,并以流的形式获取回复。
解释
上述代码片段首先通过ChatClient.Builder创建了一个ChatClient实例。然后,对于每一个进入/ai/steamChat路径下的GET请求,控制器会接收参数input作为用户输入,通过调用chatClient.prompt().user(input).stream().content()发送给AI模型处理,并立即开始返回模型生成的内容作为数据流。这种方式非常适合于实时交互场景,如聊天机器人应用。此外,通过注解@CrossOrigin(origins = "*")开启了CORS支持,使得此API可以从任何源发起请求,这对于开发阶段尤其有用。
构建前端项目
在构建一个基于React的支持流输出的前端项目时,我们首先需要创建一个新的React应用,并安装所需的依赖。接下来,我们将通过编写一系列的组件来实现一个简单的聊天应用程序,该程序能够处理从后端返回的数据流(假设后端接口URL为 http://localhost:8080/ai/steamChat?input=...)。下面将按照步骤详细介绍如何完成这个项目。
构建项目并填写代码
创建React应用及安装依赖
开始之前,请确保已经安装了Node.js环境。然后使用以下命令创建一个新的React应用并进入项目目录:
npx create-react-app frontend
cd frontend
npm install这会初始化一个新的React项目,同时下载所有必要的包。
编辑HTML文件
编辑public/index.html以设置基本的HTML结构,这里保持默认配置即可,但请确认标题和元信息是否符合需求。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Chat App</title>
</head>
<body>
<div id="root"></div>
</body>
</html>修改入口JS文件
打开src/index.js,这是React应用的入口点。此处不需要做任何修改,它负责渲染<App />到页面上。
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('root')
);创建主应用组件
接下来,在src/App.js中定义一个简单的布局,仅包含我们的ChatComponent。
import React from 'react';
import ChatComponent from './components/ChatComponent';
function App() {
return (
<div className="App">
<ChatComponent />
</div>
);
}
export default App;实现聊天组件
最核心的部分在于src/components/ChatComponent.js,在这里我们将实现用户输入消息、发送请求以及接收流式响应的功能。
import React, { useState } from 'react';
function ChatComponent() {
const [input, setInput] = useState('');
const [messages, setMessages] = useState('');
const handleInputChange = (event) => {
setInput(event.target.value);
};
const handleSendMessage = async () => {
try {
const response = await fetch(`http://localhost:8080/ai/steamChat?input=${input}`);
const reader = response.body.getReader();
const decoder = new TextDecoder('utf-8');
let done = false;
while (!done) {
const { value, done: readerDone } = await reader.read();
done = readerDone;
const chunk = decoder.decode(value, { stream: true });
setMessages((preMessages) => preMessages + chunk);
}
// 添加分隔符以便区分不同的对话回合
setMessages((preMessages) => preMessages + '\n\n=============================\n\n');
} catch (error) {
console.error('Failed to fetch', error);
}
};
const handleClearMessages = () => {
setMessages('');
};
return (
<div>
<input
type="text"
value={input}
onChange={handleInputChange}
placeholder="Enter your message"
/>
<button onClick={handleSendMessage}>Send</button>
<button onClick={handleClearMessages}>Clear</button>
<div>
<h3>Messages:</h3>
<pre>{messages}</pre>
</div>
</div>
);
}
export default ChatComponent;以上代码展示了如何创建一个简单的表单让用户输入消息,并通过调用后端API来获取数据流。每次接收到新数据时,都会更新状态变量messages,从而显示在界面上。
运行项目
完成上述配置与编码后,你可以通过执行以下命令启动开发服务器查看效果:
npm start这样就完成了一个支持流式输出的基本React前端项目的搭建。请注意实际部署时可能还需要考虑跨域资源共享(CORS)等网络问题,确保前后端正确通信。
















