当前位置: 首页 > news >正文

java对接GPT 快速入门

统一对接GPT服务的Java说明

当前,OpenAI等GPT服务厂商主要提供HTTP接口,这使得大部分Java开发者在接入GPT时缺乏标准化的方法。
为解决这一问题,Spring团队推出了Spring AI ,它提供了统一且标准化的接口来对接不同的AI服务提供商,包括阿里云通义大模型。
通过使用Spring AI,开发者可以轻松地以一致的方式调用各种GPT功能,并且能够利用Spring框架的强大生态优势,如自动装配、依赖注入等特性,极大地简化了开发流程并提高了代码复用性。

Spring AI Alibaba介绍:集成与优化

Spring AI Alibaba是基于Spring AI构建的AI应用开发工具,它通过将阿里云百炼系列大模型接入到Spring生态系统中,使得开发者能够利用熟悉的Spring Boot编程模型轻松集成AI功能。
其核心优势在于提供了一套标准化接口,支持多种AI服务提供商(如OpenAI、Azure、阿里云等),允许开发者通过简单修改配置即可切换不同的AI实现,极大减少了迁移成本和工作量。
此外,Spring AI Alibaba还兼容Flux流输出,为构建基于流的机器人模型提供了便利。通过Spring Boot的强大生态支持,Spring AI Alibaba进一步简化了AI能力在企业级应用中的落地过程。

后端构建:SpringBoot集成Spring AI Alibaba实战:构建对话模型与流接口

基于SpringBoot集成Spring AI Alibaba来构建一个简单的对话模型,并创建一个支持Prompt能力与流返回接口的项目,需要按照以下步骤进行。根据提供的我了解的信息,我们将逐步分析问题的原因,并给出具体的实施步骤。
例子使用通义后端API。

1. 环境准备

首先,确保你的开发环境满足如下要求:

  • JDK版本在JDK 17或以上。
  • Spring Boot版本为3.3.x或更高。

2. 获取API Key

前往阿里云百炼页面并登录您的阿里云账号,选择开通“百炼大模型推理”服务。待服务开通后,生成一个新的API KEY,并记录下来以备后续配置使用。

3. 配置API Key

将获取到的API Key设置为环境变量,或者直接在application.properties中配置:

spring.ai.dashscope.api-key=your_api_key_here

4. 添加依赖与仓库

由于Spring AI Alibaba目前处于Milestone阶段,你需要添加特定的Maven仓库来获取相关库。请确保你的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><dependencies><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter</artifactId><version>1.0.0-M2</version></dependency><!-- 其他必要的依赖 -->
</dependencies>

同时,请不要忘记设置Spring Boot的父级项目版本(例如3.3.4)。

5. 创建Controller处理请求

接下来,在项目中创建一个Controller来处理GET请求,该请求将利用ChatClient和Prompt功能实现聊天逻辑,并支持跨域请求(CORS)。以下是示例代码:

