java对接GPT 快速入门

news2024/10/11 4:54:31

统一对接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>
      <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;

运行项目

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

cd frontend
npm start

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

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

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

相关文章

毕设分享 大数据用户画像分析系统(源码分享)

文章目录 0 前言2 用户画像分析概述2.1 用户画像构建的相关技术2.2 标签体系2.3 标签优先级 3 实站 - 百货商场用户画像描述与价值分析3.1 数据格式3.2 数据预处理3.3 会员年龄构成3.4 订单占比 消费画像3.5 季度偏好画像3.6 会员用户画像与特征3.6.1 构建会员用户业务特征标签…

Linux查看下nginx及使用的配置文件

1、查到nginx进程 ps -aef | grep nginx2、通过进行pid查到nginx路径 pwdx <pid>3、根据路径得到配置文件 path***/nginx -t如下&#xff1a;

Unity网络开发基础 —— 实践小项目

概述 接Unity网络开发基础 导入基础知识中的代码 需求分析 手动写Handler类 手动书写消息池 using GamePlayer; using System; using System.Collections; using System.Collections.Generic; using UnityEngine;/// <summary> /// 消息池中 主要是用于 注册 ID和消息类…

(五)Proteus仿真STM32单片机串口数据流收发

&#xff08;五&#xff09;Protues仿真STM32单片机串口数据流收发 – ARMFUN 1&#xff0c;打开STM32CubeMX&#xff0c;找到USART1,配置模式Asynchronous&#xff0c;此时PA9、PA10自动变成串口模式 串口默认参数:115200bps 8bit None 1stop 2&#xff0c;NVIC Settings使能…

Linux-Docker阿里云镜像仓库失效

写在前面&#xff0c;这个是我很早之前在VmWare安装的Linux7,通过yum 安装的docker&#xff0c;但是今天怎么都无法pull镜像&#xff0c;报错如下。 Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waitin…

在IDEA里用XDebug调试PHP,断点....

做程序开发,调试必不可少,这里最近用到了PHP,顺便写个关于PHP的调试安装使用: 1、首先是PHP先安装xdebug扩展(还有zend的),这个我的工具是IDEA,所以安装方法也相对简单,如果你是用VSCode等应该也是一样,如下图,找到这个PHP->DEBUG 2、直接点上面的Install XDebug 就可以帮你…

Unity网络开发 - C#开源网络通信库PESocket的使用

概述 在现代多人在线游戏中&#xff0c;稳定且高效的网络通信是确保游戏体验的关键。本文将探讨如何利用C#开源网络通信库PESocket来构建一个简单的Unity客户端与.NET控制台服务器之间的实时消息传递系统。通过本例&#xff0c;读者不仅能够了解PESocket的基本用法&#xff0c…

Windows11系统下Sentinel环境搭建教程

目录 前言Sentinel简介Sentinel下载安装Sentinel配置与启动总结 前言 本文为博主在项目环境搭建时记录的Sentinel安装流程&#xff0c;希望对大家能够有所帮助&#xff0c;不足之处欢迎批评指正&#x1f91d;&#x1f91d;&#x1f91d; Sentinel简介 github主页地址 &#x…

004、合并两个有序数组

0、题目描述 合并两个有序数组 1、法1 数组nums1有m个元素&#xff0c; 直接在下标为m的位置处追加nums2的元素。然后再qsort整体排序。 —— —— qsort函数&#xff0c;&#xff08;数组首元素地址&#xff0c;排序的个数&#xff0c;排序元素大小&#xff0c; 比较函数&…

Vue】Vue扫盲(四)组件化思想与简单应用

【Vue】Vue扫盲&#xff08;一&#xff09;事件标签、事件修饰符&#xff1a;click.prevent click.stop click.stop.prevent、按键修饰符、及常用指令 【Vue】Vue扫盲&#xff08;二&#xff09;指令&#xff1a;v-for 、v-if、v-else-if、v-else、v-show 【Vue】Vue扫盲&…

Ruby脚本:自动化网页图像下载的实践案例

