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

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

连接主应用组件

为了让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),否则可能会遇到网络请求被拦截的问题。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux隐藏权限介绍

隐藏权限概览 在Linux系统中&#xff0c;有时即便是以root用户身份&#xff0c;你也可能遇到无法修改特定文件的情况。这种限制往往源自chattr命令的应用&#xff0c;该命令用于为文件或目录设置“隐藏权限”&#xff0c;即底层属性&#xff0c;以增强系统安全性。值得注意的是…

100个人物介绍字幕动画PR视频模板MOGRT

Premiere Pro 模板&#xff0c;5类100个人物介绍(用户)界面元素PR剪辑视频素材包。 不需要插件。 通用表达式。 模块化结构。 组织良好。 快速简单的定制。 https://prmuban.com/41688.html

华为原生鸿蒙操作系统正式发布,为开发者开启的全新机遇与挑战

华为原生鸿蒙操作系统正式发布&#xff1a;开启全场景智能生活新篇章 概述 2024年10月22日&#xff0c;华为在“原生鸿蒙之夜暨华为全场景新品发布会”上正式发布了我国首个国产移动操作系统——华为原生鸿蒙操作系统&#xff08;HarmonyOS NEXT&#xff09;。这标志着华为在…

AI大模型平台详解与AI创作示范

AI大模型平台详解与AI创作示范 在全球人工智能&#xff08;AI&#xff09;领域&#xff0c;中国的AI大模型平台取得了快速发展&#xff0c;涌现了多个具有代表性的平台&#xff0c;诸如百度的飞桨&#xff08;PaddlePaddle&#xff09;、阿里的达摩院M6、华为的MindSpore、腾讯…

JMeter详细介绍和相关概念

JMeter是一款开源的、强大的、用于进行性能测试和功能测试的Java应用程序。 本篇承接上一篇 JMeter快速入门示例 &#xff0c; 对该篇中出现的相关概念进行详细介绍。 JMeter测试计划 测试计划名称和注释&#xff1a;整个测试脚本保存的名称&#xff0c;以及对该测试计划的注…

【日志】Unity3D模型导入基本问题以及浅谈游戏框架

2024.10.22 真正的谦逊从来不是人与人面对时的谦卑&#xff0c;而是当你回头看那个曾经的自己时&#xff0c;依旧保持肯定与欣赏。 【力扣刷题】 暂无 【数据结构】 暂无 【Unity】 导入外部模型资源报错问题 在导入外部资源包的时候一般都会报错&#xff0c;不是这个资源模…

NVR小程序接入平台/设备EasyNVR多品牌NVR管理工具/设备的多维拓展与灵活应用

在数字化安防时代&#xff0c;NVR批量管理软件/平台EasyNVR作为一种先进的视频监控系统设备&#xff0c;正逐步成为各个领域监控解决方案的首选。NVR批量管理软件/平台EasyNVR作为一款基于端-边-云一体化架构的国标视频融合云平台&#xff0c;凭借其部署简单轻量、功能多样、兼…

优化多表联表查询的常见方法归纳

目录 一、使用mybatis的嵌套查询 二、添加表冗余字段&#xff0c;减少联表查询需求 三、分表预处理&#xff0c;前端再匹配 一、使用mybatis的嵌套查询 【场景说明】 前端需要展示一张列表&#xff0c;其中的字段来源于多张表&#xff0c;如何进行查询优化&#xff1f; 【…

鸿蒙网络编程系列32-基于拦截器的性能监控示例

1. 拦截器简介 在Web开发中拦截器是一种非常有用的模式&#xff0c;它允许开发者在请求发送到服务器之前或响应返回给客户端之前执行一些预处理或后处理操作。这种机制特别适用于需要对所有网络请求或响应进行统一处理的情况&#xff0c;比如添加全局错误处理、请求头的修改、…

PostgreSQL中触发器递归的处理 | 翻译

许多初学者在某个时候都会陷入触发器递归的陷阱。通常&#xff0c;解决方案是完全避免递归。但对于某些用例&#xff0c;您可能必须处理触发器递归。本文将告诉您有关该主题需要了解的内容。如果您曾经被错误消息“超出堆栈深度限制”所困扰&#xff0c;那么这里就是解决方案。…

