Spring AI 与 NVIDIA LLM API
Spring AI 现在支持 NVIDIA®(英伟达™)的 大型语言模型 API,可与各种 模型 集成。通过利用 NVIDIA 的 OpenAI 兼容 API,Spring AI 允许开发人员通过熟悉的 Spring AI API 使用 NVIDIA LLM。
本文将带你了解如何配置和使用 Spring AI OpenAI 聊天客户端来连接 NVIDIA LLM API。
- 完整的示例代码可从 nvidia-llm GitHub 仓库获取。
- SpringAI / NVIDIA 整合文档。
先决条件
- 创建 NVIDIA 帐户并获得足够的积分。
- 从 NVIDIA 提供的 LLM 模型 中选择自己喜欢的模型。如下面截图中的
meta/llama-3.1-70b-instruct
。 - 从模型页面获取所选模型的 API Key。
依赖
首先,将 Spring AI OpenAI Starter 添加到 Maven pom.xml
中:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
对于 Gradle 来说,需要在 build.gradle
添加如下依赖:
gradledependencies {
implementation 'org.springframework.ai:spring-ai-openai-spring-boot-starter'
}
确保在构建文件中已添加了 Spring Milestone 和 Snapshot 仓库,以及 Spring AI BOM。
配置 Spring AI
要在 Spring AI 中使用 NVIDIA LLM API,我们需要配置 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
# NVIDIA LLM API 不支持 Embedding。
spring.ai.openai.embedding.enabled=false
# NVIDIA LLM API 要求明确设置该参数,否则会异常
spring.ai.openai.chat.options.max-tokens=2048
关键点:
api-key
设置为你的 NVIDIA API key。base-url
设置为 NVIDIA LLM API 端点:https://integrate.api.nvidia.com
。model
设置为 NVIDIA LLM API 中可用的模型之一。- NVIDIA LLM API 要求明确设置
max-tokens
,否则会出现服务器错误。 - 由于 NVIDIA LLM API 仅支持 LLM,因此我们可以禁用 embedding 端点:
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 Controller:
/ai/generate
: 对给定的提示生成一个回复。/ai/generateStream
:流式响应,这对较长的输出或实时交互非常有用。
工具/函数调用
选择支持工具/函数的模型时,NVIDIA LLM API 端点支持工具/函数调用。
你可以在 ChatModel
中注册自定义 Java 函数,并让所提供的 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,然后获取实时天气数据。预期响应如下
The weather in Amsterdam is currently 20 degrees Celsius, and the weather in Paris is currently 25 degrees Celsius(阿姆斯特丹目前的天气为 20 摄氏度,巴黎目前的天气为 25 摄氏度)。
需要关注的点
在 Spring AI 中使用 NVIDIA LLM API 时,有一些需要关注的点:
- 模型选择:NVIDIA 提供来自不同供应商的多种模型。请根据你的使用情况选择合适的模型。
- API 兼容性:NVIDIA LLM API 的设计与 OpenAI API 兼容,可轻松与 Spring AI 集成。
- 性能:NVIDIA 的 LLM API 针对高性能推理进行了优化。你可能会发现响应速度有所提高,尤其是对于较大的模型。
- 专用模型:NVIDIA 提供针对不同任务的专用模型,如代码补全、数学问题和普通聊天。请根据你的具体需求选择最合适的模型。
- API 限制:请注意与你的 NVIDIA API Key 相关联的速率限制或使用配额。
参考
欲了解更多信息,请查阅 Spring AI 和 OpenAI 参考文档。
- Spring AI NVIDIA 参考文档
- NVIDIA LLM API
- Spring AI - NVIDIA - Demo
- 往期的 Spring AI 博客:
总结
将 NVIDIA LLM API 与 Spring AI 集成,为希望在 Spring 应用中利用高性能 AI 模型的开发人员提供了新的可能性。通过重新利用 OpenAI 客户端,Spring AI 可以在不同的 AI 提供商之间直接切换,让你可以根据具体需求选择最佳解决方案。
Ref:https://spring.io/blog/2024/08/20/spring-ai-with-nvidia-llm-api