前言
在Java 开发领域的Spring 框架一直是主流选择,但是随着人工智能的飞速发展,ai已经是时代的主题。在2024年5月30日随着Spring AI 的发布更是为 Java 开发者打开了通往 AI 世界的大门。借助 Spring AI,开发者可以轻松地将复杂的 AI 功能集成到现有的应用程序中,而无需深入理解底层的 AI 算法和技术细节。
本篇就如何使用spring ai进行开发一个简易的聊天机器人的介绍。
技术栈
Spring Boot:用于快速构建和部署 RESTful API。
Spring AI Alibaba:Spring AI Alibaba 基于 Spring AI 构建,专门为国内开发者量身定制,特别适合国内开发者。
RESTful API:通过 HTTP 请求和响应与客户端进行交互
前端:react ,vite,chatui
环境资料准备
1.开通服务,享受免费额度
2.申请我们的api-key
我们可以使用阿里的百炼平台,有免费的使用额度
项目案例
后端
1.先创建springboot项目,注意jdk17起步,因为 Spring AI Alibaba 基于 Spring Boot 3.x 开发,而springboot3要求jdk最低版本17。
选择web和lombok依赖后创建
2.导入依赖
在项目中添加 spring-ai-alibaba-starter
依赖
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
<version>1.0.0-M3.1</version>
</dependency>
由于 spring-ai 相关依赖包还没有发布到中央仓库,需要配置额外镜像源
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
在pom.xml里面配置放在和build标签同级
最后点击编译一下,把依赖下载下来
3.编写restfulapi接口,新建一个controller类,使用以下代码
@RestController
@RequestMapping("/ai")
@CrossOrigin(origins = "*") // 允许所有来源跨域访问
public class ChatController {
private final ChatClient chatClient;
public ChatController(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
@PostMapping("/chat")
public String chat(@RequestBody AskInfo askInfo) {
return this.chatClient.prompt()
.user(askInfo.getQuery())
.call()
.content();
}
}
配置上第一步骤得到的api-key
spring.ai.dashscope.api-key=sk-7b4e30c2a85xxxx
前端
import Chat, { Bubble, useMessages, MessageProps } from "@chatui/core";
import axios from "axios";
const initialMessages = [
{
type: "text",
content: { text: "主人好,我是您的贴心电影伴侣~" },
user: {
avatar: "//gw.alicdn.com/tfs/TB1DYHLwMHqK1RjSZFEXXcGMXXa-56-62.svg",
},
},
];
interface QuickReplie {
icon?: string;
name: string;
isNew?: boolean;
isHighlight?: boolean;
}
// 默认快捷短语,可选
const defaultQuickReplies: Array<QuickReplie> = [
{
icon: "message",
name: "来一部喜剧电影",
isNew: true,
isHighlight: true,
},
{
name: "随便推荐一部电影",
isNew: true,
},
];
const App = () => {
// 消息列表
const { messages, appendMsg, setTyping } = useMessages(initialMessages);
// 发送回调
function handleSend(type: string, val: string) {
if (type === "text" && val.trim()) {
appendMsg({
type: "text",
content: { text: val },
position: "right",
});
setTyping(true);
axios
.post("http://127.0.0.1:8802/ai/chat", {
query:val
})
.then((res) => {
const agentResponse = res.data;
appendMsg({
type: "text",
content: { text: agentResponse },
});
})
.catch(() => {
appendMsg({
type: "text",
content: { text: "请求出了点问题,请重试~" },
});
});
}
}
// 快捷短语回调,可根据 item 数据做出不同的操作,这里以发送文本消息为例
function handleQuickReplyClick(item: QuickReplie) {
handleSend("text", item.name);
}
function renderMessageContent(msg: MessageProps) {
const { type, content } = msg;
// 根据消息类型来渲染
switch (type) {
case "text":
return <Bubble content={content.text} />;
case "image":
return (
<Bubble type="image">
<img src={content.picUrl} alt="" />
</Bubble>
);
default:
return null;
}
}
return (
<Chat
navbar={{ title: "电影助手" }}
messages={messages}
renderMessageContent={renderMessageContent}
quickReplies={defaultQuickReplies}
onQuickReplyClick={handleQuickReplyClick}
onSend={handleSend}
/>
);
};
export default App;
额外
1.安全
apikey正常需要配置到环境中,避免直接写硬编码到代码中,具体参考
如何添加百炼的API Key到环境变量中_大模型服务平台百炼(Model Studio)-阿里云帮助中心
2.对话记忆
spring-ai-alibaba支持基于chat memory的对话记忆
//对话记忆的唯一标识
String conversantId = UUID.randomUUID().toString();
//初始化基于内存的对话记忆
ChatMemory chatMemory = new InMemoryChatMemory();
public ChatController(ChatClient.Builder builder) {
this.chatClient = builder.build().defaultAdvisors(new MessageChatMemoryAdvisor(chatMemory));
}