Llama Chat

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

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

AWS Llama 模型页面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 添加到您的构建文件中。

启用 Llama 聊天支持

默认情况下,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

在采样时要考虑的令牌的最大累积概率。该模型使用组合的 Top-k 和核采样。核采样考虑概率总和至少为 topP 的最小令牌集。

AWS Bedrock 默认值

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

指定在生成的响应中使用的令牌的最大数量。一旦生成的文本超过 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)依赖项中。

src/main/resources 目录下添加一个 application.properties 文件,以启用和配置 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", 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);
    }
}

手动配置

The BedrockLlamaChatModel implements the ChatModel and StreamingChatModel and uses the Low-level LlamaChatBedrockApi Client to connect to the Bedrock Anthropic service.

Add the spring-ai-bedrock dependency to your project’s Maven pom.xml file

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

Next, create an BedrockLlamaChatModel and use it for text generations

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(api,
    BedrockLlamaChatOptions.builder()
        .withTemperature(0.5f)
        .withMaxGenLen(100)
        .withTopP(0.9f).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."));

Low-level LlamaChatBedrockApi Client

LlamaChatBedrockApi provides is lightweight Java client on top of AWS Bedrock Meta Llama 2 and Llama 2 Chat models.

Following class diagram illustrates the LlamaChatBedrockApi interface and building blocks

LlamaChatBedrockApi Class Diagram

The LlamaChatBedrockApi supports the meta.llama3-8b-instruct-v1:0,meta.llama3-70b-instruct-v1:0,meta.llama2-13b-chat-v1 and meta.llama2-70b-chat-v1 models for both synchronous (e.g. chatCompletion()) and streaming (e.g. chatCompletionStream()) responses.

Here is a simple snippet how to use the api programmatically

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.9f)
		.withTopP(0.9f)
		.withMaxGenLen(20)
		.build();

LlamaChatResponse response = llamaChatApi.chatCompletion(request);

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

Follow the LlamaChatBedrockApi.java's JavaDoc for further information.