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 方法設定 Prompt 的使用者文字。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 模型時,一個常見的模式是附加或增強 Prompt,為其新增上下文資料。這類似於面向切面程式設計 (AOP) 中的 advice,可以在方法呼叫之前和之後修改方法引數。Spring AI 中的 Advisor 允許您在 AI 模型呼叫周圍指定此行為。

這些上下文資料可以是不同型別,包括

  • 您的自有資料:這是 AI 模型尚未訓練的資料。即使模型見過類似資料,附加的上下文資料在生成響應時也會優先。資料首先從向量儲存中檢索,然後新增到 Prompt 中。接著 AI 模型生成響應。這稱為檢索增強生成 (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。

還有內建的 Advisors 用於對話歷史,它們將對話儲存在記憶體中或向量儲存中。

雖然 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

新向量儲存

Test Container 支援

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, devholholic22, Dimibe, deepakn27, swapy-27, ahewer, skewgod

示例應用

一個涵蓋檢索增強生成和函式呼叫(在航班預訂代理的聊天機器人上下文中)的示例應用

下一步

對於 M2,我們的重點是徹底的設計評審 API,擴充套件 AI 模型型別覆蓋範圍,進一步探索 Advisor 特性,新增更多評估器,並進行全面的整合測試。我們計劃在 M2 後釋出一個 RC,然後在大約兩個月後釋出 GA 版本。

獲取 Spring 資訊

訂閱 Spring 資訊,保持連線

訂閱

先行一步

VMware 提供培訓和認證,為您的發展加速。

瞭解更多

獲取支援

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

瞭解更多

近期活動

檢視 Spring 社群的所有近期活動。

檢視全部