領先一步
VMware 提供培訓和認證,以加速您的進程。
了解更多我們很高興宣布 Spring AI 1.0.0 Milestone 1 版本發布。
此版本具有以下新功能和改進。
流暢 API 提供建構 Prompt 的方法,然後將其作為 AI 模型的輸入傳遞。您可以使用 ChatClient.Builder
物件建立 ChatClient
。您可以從 Spring Boot 自動配置取得自動配置的 ChatClient.Builder
,或以程式設計方式建立一個。
如果您熟悉其他 Spring 用戶端類別,例如 WebClient
、RestClient
和 JdbcClient
,這會讓您感到熟悉。
以下是一個簡單的使用範例
@RestController
class MyController {
private final ChatClient chatClient;
MyController(ChatClient.Builder chatClientBuilder) {
this.chatClient = chatClientBuilder.build();
}
@GetMapping("/ai")
String generation(String userInput) {
return this.chatClient.prompt()
.user(userInput)
.call()
.content();
}
}
user
方法設定提示的使用者文字。call
方法調用 AI 模型,提供各種重載以傳回回應。在此範例中,content
方法傳回字串。
您也可以反應式地呼叫 AI 模型(在底層使用 WebClient),如下所示。
Flux<String> output = chatClient.prompt()
.user("Tell me a joke")
.stream()
.content();
一個常見的使用案例是從對 AI 模型的呼叫中傳回 JSON。使用 entity
方法可以輕鬆實現這一點。
record ActorFilms(String actor, List<String> movies) {
}
ActorFilms actorFilms = chatClient.prompt()
.user("Generate the filmography for a random actor.")
.call()
.entity(ActorFilms.class);
您可以在 @Configuration
類別中建立 ChatClient
時,指定預設值,例如系統文字。設計時和執行時的分離允許執行時程式碼最小化,僅需要屬性佔位符值。例如
@Configuration
class Config {
@Bean
ChatClient chatClient(ChatClient.Builder builder) {
return builder.defaultSystem("You are a friendly chat bot that answers question in the voice of a {voice}")
.build();
}
}
@RestController
class AIController {
private final ChatClient chatClient
AIController(ChatClient chatClient) {
this.chatClient = chatClient;
}
@GetMapping("/ai")
Map<String, String> completion(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message, String voice) {
return Map.of(
"completion",
chatClient.prompt()
.system(sp -> sp.param("voice", voice))
.user(message)
.call()
.content());
}
}
還有更多選項可用。在您的 IDE 中探索 API,並參考文件以取得更多詳細資訊。
使用使用者文字呼叫 AI 模型時,常見的模式是附加或擴增具有上下文資料的提示。這類似於面向切面程式設計 (AOP) 的 advice,其中方法引數可以在調用前後修改。Spring AI 中的 Advisor 允許您在 AI 模型呼叫周圍指定此行為。
此上下文資料可以是不同的類型,包括
您自己的資料:這是 AI 模型尚未接受訓練的資料。即使模型已經看過類似的資料,附加的上下文資料在產生回應時也具有優先權。資料首先從向量資料庫中檢索,然後添加到提示中。然後,AI 模型產生回應。這被稱為檢索增強生成 (Retrieval Augmented Generation, RAG) 模式。
對話歷史記錄:聊天模型的 API 是無狀態的。如果您告訴 AI 模型您的名字,它不會在後續互動中記住它。對話歷史記錄必須隨每個請求發送,以確保在產生回應時考慮先前的互動。
假設您已經將資料載入到 VectorStore
中,您可以透過向 ChatClient
提供 QuestionAnswerAdvisor
的實例來執行檢索增強生成 (RAG)。
ChatResponse response = ChatClient.builder(chatModel)
.build().prompt()
.advisors(new QuestionAnswerAdvisor(vectorStore, SearchRequest.defaults()))
.user(userText)
.call()
.chatResponse();
ChatResponse
傳回值包含產生的內容以及有關請求的其他元資料,例如 AI 模型用於產生回應的 token 數量。
還有用於對話歷史記錄的內建 Advisor,可將對話儲存在記憶體中或向量資料庫中。
雖然 Advisor 模型並非建立 RAG 應用程式的萬能解決方案,但它僅需在您的 ChatClient
呼叫中添加一行程式碼,即可提供顯著的額外功能。這種簡單但強大的方法為進一步探索提供了很大的潛力。
通常,人們對於收到來自 AI 模型聽起來像人類的回應感到非常滿意,以至於他們認為它是準確的。不幸的是,情況並非總是如此。生成式 AI 容易產生幻覺,這意味著它可能會產生虛假資訊。除非您是領域專家,否則可能難以區分事實與虛構。
評估器有助於解決這個問題。您可以使用 AI 模型來評估另一個 AI 模型的回應是否準確。我們才剛開始使用簡單的 RelevancyEvaluator
踏上這條道路,但即使是這個基本工具也已被證明非常有用。
以下是一個範例 JUnit 測試,您可以使用它在執行 RAG 後調用 RelevancyEvaluator。
@Test void testEvaluation() {
dataController.delete();
dataController.load();
String userText = "What is the purpose of Carina?";
ChatResponse response = ChatClient.builder(chatModel)
.build().prompt()
.advisors(new QuestionAnswerAdvisor(vectorStore, SearchRequest.defaults()))
.user(userText)
.call()
.chatResponse();
var relevancyEvaluator = new RelevancyEvaluator(ChatClient.builder(chatModel));
EvaluationRequest evaluationRequest = new EvaluationRequest(userText,
(List<Content>) response.getMetadata().get(QuestionAnswerAdvisor.RETRIEVED_DOCUMENTS), response);
EvaluationResponse evaluationResponse = relevancyEvaluator.evaluate(evaluationRequest);
assertTrue(evaluationResponse.isPass(), "Response is not relevant to the question");
}
其他評估器將在 1.0 M2 中推出。
由於所有貢獻者的幫助,1.0 M1 中新增了幾個新的模型。
Spring AI 為在 您的測試 中或透過 docker compose 啟動向量資料庫提供 Testcontainer 支援。感謝 Eddú Meléndez Gonzales 的貢獻。
許多重構、錯誤修復、文件增強,由眾多貢獻者全面完成。如果我們尚未處理您的 PR,我們會的,請耐心等待。感謝
abel533, pradipkhomane, bottlerocketjonny, mackey0225, izeye, lgxisbb, jakkaz, yuluo-yx, zhangqian9158, ricken07, iAMSagar44, youngmoneee, cosmin-ionita, koloyyee, ThomasVitale, PabloSanchi, iAMSagar44, MikeLaptev, m3ss0, alexcheng1982, Hyune-c, zucchivan, scionaltera, JabezBrew, impactCn, dperezcabrera, omarmahamid, tenthe, hygl, Vrryou, thesurlydev, jiacheo, danvega, izeye, eltociear, vbartacek, Grogdunn, samzhu, habuma, devholic22, Dimibe, deepakn27, swapy-27, ahewer, skewgod
一個範例應用程式,涵蓋了在航班預訂代理的聊天機器人環境中,檢索增強生成和函數呼叫。
對於 M2,我們的重點是對 API 進行全面的設計審查、擴展 AI 模型類型覆蓋範圍、進一步探索 Advisor 功能、新增更多評估器,以及進行全面的整合測試。我們計劃在 M2 之後發布一個 RC 版本,然後在大約兩個月內發布 GA 版本。