本文主要是帮你能够快速的了解如何用java做人工智能编程 。

有详细可执行的例子,你可以参考

用Java做人工智能编程 _java_人工智能_编程_API


Spring AI:简化Java大模型调用的标准化框架

在当前Java调用大模型时,缺乏一个成熟且易于使用的AI应用框架。Spring作为老牌的Java应用框架提供商,提出了Spring AI来解决这个问题。Spring AI借鉴了langchain的核心理念,并结合了Java面向对象编程的特点,提供了一个标准化、模块化的解决方案。通过统一接口和随时可替换实现的方式,开发者可以轻松切换不同的AI提供者(如OpenAI、阿里云等),并享受专门团队的支持与维护。本次样例将以Spring AI Alibaba接入通义大模型为例进行说明,但开发者也可以根据需求更换为其他Java大模型实现。这种方式不仅简化了开发流程,还提高了代码复用性和灵活性。

Spring AI Alibaba简介及其AI服务优化

Spring AI Alibaba 是 Spring AI 的一个具体实现,它将 Spring 生态系统的设计原则应用到了AI领域,并特别针对阿里云的AI服务进行了优化。与 Spring Cloud Alibaba 类似,Spring AI Alibaba 整合了阿里的最佳实践,为开发者提供了一套简洁且强大的工具来快速构建和部署AI应用程序。作为国内最好的Spring AI实现之一,Spring AI Alibaba 支持多种AI能力的集成,包括但不限于模型调用、Prompt模板定义、检索增强生成(RAG)、文生图以及图像识别等。通过本文我们将重点介绍如何利用Prompt模板和模型调用来接入Spring AI Alibaba,展示其在简化AI功能开发过程中的强大作用。

通义千问Qwen简介:

通义千问Qwen是阿里巴巴云开发的大型语言模型,在MMLU、TheoremQA、GPQA等基准测评中表现出色,超越了Llama 3 70B。该模型在Hugging Face开源大模型排行榜Open LLM Leaderboard上位居榜首,展示了其卓越的能力和性能。

用Java做人工智能编程 _java_人工智能_编程_API_02


基于SpringBoot整合Spring AI Alibaba实现对话模型与流式返回接口

基于SpringBoot集成Spring AI Alibaba以完成一个简单的对话模型,并构建支持prompt的流返回接口项目,需要按以下步骤操作:

1. 确认环境要求

  • 确保你的JDK版本在jdk17(含)以上。
  • 确保你的Spring Boot版本在3.3.x以上。

2. 获取通义千问API Key

访问阿里云百炼页面,登录您的阿里云账号,选择开通“百炼大模型推理”服务。成功开通后,创建一个新的API Key并妥善保存,这个key将用于配置与阿里云AI平台的通信。

3. 配置API Key

设置环境变量或直接在application.properties文件中添加如下行来配置API Key:

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

请将${YOUR_API_KEY}替换为你从阿里云获得的实际API Key值。

4. 添加Maven仓库和依赖

由于Spring AI Alibaba尚未提交至Maven中心仓库,你需要添加Spring官方提供的仓库到你的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文件里加入spring-ai-alibaba-starter依赖以及Spring Boot父依赖:

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

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

    <version>3.3.4</version>

    <relativePath/>
</parent>

<dependencies>
    <dependency>
      <groupId></groupId>

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

      <version>1.0.0-M2</version>

    </dependency>

    <!-- 其他依赖 -->
</dependencies>

5. 创建Controller及注入ChatClient

定义一个REST控制器ChatController,通过构造器注入ChatClient,并且实现一个GET方法处理请求,该方法接受用户输入并通过Flux返回响应流。同时启用跨域资源共享(CORS)支持。

import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import .ChatClient;

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

    private final ChatClient chatClient;

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

    @GetMapping("/steamChat")
    public Flux<String> steamChat(@RequestParam String input) {
        return chatClient.prompt().user(input).stream().content();
    }
}

这里我们使用了chatClient.prompt().user(input).stream().content()来发送消息给AI模型,并以流的形式获取回复。

解释

上述代码片段首先通过ChatClient.Builder创建了一个ChatClient实例。然后,对于每一个进入/ai/steamChat路径下的GET请求,控制器会接收参数input作为用户输入,通过调用chatClient.prompt().user(input).stream().content()发送给AI模型处理,并立即开始返回模型生成的内容作为数据流。这种方式非常适合于实时交互场景,如聊天机器人应用。此外,通过注解@CrossOrigin(origins = "*")开启了CORS支持,使得此API可以从任何源发起请求,这对于开发阶段尤其有用。

构建前端项目

在构建一个基于React的支持流输出的前端项目时,我们首先需要创建一个新的React应用,并安装所需的依赖。接下来,我们将通过编写一系列的组件来实现一个简单的聊天应用程序,该程序能够处理从后端返回的数据流(假设后端接口URL为 http://localhost:8080/ai/steamChat?input=...)。下面将按照步骤详细介绍如何完成这个项目。

构建项目并填写代码

创建React应用及安装依赖

开始之前,请确保已经安装了Node.js环境。然后使用以下命令创建一个新的React应用并进入项目目录:

npx create-react-app frontend
cd frontend
npm install

这会初始化一个新的React项目,同时下载所有必要的包。

编辑HTML文件

编辑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>Chat App</title>

</head>

<body>
  <div id="root"></div>

</body>

</html>
修改入口JS文件

打开src/index.js,这是React应用的入口点。此处不需要做任何修改,它负责渲染<App />到页面上。

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,在这里我们将实现用户输入消息、发送请求以及接收流式响应的功能。

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}`);
      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((preMessages) => preMessages + chunk);
      }

      // 添加分隔符以便区分不同的对话回合
      setMessages((preMessages) => preMessages + '\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;

以上代码展示了如何创建一个简单的表单让用户输入消息,并通过调用后端API来获取数据流。每次接收到新数据时,都会更新状态变量messages,从而显示在界面上。

运行项目

完成上述配置与编码后,你可以通过执行以下命令启动开发服务器查看效果:

npm start

这样就完成了一个支持流式输出的基本React前端项目的搭建。请注意实际部署时可能还需要考虑跨域资源共享(CORS)等网络问题,确保前后端正确通信。