电脑视频剪辑大比拼,谁更胜一筹?

随着短视频的火爆&#xff0c;越来越多的人开始尝试自己动手制作视频&#xff0c;无论是记录生活点滴还是创作个性短片&#xff0c;一款好用的视频剪辑软件是必不可少的。今天&#xff0c;我们就从短视频运营的角度&#xff0c;来聊聊几款热门的电脑视频剪辑软件&#xff0c;看…

FineReport 数据筛选过滤

从大量的数据当中&#xff0c;获取到符合条件的数据&#xff0c;经常会使用到数据筛选过滤功能&#xff0c;在FineReort产品中实现筛选过滤的方法有三种 1&#xff09;直接通过 SQL 语句取出满足条件的的数据&#xff0c;如修改数据集 SQL 语句为&#xff1a;SELECT * FROM 订单…

YOLOv8改进,YOLOv8采用WTConv卷积(感受野的小波卷积),二次创新C2f结构,ECCV 2024

摘要 WTConv(基于小波变换的卷积层),用于在卷积神经网络(CNN)中实现大感受野。作者通过利用小波变换,设计了一个卷积层,可以在保持少量可训练参数的情况下大幅扩大感受野。WTConv 被设计为可以无缝替换现有 CNN 架构中的深度卷积层,适用于图像分类、语义分割、物体检测…

Vue-插槽slot

当我们封装一个组件时&#xff0c;不希望里面的内容写死&#xff0c;希望使用的时候能够自定义里面的内容&#xff0c;这时我们就需要使用到插槽 插槽是什么呢 插槽是子组件提供给父组件的一个占位符&#xff0c;用slot标签表示&#xff0c;父组件可以在这个标签填写任何模板代…

3DMAX碎片生成器插件FragmentGenerator使用方法

3DMAX碎片生成器FragmentGenerator插件&#xff0c;主要应用于科研绘图方面&#xff0c;一键从选择对象体积上生成若干不规则大小凌乱排列的三角形面。 【适用版本】 3dMax2015 – 2025&#xff08;不仅限于此范围&#xff09; 【安装方法】 FragmentGenerator插件无需安装&a…

基于vue框架的的二手数码产品回收管理系统bodx1(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,产品分类,产品信息,预约回收,回收员,产品回收 开题报告内容 基于Vue框架的二手数码产品回收管理系统开题报告 一、课题背景及意义 随着科技的快速发展和消费者生活水平的提高&#xff0c;数码产品的更新换代速度日益加快&#x…

网络安全中的日志审计:为何至关重要?

在数字化时代&#xff0c;网络安全已成为企业和组织不可忽视的重要议题。随着网络攻击手段的不断进化&#xff0c;保护信息系统和数据安全变得日益复杂和具有挑战性。在这种背景下&#xff0c;日志审计作为一种关键的信息安全和网络管理工具&#xff0c;发挥着至关重要的作用。…

软考(网工)——局域网和城域网

文章目录 &#x1f550;局域网基础1️⃣局域网和城域网体系架构 IEEE&#xff08;负责链路层&#xff09;2️⃣局域网拓扑结构 &#x1f551;CSMA/CD1️⃣CSMA/CD2️⃣CSMA/CD三种监听算法3️⃣冲突检测原理 &#x1f552;二进制指数退避算法1️⃣ 二进制指数退避算法 &#x1…

envoyFilter导致的webSockets协议无法正常工作

一、背景 生产项目有一个socket请求经过网关一直无法响应&#xff0c;其它接口服务都能正常处理。 二、 处理过程 让租户提供对应的模拟请求接口&#xff0c;然后进行模拟请求测试&#xff0c;并查看envoy网关日志&#xff0c;发现在发起请求时&#xff0c;envoy网关日志是无法…

解密 Redis:如何通过 IO 多路复用征服高并发挑战!

文章目录 一、什么是 IO 多路复用&#xff1f;二、为什么 Redis 要使用 IO 多路复用&#xff1f;三、Redis 如何实现 IO 多路复用&#xff1f;四、IO 多路复用的核心机制&#xff1a;epoll五、IO 多路复用在 Redis 中的工作流程六、IO 多路复用的优点七、IO 多路复用使用中的注…