Titan 聊天

Amazon Titan 基础模型 (FM) 通过完全托管的 API 为客户提供广泛的高性能图像、多模态嵌入和文本模型选择。Amazon Titan 模型由 AWS 创建,并在大型数据集上进行预训练,使其成为功能强大、通用的模型,旨在支持各种用例,同时支持负责任的 AI 使用。您可以直接使用它们,也可以使用自己的数据私下定制它们。

AWS Bedrock Titan 模型页面Amazon Bedrock 用户指南 中包含有关如何使用 AWS 托管模型的详细信息。

先决条件

有关设置 API 访问权限,请参阅 Amazon Bedrock 上的 Spring AI 文档

添加存储库和 BOM

Spring AI 工件发布在 Spring Milestone 和 Snapshot 存储库中。有关将这些存储库添加到您的构建系统,请参阅 存储库 部分。

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

自动配置

spring-ai-bedrock-ai-spring-boot-starter 依赖项添加到项目的 Maven pom.xml 文件中

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

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

dependencies {
    implementation 'org.springframework.ai:spring-ai-bedrock-ai-spring-boot-starter'
}
有关将 Spring AI BOM 添加到您的构建文件,请参阅 依赖项管理 部分。

启用 Titan Chat

默认情况下,Titan 模型处于禁用状态。要启用它,请将 spring.ai.bedrock.titan.chat.enabled 属性设置为 true。导出环境变量是设置此配置属性的一种方法

export SPRING_AI_BEDROCK_TITAN_CHAT_ENABLED=true

聊天属性

前缀 spring.ai.bedrock.aws 是用于配置与 AWS Bedrock 连接的属性前缀。

属性 描述 默认值

spring.ai.bedrock.aws.region

要使用的 AWS 区域。

us-east-1

spring.ai.bedrock.aws.timeout

要使用的 AWS 超时时间。

5m

spring.ai.bedrock.aws.access-key

AWS 访问密钥。

-

spring.ai.bedrock.aws.secret-key

AWS 密钥。

-

前缀 spring.ai.bedrock.titan.chat 是用于配置 Titan 的聊天模型实现的属性前缀。

属性 描述 默认值

spring.ai.bedrock.titan.chat.enable

启用 Bedrock Titan 聊天模型。默认情况下禁用。

false

spring.ai.bedrock.titan.chat.model

要使用的模型 ID。请参阅 TitanChatBedrockApi#TitanChatModel 以了解支持的模型。

amazon.titan-text-lite-v1

spring.ai.bedrock.titan.chat.options.temperature

控制输出的随机性。值范围为 [0.0,1.0]。

0.7

spring.ai.bedrock.titan.chat.options.topP

在采样时要考虑的令牌的最大累积概率。

AWS Bedrock 默认值

spring.ai.bedrock.titan.chat.options.stopSequences

配置生成器识别的最多四个序列。在遇到停止序列后,生成器将停止生成更多令牌。返回的文本不包含停止序列。

AWS Bedrock 默认值

spring.ai.bedrock.titan.chat.options.maxTokenCount

指定在生成的响应中使用的令牌的最大数量。请注意,模型可能会在达到此最大值之前停止。此参数仅指定要生成的令牌的绝对最大数量。我们建议限制为 4,000 个令牌以获得最佳性能。

AWS Bedrock 默认值

查看 TitanChatBedrockApi#TitanChatModel 以了解其他模型 ID。支持的值为:amazon.titan-text-lite-v1amazon.titan-text-express-v1amazon.titan-text-premier-v1:0。模型 ID 值也可以在 AWS Bedrock 文档中找到基本模型 ID

所有以 spring.ai.bedrock.titan.chat.options 为前缀的属性都可以在运行时通过向 Prompt 调用添加特定于请求的 运行时选项 来覆盖。

运行时选项

BedrockTitanChatOptions.java 提供模型配置,例如温度、topP 等。

在启动时,可以使用 BedrockTitanChatModel(api, options) 构造函数或 spring.ai.bedrock.titan.chat.options.* 属性配置默认选项。

