Llama Chat

Meta 的 Llama Chat 是 Llama 系列大型语言模型的一部分。它在基于对话的应用中表现出色,参数规模从 70 亿到 700 亿不等。利用公共数据集和超过 100 万个人工标注,Llama Chat 提供了上下文感知的对话。

Llama-Chat 训练于来自公共数据源的 2 万亿个 token,提供了广泛的知识,可以进行富有见地的对话。严格的测试,包括超过 1000 小时的红队测试和标注,确保了性能和安全性,使其成为 AI 驱动对话的可靠选择。

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

前提条件

请参考 Spring AI 关于 Amazon Bedrock 的文档 来设置 API 访问。

添加仓库和 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 添加到您的构建文件中。

启用 Llama Chat 支持

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

export SPRING_AI_BEDROCK_LLAMA_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.llama.chat` 是配置 Llama 聊天模型实现的属性前缀。

属性 描述 默认值

spring.ai.bedrock.llama.chat.enabled

启用或禁用 Llama 支持

false

spring.ai.bedrock.llama.chat.model

要使用的模型 ID(见下文)

meta.llama3-70b-instruct-v1:0

spring.ai.bedrock.llama.chat.options.temperature

控制输出的随机性。值可以介于 [0.0,1.0](包含)之间。接近 1.0 的值将产生变化更大的响应,而接近 0.0 的值通常会导致模型产生不太令人意外的响应。此值指定后端在调用模型时使用的默认值。

0.7

spring.ai.bedrock.llama.chat.options.top-p

采样时要考虑的 token 的最大累积概率。模型使用组合的 Top-k 和 nucleus 采样。Nucleus 采样考虑概率总和至少为 topP 的最小 token 集。

AWS Bedrock 默认值

spring.ai.bedrock.llama.chat.options.max-gen-len

指定在生成的响应中使用的 token 的最大数量。一旦生成的文本超过 maxGenLen,模型就会截断响应。

300

查看 LlamaChatBedrockApi#LlamaChatModel 以获取其他模型 ID。另一个支持的值是 `meta.llama2-13b-chat-v1`。模型 ID 值也可以在 AWS Bedrock 基模型 ID 文档 中找到。

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

运行时选项

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

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

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

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

示例控制器

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

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

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.llama.chat.enabled=true
spring.ai.bedrock.llama.chat.options.temperature=0.8
regionsaccess-keysecret-key替换为您的AWS凭证。

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

@RestController
public class ChatController {

    private final BedrockLlamaChatModel chatModel;

    @Autowired
    public ChatController(BedrockLlamaChatModel 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));
    }

    @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 this.chatModel.stream(prompt);
    }
}

手动配置

BedrockLlamaChatModel实现了ChatModelStreamingChatModel接口,并使用低级LlamaChatBedrockApi客户端连接到Bedrock Anthropic服务。

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 添加到您的构建文件中。

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

LlamaChatBedrockApi api = new LlamaChatBedrockApi(LlamaChatModel.LLAMA2_70B_CHAT_V1.id(),
	EnvironmentVariableCredentialsProvider.create(),
	Region.US_EAST_1.id(),
	new ObjectMapper(),
	Duration.ofMillis(1000L));

BedrockLlamaChatModel chatModel = new BedrockLlamaChatModel(this.api,
    BedrockLlamaChatOptions.builder()
        .withTemperature(0.5)
        .withMaxGenLen(100)
        .withTopP(0.9).build());

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

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

低级LlamaChatBedrockApi客户端

LlamaChatBedrockApi提供了一个基于AWS Bedrock的轻量级Java客户端,用于访问Meta Llama 2和Llama 2 Chat模型

下面的类图说明了LlamaChatBedrockApi接口及其组成部分。

LlamaChatBedrockApi Class Diagram

LlamaChatBedrockApi支持meta.llama3-8b-instruct-v1:0meta.llama3-70b-instruct-v1:0meta.llama2-13b-chat-v1meta.llama2-70b-chat-v1模型,并支持同步(例如chatCompletion())和流式(例如chatCompletionStream())响应。

这是一个简单的代码片段,演示如何以编程方式使用该API。

LlamaChatBedrockApi llamaChatApi = new LlamaChatBedrockApi(
        LlamaChatModel.LLAMA3_70B_INSTRUCT_V1.id(),
        Region.US_EAST_1.id(),
        Duration.ofMillis(1000L));

LlamaChatRequest request = LlamaChatRequest.builder("Hello, my name is")
		.withTemperature(0.9)
		.withTopP(0.9)
		.withMaxGenLen(20)
		.build();

LlamaChatResponse response = this.llamaChatApi.chatCompletion(this.request);

// Streaming response
Flux<LlamaChatResponse> responseStream = this.llamaChatApi.chatCompletionStream(this.request);
List<LlamaChatResponse> responses = this.responseStream.collectList().block();

请参阅LlamaChatBedrockApi.java的Javadoc以获取更多信息。