目錄
目的
實作前
提示詞
概念验证
项目设置
代码实现
Spring AI 集成
客户端 - Spring Boot应用程序通信
客户端 - Open AI 通信
调整和观察
结论
首頁 科技週邊 人工智慧 利用Spring Boot以及Spring AI建構生成式人工智慧應用

利用Spring Boot以及Spring AI建構生成式人工智慧應用

Apr 28, 2024 am 11:46 AM
ai spring spring框架 gen ai

Spring AI作為行業領導者,透過其強大、靈活的API和先進的功能,為各種行業提供了領先性的解決方案。在本專題中,我們將深入探討Spring AI在各領域的應用範例,每個案例都將展示Spring AI如何滿足特定需求,實現目標,並將這些LESSONS LEARNED擴展到更廣泛的應用。希望這個專題能對你有所啟發,更深入地理解和利用Spring AI的無限可能。

Spring框架在軟體開發領域已經有超過20年的歷史,自Spring Boot 1.0版本發布以來已有10年。現在,無人會質疑,Spring創造了一種獨特的風格,使開發者從重複任務中解放出來,專注於提供業務價值。隨著時間的推移,Spring的技術深度不斷增強,涵蓋了廣泛的開發領域和技術。另一方面,隨著更多的專用解決方案被嘗試,概念的驗證被創建,而最終在專案的保護下得到推廣,其技術廣度不斷擴大。

Spring AI專案是一個實例,根據其參考文檔,該專案旨在簡化當生成式人工智慧層需求被引入應用時的開發過程。開發者再次從重複任務中解放出來,可以直接透過簡單的介面與預先訓練的模型(包含實際處理演算法)進行互動。

透過直接透過Spring AI程式設計方式與生成式預訓練的轉換器(GPTs)交互,使用者(開發者)不需要擁有廣泛的機器學習知識。但身為工程師,我強烈認為,即使這些開發者工具可以方便快速地使用並產生結果,我建議我們需要克制自己,警覺觀察察嘗試先理解基本概念。此外,透過遵循這條路徑,產出的結果可能會更有價值。

目的

本文介紹如何將 Spring AI 整合到 Spring Boot 應用,並與 OpenAI 進行程式設計互動。我們假設設計一般來說是一種最先進的活動。因此,在實驗過程中所使用的prompt具有教導性,但應用性不大。此處的重點是通訊接口,即 Spring AI API。

實作前

首先要明確自體使用GPT解決方案的理由,除了希望提供更好的質量,節省時間和降低成本。

生產式人工智慧據說擅長執行大量耗時的任務,速度更快,效率更高,產生結果。此外,如果這些結果進一步經過經驗豐富且智慧的人類驗證,獲得有用結果的可能性會增加。

接下來,應抵抗立即跳入實施的誘惑,至少要花一些時間熟悉一下一般概念。對生成式人工智慧概念的深入探索遠遠超出了本文的範圍。然而,出現在互動中的「主要角色」在下面簡要描述。

舞台 - 生成式人工智慧是人工智慧的一部分
輸入 - 提供的資料(輸入)
輸出 - 計算結果(輸出)
大型語言模型(LLM)- 根據解釋的輸入產生輸出的微調演算法
提示詞- 一種最先進的接口,透過它將輸入傳入模型
提示詞模板 - 允許構造結構化參數化提示的組件
令牌 - 演算法在內部將輸入轉換為令牌,然後使用這些令牌來編譯結果,並最終從中構造輸出
模型的環境視窗- 模型限制每次調用的令牌數量的閾值(通常,使用的令牌越多,操作就越昂貴)

最後,可以開始實施,但隨著實施的進行,建議回顧和優化前兩個步驟。

提示詞

在本次練習中,我們要求如下:

Write {count = three} reasons why people in {location = Romania} should consider a {job = software architect} job. These reasons need to be short, so they fit on a poster. For instance, "{job} jobs are rewarding."
登入後複製

上面内容代表了提示词模板。按照建议,应作为提示词的一部分提供清晰的主题,清晰的任务含义以及额外的有用信息,以提高结果的准确性。

提示词包含三个参数

count - 希望作为输出的原因数量
job - 感兴趣的领域或工作
location - 工作申请者所在的国家,城镇,地区等

概念验证

在这篇文章中,简单的概念验证目标如下:

将 Spring AI 集成到Spring Boot应用程序并使用它
允许客户端通过应用程序与 Open AI 进行通信
客户端向应用程序发出参数化的HTTP请求
应用程序使用一个提示词来创建输入,发送给 Open AI 并获取输出
应用程序将响应发送给客户端