@RestController
@RequestMapping("/ai")
@CrossOrigin(origins = "*") // 支持所有来源的跨域请求
public class SteamChatController {private final ChatClient chatClient;public SteamChatController(ChatClient.Builder builder) {this.chatClient = builder.build();}@GetMapping(value = "/steamChat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public Flux<String> steamChat(@RequestParam String input) {return chatClient.prompt().user(input).stream().content();}
}

这段代码定义了一个名为SteamChatController的控制器,它接受HTTP GET请求,并通过chatClient调用通义千问API完成对话任务。注意这里我们设置了响应的内容类型为MediaType.TEXT_EVENT_STREAM_VALUE,这是为了适应Flux类型的流输出需求。

6. 启动应用

现在,你已经完成了所有必需的配置和编码工作,只需运行Spring Boot应用程序即可。访问http://localhost:8080/ai/steamChat?input=your_input,其中your_input是你想要发送给AI助手的信息,然后你会看到实时的回复流。

解释

上述步骤涵盖了从环境搭建、API Key配置到实际编写控制逻辑的全过程。特别地,我们使用了Spring AI Alibaba提供的ChatClient对象来发起对阿里云通义千问API的调用,并且实现了基于SSE(Server-Sent Events)协议的流式响应。这使得我们的服务能够实时地向客户端推送数据,非常适合于构建互动性高的在线聊天应用。此外,通过启用CORS支持,允许来自任何源的前端应用都能轻松地与本服务交互。

前端构建:基于React的流式聊天应用,从搭建到运行

构建项目并填写代码

为了构建一个基于React的前端项目,它能够支持流式数据输出(即接收flux<String>格式的数据),并且后端接口地址为http://localhost:8080/ai/steamChat?input=...,你需要遵循以下步骤:

首先,请确保已经安装了Node.js环境。接下来,通过执行下面命令来创建一个新的React应用,并进入该目录安装必要的依赖项:

npx create-react-app frontend
cd frontend
npm install

接着,按照给出的结构组织你的项目文件和添加相应的代码。

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>Stream Chat App</title></head><body><div id="root"></div></body></html>
src/index.js

这个文件用于渲染React应用到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

定义应用的主要组件入口点:

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}`);if (!response.ok) throw new Error("Network response was not ok");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((prevMessages) => prevMessages + chunk);  // 将新收到的数据追加到已有消息上}} catch (error) {console.error('Failed to fetch', error);}};const handleClearMessages = () => {setMessages('');};return (<div><inputtype="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;

运行项目

完成以上设置之后,你可以通过运行如下命令启动前端服务:

cd frontend
npm start

这将自动打开浏览器窗口并加载你的应用页面,在这里用户可以输入信息并通过点击“Send”按钮向指定URL发起请求,从而与后端进行交互。注意,上述示例假定后端服务已经在http://localhost:8080/ai/steamChat?input=...处正确配置且可访问,同时支持CORS跨域资源共享以允许来自前端的请求。如果遇到任何网络错误或权限问题,请检查后端设置及安全性配置。

相关文章:

java对接GPT 快速入门

统一对接GPT服务的Java说明 当前&#xff0c;OpenAI等GPT服务厂商主要提供HTTP接口&#xff0c;这使得大部分Java开发者在接入GPT时缺乏标准化的方法。 为解决这一问题&#xff0c;Spring团队推出了Spring AI &#xff0c;它提供了统一且标准化的接口来对接不同的AI服务提供商…...

微信小程序引入组件教程

1、安装 node.js 下载网址&#xff1a;https://nodejs.org 2.通过 npm 安装 npm init -y npm i vant/weapp -S --production 3、修改 app.json 将 app.json 中的 “style”: “v2” 去除 4、修改 project.config.json 关于修改 project.config.json 的详细内容&#x…...

STM32—SPI通信外设

1.SPI外设简介 STM32内部集成了硬件SPI收发电路&#xff0c;可以由硬件自动执行时钟生成、数据收发等功能&#xff0c;减轻CPU的负担可配置8位/16位数据帧、高位先行/低位先行时钟频率&#xff1a;fpclk/(2,4,8,16,32,64,128,256)支持多主机模型、主或从操作可精简为半双工/单…...

Ubuntu:用户不在sudoers文件中

1、问题 执行sudo xxx命令时&#xff0c;显示&#xff1a; user 不在sudoers文件中 需要查看系统版本进入恢复模式修复。 2、重启进入恢复模式 查看系统命令&#xff1a;uname -r 可能显示为&#xff1a;6.8.0-45-generic 重启Ubuntu系统&#xff0c;在开机时按ESC进入模…...

五、Spring Boot集成Spring Security之认证流程2

一、Spring Boot集成Spring Security专栏 一、Spring Boot集成Spring Security之自动装配 二、Spring Boot集成Spring Security之实现原理 三、Spring Boot集成Spring Security之过滤器链详解 四、Spring Boot集成Spring Security之认证流程 五、Spring Boot集成Spring Se…...

接口测试(全)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、什么是接口测试 顾名思义&#xff0c;接口测试是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换&#xff0c;传递和控制管理过程&#xff0…...

【学习】word保存图片

word中有想保存的照片 直接右键另存为的话&#xff0c;文件总是不清晰&#xff0c;截屏的话&#xff0c;好像也欠妥。 怎么办? 可以另存为 网页 .html 可以得到&#xff1a; 原图就放到了文件夹里面...

【实战篇】用SkyWalking排查线上[xxl-job xxl-rpc remoting error]问题

一、组件简介和问题描述 SkyWalking 简介 Apache SkyWalking 是一个开源的 APM&#xff08;应用性能管理&#xff09;工具&#xff0c;专注于微服务、云原生和容器化环境。它提供了分布式追踪、性能监控和依赖分析等功能&#xff0c;帮助开发者快速定位和解决性能瓶颈和故障。…...

三勾软件/ java+springboot+vue3玖玖云电商ERP多平台源码

玖玖云ERP系统、支持多平台订单同步&#xff0c;仓库发货&#xff0c;波次拣货&#xff0c;售后服务&#xff0c;电商ERP一站式解决方案 项目介绍 玖玖云ERP系统基于javaspringbootelement-plusuniapp打造的面向开发的电商管理ERP系统&#xff0c;方便二次开发或直接使用。主…...

020 elasticsearch7.10.2 elasticsearch-head kibana安装

文章目录 全文检索流程ElasticSearch介绍ElasticSearch应用场景elasticsearch安装允许远程访问设置vm.max_map_count 的值 elasticsearch-head允许跨域 kibana 商品数量超千万&#xff0c;数据库无法使用索引 如何使用全文检索&#xff1a; 使用lucene&#xff0c;在java中唯一…...

基于SpringBoot+Vue的蜗牛兼职网的设计与实现(带文档)

基于SpringBootVue的蜗牛兼职网的设计与实现&#xff08;带文档) 开发语言:Java数据库:MySQL技术:SpringBootMyBatisVue等工具:IDEA/Ecilpse、Navicat、Maven 该系统主要分为三个角色&#xff1a;管理员、用户和企业&#xff0c;每个角色都有其独特的功能模块&#xff0c;以满…...

Linux 命令 chown 和 chmod 的区别

Linux 命令 chown 和 chmod 的区别 chown的作用&#xff1a;更改文件或目录的所有者和所属用户组chmod的作用&#xff1a;更改文件或目录的访问权限 chown的作用&#xff1a;更改文件或目录的所有者和所属用户组 $ chown [options] user:group file_pathuser&#xff1a;新文件…...

盘点慢查询原因及优化方法

目录 一&#xff0c;前言二&#xff0c;准备 type重点看 三&#xff0c;慢查询原因和解决 1&#xff0c;sql未加索引2&#xff0c;索引失效3&#xff0c;limit深分页问题 &#xff08;1&#xff09;limit深分页为什么会慢&#xff08;2&#xff09;深分页优化 4&#xff0c;in…...

【热门】智慧果园管理系统解决方案

随着科技的进步,原有农业种植方式已经不能满足社会发展的需要,必须对传统的农业进行技术更新和改造。经过多年的实践,人们总结出一种新的种植方法——温室农业,即“用人工设施控制环境因素,使作物获得最适宜的生长条件,从而延长生产季节,获得最佳的产出”。这种农业生产方式…...

torch.nn.Sequential介绍

torch.nn.Sequential 是 PyTorch 中一个模块容器,用于将一系列层或模块按顺序连接在一起,简化前向传播过程。在 Sequential 中,所有的子模块会按照添加的顺序被执行,适合那些有明确顺序的神经网络结构,比如卷积神经网络、全连接网络等。 主要特点 按顺序执行: 将多个子模…...

使用verilog设计实现的数字滤波器(低通、高通、带通)及其仿真

以下是一个简单的使用Verilog设计数字滤波器(以有限脉冲响应(FIR)滤波器为例,实现低通、高通、带通滤波器)的基本步骤和代码框架: 一、FIR滤波器原理 FIR滤波器的输出 y [ n ] y[n] y[n] 是输入信号...

KPaaS集成平台中怎么创建数据可视化大屏

KPaaS集成平台的数据可视化大屏是什么&#xff1f; 在KPaaS业务集成扩展平台中&#xff0c;数据大屏是一种数据可视化展示工具&#xff0c;它可以帮助企业将复杂的数据以直观、易理解的方式呈现出来&#xff0c;从而提高数据的可读性和价值。数据大屏的主要特点包括&#xff1…...

深度学习:网络压缩(Network Compression)详解

网络压缩&#xff08;Network Compression&#xff09;详解 网络压缩是一种旨在减小深度学习模型大小&#xff0c;提高其运行效率和降低计算资源消耗的技术。在移动设备和嵌入式系统等资源受限的环境中&#xff0c;网络压缩尤为重要。它允许这些设备利用现有的深度学习技术&am…...

Go pprof性能分析

pprof是Go语言内置的性能分析工具&#xff0c;它可以帮助我们分析程序的CPU使用情况、内存分配等。 pprof 包含两部分&#xff1a; Go语言内置的两个包 net/http/pprof 对 runtime/pprof 的二次封装&#xff0c;一般是服务型应用。比如 web server &#xff0c;它一直运行。这…...

扬帆出海!九章云极DataCanvas公司惊艳亮相迪拜GITEX Global 2024

近日&#xff0c; 第44届GITEX GLOBAL展会&#xff08;GITEX GLOBAL 2024&#xff09;及全球领先的创业与投资盛会Expand North Star 2024在迪拜盛大启幕。九章云极DataCanvas公司惊艳亮相盛会&#xff0c;向全球观众展示智算领域最新研发进展与创新成果&#xff0c;在国际舞台…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...