自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

有了 Spring AI ,Java 開發(fā)AI應(yīng)用也就簡單多了

開發(fā) 前端
Spring AI解決了AI集成的核心難題:即無縫連接企業(yè)數(shù)據(jù)、API與AI模型,同時也簡化了Java 開發(fā)人員對AI應(yīng)用的編程復(fù)雜度,還提供檢索增強生成 (RAG)、函數(shù)調(diào)用等關(guān)鍵功能。

前言

Spring 官方自從發(fā)布了 Spring AI,AI 界的門檻兒算是被徹底踹飛了!為什么?因為這就意味著整天只會 CRUD 的 Javaer 們也能開發(fā)AI應(yīng)用了,而且簡單到讓你懷疑人生。那么本文就基于 Spring AI Alibaba 開發(fā)一個簡單的 AI 對話應(yīng)用。

效果展示

Spring AI 實現(xiàn)的AI對話Spring AI 實現(xiàn)的AI對話

實現(xiàn)步驟

基于 Spring AI Alibaba 實現(xiàn)這樣一個AI對話非常簡單,只需要幾行代碼就可以完成??梢愿旅娴牟襟E操作:

創(chuàng)建一個 SpringBoot 項目

Spring AI Alibaba 提供了 SpringBoot starter。所以,第一步就是創(chuàng)建一個SpringBoot項目引入依賴以及配置。

pom.xml文件添加spring-ai-alibaba-starter依賴

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud.ai</groupId>
        <artifactId>spring-ai-alibaba-starter</artifactId>
        <version>1.0.0-M3.1</version>
    </dependency>
</dependencies>

application.yml添加;

server:
  port: 8080

spring:
  application:
    name: spring-ai-alibaba-chat
  ai:
    dashscope:
      api-key: xxxx

配置中的api-key是阿里云百煉大模型平臺的憑證,AI的實現(xiàn)最終會調(diào)用該模型。

api-key 申請

這里有兩個事項需要注意:

  1. Spring AI Alibaba 基于 Spring Boot 3.x 開發(fā),所以JDK 版本要求為 17 及以上。
  2. spring-ai 相關(guān)依賴包還沒有發(fā)布到中央倉庫,本地 Maven 倉庫要添加以下配置。
<repositories>
  <repository>
    <id>spring-milestones</id>
    <name>Spring Milestones</name>
    <url>https://repo.spring.io/milestone</url>
    <snapshots>
      <enabled>false</enabled>
    </snapshots>
  </repository>
</repositories>

編寫與大模型交互的 Controller

項目創(chuàng)建成功之后,只需要寫一個Controller就可以實現(xiàn)與AI對話,代碼如下:

@RestController
@RequestMapping("/ai")
public class AIChatController {

    private final ChatClient chatClient;
    
    public AIChatController(ChatClient.Builder builder) {
        this.chatClient = builder
                .build();
    }


    @GetMapping("/chat")
    public String chat(String message) {
        return this.chatClient.prompt()
                .user(message)
                .call()
                .content();
    }
}

代碼中的ChatClient類似于應(yīng)用程序開發(fā)中的服務(wù)層,只不過這里由spring-ai-alibaba-starter自動初始化了實例,可以直接提供 AI 服務(wù),最終會調(diào)用百煉大模型。

此時就可以啟動應(yīng)用,通過瀏覽器訪問localhost:8080/ai/chat?message= 進(jìn)行對話。

編寫通過頁面進(jìn)行對話的 html

