Hugging Face Chat

Hugging Face Text Generation Inference (TGI) 是一种专门用于在云端部署大型语言模型(LLM)的解决方案,通过 API 使它们可访问。TGI 通过连续批处理、令牌流和高效内存管理等功能为文本生成任务提供优化的性能。

Text Generation Inference 要求模型与其架构特定的优化兼容。虽然许多流行的 LLM 都受支持,但并非 Hugging Face Hub 上的所有模型都可以使用 TGI 部署。如果您需要部署其他类型的模型,请考虑改用标准的 Hugging Face Inference Endpoints。

有关支持模型和架构的完整最新列表,请参阅 Text Generation Inference 支持模型文档

先决条件

您需要在 Hugging Face 上创建一个 Inference Endpoint,并创建一个 API 令牌来访问该端点。 更多详细信息请参见 此处

Spring AI 项目定义了两个配置属性:

  1. spring.ai.huggingface.chat.api-key:将其设置为从 Hugging Face 获取的 API 令牌的值。

  2. spring.ai.huggingface.chat.url:将其设置为在 Hugging Face 中配置模型时获取的推理端点 URL。

您可以在 Inference Endpoint 的 UI 此处找到您的推理端点 URL。

您可以在 application.properties 文件中设置这些配置属性:

spring.ai.huggingface.chat.api-key=<your-huggingface-api-key>
spring.ai.huggingface.chat.url=<your-inference-endpoint-url>

为了在处理 API 密钥等敏感信息时增强安全性,您可以使用 Spring 表达式语言 (SpEL) 引用自定义环境变量:

# In application.yml
spring:
  ai:
    huggingface:
      chat:
        api-key: ${HUGGINGFACE_API_KEY}
        url: ${HUGGINGFACE_ENDPOINT_URL}
# In your environment or .env file
export HUGGINGFACE_API_KEY=<your-huggingface-api-key>
export HUGGINGFACE_ENDPOINT_URL=<your-inference-endpoint-url>

您也可以在应用程序代码中以编程方式设置这些配置:

// Retrieve API key and endpoint URL from secure sources or environment variables
String apiKey = System.getenv("HUGGINGFACE_API_KEY");
String endpointUrl = System.getenv("HUGGINGFACE_ENDPOINT_URL");

添加仓库和 BOM

Spring AI 工件发布在 Maven Central 和 Spring Snapshot 仓库中。 请参阅 工件仓库部分,将这些仓库添加到您的构建系统。

为了帮助进行依赖管理,Spring AI 提供了一个 BOM(物料清单),以确保在整个项目中使用的 Spring AI 版本一致。请参阅 依赖管理部分,将 Spring AI BOM 添加到您的构建系统。

自动配置

Spring AI 自动配置、启动器模块的工件名称发生了重大变化。 有关更多信息,请参阅 升级说明

Spring AI 为 Hugging Face Chat Client 提供了 Spring Boot 自动配置。 要启用它,请将以下依赖项添加到您的项目的 Maven pom.xml 文件中:

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-model-huggingface</artifactId>
</dependency>

或添加到您的 Gradle build.gradle 构建文件中。

dependencies {
    implementation 'org.springframework.ai:spring-ai-starter-model-huggingface'
}

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

聊天属性

聊天自动配置的启用和禁用现在通过前缀为 spring.ai.model.chat 的顶级属性进行配置。 要启用,spring.ai.model.chat=huggingface(默认已启用) 要禁用,spring.ai.model.chat=none(或任何不匹配 huggingface 的值) 此更改是为了允许配置多个模型。

spring.ai.huggingface 前缀是允许您配置 Hugging Face 聊天模型实现的属性前缀。

属性

描述

默认值

spring.ai.huggingface.chat.api-key

用于与推理端点进行身份验证的 API 密钥。

-

spring.ai.huggingface.chat.url

要连接的推理端点的 URL

-

spring.ai.huggingface.chat.enabled (已删除且不再有效)

启用 Hugging Face 聊天模型。

true

spring.ai.model.chat

启用 Hugging Face 聊天模型。

huggingface

示例控制器(自动配置)

创建一个新的 Spring Boot 项目,并将 spring-ai-starter-model-huggingface 添加到您的 pom(或 gradle)依赖项中。

src/main/resources 目录下添加一个 application.properties 文件,以启用和配置 Hugging Face 聊天模型:

spring.ai.huggingface.chat.api-key=YOUR_API_KEY
spring.ai.huggingface.chat.url=YOUR_INFERENCE_ENDPOINT_URL

api-keyurl 替换为您的 Hugging Face 值。

这将创建一个 HuggingfaceChatModel 实现,您可以将其注入到您的类中。 这是一个使用聊天模型进行文本生成的简单 @Controller 类的示例。

@RestController
public class ChatController {

    private final HuggingfaceChatModel chatModel;

    @Autowired
    public ChatController(HuggingfaceChatModel chatModel) {
        this.chatModel = chatModel;
    }

    @GetMapping("/ai/generate")
    public Map generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
        return Map.of("generation", this.chatModel.call(message));
    }
}

手动配置

HuggingfaceChatModel 实现了 ChatModel 接口,并使用 [low-level-api] 连接到 Hugging Face 推理端点。

spring-ai-huggingface 依赖项添加到您的项目的 Maven pom.xml 文件中:

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-huggingface</artifactId>
</dependency>

或添加到您的 Gradle build.gradle 构建文件中。

dependencies {
    implementation 'org.springframework.ai:spring-ai-huggingface'
}

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

接下来,创建一个 HuggingfaceChatModel 并将其用于文本生成:

HuggingfaceChatModel chatModel = new HuggingfaceChatModel(apiKey, url);

ChatResponse response = this.chatModel.call(
    new Prompt("Generate the names of 5 famous pirates."));

System.out.println(response.getResult().getOutput().getText());