Java调用大模型 - Spring AI 初体验

Spring AI:为Java开发者提供高效的大模型应用框架

当前Java调用大模型时面临缺乏高效AI应用框架的问题。Spring作为资深的Java应用框架提供商,通过推出Spring AI来解决这一挑战。它借鉴了LangChain的核心理念,并结合了Java面向对象编程的优势,提供统一接口标准、支持随时替换不同的大模型实现(如OpenAI、阿里云等),并由专门团队持续维护。这使得开发者能够更便捷地在项目中集成和切换各种大模型服务,极大简化了开发流程,同时确保了代码的可移植性和灵活性。

Spring AI Alibaba的功能与优势

当大模型在国内应用时,主要面临的挑战是如何在保证内容安全可控的前提下,还能满足业务对智能性的需求。Spring AI Alibaba 是应对这一挑战的理想选择,因为它不仅拥有强大的内容安全保障能力,还集成了阿里云的最佳实践和Qwen-2.5模型。Qwen-2.5 在 OpenCompass 评选中被评为开源模型中的第一名,这进一步证明了其卓越的性能。

Spring AI Alibaba 是 Spring AI 框架的一个本地化实现,专为与阿里云的通义大模型对接而设计。它支持多种AI能力,包括对话、文本生成图像、语音合成等,并提供诸如OutputParser、Prompt Template等实用功能来简化开发流程。通过使用Spring AI Alibaba,开发者可以轻松地将这些高级AI功能整合进自己的项目中,同时利用Spring框架的优势(如模块化设计)提高代码的可维护性和移植性。此外,由于其统一且简洁的API设计,使得切换不同AI供应商变得非常方便,极大降低了技术迁移成本。

基于SpringBoot集成Spring AI Alibaba构建对话模型及支持prompt的流返回接口

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

1. 环境准备

  • JDK版本:确保你的开发环境中的JDK版本在jdk17(含)以上。
  • Spring Boot版本:确保使用的Spring Boot版本在3.3.x及以上。

2. 获取API Key

你需要从阿里云申请通义千问的API Key。按照以下步骤操作:

  • 打开阿里云百炼页面 -> 登录您的阿里云账号 -> 选择开通“百炼大模型推理”服务,然后等待开通成功的短信 -> 开通成功后,登录阿里云百炼页面,点击右上角小人图标-> API-KEY -> 点击【创建新的API-KEY】生成API-KEY。请记录这个key,后面会用到。

接着配置API KEY:

export AI_DASHSCOPE_API_KEY=${REPLACE-WITH-VALID-API-KEY}

${REPLACE-WITH-VALID-API-KEY}替换为你刚才生成的API Key。

3. 添加仓库和依赖

由于spring-ai-alibaba-starter目前还在Milestone阶段,你需要添加Spring自己的仓库以及snapshot仓库到你的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>

接下来,在pom.xml文件里添加必要的依赖项:

<parent>
    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-parent</artifactId>

    <version>3.3.4</version>

    <relativePath/> <!-- lookup parent from repository -->
</parent>

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

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

        <version>1.0.0-M2</version>

    </dependency>

    <!-- 其他需要的依赖 -->
</dependencies>

4. 配置API Key

在项目的application.propertiesapplication.yml文件中添加以下配置以设置API Key:

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

5. 编写Controller代码

最后一步是编写处理GET请求并支持跨域访问的控制器类。该控制器类将利用ChatClient实例与通义大模型进行交互,并返回基于Flux的数据流。

@RestController
@RequestMapping("/ai")
@CrossOrigin(origins = "*") // 支持CORS
public class ChatController {

    private final ChatClient chatClient;

    @Value("classpath:correct-and-expand.st")
    Resource resource;

    public ChatController(ChatClient.Builder builder) {
        this.chatClient = builder.build();
    }

    @GetMapping("/steamChat")
    public Flux<String> steamChat(@RequestParam String input) {
        PromptTemplate promptTemplate = new PromptTemplate(resource);
        Prompt prompt = promptTemplate.create(Map.of("input", input));
        return chatClient.prompt(prompt).stream().content();
    }
}

在这个例子中,我们使用了@CrossOrigin(origins = "*")注解来允许所有来源的跨域请求。如果你只想允许特定来源,则可以指定具体的URL而非*

同时,我们通过构造函数注入了ChatClient实例,并且使用了一个Prompt模板来格式化输入的内容。最后,调用chatClient.prompt()方法发送请求给AI模型,并返回一个Flux对象作为响应内容。

解释

