Spring AI 1.0.0 M1 釋出

釋出 | Mark Pollack | 2024 年 5 月 30 日 | ...

我們很高興宣佈 Spring AI 1.0.0 Milestone 1 版本釋出。

此版本包含以下新功能和改進。

ChatClient 流式 API

流式 API 提供用於構建 Prompt 的方法,該 Prompt 將作為輸入傳遞給 AI 模型。您可以使用 ChatClient.Builder 物件建立 ChatClient。您可以從 Spring Boot 自動配置中獲取一個自動配置的 ChatClient.Builder,或者以程式設計方式建立一個。

如果您熟悉其他 Spring 客戶端類,例如 WebClientRestClientJdbcClient,那麼您會覺得這個很熟悉。

這是一個簡單的使用示例

@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 方法返回一個 String。

您也可以以反應式方式呼叫 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) 的通知,其中可以在方法呼叫前後修改方法引數。Spring AI 中的 Advisor 允許您在 AI 模型呼叫周圍指定此行為。

此上下文資料可以包含不同型別,包括:

  • 您自己的資料:這是 AI 模型尚未訓練過的資料。即使模型見過類似資料,附加的上下文資料在生成響應時具有優先權。資料首先從向量儲存中檢索,然後新增到提示中。AI 模型然後生成響應。這被稱為檢索增強生成 (RAG) 模式。

  • 對話歷史:聊天模型的 API 是無狀態的。如果您告訴 AI 模型您的名字,它在後續互動中不會記住。每次請求都必須傳送對話歷史,以確保在生成響應時考慮之前的互動。

假設您已經將資料載入到 VectorStore 中,透過將 QuestionAnswerAdvisor 的例項提供給 ChatClient,您可以執行檢索增強生成 (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 版本中推出。

新 AI 模型

在 1.0 M1 版本中,我們添加了幾個新模型,感謝所有為此做出貢獻的開發者。

更新的模型

  • OpenAI - 支援 GPT4o 和多模態
  • Google Gemini Pro 1.5 pro, flash 等。
  • Anthropic 函式呼叫
  • Ollama 多模態支援
  • 改進的流式函式呼叫支援 - Grogdunn

新向量儲存

測試容器支援

Spring AI 提供 Testcontainer 支援,以便在 您的測試 中或透過 docker compose 啟動向量儲存資料庫。感謝 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 版本。

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有