用JAVA写人工智能应用_JAVA_AI

目录

​编辑

Java AI 介绍:Spring AI - Java领域的AI开发新利器

Spring AI 扩展:Spring AI Alibaba,简化Java应用AI集成

SpringBoot集成阿里云AI服务:构建对话应用指南

基于SpringBoot集成Spring AI Alibaba

1. 环境准备

2. 获取API Key

3. 配置环境变量

4. 添加依赖项

5. 创建Controller处理逻辑

6. 使用Prompt功能

搭建React前端与后端交互:实时聊天应用实例

构建项目并填写代码

public/index.html

src/index.js

src/App.js

src/components/ChatComponent.js

运行项目


Java AI 介绍:Spring AI - Java领域的AI开发新利器

Spring AI的诞生主要为了解决过去Java在处理AI相关任务时缺乏一个类似于Python中LangChain这样的高效框架的问题。随着GPT等大型语言模型的发展,对于能够便捷地与这些模型交互的需求日益增长。Spring团队基于此背景,结合了Java语言的特点和优势,开发出了一套高度抽象且易于集成的解决方案——Spring AI。它不仅提供了标准化的方式让开发者可以轻松切换不同的AI服务提供商(如阿里云、OpenAI等),还支持流式输出,使得构建复杂的应用程序变得更为简单直接。通过这一框架,Java开发者现在也能够以更低的成本享受到先进的AI能力。

Spring AI 扩展:Spring AI Alibaba,简化Java应用AI集成

Spring AI Alibaba是基于Spring Cloud Alibaba的一个扩展项目,专为集成AI能力而设计。它通过提供一系列简洁的API和工具,使得开发者能够轻松地在Java应用程序中接入阿里云的通义大模型等高级AI服务,如文本生成、图像生成及语音转换等功能。借助Spring AI Alibaba,用户可以利用标准的POJO结构进行开发,同时支持多种AI服务提供商(包括但不限于OpenAI),只需简单配置更改即可切换不同的后端实现。这一框架还兼容了流式数据处理,非常适合构建聊天机器人或其他需要实时响应的应用程序。其核心优势在于简化了复杂的AI集成过程,极大提升了开发效率,并降低了迁移成本。

SpringBoot集成阿里云AI服务:构建对话应用指南

基于SpringBoot集成Spring AI Alibaba

根据提供的我了解的信息,为了构建一个基于Spring Boot的项目,该项目能够利用Spring AI Alibaba来实现与阿里云通义大模型进行对话的功能,并且通过GET接口以流的方式返回Flux<String>格式的数据,支持CORS跨域请求,具体步骤如下:

1. 环境准备
  • JDK版本:确保你的开发环境使用的是JDK 17或更高。
  • Spring Boot版本:保证项目的Spring Boot版本为3.3.x。
2. 获取API Key
  • 访问阿里云百炼页面,登录您的阿里云账号后,选择开通“百炼大模型推理”服务。完成服务开通并获取短信通知后,进入控制台创建一个新的API Key。请保存好这个Key,它将在后续配置中使用。
3. 配置环境变量

在系统环境变量中设置刚刚获得的API Key:

export AI_DASHSCOPE_API_KEY=您的API-KEY

同时,在application.properties文件中添加以下行来引用环境变量中的API Key值:

spring.ai.dashscope.api-key=${AI_DASHSCOPE_API_KEY}
4. 添加依赖项

由于Spring AI Alibaba尚未正式发布到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>

<!-- Spring Boot父级项目 -->
<parent>
    <groupId>org.springframework.boot</groupId>

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

    <version>3.3.4</version>

    <relativePath/>
</parent>

<dependencies>
    <!-- Spring AI Alibaba启动器 -->
    <dependency>
        <groupId>com.alibaba.cloud.ai</groupId>

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

        <version>1.0.0-M2</version>

    </dependency>

    <!-- 其他依赖... -->
</dependencies>
5. 创建Controller处理逻辑

定义一个REST控制器来处理聊天请求。在此例中,我们将提供一个接受用户输入并通过流式方式响应的GET端点。

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

    private final ChatClient chatClient;

    @Autowired
    public ChatController(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();
    }
}
6. 使用Prompt功能

如果希望使用预定义的Prompt模板,则可以按照下面的方式进一步扩展上述代码:

  • 在resources目录下创建prompt文件,例如classpath:/prompts/greeting.st:
Hello, {name}! How can I assist you today?
  • 修改控制器方法以读取并应用该模板:
@Value("classpath:/prompts/greeting.st")
private Resource greetingResource;

