SpringBoot 集成GPT实战,超简单详细

news2024/11/24 0:10:59

Spring AI 介绍 

在当前的AI应用开发中,像OpenAI这样的GPT服务提供商主要通过HTTP接口提供服务,这导致大部分Java开发者缺乏一种标准化的方式来接入这些强大的语言模型。Spring AI Alibaba应运而生,它作为Spring团队提供的一个解决方案,旨在为Java社区带来一套统一且易于使用的接口标准,以便快速整合包括阿里云通义在内的多种AI能力。借助Spring AI Alibaba,开发者可以更轻松地将GPT等先进技术集成到自己的项目中,同时享受Spring框架带来的诸如依赖注入、自动配置等便利特性,极大简化了从概念验证到生产部署的过程。

Spring AI Alibaba : 集成阿里云最佳时间的spring AI

Spring AI Alibaba 是 Spring AI 的一个实现,专门针对阿里云的百炼系列云产品大模型进行了适配。它旨在为开发者提供基于阿里云通义大模型的聊天、图片生成、语音生成等AI能力。其核心优势在于通过标准化接口简化了不同AI服务提供商之间的迁移工作,使得开发人员仅需更改配置即可轻松切换不同的AI实现。此外,Spring AI Alibaba 支持与Spring Boot的高度集成,让熟悉Spring生态的开发者可以更加便捷地引入强大的AI功能到自己的项目中,无需深入了解底层细节。这不仅提高了开发效率,还确保了应用程序能够以模块化和可移植的方式构建,符合现代微服务架构的设计理念。

基于SpringBoot整合Spring AI alibaba 实现简单聊天

本场景主要是借助spring ai 的能力,整合spring ai alibaba,实现一个最简单的helloworld聊天,主要想要体现spring ai 的流(flux)能力

SpringBoot实战:集成Spring AI Alibaba打造对话模型与prompt流接口

基于SpringBoot集成Spring AI Alibaba来完成一个简单的对话模型,并构建一个支持prompt的流返回接口项目,需要遵循如下步骤:

1. 环境准备

  • JDK版本:确保你的开发环境使用的是JDK 17或更高版本。
  • Spring Boot版本:确认你的Spring Boot版本为3.3.x或以上。

2. 申请API Key

前往阿里云百炼页面,登录您的账号并开通“百炼大模型推理”服务。开通成功后,在个人中心创建一个新的API KEY,并保存好该KEY值,稍后配置时会用到。

3. 配置API KEY

在你的操作系统环境中设置环境变量AI_DASHSCOPE_API_KEY,值为你之前获取的API KEY:

export AI_DASHSCOPE_API_KEY=your_api_key_here

4. 添加依赖和仓库

编辑pom.xml文件,添加对Spring AI Alibaba的支持以及必要的仓库信息:

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

<dependencies>
    <dependency>
        <groupId>com.alibaba.cloud.ai</groupId>

        <artifactId>spring-ai-alibaba-starter</artifactId>

        <version>1.0.0-M2</version>

    </dependency>

    <!-- 其他依赖 -->
</dependencies>

5. 创建Spring Boot应用

5.1 Application启动类

保持基本不变,标准的Spring Boot应用程序入口点即可。

5.2 ChatController实现

创建一个控制器ChatController用于处理GET请求,接收用户输入并通过通义千问生成响应流。

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

@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 this.chatClient.prompt().user(input).stream().content();
    }
}

这里使用了@CrossOrigin(origins = "*")注解允许跨域请求。

5.3 配置application.properties

将之前设置的API KEY添加至application.properties中:

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

6. 运行与测试

启动你的Spring Boot应用,然后可以通过浏览器或者Postman等工具访问http://localhost:8080/ai/steamChat?input=你的问题来测试接口是否能够正常工作。

解释

上述过程通过引入Spring AI Alibaba的相关依赖,配置了阿里云通义千问所需的API KEY,并定义了一个简单的RESTful API来展示如何利用ChatClient实例进行对话式交互。此示例中的关键在于正确配置了环境变量、依赖关系及安全策略(如CORS),以保证服务能够顺利运行且易于调用。此外,本例还演示了如何利用Flux异步地流式传输聊天响应内容,这对于实时性要求较高的应用场景尤其有用。

搭建React聊天应用:从创建到运行

构建项目并填写代码

首先,创建一个新的 React 应用并安装所需的依赖。这一步骤为你的前端项目搭建好基本的框架。

npx create-react-app frontend
cd frontend
npm install
public/index.html

此文件定义了页面的基本结构,包括标题和一个用于挂载React应用的div元素。

<!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>
src/index.js

这里是React应用的入口点,它将根组件App渲染到指定的DOM节点上。

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