上述步骤详细介绍了如何基于Spring Boot集成Spring AI Alibaba框架,从而实现一个简单的聊天机器人应用。整个过程涉及到了环境搭建、获取API Key、添加必要的依赖、配置API Key以及编写实际的业务逻辑。通过这种方式,我们可以非常方便地接入阿里云提供的通义大模型服务,为应用程序添加智能对话功能。

创建React前端项目

构建前端

在构建一个基于React的支持流式数据输出的前端项目时,我们首先需要创建一个新的React应用,该应用需要能够发送请求至后端接口 http://localhost:8080/ai/steamChat?input=... 并处理返回的流式字符串数据。

创建并配置React应用

首先,请确保您的开发环境中已安装Node.js及npm。接下来,在命令行中执行以下步骤来创建新的React应用并进入其目录:

npx create-react-app frontend
cd frontend
npm install

上述命令将会自动为您生成一个基本的React应用框架。

修改基础文件

对于本例而言,无需对public/index.htmlsrc/index.js进行修改,因为它们默认配置已经足够满足需求。这两个文件的主要作用分别是定义HTML文档结构以及渲染React组件树到页面上。

开发聊天组件

核心功能由ChatComponent实现,它负责收集用户输入、发送请求给后端API,并实时展示从服务器接收到的消息流。请按照如下所示编写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;
      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;

此组件包含了一个输入框用于接收用户输入、两个按钮(分别用于提交信息和清除历史记录),以及一个显示区用来展示与服务器交互过程中产生的所有消息。

连接主应用组件

为了让ChatComponent成为应用程序的一部分,你需要稍微调整一下src/App.js:

import React from 'react';
import ChatComponent from './components/ChatComponent';

function App() {
  return (
    <div className="App">
      <ChatComponent />
    </div>

  );
}

export default App;

这样就完成了所有必要的代码编写工作。

启动并测试项目

最后一步是运行你的React应用,可以通过下面这条命令启动开发服务器:

npm start

打开浏览器访问http://localhost:3000即可看到应用界面。试着输入一些文字并通过点击“Send”按钮发送给后端,如果一切设置正确,你应该能在屏幕上看到逐字显示的回复消息。

通过以上步骤,您已经成功地使用React建立了一个简单的支持流式输出的前端应用。请注意确保后端服务允许来自前端应用所在域的跨源资源共享(CORS),否则可能会遇到网络请求被拦截的问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

提升网络安全防御有效性,服务器DDoS防御软件解读

从购物、银行业务、旅行计划到娱乐&#xff0c;人们越来越多地转向数字领域来促进他们的公共和私人生活。然而&#xff0c;当DDoS攻击汹涌而至&#xff0c;企业很可能会陷入数小时或数天的混乱局面&#xff0c;用户的体验也会大打折扣。根据DDoS-Guard发布的数据&#xff0c;20…

QML 基本动画

在介绍完 QML 动画框架之后,现在我们来看看具体的动画及其用法。先从最常用的基本动画入手,这些动画包括:PropertyAnimation、ColorAnimation、Vector3dAnimation 和 PathAnimation 等,它们不仅能够帮助我们轻松地为应用程序添加动态效果,还能显著提升用户体验,使得界面更…

C++11——智能指针

智能指针的介绍 智能指针是C11中引入的标准库特性之一&#xff0c;智能指针是为了避免手动管理内存时常见的错误&#xff0c;比如内存泄漏、重复释放内存等问题。智能指针通过封装原生指针&#xff08;裸指针&#xff09;和自动释放内存的功能&#xff0c;让开发者更安全和高效…

[渗透]前端源码Chrome浏览器修改并运行