利用Spring Boot以及Spring AI构建生成式人工智能应用图片

项目设置

Java 21
Maven 3.9.2
Spring Boot – v. 3.2.2
Spring AI – v. 0.8.0-SNAPSHOT (仍在开发,实验性)

代码实现

Spring AI 集成

通常,这是一个基本步骤,不一定值得一提。然而,因为 Spring AI 目前以快照形式发布,为了能够集成 Open AI 自动配置依赖,你需要添加一个引用到 Spring 快照仓库。

<repositories><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-ai-openai-spring-boot-starter Maven 依赖项。

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId><version>0.8.0-SNAPSHOT</version></dependency>
登入後複製

Open AI ChatClient 现在是应用程序类路径的一部分。它是用来向 Open AI 发送输入并获取输出的组件。

为了能够连接到AI模型,需要在 application.properties 文件中设置 spring.ai.openai.api-key 属性。

spring.ai.openai.api-key = api-key-value
登入後複製

它的值代表了用户的有效API密钥,用户将通过此密钥进行通信。通过访问[资源2],可以注册或登录并生成一个。

客户端 - Spring Boot应用程序通信

概念验证的第一部分是客户端应用程序(例如浏览器,curl等)与开发的应用程序之间的通信。这是通过一个 REST 控制器实现的,可以通过HTTP GET请求访问。

URL路径是 /job-reasons,还有之前在定义提示时概述的三个参数,这将导致如下格式:

/job-reasons?count={count}&job={job}&locatinotallow={location}
登入後複製

和相应的控制器:

@RestControllerpublic class OpenAiController { @GetMapping("/job-reasons")public ResponseEntity<String> jobReasons(@RequestParam(value = "count", required = false, defaultValue = "3") int count, @RequestParam("job") String job, @RequestParam("location") String location) {return ResponseEntity.ok().build();}}
登入後複製

由于来自 Open AI 的响应将是一个字符串,因此控制器返回一个封装了字符串的ResponseEntity。如果我们运行应用程序并发出请求,当前响应体部分没有返回任何内容。

客户端 - Open AI 通信

Spring AI 目前主要关注处理语言并产生语言或数字的AI模型。在前一类别中, Open AI 模型的例子包括GPT4-openai或GPT3.5-openai。

为了与这些AI模型(实际上是指 Open AI 算法)进行交互, Spring AI 提供了一个统一的接口。

ChatClient接口目前支持文本输入和输出,并具有简单的契约。

@FunctionalInterfacepublic interface ChatClient extends ModelClient<Prompt, ChatResponse> {default String call(String message) {Prompt prompt = new Prompt(new UserMessage(message));return call(prompt).getResult().getOutput().getContent();} ChatResponse call(Prompt prompt);}
登入後複製

确实如此,功能接口的实际方法通常是被使用的方法。

在我们的概念验证中,这正是我们所需要的,一种调用 Open AI 并发送目标参数化 Prompt 作为参数的方式。我们定义了以下的OpenAiService,在其中注入了一个 ChatClient 的实例。