@GetMapping(value = "/steamChat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> steamChat(@RequestParam String name) {
    PromptTemplate promptTemplate = new PromptTemplate(greetingResource);
    Prompt prompt = promptTemplate.create(Map.of("name", name));
    return chatClient.prompt(prompt).stream().content();
}

以上步骤详细介绍了如何从零开始搭建一个集成了Spring AI Alibaba功能的小型Spring Boot应用程序。这包括了从基础环境配置、依赖管理到实际编写REST API的过程,特别是强调了如何利用ChatClient及自定义Prompts实现文本生成服务。

搭建React前端与后端交互:实时聊天应用实例

构建项目并填写代码

首先,创建一个新的 React 应用并安装所需的依赖:

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

这个文件不需要进行修改,它已经默认为你准备好了基本的HTML结构。

src/index.js

这个文件也不需要进行大的改动,保持其默认内容即可。这将作为React应用的入口点。

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

这里定义了应用程序的主要组件树,对于我们的需求来说,只需引入即将创建的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方法向后端发送请求,并通过流的方式接收数据。

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 {
      // 发送GET请求到指定URL,携带输入文本作为参数
      const response = await fetch(`http://localhost:8080/ai/steamChat?input=${input}`);
      if (!response.ok) throw new Error(response.statusText);

      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);  // 更新状态以反映接收到的新消息
      }

      // 在每次请求完成后添加换行符
      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;

运行项目

  1. 启动前端开发服务器:
cd frontend
npm start

上述步骤描述了一个简单的基于React的前端应用,该应用能够与返回Flux<String>类型的后端服务通信。通过fetchAPI从后端获取流式响应,并实时更新UI来展示来自后端的消息。此实现方式适用于任何提供类似RESTful API且支持CORS策略的后端服务。请注意确保你的后端服务配置允许跨域资源共享(CORS),否则前端可能无法成功发起请求。

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

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

相关文章

JavaScript将array数据下载到Excel中

具体代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widt…

【Windows命令】Windows下启动Nginx后,在任务管理器里面没有发现nginx.exe进程

如题&#xff0c;当在本地Windows环境下想用反向代理时&#xff0c;突然发现在任务管理器里面没有发现nginx.exe进程&#xff0c;但是端口又是占用的。这时就要用Windows命令了。 查询端口占用 netstat -ano | findstr :80 根据进程ID&#xff08;pid&#xff09;查询进程名称…

Java_EE(反射技术)

反射机制介绍: 什么是反射Java反射机制是Java语言一个很重要的特性&#xff0c;它使得Java具有了“动态性”。在Java程序运行时&#xff0c;对于任意的一个类&#xff0c;我们能不能知道这个类有哪些属性和方法呢&#xff1f;对于任意的一个对象&#xff0c;我们又能不能调用它…

IOS APP初体验-第2课:给Iphone App设置个ICON

目录 第一步、图片尺寸 第二步、找到项目内Assets节点&#xff0c;把自己的图片复制进来 第三步、图片设置 第四步、启动项目真机调试 第一步、图片尺寸 设置一张图片&#xff0c;要求图片格式JPG&#xff0c;图片尺寸1024px*1024px。 第二步、找到项目内Assets节点&#…

2024腾讯全球数字生态大会 | 线上直播活动参与教程

2024腾讯全球数字生态大会 | 线上直播活动参与教程 9月5-6日,2024腾讯全球数字生态大会,共见最新 全景式产品服务矩阵,了解智能科技如何成本优化、 生产提效、重塑商业生态、加速全球布局。 大会亮点 100大咖趋势洞察 100专业白皮书 100开发者活动福利 体验丰富前沿智能应用落…

SCALABLEANDEFFECTIVE IMPLICIT GRAPH NEURALNETWORKS ON LARGEGRAPHS

ICLR24 推荐指数&#xff1a; #paper/⭐⭐ 领域&#xff1a; 大图&#xff0c;图扩展 大概的工作&#xff1a;提出了针对子图的虚拟节点&#xff0c;让所有点都与其相连 相关工作&#xff1a; 传统GNN与Inplicit gnn 传统GNN的传播函数&#xff1a; Z ( l 1 ) ϕ ( W ( …

Linux常用功能整合

Linux Linux 前言一、常用操作以及概念 快捷键求助关机PATHsudo包管理工具发行版VIM 三个模式GNU开源协议 二、磁盘 磁盘接口磁盘的文件名 三、分区 分区表开机检测程序 四、文件系统 分区与文件系统组成文件读取磁盘碎片blockinode目录日志挂载目录配置 五、文件 文件属性文件…

