Ollama 函式呼叫 (已棄用)

此頁面描述了 Function Calling API 的先前版本,該版本已被棄用,並計劃在下一版本中移除。當前版本請參閱 工具呼叫。更多資訊請參閱 遷移指南
您需要 Ollama 0.2.8 或更高版本才能使用函式呼叫功能,需要 Ollama 0.4.6 或更高版本才能在流式模式下使用這些功能。
您需要預訓練支援 Tools 的模型。通常,這類模型會帶有 Tools 標籤。

您可以使用 OllamaChatModel 註冊自定義 Java 函式,並讓 Ollama 部署的模型智慧地選擇輸出一個 JSON 物件,其中包含呼叫一個或多個註冊函式的引數。這使您可以將 LLM 功能與外部工具和 API 連線起來。帶有 Tools 標籤的 Ollama 模型(參閱完整列表)經過訓練,能夠檢測何時應呼叫函式,並響應符合函式簽名的 JSON。

Ollama API 不直接呼叫函式;相反,模型會生成 JSON,您可以使用該 JSON 在程式碼中呼叫函式,並將結果返回給模型以完成對話。Spring AI 提供了靈活且使用者友好的方式來註冊和呼叫自定義函式。通常,自定義函式需要提供一個函式 namedescription 以及函式呼叫 signature(作為 JSON schema),以便讓模型知道函式需要哪些引數。description 有助於模型理解何時應呼叫該函式。

作為開發者,您需要實現一個函式,該函式接收 AI 模型傳送的函式呼叫引數,並將結果響應回模型。您的函式可以進一步呼叫其他第三方服務來提供結果。

Spring AI 使這變得非常簡單,只需定義一個返回 java.util.Function@Bean 定義,並在呼叫 ChatModel 時將 bean 名稱作為選項提供即可。

在底層,Spring 使用適當的介面卡程式碼包裝您的 POJO(即函式),從而實現與 AI 模型的互動,避免您編寫繁瑣的樣板程式碼。底層基礎設施的基礎是 ToolCallback.java 介面以及配套的 Builder 工具類,用於簡化 Java 回撥函式的實現和註冊。

工作原理

假設我們希望 AI 模型響應它不具備的資訊,例如給定地點的當前溫度。

我們可以向 AI 模型提供有關我們自己的函式的元資料,模型可以在處理您的 prompt 時使用這些元資料來檢索資訊。

例如,如果在處理 prompt 期間,AI 模型確定需要關於給定地點溫度的額外資訊,它將啟動一個由伺服器端生成的請求/響應互動。AI 模型會呼叫客戶端函式。AI 模型提供方法的呼叫詳細資訊(格式為 JSON),客戶端負責執行該函式並返回響應。

模型與客戶端的互動在 Spring AI 函式呼叫流程圖 中有所闡述。

Spring AI 大大簡化了您需要編寫的用於支援函式呼叫的程式碼。它為您代理函式呼叫對話。您只需將函式定義作為 @Bean 提供,然後在您的 prompt 選項中提供該函式的 bean 名稱即可。您也可以在您的 prompt 中引用多個函式 bean 名稱。

快速入門

讓我們建立一個聊天機器人,透過呼叫我們自己的函式來回答問題。為了支援聊天機器人的響應,我們將註冊一個函式,該函式接收一個地點並返回該地點的當前天氣。

當模型需要回答諸如“波士頓天氣怎麼樣?”的問題時,AI 模型將呼叫客戶端,將地點值作為引數傳遞給函式。這種類似 RPC 的資料以 JSON 格式傳遞。

我們的函式會呼叫基於 SaaS 的天氣服務 API,並將天氣響應返回給模型以完成對話。在此示例中,我們將使用一個名為 MockWeatherService 的簡單實現,它對不同地點的溫度進行硬編碼。

以下 MockWeatherService.java 代表天氣服務 API

public class MockWeatherService implements Function<Request, Response> {

	public enum Unit { C, F }
	public record Request(String location, Unit unit) {}
	public record Response(double temp, Unit unit) {}

	public Response apply(Request request) {
		return new Response(30.0, Unit.C);
	}
}

將函式註冊為 Bean

透過 OllamaChatModel Auto-Configuration,您可以透過多種方式將自定義函式註冊為 Spring 上下文中的 bean。

我們首先介紹最 POJO 友好的選項。

普通 Java 函式

