之前做個幾個大模型的應用,都是使用Python語言,后來有一個項目使用了Java,并使用了Spring AI框架。隨著Spring AI不斷地完善,最近它發布了1.0正式版,意味著它已經能很好的作為企業級生產環境的使用。對于Java開發者來說真是一個福音,其功能已經能滿足基于大模型開發企業級應用。借著這次機會,給大家分享一下Spring AI框架。
注意:由于框架不同版本改造會有些使用的不同,因此本次系列中使用基本框架是 Spring AI-1.0.0,JDK版本使用的是19。
代碼參考: https://github.com/forever1986/springai-study
目錄
- 1 示例演示
- 1.1 前提準備
- 1.2 代碼實現
- 1.3 演示
- 2 底層原理
上一章演示了Spring AI Alibaba的基本入門,本章將演示基于Nacos的動態prompt模版。基于Nacos的prompt是Spring AI Alibaba對prompt模版的擴展功能,在實際企業級應用中可能對于提示詞的管理需要一個統一的地方,因此采用Nacos統一進行版本管理和發布是一個比較好的實踐。本章就通過示例來演示如何基于Nacos管理prompt模版。
1 示例演示
代碼參考lesson24子模塊下的ali-prompt子模塊
示例說明:通過Nacos動態加載提示詞模版,從而使得無需啟動服務器可以調試或者修改prompt模版
1.1 前提準備
1)需要準備一個nacos,這里使用版本是3.0.2
注意:Nacos3的控制臺端口默認也是8080,因此自己可以在配置文件中修改或者演示項目ali-prompt改一下端口,避免端口沖突
2)在Nacos下面配置一個prompt的配置文件
在Nacos的public命名空間下,創建一個名字為:spring.ai.alibaba.configurable.prompt 其group為:DEFAULT_GROUP
[{"name": "author","template": "請介紹 {author} 的生平簡介","model": {"author": "余華"}}
]
說明:這里解釋一下參數:
1)name:就是提示詞模版的名稱,也是代碼中使用它來決定加載哪個模版
2)template:提示詞模版
3)model:參數,可以用于提示詞模版里面
1.2 代碼實現
1)在lesson24子模塊下,新建ali-prompt子模塊,其pom引入如下:
<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-dashscope</artifactId></dependency><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter-nacos-prompt</artifactId></dependency>
</dependencies>
2)新建application.properties配置文件
spring.ai.dashscope.api-key=你的阿里百煉API KEYspring.config.import=nacos:prompt-application.properties
spring.nacos.serverAddr=localhost:8848
spring.nacos.username=nacos
spring.nacos.password=nacos# 開啟 nacos 的 prompt tmpl 監聽功能
spring.ai.nacos.prompt.template.enabled=true
3)新建DemoController演示類:
import com.alibaba.cloud.ai.prompt.ConfigurablePromptTemplate;
import com.alibaba.cloud.ai.prompt.ConfigurablePromptTemplateFactory;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;import java.util.Map;@RestController
public class DemoController {private final ChatClient dashScopeChatClient;private final ConfigurablePromptTemplateFactory promptTemplateFactory;public DemoController(ChatClient.Builder chatClientBuilder, ConfigurablePromptTemplateFactory promptTemplateFactory) {this.dashScopeChatClient = chatClientBuilder.build();this.promptTemplateFactory = promptTemplateFactory;}@GetMapping(value = "/ai/generate", produces = "text/html;charset=UTF-8")public Flux<String> generate(@RequestParam(value = "authorName", required = false, defaultValue = "") String authorName) {// 使用 nacos 的 prompt tmpl 創建 promptConfigurablePromptTemplate template = promptTemplateFactory.create(// 配置的模版name"author",// 如果找不到,會使用這個默認模版"請列出這位{author}最著名的三本書。");Prompt prompt = null;if(!StringUtils.hasText(authorName)){// 但參數為空時,使用nacos默認的author關鍵字prompt = template.create();}else{prompt = template.create(Map.of("author", authorName));}return dashScopeChatClient.prompt(prompt).stream().content();}}
4)新建啟動Lesson24PromptApplication類:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Lesson24PromptApplication {public static void main(String[] args) {SpringApplication.run(Lesson24PromptApplication.class, args);}}
1.3 演示
1)不傳參訪問
http://localhost:8080/ai/generate
說明:會默認讀取Nacos的模版
2)傳參訪問
http://localhost:8080/ai/generate?authorName=魯迅
說明:通過傳參方式,結合Nacos的prompt模版返回的結果
3)修改Nacos配置
4)再次訪問
http://localhost:8080/ai/generate?authorName=魯迅
說明:可以看到新的prompt模版已經生效,這樣就實現了動態修改模版
2 底層原理
下面來看看其底層原理
1)可以看到自動化配置了ConfigurablePromptTemplateFactory類
2)在演示類DemoController中也可以看到是通過注冊一個ConfigurablePromptTemplateFactory類,并從中獲取到nacos配置的提示詞模版,下面是關鍵源碼
說明:ConfigurablePromptTemplateFactory類源碼比較關鍵的2個點
1)@NacosConfigListener,其監聽了group為DEFAULT_GROUP,名稱為:spring.ai.alibaba.configurable.prompt 的配置作為提示詞配置
2)Nacos的配置會解析為ConfigurablePromptTemplateModel類,里面有name、template和model三個參數
結語:本章通過演示Spring AI Alibaba-基于Nacos的prompt模版,并簡單解析了其實現原理。下一章將講解Spring AI Alibaba對于聊天記憶的擴展。
Spring AI系列上一章:《Spring AI 系列之二十七 - Spring AI Alibaba-入門》
Spring AI系列下一章:《Spring AI 系列之二十九 - Spring AI Alibaba-聊天記憶》