文章目录 简述本项目所使用的代码[Fir](https://so.csdn.net/so/search?qFir&spm1001.2101.3001.7020) Cloud 完整项目 原始页面修改源码本地运行前端源码修改页面布局修改请求接口 本项目请求方式 简述 好久之前&#xff0c;就已经看到&#xff0c;_无论什么样的加密&am…

SPI的学习

工作原理 SPI的工作原理基于主从架构。主设备通过四条主要信号线与一个或多个从设备进行通信&#xff1a; MOSI&#xff08;主输出&#xff0c;从输入&#xff09;DI&#xff08;Master Output Slave Input&#xff09;&#xff1a;主设备发送数据到从设备。MISO&#xff08;…

利用自定义 ref 实现函数防抖

今天来简单介绍一个新的方法&#xff0c;使用自定义 ref 实现函数防抖。 1. 自定义 ref 的来源 自定义 ref 防抖函数来自于前端开发中的两个概念&#xff1a;Vue 的响应式系统 和 数防抖&#xff08;Debounce&#xff09;。 1、Vue 响应式系统&#xff1a;Vue 提供了 ref 和…

SQL 干货 | SQL 反连接

最强大的 SQL 功能之一是 JOIN 操作&#xff0c;它提供了一种优雅而简单的方法&#xff0c;将一个表中的每一条记录与另一个表中的每一条记录结合起来。不过&#xff0c;有时我们可能想从一个表中找到另一个表中没有的值。正如我们将在今天的博客文章中看到的&#xff0c;通过包…

爬虫结合项目实战

由于本人是大数据专业&#xff0c;所以准备的是使用pycharm工具进行爬虫爬取数据&#xff0c;然后实现一个可视化大屏 参考项目&#xff1a; 1.医院大数据可视化最后展示 2. 大数据分析可视化系统展示 代码包&#xff1a;

会话管理——Cookie

会话管理在人机交互中扮演着至关重要的角色&#xff0c;它是指保持用户的整个会话活动的互动与计算机系统跟踪过程。以下是对会话管理的简单介绍&#xff1a; 会话主要分为两类&#xff1a;有状态会话&#xff08;知道对方身份&#xff09;和无状态会话&#xff08;不知道对方…

go mod的使用

1. go中包的介绍和定义 包就是很多golang源码的集合&#xff0c;Go语言为我们提供了很多内置包&#xff0c;如fmt、strconv、strings、sort、errors、time、encoding/json、os、io等。 种类&#xff1a;1、系统内置包 2、自定义包 3、第三方包 系统内置包&…

计算机组成原理一句话

文章目录 计算机系统概述存储系统指令系统 计算机系统概述 指令和数据以同等地位存储在存储器中&#xff0c;形式上没有差别&#xff0c;但计算机应能区分他们。通过指令周期的不同阶段。 完整的计算机系统包括&#xff0c;1&#xff09;软件系统&#xff1a;程序、文档和数据&…

GEE引擎架设好之后进游戏时白屏的解决方法——gee引擎白屏修复

这两天测试GeeM2引擎的服务端&#xff0c;最常见的问题就是点击开始游戏出现白屏&#xff0c;最早还以为是服务端问题&#xff0c;结果是因为升级了引擎&#xff0c;而没有升级NewUI这份文件导致的。解决方法如下&#xff1a; 下载GEE引擎包最新版&#xff0c;&#xff08;可以…

C++实现精简实用的json解析库

fcjson.h #pragma once#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) #define _CRT_SECURE_NO_WARNINGS #endif#include <stdint.h> #include <string> #include <vector> #include <map>// VS 将执行字符集指定为…

Jupyter Notebook修改你的默认路径

Jupyter Notebook修改你的默认路径 看到网上一堆抄来抄去的博客&#xff0c;图片和文字都不对应&#xff0c;搞得配置得头昏脑涨的&#xff0c;所以写了这个。 1.打开 Anaconda Prompt 2.输入 jupyter notebook --generate-config&#xff0c;注意提示后输入N&#xff0c;因为…

【K8s】Kubernetes 证书管理工具 Cert-Manager

本文内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01; 如果对您有帮助&#xff0c;烦请点赞、关注、转发、订阅专栏&#xff01; 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】&#xff08;全…

校招基础知识详解——计算机操作系统(内存管理)

文章目录 虚拟内存分页系统地址映射页面置换算法最佳页面置换算法(OPT, Optimal replacement algorithm)先进先出置换算法&#xff08;FIFO, First In First Out&#xff09;最近最久未使用的置换算法&#xff08;LRU, Least Recently Used&#xff09;最不常用算法最近未使用&…

Excel常用操作培训

1 Excel基本操作 1.1 常用快捷键 1.1.1快捷键操作工作簿、工作表 1.1.2快捷键操作 1.1.3单元格操作 1.1.4输入操作 2.1 常见功能描述 2.1.1 窗口功能栏 excel有很多功能可以用&#xff0c;新建文档后&#xff0c;可以最上方&#xff0c;可以看到所有的功能栏目 2.1.2 剪切板…

《YOLO目标检测》—— YOLO v2 详细介绍

&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;未写完&#xff01;&#xff01;&#xff01;&#xff0…

Android中导入讯飞大模型ai智能系统

1.在讯飞大平台申请免费接口(申请后获取url和token) 2.创建一个数据库进行储存对话聊天记录 package com.example.myapplication.XL; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlit…

【SQL】SQL函数

&#x1f4e2; 前言 函数 是指一段可以直接被另一段程序调用的程序或代码。主要包括了以下4中类型的函数。 字符串函数数值函数日期函数流程函数 &#x1f384; 字符串函数 ⭐ 常用函数 函数 功能 CONCAT(S1,S2,...Sn) 字符串拼接&#xff0c;将S1&#xff0c;S2&#xff0…