Spring AI 与 NVIDIA LLM API

工程 | Christian Tzolov | 2024年8月20日 | ...

Spring AI 现在支持NVIDIA 的大型语言模型 API,提供与各种模型的集成。通过利用 NVIDIA 与 OpenAI 兼容的 API,Spring AI 允许开发人员通过熟悉的Spring AI API使用 NVIDIA 的 LLM。

SpringAI-NVIDIA-API-5

我们将探讨如何配置和使用 Spring AI OpenAI 聊天客户端以连接到 NVIDIA LLM API。

  • 演示应用程序代码可在nvidia-llm GitHub 存储库中找到。
  • SpringAI/NVIDIA 集成的文档

先决条件

  • 创建一个具有足够积分的NVIDIA 帐户。
  • 从 NVIDIA 提供的选项中选择您首选的LLM 模型。例如,下图中的meta/llama-3.1-70b-instruct
  • 在模型页面上,获取您选择的模型的 API 密钥。

NVIDIA-API-KEYS

依赖项

要开始,请将 Spring AI OpenAI 启动器添加到您的项目中。对于 Maven,请将此添加到您的 pom.xml 中

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

对于 Gradle,请将此添加到您的 build.gradle 中

gradleCopydependencies {
  implementation 'org.springframework.ai:spring-ai-openai-spring-boot-starter'
}

确保您已添加 Spring 里程碑和快照存储库,并添加Spring AI BOM

配置 Spring AI

要将 NVIDIA LLM API 与 Spring AI 一起使用,我们需要将 OpenAI 客户端配置为指向 NVIDIA LLM API 端点并使用 NVIDIA 特定的模型。

将以下环境变量添加到您的项目中

export SPRING_AI_OPENAI_API_KEY=<NVIDIA_API_KEY>
export SPRING_AI_OPENAI_BASE_URL=https://integrate.api.nvidia.com
export SPRING_AI_OPENAI_CHAT_OPTIONS_MODEL=meta/llama-3.1-70b-instruct
export SPRING_AI_OPENAI_EMBEDDING_ENABLED=false
export SPRING_AI_OPENAI_CHAT_OPTIONS_MAX_TOKENS=2048

或者,您可以将这些添加到您的 application.properties 文件中

spring.ai.openai.api-key=<NVIDIA_API_KEY>
spring.ai.openai.base-url=https://integrate.api.nvidia.com
spring.ai.openai.chat.options.model=meta/llama-3.1-70b-instruct

# The NVIDIA LLM API doesn't support embeddings.
spring.ai.openai.embedding.enabled=false
# The NVIDIA LLM API requires this parameter to be set explicitly or error will be thrown.
spring.ai.openai.chat.options.max-tokens=2048

关键点

  • api-key 设置为您的 NVIDIA API 密钥。
  • base-url 设置为 NVIDIA 的 LLM API 端点:https://integrate.api.nvidia.com
  • model 设置为 NVIDIA LLM API 上可用的模型之一。
  • NVIDIA LLM API 要求显式设置max-tokens,否则会抛出服务器错误。
  • 由于 NVIDIA LLM API 仅限于 LLM,因此我们可以禁用嵌入端点:embedding.enabled=false

查看参考文档以获取配置属性的完整列表。

代码示例

现在我们已将 Spring AI 配置为使用 NVIDIA LLM API,让我们来看一个如何在应用程序中使用它的简单示例。

@RestController
public class ChatController {

    private final ChatClient chatClient;

	@Autowired
    public ChatController(ChatClient.Builder builder) {
      this.chatClient = builder.build();
    }

    @GetMapping("/ai/generate")
    public String generate(@RequestParam(value = "message", defaultValue =  "Tell me a joke") String message) {
      return  chatClient.prompt().user(message).call().content();
    }

    @GetMapping("/ai/generateStream")
    public Flux<String> generateStream(
		@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
      return chatClient.prompt().user(message).stream().content();
    }
}

ChatController.java 示例中,我们创建了一个带有两个端点的简单 REST 控制器

  • /ai/generate:针对给定提示生成单个响应。
  • /ai/generateStream:流式传输响应,这对于较长的输出或实时交互很有用。

工具/函数调用

当选择支持工具/函数的模型之一时,NVIDIA LLM API 端点支持工具/函数调用。

SpringAI-NVIDIA-FuncitonCalling

您可以使用自定义 Java 函数注册您的 ChatModel,并让提供的 LLM 模型智能地选择输出包含要调用一个或多个已注册函数的参数的 JSON 对象。这是一种强大的技术,可以将 LLM 功能与外部工具和 API 连接起来。

详细了解 SpringAI/OpenAI函数调用支持。

工具示例

这是一个关于如何使用 Spring AI 进行工具/函数调用的简单示例

@SpringBootApplication
public class NvidiaLlmApplication {

	public static void main(String[] args) {
		SpringApplication.run(NvidiaLlmApplication.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") // reference by bean name.
				.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);
		}
	}
}

NvidiaLlmApplication.java 示例中,当模型需要天气信息时,它将自动调用weatherFunction bean,然后该 bean 可以获取实时天气数据。预期的响应如下所示

阿姆斯特丹目前气温为 20 摄氏度,巴黎目前气温为 25 摄氏度。

关键注意事项

在将 NVIDIA LLM API 与 Spring AI 一起使用时,请记住以下几点

  • 模型选择:NVIDIA 提供了来自各种提供商的各种模型。选择适合您用例的模型。
  • API 兼容性:NVIDIA LLM API 旨在与 OpenAI API 兼容,从而可以轻松集成到 Spring AI 中。
  • 性能:NVIDIA 的 LLM API 针对高性能推理进行了优化。您可能会注意到响应速度有所提高,尤其是在使用大型模型时。
  • 专业模型:NVIDIA 提供了专门用于不同任务的模型,例如代码完成、数学问题和通用聊天。选择最适合您特定需求的模型。
  • API 限制:请注意与您的 NVIDIA API 密钥相关的任何速率限制或使用配额。

参考文献

有关更多信息,请查看 Spring AI 和 OpenAI 参考文档。

结论

将 NVIDIA LLM API 与 Spring AI 集成,为希望在其 Spring 应用程序中利用高性能 AI 模型的开发人员开辟了新的可能性。通过重新利用 OpenAI 客户端,Spring AI 使在不同的 AI 提供商之间切换变得非常简单,允许您为您的特定需求选择最佳解决方案。

在您探索此集成时,请记住随时了解 Spring AI 和 NVIDIA LLM API 的最新文档,因为功能和模型可用性可能会随着时间的推移而发展。

我们鼓励您尝试不同的模型并比较它们的性能和输出,以找到最适合您用例的模型。

祝您编码愉快,并享受 NVIDIA LLM API 为您的 AI 驱动的 Spring 应用程序带来的速度和功能!

获取 Spring 新闻通讯

与 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部