為了直觀的展示效果,簡單實現(xiàn)一個前端和接口交互,通過頁面進(jìn)行AI對話。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <script src="js/marked.min.js"></script>
    <title></title>
    <style>
        body {
            background-color: #f8f9fa;
            font-family: Arial, sans-serif;
        }

        .container {
            margin: 50px auto;
            width: 800px;
            background-color: #fff;
            padding: 20px;
            border-radius: 5px;
            box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
        }

        h1 {
            text-align: center;
            margin-bottom: 30px;
        }

        label {
            display: block;
            margin-bottom: 10px;
            color: #333;
        }

        input[type="text"] {
            width: 85%;
            padding: 10px;
            border: 1px solid #ccc;
            border-radius: 3px;
        }

        input[type="submit"] {
            background-color: #2ecc71;
            color: #fff;
            border: none;
            padding: 10px 20px;
            border-radius: 3px;
            cursor: pointer;
            width: 10%;
        }

        .chat-box {
            width: 100%;
            height: 500px;
            padding: 10px;
            border: 1px solid #ccc;
            border-radius: 3px;
            overflow-y: scroll;
        }

        .message {
            margin-bottom: 10px;
            padding: 10px;
            background-color: #f1f1f1;
            border-radius: 3px;
        }

        .user-message {
            background-color: #2ecc71;
            color: #fff;
        }

        .bot-message {
            background-color: #e6aa6b;
            color: #fff;
        }

        .loader {
            text-align: center;
        }

        .loader::after {
            content: "";
            display: inline-block;
            width: 20px;
            height: 20px;
            border-radius: 50%;
            border: 2px solid #ccc;
            border-top-color: #2ecc71;
            animation: spin 1s infinite linear;
        }

        @keyframes spin {
            to {
                transform: rotate(360deg);
            }
        }
    </style>
</head>
<body>
<div class="container">
    <h1>AI 對話</h1>
    <form id="form" style="width: 47%;position: absolute;bottom: 150px;margin-left:15px">
        <input type="text" id="message" name="message" placeholder="輸入你的問題">
        <input type="submit" value="發(fā)送">
    </form>
    <br>
    <div id="loader" class="loader" style="display: none;"></div>
    <div id="chat-box" class="chat-box"></div>
</div>

<script>
    var loader = document.getElementById("loader");

    document.getElementById("form").addEventListener("submit", function(event) {
        event.preventDefault();

        var messageInput = document.getElementById("message");
        var message = messageInput.value;
        messageInput.value = "";

        var chatBox = document.getElementById("chat-box");

        var userMessage = document.createElement("div");
        userMessage.className = "message";
        userMessage.textContent = "我: " + message;
        chatBox.appendChild(userMessage);
        chatBox.scrollTop = chatBox.scrollHeight;

        loader.style.display = "block";

        var xhr = new XMLHttpRequest();
        xhr.open("GET", "http://localhost:8080/ai/chat?message=" + encodeURIComponent(message), true);
        xhr.onreadystatechange = function() {
            if (xhr.readyState === 4) {
                loader.style.display = "none";

                if (xhr.status === 200) {
                    var response = xhr.responseText;

                    var botMessage = document.createElement("div");
                    botMessage.className = "message bot-message";

                    var botMessageText = document.createElement("span");
                    botMessageText.className = "message-text";
                    botMessage.appendChild(botMessageText);
                    botMessageText.innerHTML = marked.marked(response);

                    chatBox.appendChild(botMessage);
                    chatBox.scrollTop = chatBox.scrollHeight;
                } else if (xhr.status === 400) {
                    var error = JSON.parse(xhr.responseText);

                    var errorMessage = document.createElement("div");
                    errorMessage.className = "message bot-message";
                    errorMessage.textContent = "Bot: " + error.message;
                    chatBox.appendChild(errorMessage);
                    chatBox.scrollTop = chatBox.scrollHeight;
                } else {
                    var errorMessage = document.createElement("div");
                    errorMessage.className = "message bot-message";
                    errorMessage.textContent = "Bot: Failed to connect to the backend service. Please make sure the backend service is running.";
                    chatBox.appendChild(errorMessage);
                    chatBox.scrollTop = chatBox.scrollHeight;
                }
            }
        };

        xhr.onloadstart = function() {
            loader.style.display = "block";
        };

        xhr.onloadend = function() {
            loader.style.display = "none";
        };

        xhr.send();
    });
</script>
</body>
</html>

js 引入的 marked.min.js 可以去GitHub或者聯(lián)系我獲取。

至此,就實現(xiàn)了文中開頭的AI對話效果。

需要了解的基本知識