@Servicepublic class OpenAiService { private final ChatClient client; public OpenAiService(OpenAiChatClient aiClient) {this.client = aiClient;} public String jobReasons(int count, String domain, String location) {final String promptText = """Write {count} reasons why people in {location} should consider a {job} job.These reasons need to be short, so they fit on a poster.For instance, "{job} jobs are rewarding.""""; final PromptTemplate promptTemplate = new PromptTemplate(promptText);promptTemplate.add("count", count);promptTemplate.add("job", domain);promptTemplate.add("location", location); ChatResponse response = client.call(promptTemplate.create());return response.getResult().getOutput().getContent();}}
登入後複製

如果应用程序正在运行,那么可以从浏览器执行以下请求:

http://localhost:8080/gen-ai/job-reasons?count=3&job=software%20architect&locatinotallow=Romania
登入後複製

这下面的结果被检索出来的结果:

利润丰裕的职业:软件架构师的工作提供了有竞争力的薪酬和出色的增长机会,确保在罗马尼亚的财务稳定和成功。
热门职业:随着技术需求的持续增长,软件架构师在罗马尼亚和全世界都备受追捧,提供了丰富的就业前景和就业保障。
创造性问题解决:软件架构师在设计和开发创新软件解决方案中扮演着至关重要的角色,使他们可以释放他们的创造力,并对各种行业产生重大影响。

这就是我们所期望的——一个简易的接口,通过它,可以要求 Open AI GPT模型写出一些原因,解释为何在特定地点的特定工作具有吸引力。

调整和观察

到目前为止,开发的简单概念验证主要使用了默认的配置。

ChatClient实例可以通过各种属性根据所需需要来配置。虽然这超出了本文的范围,但在这里举两个例子。

spring.ai.openai.chat.options.model 指定要使用的AI模型。默认为'gpt-35-turbo',但'gpt-4'和'gpt-4-32k'指定的是最新版本。虽然这些版本都是可用的,但你可能无法使用按使用量付费的计划来访问这些版本,但 Open AI 网站上有更多的信息可以帮助你了解如何适应它。

另一个值得一提的属性是 spring.ai.openai.chat.options.temperature。根据参考文档,采样温度控制了“回应的创新性”。据说,较高的值会让输出“更随机”,而较低的值会“更专注和决定性”。默认值为0.8,如果我们将其降低到0.3,重启应用并再次使用相同的请求参数询问,下面的结果将被检索出来。

有利可图的职业机会:罗马尼亚的软件架构师工作提供有竞争力的薪水和极好的成长前景,对于寻求财务稳定和职业发展的个人来说,这是一个吸引人的职业选择。
具有挑战性和智能刺激的工作:作为一名软件架构师,你将负责设计和实现复杂的软件系统,解决复杂的技术问题,并与有才华的团队合作。这个角色提供了持续的学习机会和在尖端技术上工作的机会。
高需求和工作保障:随着对技术和数字化转型的依赖增加,各行各业对熟练软件架构师的需求在上升。选择在罗马尼亚的软件架构师工作确保了工作安全和广泛的就业选择,无论是在本地还是国际上。

可以看出,这种情况下的输出更具描述性。

最后一个考虑因素是与获取的输出的结构相关的。拥有将实际接收的有效载荷映射到Java对象(例如,类或记录)的能力将非常方便。截至目前,表示形式是文本形式,实现也是如此。输出解析器可能实现这一点,类似于Spring JDBC的映射结构。

在这个概念验证中,我们使用了一个BeanOutputParser,它允许直接将结果反序列化到Java记录中,如下所示:

public record JobReasons(String job, String location, List<String> reasons) {}
登入後複製

通过将 {format} 作为提示文本的一部分,并将其作为指示提供给 AI 模型。

OpenAiService 方法变为:

public JobReasons formattedJobReasons(int count, String job, String location) {final String promptText = """Write {count} reasons why people in {location} should consider a {job} job.These reasons need to be short, so they fit on a poster.For instance, "{job} jobs are rewarding."{format}"""; BeanOutputParser<JobReasons> outputParser = new BeanOutputParser<>(JobReasons.class); final PromptTemplate promptTemplate = new PromptTemplate(promptText);promptTemplate.add("count", count);promptTemplate.add("job", job);promptTemplate.add("location", location); promptTemplate.add("format", outputParser.getFormat());promptTemplate.setOutputParser(outputParser); final Prompt prompt = promptTemplate.create(); ChatResponse response = client.call(prompt);return outputParser.parse(response.getResult().getOutput().getContent());}
登入後複製

再次调用时,输出如下:

{"job":"software architect","location":"Romania","reasons":["High demand","Competitive salary","Opportunities for growth"]}
登入後複製

格式符合预期,但解释的原因似乎较少,这意味着需要进行额外的调整以达到更好的可用性。然而,从概念验证的角度来看,这是可接受的,因为焦点是形式。

结论

提示设计是任务的重要部分 - 提示越清晰,输入越好,输出的质量也就越高。

使用 Spring AI 与各种聊天模型进行集成非常简单 - 本篇文章展示了一个 Open AI 的集成。

然而,对于 Gen AI 或者几乎任何技术来说,首先至少要熟悉基本概念是非常重要的。然后,尝试理解如何进行通讯的魔法,最后再开始编写“生产”代码。

最后但同样重要的是,建议进一步探索 Spring AI API,以了解实现并随着其不断发展和改进保持最新状态。


以上是利用Spring Boot以及Spring AI建構生成式人工智慧應用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

oracle數據庫怎麼創建 oracle數據庫怎麼建庫 oracle數據庫怎麼創建 oracle數據庫怎麼建庫 Apr 11, 2025 pm 02:36 PM

創建Oracle數據庫,常用方法是使用dbca圖形化工具,步驟如下:1. 使用dbca工具,設置dbName指定數據庫名;2. 設置sysPassword和systemPassword為強密碼;3. 設置characterSet和nationalCharacterSet為AL32UTF8;4. 設置memorySize和tablespaceSize根據實際需求調整;5. 指定logFile路徑。 高級方法為使用SQL命令手動創建,但更複雜易錯。 需要注意密碼強度、字符集選擇、表空間大小及內存

怎麼創建oracle數據庫 oracle怎麼創建數據庫 怎麼創建oracle數據庫 oracle怎麼創建數據庫 Apr 11, 2025 pm 02:33 PM

創建Oracle數據庫並非易事,需理解底層機制。 1. 需了解數據庫和Oracle DBMS的概念;2. 掌握SID、CDB(容器數據庫)、PDB(可插拔數據庫)等核心概念;3. 使用SQL*Plus創建CDB,再創建PDB,需指定大小、數據文件數、路徑等參數;4. 高級應用需調整字符集、內存等參數,並進行性能調優;5. 需注意磁盤空間、權限和參數設置,並持續監控和優化數據庫性能。 熟練掌握需不斷實踐,才能真正理解Oracle數據庫的創建和管理。

oracle數據庫的語句怎麼寫 oracle數據庫的語句怎麼寫 Apr 11, 2025 pm 02:42 PM

Oracle SQL語句的核心是SELECT、INSERT、UPDATE和DELETE,以及各種子句的靈活運用。理解語句背後的執行機制至關重要,如索引優化。高級用法包括子查詢、連接查詢、分析函數和PL/SQL。常見錯誤包括語法錯誤、性能問題和數據一致性問題。性能優化最佳實踐涉及使用適當的索引、避免使用SELECT *、優化WHERE子句和使用綁定變量。掌握Oracle SQL需要實踐,包括代碼編寫、調試、思考和理解底層機制。

MySQL數據表字段操作指南之添加、修改與刪除方法 MySQL數據表字段操作指南之添加、修改與刪除方法 Apr 11, 2025 pm 05:42 PM

MySQL 中字段操作指南:添加、修改和刪除字段。添加字段:ALTER TABLE table_name ADD column_name data_type [NOT NULL] [DEFAULT default_value] [PRIMARY KEY] [AUTO_INCREMENT]修改字段:ALTER TABLE table_name MODIFY column_name data_type [NOT NULL] [DEFAULT default_value] [PRIMARY KEY]

oracle數據庫表的完整性約束有哪些 oracle數據庫表的完整性約束有哪些 Apr 11, 2025 pm 03:42 PM

Oracle 數據庫的完整性約束可確保數據準確性,包括:NOT NULL:禁止空值;UNIQUE:保證唯一性,允許單個 NULL 值;PRIMARY KEY:主鍵約束,加強 UNIQUE,禁止 NULL 值;FOREIGN KEY:維護表間關係,外鍵引用主表主鍵;CHECK:根據條件限制列值。

MySQL數據庫中的嵌套查詢實例詳解 MySQL數據庫中的嵌套查詢實例詳解 Apr 11, 2025 pm 05:48 PM

嵌套查詢是一種在一個查詢中包含另一個查詢的方式,主要用於檢索滿足複雜條件、關聯多張表以及計算匯總值或統計信息的數據。實例示例包括:查找高於平均工資的僱員、查找特定類別的訂單以及計算每種產品的總訂購量。編寫嵌套查詢時,需要遵循:編寫子查詢、將其結果寫入外層查詢(使用別名或 AS 子句引用)、優化查詢性能(使用索引)。

oracle是乾嘛的 oracle是乾嘛的 Apr 11, 2025 pm 06:06 PM

Oracle 是全球最大的數據庫管理系統(DBMS)軟件公司,其主要產品包括以下功能:關係數據庫管理系統(Oracle 數據庫)開發工具(Oracle APEX、Oracle Visual Builder)中間件(Oracle WebLogic Server、Oracle SOA Suite)雲服務(Oracle Cloud Infrastructure)分析和商業智能(Oracle Analytics Cloud、Oracle Essbase)區塊鏈(Oracle Blockchain Pla

如何配置Debian Apache日誌格式 如何配置Debian Apache日誌格式 Apr 12, 2025 pm 11:30 PM

本文介紹如何在Debian系統上自定義Apache的日誌格式。以下步驟將指導您完成配置過程:第一步:訪問Apache配置文件Debian系統的Apache主配置文件通常位於/etc/apache2/apache2.conf或/etc/apache2/httpd.conf。使用以下命令以root權限打開配置文件:sudonano/etc/apache2/apache2.conf或sudonano/etc/apache2/httpd.conf第二步:定義自定義日誌格式找到或

See all articles