在运行时,您可以通过向 Prompt 调用添加新的、特定于请求的选项来覆盖默认选项。例如,要覆盖特定请求的默认温度

ChatResponse response = chatModel.call(
    new Prompt(
        "Generate the names of 5 famous pirates.",
        BedrockTitanChatOptions.builder()
            .withTemperature(0.4)
        .build()
    ));
除了特定于模型的 BedrockTitanChatOptions 之外,您还可以使用可移植的 ChatOptions 实例,该实例使用 ChatOptionsBuilder#builder() 创建。

示例控制器

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

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

spring.ai.bedrock.aws.region=eu-central-1
spring.ai.bedrock.aws.timeout=1000ms
spring.ai.bedrock.aws.access-key=${AWS_ACCESS_KEY_ID}
spring.ai.bedrock.aws.secret-key=${AWS_SECRET_ACCESS_KEY}

spring.ai.bedrock.titan.chat.enabled=true
spring.ai.bedrock.titan.chat.options.temperature=0.8
用您的 AWS 凭据替换 regionsaccess-keysecret-key

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

@RestController
public class ChatController {

    private final BedrockTitanChatModel chatModel;

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

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

    @GetMapping("/ai/generateStream")
	public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
        Prompt prompt = new Prompt(new UserMessage(message));
        return chatModel.stream(prompt);
    }
}

手动配置

BedrockTitanChatModel 实现 ChatModelStreamingChatModel,并使用 低级 TitanChatBedrockApi 客户端 连接到 Bedrock Titanic 服务。

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

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

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

dependencies {
    implementation 'org.springframework.ai:spring-ai-bedrock'
}
有关将 Spring AI BOM 添加到您的构建文件,请参阅 依赖项管理 部分。

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

TitanChatBedrockApi titanApi = new TitanChatBedrockApi(
    TitanChatModel.TITAN_TEXT_EXPRESS_V1.id(),
	EnvironmentVariableCredentialsProvider.create(),
    Region.US_EAST_1.id(),
    new ObjectMapper(),
    Duration.ofMillis(1000L));

BedrockTitanChatModel chatModel = new BedrockTitanChatModel(titanApi,
    BedrockTitanChatOptions.builder()
        .withTemperature(0.6f)
        .withTopP(0.8f)
        .withMaxTokenCount(100)
    .build());

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

// Or with streaming responses
Flux<ChatResponse> response = chatModel.stream(
    new Prompt("Generate the names of 5 famous pirates."));

低级 TitanChatBedrockApi 客户端

TitanChatBedrockApi 提供了一个轻量级的 Java 客户端,它建立在 AWS Bedrock Bedrock Titan 模型 之上。

以下类图说明了 TitanChatBedrockApi 接口和构建块

bedrock titan chat low level api

客户端支持 amazon.titan-text-lite-v1amazon.titan-text-express-v1 模型,用于同步(例如 chatCompletion())和流式(例如 chatCompletionStream())响应。

以下是一个简单的代码片段,说明如何以编程方式使用 api

TitanChatBedrockApi titanBedrockApi = new TitanChatBedrockApi(TitanChatCompletionModel.TITAN_TEXT_EXPRESS_V1.id(),
		Region.EU_CENTRAL_1.id(), Duration.ofMillis(1000L));

TitanChatRequest titanChatRequest = TitanChatRequest.builder("Give me the names of 3 famous pirates?")
	.withTemperature(0.5f)
	.withTopP(0.9f)
	.withMaxTokenCount(100)
	.withStopSequences(List.of("|"))
	.build();

TitanChatResponse response = titanBedrockApi.chatCompletion(titanChatRequest);

Flux<TitanChatResponseChunk> response = titanBedrockApi.chatCompletionStream(titanChatRequest);

List<TitanChatResponseChunk> results = response.collectList().block();

有关更多信息,请遵循 TitanChatBedrockApi 的 JavaDoc。