基于spring ai alibba开发聊天机器人

821 阅读3分钟

前言

9c81cc51188dc405d2f287bac19c140e.png

在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.开通服务,享受免费额度

bailian.console.aliyun.com/

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));
  }

3.更多内容参考

sca.aliyun.com/ai/