領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多更新:截至2024年3月13日,Mistral AI已在其大型模型中集成了並行函式呼叫支援,這項功能在本文釋出時並不存在。
領先的開源大型語言模型開發商 Mistral AI 釋出了其尖端模型對函式呼叫的支援。
函式呼叫是一項促進 LLM 與外部工具和 API 整合的功能。它使語言模型能夠請求執行客戶端函式,從而允許其動態訪問必要的執行時資訊或執行任務。
在這裡,我將討論如何將 Mistral AI 的新函式呼叫功能與 Java 結合使用,特別是與 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)模式。此外,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 javadocs 以瞭解可用選項。
將程式碼移植到其他支援函式呼叫的模型非常簡單。例如,要將程式碼從使用 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 模型重用相同的程式碼和相同的函式。
要構建原生映象,您需要安裝 GrallVM 21 JDK 並執行以下 Maven 命令。
./mvnw clean install -Pnative native:compile
這可能需要幾分鐘才能完成。然後您可以執行原生可執行檔案。
./target/mistralai-aot-demo
在這篇博文中,我們探討了 Mistral AI 的函式呼叫功能與 Java 和 Spring AI 的結合。
重點是利用 Spring AI 的函式呼叫,這是一個透過處理與 AI 模型的互動複雜性來簡化整合過程的框架,促進程式碼可移植性和高效原生(GraalVM)可執行檔案的開發。
涵蓋的關鍵點包括:
該部落格提供了相關文件和演示的連結,供讀者進一步探索函式呼叫功能以及跨不同語言模型提供商的程式碼可移植性。