領先一步
VMware 提供培訓和認證,為您的進步加速。
瞭解更多更新:截至 2024 年 3 月 13 日,Mistral AI 已在其大型模型中集成了並行函式呼叫支援,此功能在該部落格初次釋出時尚不存在。
作為開源大型語言模型的領先開發者,Mistral AI 釋出了其尖端模型新增的函式呼叫支援功能。
函式呼叫是一項便利將大型語言模型(LLM)與外部工具和 API 整合的功能。它使得語言模型能夠請求執行客戶端函式,從而使其能夠訪問必要的執行時資訊或動態執行任務。
在這裡,我將討論如何在 Java 中使用 Mistral AI 的新函式呼叫功能,特別是與 Spring AI 整合使用。
如果您對深入研究底層 Java 客戶端的細節不感興趣,並希望充分利用您的投入,請隨意跳過下一段,直接進入使用 Spring AI 進行函式呼叫的部分。
如果您想使用 Java 和 Spring AI 試用最新的 Mistral AI 功能,您會發現 Mistral 尚不支援 Java 客戶端,也尚未釋出函式呼叫 API。
因此,我不得不研究他們的 JavaScript/Python 客戶端來弄清楚。下面是 API 各個元件及其相互連線的類圖。
熟悉 OpenAI API 的人會注意到,Mistral AI 的新 API 幾乎相同,只有一些細微的差別。
我擴充套件了由 Ricken Bazolo 最初建立的 MistralAiApi Java 客戶端,以包含缺失的函式呼叫功能。更新後的客戶端執行良好,如支付狀態演示所示。
由於我的重點是 Spring AI,在這裡我不會深入探討客戶端的技術細節。但是,如果您感興趣,可以查閱我下方提供的演示程式碼和備忘單圖表。
重要的是要注意,模型不會直接呼叫函式;相反,它會生成 JSON,供您在程式碼中呼叫該函式,並將結果返回給模型以繼續對話。
Spring AI 透過允許您定義一個返回使用者定義的 java.util.Function
的 @Bean
來簡化函式呼叫。它會自動推斷函式的輸入型別並生成相應的 JSON(或 Open API)Schema。此外,Spring AI 透過使用必要的介面卡程式碼包裝您的 POJO(即函式),處理了與 AI 模型之間的複雜互動,無需您編寫重複的程式碼。
此外,Spring AI 簡化了程式碼向其他支援函式呼叫的 AI 模型的移植性,並允許開發高效的原生(GraalVM)可執行檔案。
假設我們希望 AI 模型回覆它本身沒有的資訊。例如,如這個 Mistral AI 教程所示,獲取您最近支付交易的狀態。
讓我們使用 Spring AI 重新實現這個教程。
使用 Initializr 引導一個新的 Boot 應用,並將 MistralAI 的 boot starter 依賴新增到 POM 中
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mistral-ai-spring-boot-starter</artifactId>
<version>0.8.1</version>
</dependency>
使用 application.properties
檔案進行配置
spring.ai.mistralai.api-key=${MISTRAL_AI_API_KEY}
spring.ai.mistralai.chat.options.model=mistral-small-latest
這將為您提供功能齊全的 MistralAiChatClient
@Autowired
MistralAiChatClient chatClient;
接下來,假設我們有一個包含支付交易的資料集
public record Transaction(String transactionId) {}
public record Status(String status) {}
public static final Map<Transaction, Status> PAYMENT_DATA = Map.of(
new Transaction("T1001"), new Status("Paid"),
new Transaction("T1002"), new Status("Unpaid"),
new Transaction("T1003"), new Status("Paid"),
new Transaction("T1004"), new Status("Paid"),
new Transaction("T1005"), new Status("Pending"));
使用者可以就此資料集提問,並使用函式呼叫來回答。例如,考慮一個根據交易獲取支付狀態的函式
@Bean
@Description("Get payment status of a transaction")
public Function<Transaction, Status> retrievePaymentStatus() {
return (transaction) -> new Status(PAYMENT_DATA.get(transaction).status());
}
它使用一個普通的 java.util.Function
,該函式接受一個 Transaction
作為輸入並返回該交易的 Status
。該函式被註冊為一個 @Bean
,並使用 @Description
註解定義函式描述。Spring AI 極大地簡化了您為支援函式呼叫而需要編寫的程式碼。它為您協調了函式呼叫對話。您還可以在提示中引用多個函式 bean 名稱。
var options = MistralAiChatOptions.builder()
.withFunction("retrievePaymentStatus")
.build();
ChatResponse paymentStatusResponse = chatClient.call(
new Prompt("What's the status of my transaction with id T1005?", options);
我們在提示中提問,並在提示的選項中包含相關的函式名稱。函式名稱應與 Bean 名稱匹配。
提示:您不必在每個請求的提示選項中重複指定函式名稱,而是可以在
application.properties
檔案中配置一次,例如:spring.ai.mistralai.chat.options.functions=retrievePaymentStatus
。這種方法可以確保該函式對於所有提示問題都始終啟用並可訪問。但是,需要注意的是,對於不需要該函式的請求,此方法可能會傳輸不必要的上下文令牌。
就是這樣。Spring AI 將代表您協調函式呼叫對話。您可以列印響應內容
System.out.println(paymentStatusResponse.getResult().getOutput().getContent());
並期望得到類似這樣的結果
The status of your transaction T1005 is "Pending".
提示:檢視 MistralAi-AOT-Demo,這是一個簡單的 Spring Boot 應用,展示了 Mistral AI 與 Spring AI 的整合。它包含了各種功能,例如聊天完成、流式聊天完成、嵌入和函式呼叫。此外,還包含了原生構建的說明。
在參考文件中探索有關 Spring AI 與 Mistral AI 整合的更多細節
使用 MistralAiChatOptions,我們可以為每個提示請求定製預設設定。例如,我們可以根據需要將模型切換到 LARGE 並調整特定請求的溫度。
ChatResponse paymentStatusResponse = chatClient
.call(new Prompt("What's the status of my transaction with id T1005?",
MistralAiChatOptions.builder()
.withModel(MistralAiApi.ChatModel.LARGE.getValue())
.withTemperature(0.6f)
.withFunction("retrievePaymentStatus")
.build()));
檢視 MistralAiChatOptions 的 javadoc 以瞭解可用選項。
將程式碼移植到其他支援函式呼叫的模型非常簡單。例如,要將程式碼從使用 Mistral AI 遷移到 Azure OpenAI,請按照以下步驟操作
spring-ai-mistral-ai-spring-boot-starter
依賴項替換為 spring-ai-azure-openai-spring-boot-starter
。application.properties
檔案spring.ai.azure.openai.api-key=${AZURE_OPENAI_API_KEY}
spring.ai.azure.openai.endpoint=${AZURE_OPENAI_ENDPOINT}
spring.ai.azure.openai.chat.options.model=gpt-35-turbo
MistralAiChatOptions
類重新命名為 AzureOpenAiChatOptions
(此重新命名在未來的 Spring AI 版本中可能變得不必要)。目前,Spring AI 在以下平臺之間提供了函式呼叫程式碼的可移植性
Spring-AI-Function-Calling-Portability 示例應用展示瞭如何在多個 AI 模型之間重用相同的程式碼和函式。
要構建原生映象,您需要安裝 GraalVM 21 JDK 並執行以下 maven 命令
./mvnw clean install -Pnative native:compile
這可能需要幾分鐘才能完成。然後您可以執行原生可執行檔案
./target/mistralai-aot-demo
在這篇部落格文章中,我們探討了 Mistral AI 的函式呼叫功能與 Java 和 Spring AI 的結合使用。
重點是利用 Spring AI 的函式呼叫功能,Spring AI 是一個簡化整合過程的框架,它處理與 AI 模型互動的複雜性,促進程式碼可移植性以及高效原生(GraalVM)可執行檔案的開發。
涵蓋的關鍵點包括
該部落格提供了相關文件和演示的連結,讀者可以進一步探索函式呼叫功能以及在不同語言模型提供商之間的程式碼可移植性。