使用 Spring AI 開發 AI 應用時,Ollama 通常在本地開發和測試時使用,用來在本地運行大模型。由于本地開發機器的資源限制,當使用 Ollama 運行較大的模型時,大模型給出響應的時間會比較長。Spring AI 提供的 OllamaChatModel 與 Ollama 服務器交互時,默認的超時時間是 30 秒。也就是說,如果 Ollama 服務器無法在 30 秒內給出響應,Spring AI 的 OllamaChatModel 會出錯,導致整個請求出現錯誤。超時的錯誤在本地開發中經常會出現,嚴重影響開發的體驗和效率。我們需要的是把超時時間延長一些。
那怎么做呢?OllamaChatModel 使用 OllamaApi 與 Ollama 服務器交互。非流式接口使用的是 Spring 的 RestClient,流式接口使用的是 Spring 的 WebClient。OllamaApi 的構造器接受一個 RestClient.Builder 對象,用來創建 RestClient。所以,我們只需要提供一個自定義的 RestClient.Builder 對象即可。
這里需要一個 ClientHttpRequestFactory 實現,用來創建 HTTP 請求對象。不同的 ClientHttpRequestFactory 有各自獨有的設置請求超時時間的方式。這里使用的是 JdkClientHttpRequestFactory,也就是使用 JDK 自帶的 HttpClient 來發送請求,這樣可以避免引入不必要的外部依賴。使用 setReadTimeout 方法來設置超時時間即可。在創建 OllamaApi 時,使用自定義的 RestClient.Builder 對象即可。
完整的 Spring 配置如下面所示。這里把超時時間設置為 3 分鐘。
public class AppConfiguration {@Bean@Qualifier("OllamaRestClientBuilder")public RestClient.Builder ollamaRestClientBuilder() {JdkClientHttpRequestFactory requestFactory = new JdkClientHttpRequestFactory(HttpClient.newHttpClient());requestFactory.setReadTimeout(Duration.ofMinutes(3));return RestClient.builder().requestFactory(requestFactory);}@Beanpublic OllamaApi ollamaApi(OllamaConnectionDetails connectionDetails,@Qualifier("OllamaRestClientBuilder") RestClient.Builder restClientBuilder) {return new OllamaApi(connectionDetails.getBaseUrl(), restClientBuilder);}
}
添加了上述配置之后,OllamaChatModel 在與 Ollama 服務器交互時,會使用配置提供的超時時間,避免了頻繁出現的超時錯誤。