App组件作为顶层组件,负责引入聊天组件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

这是核心的聊天组件,实现了消息输入、发送以及流式接收后端返回的数据。注意这里的fetch请求URL已按照题目要求调整为http://localhost:8080/ai/steamChat?input=${input},并且确保后端服务支持CORS策略以允许跨域请求。

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;

      let fullMessage = '';

      while (!done) {
        const { value, done: readerDone } = await reader.read();
        done = readerDone;
        const chunk = decoder.decode(value, { stream: true });
        fullMessage += chunk;
        setMessages((prevMessages) => prevMessages + chunk);
      }

      // 在每次请求完成后添加换行符
      setMessages((prevMessages) => prevMessages + '\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;

运行项目

完成上述步骤后,通过下面命令启动你的前端开发服务器,并在浏览器中打开http://localhost:3000查看效果。

cd frontend
npm start

这里构建了一个简单的基于React的应用程序来演示如何与支持Flux流输出的后端服务进行交互。用户可以输入文本并通过点击“Send”按钮发送给后端处理;收到的响应则会实时更新显示于页面之上。此外还提供了一个清除消息记录的功能以便重新开始对话

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2209319.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot 3 文件管理:上传、下载、预览、查询与删除(全网最全面教程)

在现代Web应用中&#xff0c;文件管理是一个非常重要的功能。Spring Boot作为Java开发领域的热门框架&#xff0c;提供了丰富的工具和API来简化文件管理的操作。本文将详细介绍如何使用Spring Boot 3进行文件的上传、下载、预览、查询与删除操作&#xff0c;并提供一个完整的示…

OpenCV 环境配置

首先下载opencv&#xff0c;在opencv官网进行下载。 按照上面的步骤&#xff0c;点击进去 滑至底部&#xff0c;不切换至不同页&#xff0c;选择合适的版本进行下载(Window系统选择Windows版本进行下载)。 接下来以4.1.2版本为例&#xff1a; 点击之后会进入这个页面&#xff…

聚类分析 | NRBO-GMM聚类优化算法

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 (创新)NRBO-GMM聚类优化算法 (NRBO聚类优化&#xff0c;创新&#xff0c;独家) 牛顿-拉夫逊优化算法优化GMM高斯混合聚类优化算法 matlab语言&#xff0c;一键出图&#xff0c;直接运行 1.牛顿-拉夫逊优化算法(New…

STM32—BKP备份寄存器RTC实时时钟

1.BKP简介 BKP(Backup Registers)备份寄存器BKP可用于存储用户应用程序数据。当VDD&#xff08;2.0~3.6V&#xff09;电源被切断&#xff0c;他们仍然由VBAT(1.8~3.6V)维持供电。当系统在待机模式下被唤醒&#xff0c;或系统复位或电源复位时&#xff0c;他们也不会被复位TAMP…

教培机构如何向知识付费转型

在数字化时代&#xff0c;知识付费已成为一股不可忽视的潮流。面对这一趋势&#xff0c;教育培训机构必须积极应对&#xff0c;实现向知识付费的转型&#xff0c;以在新的市场环境中立足。 一、教培机构应明确自身的知识定位。 在知识付费领域&#xff0c;专业性和独特性是关键…

【Python】selenium获取鼠标在网页上的位置,并定位到网页位置模拟点击的方法

在使用Selenium写自动化爬虫时&#xff0c;遇到验证码是常事了。我在写爬取测试的时候&#xff0c;遇到了点击型的验证码&#xff0c;例如下图这种&#xff1a; 这种看似很简单&#xff0c;但是它居然卡爬虫&#xff1f;用简单的点触验证码的方法来做也没法实现 平常的点触的方…

数据迁移:如何保证在不停机的情况下平滑的迁移数据

1. 引言 数据迁移是一个常见的需求&#xff0c;比如以下的场景&#xff0c;我们都需要进行数据迁移。 大表修改表结构单表拆分进行分库分表、扩容系统重构&#xff0c;使用新的表结构来存储数据 2. 迁移准备 2.1 备份工具 2.1.1 mysqldump mysqldump 是 MySQL 自带的用于…

【计网】从零开始认识https协议 --- 保证安全的网络通信

在每个死胡同的尽头&#xff0c; 都有另一个维度的天空&#xff0c; 在无路可走时迫使你腾空而起&#xff0c; 那就是奇迹。 --- 廖一梅 --- 从零开始认识https协议 1 什么是https协议2 https通信方案2.1 只使用对称加密2.2 只使用非对称加密2.3 双方都使用非对称加密2.4 …

Winform和WPF的技术对比

WinForms&#xff08;Windows Forms&#xff09;和WPF&#xff08;Windows Presentation Foundation&#xff09;是用于创建桌面应用程序的两种技术。尽管两者都可以用于开发功能强大的Windows应用程序&#xff0c;但它们的设计理念、功能和开发体验都有显著区别。在本文中&…

(亲测可行)ubuntu下载安装c++版opencv4.7.0和4.5.0 安装opencv4.5.0报错及解决方法

文章目录 &#x1f315;系统配置&#x1f315;打开终端&#xff0c;退出anacoda激活环境(如果有的话)&#x1f315;安装依赖&#x1f319;安装g, cmake, make, wget, unzip&#xff0c;若已安装&#xff0c;此步跳过&#x1f319;安装opencv依赖的库&#x1f319;安装可选依赖 …

Smartfusion2开发环境的搭建

Libero软件安装包括libero安装、bibero补丁安装、bibero的license添加和官方ip库的添加等4部分内容组成。具体内容如下所示&#xff1a; 1 Libero软件安装 1、解压LiberoSoC_v11.8的安装包到当前目录&#xff0c;然后运行Libero中的可执行软件进行安装&#xff1b; 图1 双击l…

Javascript实现Punycode编码/解码

Punycode编码/解码的Javascript实现。 用法 const punycode require(punycode); console.log(punycode.encode(用法)); //nwwn1p console.log(punycode.decode(nwwn1p)) //用法console.log(punycode.toIDN(用法.中国)); //xn--nwwn1p.xn--fiqs8s console.log(punycode.fromI…

【AAOS】Android Automotive 13模拟器源码下载及编译

源码下载 repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r69 repo sync -c --no-tags --no-clone-bundle 源码编译 source build/envsetup.sh lunch sdk_car_x86_64-userdebug make -j8 运行效果 emualtor HomeMapAll appsSettings…

CUDA-X

NVIDIA CUDA-X 文章目录 前言一、CUDA-X 微服务CUDA-X 微服务CUDA-X 库二、CUDA-X 数据处理三、CUDA-X AI四、CUDA-X HPC总结前言 适用于 AI 的采用 GPU 加速的微服务和库。 释放 GPU 在 AI 应用程序中的潜能 探索 NVIDIA CUDA-X AI 正在推动变革的 AI 领域和可在其中使用的 G…

win10 解决Qt编译得到的可执行文件 *.exe 无法启动的问题

问题描述 在Qt 5.12.4 写了一个服务端程序&#xff0c;编译可以通过&#xff0c;但是打开debug目录下的可执行文件&#xff0c;就报以下错误&#xff1a; 解决方案 方法一 复制缺失的dll到TCPServer.exe目录下 方法二 可能是系统环境变量没有配好 将你电脑上的Qt安装目录…

linux入门——“权限”

linux中有权限的概念&#xff0c;最常见的就是安装一些命令的时候需要输入sudo来提权&#xff0c;那么为什么要有这个东西呢&#xff1f; linux是一个多用户操作系统&#xff0c;很多东西看起来是有很多分&#xff0c;但是实际的存储只有一份&#xff08;比如命令&#xff0c;不…

网站在对抗机器人攻击的斗争中失败了

95% 的高级机器人攻击都未被发现&#xff0c;这一发现表明当前的检测和缓解策略存在缺陷。 这表明&#xff0c;虽然一些组织可能拥有基本的防御能力&#xff0c;但他们没有足够的能力应对更复杂的攻击。 例如利用人工智能和机器学习来模仿人类行为的攻击。 这些统计数据强调…

数据结构之顺序表详解:从原理到C语言实现

引言 在上一篇文章中我们讲到了时间复杂度与空间复杂度&#xff0c;今天我们接着讲数据结构中的内容。 数据的存储和组织方式决定了程序的效率。而顺序表&#xff0c;也就是大家熟悉的数组&#xff0c;正是我们编程中的“起步工具”。它简单易懂&#xff0c;却能帮你解决许多…

python利用电脑默认打开方式打开文件,视频,图片

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理python利用os库打开本地文件的方法。 这个确实比较简单。 利用os库的 os.startfile("mp4") 函数即可用系统默认打开方式打开文件。 这里打开视频进行测试。 import os os.startfile("…

linux 虚拟环境下源码安装DeepSpeed

第一步&#xff1a;创建虚拟环境&#xff1a; conda create -n deepspeed python3.10 第二步&#xff1a;进入虚拟环境&#xff0c;安装Pytorch 2.3.1 # CUDA 12.1 conda install pytorch2.3.1 torchvision0.18.1 torchaudio2.3.1 pytorch-cuda12.1 -c pytorch -c nvidia 第…