随着互联网的快速发展&#xff0c;网页上的内容变得越来越丰富&#xff0c;尤其是图像资源。对于需要大量图像资源的设计师、内容创作者或数据分析师来说&#xff0c;手动下载这些图片不仅耗时耗力&#xff0c;而且效率低下。因此&#xff0c;自动化网页图像下载成为了一个迫切…

3_路由器分组交换知多少?20241009

上次介绍到了路由器的分组交换戛然而止&#xff0c;这次扫盲式介绍下。 1、分组交换的主要特点 分组交换则采用存储转发技术1-11 表示把一个报文划分为几个分组后再进行传送。通常我们把要发送的整块数据称为一个报文(message)。在发送报文之前&#xff0c;先把较长的报文划分成…

java-02 数据结构-队列

在Java中&#xff0c;队列是一种常见的数据结构&#xff0c;用于在保持顺序的同时存储和检索数据。Java提供了java.util.Queue接口&#xff0c;它的常见实现包括ArrayDeque、LinkedList和PriorityQueue等。 如果你觉得我分享的内容或者我的努力对你有帮助&#xff0c;或者你只…

元数据 - iXML

在专业的音频和视频制作中&#xff0c;元数据的准确传递对于后期制作和编辑至关重要。iXML&#xff08;iXML Metadata&#xff09;是一种开放的、可扩展的元数据规范&#xff0c;旨在在录音设备和数字音频工作站&#xff08;DAW&#xff09;之间传递详细的录音信息。 一、什么是…

安卓使用.9图实现阴影效果box-shadow: 0 2px 6px 1px rgba(0,0,0,0.08);

1.安卓实现阴影效果有很多种&#xff0c;一般UX设计会给以H5参数box-shadow: 0 2px 6px 1px rgba(0,0,0,0.08);这种方式提供背景阴影效果&#xff0c;这里记录一下实现过程 2.界面xml源码 <?xml version"1.0" encoding"utf-8"?> <layout xmlns…

小北的技术博客:探索华为昇腾CANN训练营与AI技术创新——Ascend C算子开发能力认证考试(中级)

前言 哈喽哈喽,这里是zyll~,北浊.(大家可以亲切的呼唤我叫小北)智慧龙阁的创始人,一个在大数据和全站领域不断深耕的技术创作者。今天,我想和大家分享一些关于华为昇腾CANN训练营以及AI技术创新的最新资讯和实践经验~(初级证书还没拿到的小伙伴,可以先参考小北的这篇技术…

QTableView-mode中嵌入复选框CheckBox

QTableView中嵌入复选框CheckBox 第二种方法&#xff1a;设置QAbstractTableModel的flags()函数法 通过Delegate创建QCheckBox来实现的Check列&#xff0c;只有在该列进入编辑模式时才能够Check/Uncheck。这显然不是我们想要的&#xff0c;网上翻来翻去&#xff0c;在一个国外论…

SpringBoot+Vue智能社区服务小程序

SpringBootVue智能社区服务小程序 SpringBootVue智能社区服务小程序 项目描述 智能社区服务小程序的前台小程序是一个集成多功能的综合性平台&#xff0c;旨在提供便捷、高效的社区服务。以下是关于各个功能的简单介绍&#xff1a; 用户管理&#xff1a;用户管理模块负责社区…

基于SpringBoot+Vue的非物质文化遗产保护与传播系统设计实现【原创】(地图组件)

&#x1f388;系统亮点&#xff1a;地图组件&#xff1b; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a; 技术&#xff1a;框架Vue.js&#x…

Mysql(五) --- 数据库设计

文章目录 前言1.范式1.1.第一范式1.1.1 定义1.1.2.例子 1.2.第二范式1.2.1 定义1.2.2 例子1.2.3.不满足第二范式可能会出现的问题 1.3.第三范式1.3.1 定义2.3.2 示例 2. 设计过程3. 实体-关系图3.1 E-R图的基本组成3.2 关系的类型3.2.1 一对一关系(1:1)3.2.2 ⼀对多关系(1:N)3.…