上面的示例其實就是一個SpringBoot項目,對于Javaer肯定不陌生。而對于沒有人工智能相關(guān)背景的人來說,如果想要基于 Spring AI 開發(fā)一個AI應(yīng)用產(chǎn)品,還是需要了解一些基本概念的。

  • AI 模型:AI 模型是旨在處理和生成信息的算法,通常模仿人類的認(rèn)知功能。我們現(xiàn)在基本上聽到的大模型都屬于生成式AI模型,例如ChatGPT、文心一言、通義千問、混元、豆包等。
  • Prompt:提示詞作為生成式大模型的輸入,可以指導(dǎo)模型生成特定的輸出。如果搭建過智能體就會知道,創(chuàng)建一個智能體首先要設(shè)置一些提示詞。
  • Token:token作為 AI 模型工作原理的基石,輸入時,模型將單詞轉(zhuǎn)換為token,輸出時,將token轉(zhuǎn)換回單詞。在現(xiàn)在的AI模型背景下,token就相當(dāng)于金錢,一次調(diào)用的費用就越高。
  • 模型的認(rèn)知:一個模型的誕生需要在海量的訓(xùn)練集中進(jìn)行學(xué)習(xí),所以它的認(rèn)知中沒有未來的知識。如果想讓模型對現(xiàn)有知識產(chǎn)生認(rèn)知,有微調(diào)、檢索增強生成 (RAG)、函數(shù)調(diào)用這幾種方式。

對于本文示例中來說,每一次的對話就是模型的一次token輸入和輸出。

實現(xiàn)有記憶的對話

如果運行了上面的示例,并且進(jìn)行了幾輪對話,會發(fā)現(xiàn)大模型并不會理解上下文,也無法實現(xiàn)連貫的對話。

就如上面所說的“模型的認(rèn)知”,大模型不會記錄對話,所以不會產(chǎn)生上下文關(guān)聯(lián)。例如我接下來的問答中,并沒有按照我的提問生成“冒險的”故事,只是“冒險的”進(jìn)行了說明。

Spring AI 實現(xiàn)的AI對話Spring AI 實現(xiàn)的AI對話

那如何讓大模型能夠追蹤、理解并利用先前對話上下文的能力?

spring-ai 支持基于chat memory的對話記憶。在上面的代碼中,只需要在構(gòu)建chatClient時添加兩行代碼。

private ChatMemory chatMemory = new InMemoryChatMemory();                                            
                                                                                                     
public AIChatController(ChatClient.Builder builder) {                                                
    this.chatClient = builder                                                                        
            .defaultAdvisors(new MessageChatMemoryAdvisor(chatMemory, UUID.randomUUID().toString(), 10))
            .build();                                                                                
}

UUID 會作為此次對話的唯一標(biāo)識,ChatMemory會將之前的對話內(nèi)容記錄下來,每次對模型的輸入就是歷史的對話記錄,最終實現(xiàn)對話記憶。

這種做法最終會影響使用大模型的成本,就如上面所說,輸入和輸出都會影響總token數(shù)量,而token就相當(dāng)于金錢。

總結(jié)

Spring AI解決了AI集成的核心難題:即無縫連接企業(yè)數(shù)據(jù)、API與AI模型,同時也簡化了Java 開發(fā)人員對AI應(yīng)用的編程復(fù)雜度,還提供檢索增強生成 (RAG)、函數(shù)調(diào)用等關(guān)鍵功能。對于Java 開發(fā)人員來講,通過 Spring AI 可以探索更多的 AI 應(yīng)用場景。

責(zé)任編輯:武曉燕 來源: Hi程序員
相關(guān)推薦

2020-06-29 11:24:39

華為云

2020-12-14 13:39:39

AI人工智能算法

2020-12-14 15:26:38

AIAI算法

2025-03-31 09:30:52

2024-11-12 13:41:49

2023-06-19 09:01:17

2021-01-19 12:46:45

鴻蒙HarmonyOSHelloworld

2021-12-27 11:29:17

AI集成程序

2021-11-30 08:04:32

AIIT運維

2025-03-31 00:44:00

JavaAI開發(fā)

2025-02-19 12:00:00

SpringBootDeepSeekAI

2021-01-15 11:36:16

鴻蒙HarmonyOSAI應(yīng)用

2021-01-15 09:50:06

鴻蒙HarmonyOSAI應(yīng)用

2021-01-14 12:06:22

鴻蒙HarmonyOSAI應(yīng)用

2021-01-25 09:58:01

鴻蒙HarmonyOS應(yīng)用開發(fā)

2024-11-26 09:50:18

AIjs 工具庫前端開發(fā)

2024-06-07 13:11:44

2025-04-11 08:45:00

2021-12-13 14:03:08

工作站數(shù)據(jù)科學(xué)元宇宙
點贊
收藏

51CTO技術(shù)棧公眾號