在 Java 和 Spring AI 中使用最新的 Mistral AI API 進行函式呼叫

工程 | Christian Tzolov | 2024 年 3 月 6 日 | ...

更新:截至 2024 年 3 月 13 日,Mistral AI 已將平行函式呼叫支援整合到其大型模型中,此功能在本部落格首次發布時並不存在。

Mistral AI 是開放原始碼大型語言模型的領先開發者,推出了將函式呼叫支援添加到其尖端模型中的功能。

函式呼叫是一項促進 LLM 與外部工具和 API 整合的功能。 它使語言模型能夠請求執行客戶端函式,從而允許它訪問必要的運行時資訊或動態執行任務。

在這裡,我將討論如何使用 Mistral AI 新的函式呼叫功能與 Java,尤其是 Spring AI 一起使用。

如果您不熱衷於深入研究底層 Java 客戶端的細節,並且想充分利用您的投資,請隨意跳過下一段,直接跳到 使用 Spring AI 進行函式呼叫

1. 在 Java 中進行函式呼叫

如果您想使用 Java 和 Spring AI 測試最新的 Mistral AI 功能,您會發現 Mistral 不支援 Java 客戶端,並且尚未發布函式呼叫 API。

因此,我不得不求助於探索他們的 JavaScript/Python 客戶端來弄清楚。 以下是一個類別圖,說明了 API 的各種元件及其相互連接。

Mistral AI Class Diagram 1

那些熟悉 OpenAI API 的人會注意到 Mistral AI 的新 API 幾乎相同,只有一些小的差異。

我擴展了最初由 Ricken Bazolo 創建的 MistralAiApi Java 客戶端,以包含缺少的函式呼叫功能。 更新後的客戶端運作良好,付款狀態示範證明了這一點。

由於我的重點是 Spring AI,因此我不會在這裡深入研究客戶端的技術複雜性。 但是,如果您有興趣,可以探索示範程式碼和我包含在下面的備忘單圖。

Mistral AI Function Calling Flow 3

重要的是要注意,模型不會直接呼叫函式; 而是生成 JSON,讓您在程式碼中呼叫該函式,然後將結果返回給模型以繼續對話。

2. 使用 Spring AI 進行函式呼叫

Spring AI 透過允許您定義一個 @Bean 來簡化函式呼叫,該 @Bean 返回使用者定義的 java.util.Function。 它會自動推斷函式的輸入類型,並相應地產生 JSON(或 Open API)結構描述。 此外,Spring AI 會透過使用必要的配接器程式碼包裝您的 POJO(函式)來處理與 AI 模型的複雜互動,從而消除了您編寫重複程式碼的需要。

此外,Spring AI 簡化了程式碼的可移植性,使其能夠移植到其他支援函式呼叫的 AI 模型,並允許開發高效的原生 (GraalVM) 可執行檔。

2.1 它是如何運作的?

假設我們希望 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 整合的更多詳細資訊

2.2 動態提示選項

使用 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 以取得可用的選項。

2.3 程式碼可移植性

將程式碼移植到其他支援函式呼叫的模型非常簡單。 例如,要將程式碼從使用 Mistral AI 轉換到 Azure OpenAI,請按照以下步驟操作

  1. spring-ai-mistral-ai-spring-boot-starter 依賴項替換為 spring-ai-azure-openai-spring-boot-starter
  2. 調整 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
    
  3. MistralAiChatOptions 類別重新命名為 AzureOpenAiChatOptions(在未來的 Spring AI 版本中,此重新命名可能變得不必要)。

目前,Spring AI 在以下平台之間提供函式呼叫程式碼可移植性

Spring-AI-Function-Calling-Portability 範例應用程式,展示了如何跨多個 AI 模型重複使用相同的程式碼和相同的函式。

3. 建置原生 (GraalVM) 執行

為了建置原生映像檔,您需要安裝 GrallVM 21 JDK 並執行以下 maven 命令

./mvnw clean install -Pnative native:compile

可能需要幾分鐘才能完成。 然後您可以執行原生可執行檔

./target/mistralai-aot-demo

4. 結論

在這篇部落格文章中,我們將探討 Mistral AI 的函式呼叫 (Function Calling) 功能,並結合 Java 和 Spring AI。

重點在於利用 Spring AI 進行函式呼叫,Spring AI 是一個框架,它透過處理與 AI 模型互動的複雜性來簡化整合過程,促進程式碼的可移植性以及高效、原生 (GraalVM) 可執行檔的開發。

涵蓋的要點包括:

  • Spring AI 函式呼叫的概述,包括演示和程式碼範例。
  • 解釋 Spring AI 支援的不同 AI 模型之間的動態 Prompt 選項和程式碼可移植性。
  • 建構原生 (GraalVM) 執行檔以提高效能

此部落格提供相關文件和演示的連結,讓讀者可以進一步探索跨不同語言模型供應商的函式呼叫功能和程式碼可移植性。

取得 Spring 電子報

與 Spring 電子報保持聯繫

訂閱

領先一步

VMware 提供培訓和認證,以加速您的進展。

了解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

了解更多

即將到來的活動

查看 Spring 社群中所有即將到來的活動。

查看全部