使用 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 服务器交互时,会使用配置提供的超时时间,避免了频繁出现的超时错误。