在這種方法中,您可以在應用程式上下文中像定義任何其他 Spring 管理的物件一樣定義一個 @Bean

在內部,Spring AI ChatModel 將建立一個 ToolCallback 例項,該例項添加了透過 AI 模型呼叫它的邏輯。@Bean 的名稱作為 ChatOption 傳遞。

@Configuration
static class Config {

	@Bean
	@Description("Get the weather in location") // function description
	public Function<MockWeatherService.Request, MockWeatherService.Response> currentWeather() {
		return new MockWeatherService();
	}

}

@Description 註解是可選的,它提供函式描述,幫助模型理解何時應呼叫該函式。這是一個重要的屬性,有助於 AI 模型確定要呼叫哪個客戶端函式。

提供函式描述的另一種選項是在 MockWeatherService.Request 上使用 @JsonClassDescription 註解

@Configuration
static class Config {

	@Bean
	public Function<Request, Response> currentWeather() { // bean name as function name
		return new MockWeatherService();
	}

}

@JsonClassDescription("Get the weather in location") // // function description
public record Request(String location, Unit unit) {}

最佳實踐是用資訊註解請求物件,以便該函式生成的 JSON schema 儘可能具有描述性,幫助 AI 模型選擇正確的函式進行呼叫。

ToolCallback

另一種註冊函式的方法是建立 ToolCallback,如下所示:

@Configuration
static class Config {

	@Bean
	public FunctionToolCallback weatherFunctionInfo() {

    return FunctionToolCallback.builder("CurrentWeather", new MockWeatherService()) // (1) function name
        .description("Get the weather in location") // (2) function description
		.inputType(MockWeatherService.Request.class) // (3) function signature
        .build();
	}

}

它封裝了第三方 MockWeatherService 函式,並將其註冊為 OllamaChatModelCurrentWeather 函式。它還提供描述 (2) 和函式簽名 (3),以便模型知道函式需要哪些引數。

預設情況下,響應轉換器會執行 Response 物件的 JSON 序列化。
FunctionToolCallback 內部根據 MockWeatherService.Request 類解析函式呼叫簽名。

在聊天選項中指定函式

要讓模型知道並呼叫您的 CurrentWeather 函式,您需要在 prompt 請求中啟用它

OllamaChatModel chatModel = ...

UserMessage userMessage = new UserMessage("What's the weather like in San Francisco, Tokyo, and Paris?");

ChatResponse response = this.chatModel.call(new Prompt(this.userMessage,
		OllamaOptions.builder().tools("CurrentWeather").build())); // Enable the function

logger.info("Response: {}", response);

以上使用者問題將觸發對 CurrentWeather 函式的 3 次呼叫(每個城市一次),最終響應將如下所示:

Here is the current weather for the requested cities:
- San Francisco, CA: 30.0°C
- Tokyo, Japan: 10.0°C
- Paris, France: 15.0°C

OllamaFunctionCallbackIT.java 測試演示了這種方法。

使用 Prompt 選項註冊/呼叫函式

除了自動配置,您還可以使用 Prompt 請求動態註冊回撥函式

OllamaChatModel chatModel = ...

UserMessage userMessage = new UserMessage("What's the weather like in San Francisco, Tokyo, and Paris?");

var promptOptions = OllamaOptions.builder()
	.toolCallbacks(List.of(FunctionToolCallback.builder("CurrentWeather", new MockWeatherService()) // (1) function name and instance
        .description("Get the weather in location") // (2) function description
		.inputType(MockWeatherService.Request.class) // (3) function signature
        .build())) // function code
	.build();

ChatResponse response = this.chatModel.call(new Prompt(this.userMessage, this.promptOptions));
預設情況下,在本次請求期間,prompt 中註冊的函式是啟用的。

這種方法允許您根據使用者輸入動態選擇要呼叫的不同函式。

FunctionCallbackInPromptIT.java 整合測試提供瞭如何在 OllamaChatModel 中註冊函式並在 prompt 請求中使用它的完整示例。

附錄

Spring AI 函式呼叫流程

下圖闡述了 OllamaChatModel 函式呼叫的流程

ollama chatmodel function call

OllamaAPI 函式呼叫流程

下圖闡述了 Ollama API 的流程

ollama function calling flow

OllamaApiToolFunctionCallIT.java 提供瞭如何使用 Ollama API 函式呼叫的完整示例。