01 Solidity--

第一个 Solidity 程序 Solidity 是一种用于编写以太坊虚拟机&#xff08;EVM&#xff09;智能合约的编程语言。 掌握 Solidity 是参与链上项目的必备技能 在 Remix 中&#xff0c;左侧菜单有三个按钮&#xff0c;分别对应文件&#xff08;编写代码&#xff09;、编译&#x…

Spring ApplicationContext初始化过程

Spring-01篇章 一、Spring 简介 Spring是一个开源的Java平台&#xff0c;它提供了全面的基础设施支持来帮助Java开发者更容易地开发Java应用程序。Spring框架的核心特点是依赖注入&#xff08;DI&#xff09;和面向切面编程&#xff08;AOP&#xff09;&#xff0c;这些使得开…

【H2O2|全栈】JS入门知识(一)

目录 JS入门 前言 准备工作 JS标签和文件 变量 数据类型 字符串 变量的交换 数据类型获取 数据类型转换 面试题 提问框和提示框 提问框 提示框 ​编辑​编辑控制台输出 ​编辑转义字符 结束语 JS入门 前言 本系列博客主要分享JavaScript的基础语法知识&…

RNA-seq全流程

第一部分&#xff1a;脚本的初始设置与参数解析 #!/bin/bash# 检查输入参数 if [ "$#" -lt 1 ]; thenecho "Usage: $0 -f <sample_file> -d <data_directory> -s <script_directory> -g <group_file>"exit 1 fi# 使用 R 语言的 a…

2025推荐选题|基于Springboot和vue的智慧阅读管理系统

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…

Java - WebSocket

一、WebSocket 1.1、WebSocket概念 WebSocket是一种协议&#xff0c;用于在Web应用程序和服务器之间建立实时、双向的通信连接。它通过一个单一的TCP连接提供了持久化连接&#xff0c;这使得Web应用程序可以更加实时地传递数据。WebSocket协议最初由W3C开发&#xff0c;并于2…

【CSS】houdini自定义CSS属性实现渐变色旋转动画

现有一段代码&#xff0c;在不旋转整个元素的前提下&#xff0c;渐变背景无法应用动画 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initia…

专业模拟训练头显,Varjo XR-4 如何开启虚拟仿真新模拟时代

虚拟仿真模拟训练是提升技能熟练度与工作安全性的有效解决方案&#xff0c;Varjo XR-4作为专业模拟训练头显&#xff0c;凭借其出色的技术特性和性能&#xff0c;正在引领虚拟仿真模拟训练进入一个全新的时代。 一、卓越的视觉体验 高分辨率显示器&#xff1a;Varjo XR-4配备…

计算机毕业设计 基于Python的美术馆预约系统的设计与实现 Python毕业设计 Python毕业设计选题【附源码+安装调试】

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

三子棋(C 语言)

目录 一、游戏设计的整体思路二、各个步骤的代码实现1. 菜单及循环选择的实现2. 棋盘的初始化和显示3. 轮流下棋及结果判断实现4. 结果判断实现 三、所有代码四、总结 一、游戏设计的整体思路 &#xff08;1&#xff09;提供一个菜单让玩家选择人机对战、玩家对战或者退出游戏…

大厂面试真题-组合和聚合的区别是什么

组合和聚合比较类似&#xff0c;二者都表示整体和部分之间的关系。 聚合关系的特点是&#xff1a;整体由部分构成&#xff0c;但是整体和部分之间并不是强依赖的关系&#xff0c;而是弱依 赖的关系&#xff0c;也就是说&#xff0c;即使整体不存在了&#xff0c;部分仍然存在…

Zabbix监控vCenter虚拟机

1. vcenter上配置snmp agent 如果配置 vCenter Server Appliance SNMP 代理以用于轮询,则它可以侦听和响应来自 SNMP 管理客户端系统的请求,如 GET、GETNEXT 和 GETBULK 请求. 使用root身份进入vcenter命令行,开启snmp代理 Command> snmp.enable Command> snmp.set…

正则表达式 | Python、Julia 和 Shell 语法详解

正则表达式在网页爬虫、脚本编写等众多任务中都有重要的应用。为了系统梳理其语法&#xff0c;以及 Python、Julia 和 Shell 中与正则表达式相关的工具&#xff0c;本篇将进行详细介绍。 相关学习资源&#xff1a;编程胶囊。 基础语法 通用语法 在大多数支持正则表达式的语…