Spring AI 对 Ollama Tool 的支持

本周早些时候,Ollama 推出 了一项令人兴奋的新功能:对大型语言模型(LLM)的工具支持。

今天,我们非常高兴地宣布 Spring AI(1.0.0-SNAPSHOT)已完全支持这一强大功能,将 Ollama 的函数调用功能引入 Spring 生态系统。

Ollama 的工具支持允许模型决定何时调用外部函数以及如何使用返回的数据。这为访问实时信息到执行复杂计算等各种可能性打开了大门。Spring AI 采用了这一概念,并将其与 Spring 生态系统无缝集成,使 Java 开发人员能够非常轻松地在其应用程序中利用这一功能。Spring AI 的 Ollama 函数调用支持的主要功能包括:

  • 轻松集成:将 Java 函数注册为 Spring Bean,并与 Ollama 模型一起使用。
  • 灵活配置:多种注册和配置函数的方法。
  • 支持多种函数:在一个聊天会话中注册和使用多种函数。
  • 运行时函数选择:动态选择为每个提示(Prompt)启用哪些函数。
  • 代码可移植性:使用不同的 LLM 提供商(如 OpenAI、Mistral、VertexAI、Anthropic、Groq),无需修改代码即可重复使用你的应用代码。

工作原理

  • 定义自定义 Java 函数并将其注册到 Spring AI。

    Spring AI 自定义 Java 函数

  • 执行可能需要调用函数才能完成回答的聊天请求。

  • 当 AI 模型确定需要调用一个函数时,它会生成一个包含函数名称和参数的 JSON 对象。

  • Spring AI 会拦截该请求,调用你的 Java 函数,并将结果返回给模型。

  • 该模型将函数的输出纳入其响应中。

入门

先决条件

首先需要在本地计算机上运行 Ollama(0.2.8 以上)。请参阅官方的 Ollama 项目 README,开始在本地计算机上运行模型。然后调出支持模型的工具,例如 Llama 3.1、Mistral、Firefunction v2、Command-R +。。。支持的模型列表可在 模型页面的工具类别 下找到。

ollama pull mistral

依赖

要开始在 Spring AI 中使用 Ollama 函数调用,请在项目中添加以下依赖:

<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
</dependency>

请参阅 “依赖管理” 部分,将 Spring AI BOM 添加到构建文件中。

示例

下面是一个如何在 Spring AI 中使用 Ollama 函数调用的简单示例:

@SpringBootApplication
public class OllamaApplication {

    public static void main(String[] args) {
        SpringApplication.run(OllamaApplication.class, args);
    }

    @Bean
    CommandLineRunner runner(ChatClient.Builder chatClientBuilder) {
        return args -> {
            var chatClient = chatClientBuilder.build();

            var response = chatClient.prompt()
                .user("What is the weather in Amsterdam and Paris?")
                .functions("weatherFunction") // 通过 Bean 名引用
                .call()
                .content();

            System.out.println(response);
        };
    }

    @Bean
    @Description("Get the weather in location")
    public Function<WeatherRequest, WeatherResponse> weatherFunction() {
        return new MockWeatherService();
    }

    public static class MockWeatherService implements Function<WeatherRequest, WeatherResponse> {

        public record WeatherRequest(String location, String unit) {}

        public record WeatherResponse(double temp, String unit) {}

        @Override
        public WeatherResponse apply(WeatherRequest request) {
            double temperature = request.location().contains("Amsterdam") ? 20 : 25;
            return new WeatherResponse(temperature, request.unit);
        }
    }
}

在本例中,当模型需要天气信息时,它会自动调用 weatherFunction Bean,然后获取实时天气数据。

预期的回答是这样的 “The weather in Amsterdam is currently 20 degrees Celsius, and the weather in Paris is currently 25 degrees Celsius(阿姆斯特丹目前的天气是 20 摄氏度,巴黎目前的天气是 25 摄氏度)”。

完整的示例代码见:https://github.com/tzolov/ollama-tools

与 OpenAI 的兼容性

Ollama 兼容 OpenAI API,你可以使用 Spring AI OpenAI 客户端与 Ollama 对话并使用工具。为此,你需要使用 OpenAI 客户端,但要设置 base-urlspring.ai.openai.chat.base-url=http://localhost:11434,并从提供的 Ollama 工具模型中选择一个:spring.ai.openai.chat.options.model=mistral

请查看 OllamaWithOpenAiChatModelIT.java 测试,了解在 Spring AI OpenAI 上使用 Ollama 的示例。

局限性

正如 Ollama 博文所述,目前他们的 API 既不支持流式(Stream)工具调用,也不支持工具选择(Tool choice)。

一旦这些限制得到解决,Spring AI 也将为它们提供支持。

更多信息

总结

通过借助 Ollama 创新的工具支持并将其集成到 Spring 生态系统中,Spring AI 为 Java 开发人员创造了一种强大的新方式来创建增强 AI 的应用程序。这一功能为创建更具动态性和响应性的 AI 系统打开了令人兴奋的可能性,这些系统可以与现实世界的数据和服务进行互动。

使用 Spring AI 的 Ollama 函数调用的一些好处包括:

  • 扩展 AI 功能:利用自定义功能和实时数据轻松增强 AI 模型。
  • 无缝集成:在 AI 应用程序中利用现有的 Spring Bean 和基础架构。
  • 类型安全的开发:使用强类型 Java 函数,而不是处理原始 JSON。
  • 减少模板代码:Spring AI 可处理复杂的函数调用,让你专注于业务逻辑。

我们鼓励你试用这项新功能,并告诉我们你在项目中是如何使用它的。更多详细信息和高级用法,请查看我们的 官方文档


Ref:https://spring.io/blog/2024/07/26/spring-ai-with-ollama-tool-support