Spring AI中函式呼叫Mistral AI最新API

banq發表於2024-03-17


Mistral AI 是開源大型語言模型的領先開發商,宣佈為其尖端模型新增函式呼叫支援。

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

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

Java中的函式呼叫
如果您想使用 Java 和Spring AI測試最新的 Mistral AI 功能,您會發現 Mistral 不支援 Java 客戶端,並且尚未釋出函式呼叫 API。
因此,我不得不透過探索他們的 JavaScript/Python 客戶端來解決這個問題。

我擴充套件了最初由 Ricken Bazolo 建立的MistralAiApi Java 客戶端,以包含缺少的函式呼叫功能。更新後的客戶端執行良好,如付款狀態演示所示。

由於我的重點是 Spring AI,因此我不會在這裡深入研究客戶端的技術複雜性。


Spring AI 的函式呼叫
Spring AI 允許您定義@Bean返回使用者定義的java.util.Function. 它自動推斷函式的輸入型別並相應地生成 JSON(或開放 API)模式。此外,Spring AI 透過使用必要的介面卡程式碼包裝 POJO(函式)來處理與 AI 模型的複雜互動,從而消除了您編寫重複程式碼的需要。

此外,Spring AI 簡化了程式碼與支援函式呼叫的其他 AI 模型的可移植性,並允許開發高效的本機 (GraalVM) 可執行檔案。

假設我們希望人工智慧模型用它沒有的資訊做出響應。例如,本 Mistral AI教程中所示的您最近的付款交易的狀態。

讓我們用 Spring AI 重新實現本教程。

使用Initializr引導新的引導應用程式,並將 MistralAI 引導啟動器依賴項新增到 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(<font>"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(<font>"Get payment status of a transaction")
public Function<Transaction, Status> retrievePaymentStatus() {
        return (transaction) -> new Status(PAYMENT_DATA.get(transaction).status());
}

它使用一個普通的java.util.Function,以 aTransaction作為輸入並返回Status該交易的 。函式被註冊為@Bean並使用@Description註釋來定義函式描述。Spring AI 極大地簡化了支援函式呼叫所需編寫的程式碼。它為您代理函式呼叫對話。您還可以在提示中引用多個函式 bean 名稱。

var options = MistralAiChatOptions.builder()
   .withFunction(<font>"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".

詳細點選標題

相關文章