使用聊天/嵌入响应使用量

概述

Spring AI 通过在 Usage 接口中引入 getNativeUsage() 方法并提供 DefaultUsage 实现,增强了其模型使用量处理功能。 这一变化简化了不同 AI 模型跟踪和报告其使用指标的方式,同时保持了整个框架的一致性。

主要变更

Usage 接口增强

Usage 接口现在包含一个新方法:

Object getNativeUsage();

此方法允许访问模型特定的原生使用数据,在需要时实现更详细的使用量跟踪。

与 ChatModel 一起使用

以下是一个完整的示例,展示如何使用 OpenAI 的 ChatModel 跟踪使用量:

@SpringBootConfiguration
public class Configuration {

        @Bean
        public OpenAiApi chatCompletionApi() {
            return OpenAiApi.builder()
                .apiKey(System.getenv("OPENAI_API_KEY"))
                .build();
        }

        @Bean
        public OpenAiChatModel openAiClient(OpenAiApi openAiApi) {
            return OpenAiChatModel.builder()
                .openAiApi(openAiApi)
                .build();
        }

    }

@Service
public class ChatService {

    private final OpenAiChatModel chatModel;

    public ChatService(OpenAiChatModel chatModel) {
        this.chatModel = chatModel;
    }

    public void demonstrateUsage() {
        // 创建聊天提示
        Prompt prompt = new Prompt("今天天气怎么样?");

        // 获取聊天响应
        ChatResponse response = this.chatModel.call(prompt);

        // 访问使用量信息
        Usage usage = response.getMetadata().getUsage();

        // 获取标准使用量指标
        System.out.println("提示词令牌数: " + usage.getPromptTokens());
        System.out.println("完成令牌数: " + usage.getCompletionTokens());
        System.out.println("总令牌数: " + usage.getTotalTokens());

        // 访问原生 OpenAI 使用数据,包含详细的令牌信息
        if (usage.getNativeUsage() instanceof org.springframework.ai.openai.api.OpenAiApi.Usage) {
            org.springframework.ai.openai.api.OpenAiApi.Usage nativeUsage =
                (org.springframework.ai.openai.api.OpenAiApi.Usage) usage.getNativeUsage();

            // 详细的提示词令牌信息
            System.out.println("提示词令牌详情:");
            System.out.println("- 音频令牌: " + nativeUsage.promptTokensDetails().audioTokens());
            System.out.println("- 缓存令牌: " + nativeUsage.promptTokensDetails().cachedTokens());

            // 详细的完成令牌信息
            System.out.println("完成令牌详情:");
            System.out.println("- 推理令牌: " + nativeUsage.completionTokenDetails().reasoningTokens());
            System.out.println("- 接受的预测令牌: " + nativeUsage.completionTokenDetails().acceptedPredictionTokens());
            System.out.println("- 音频令牌: " + nativeUsage.completionTokenDetails().audioTokens());
            System.out.println("- 拒绝的预测令牌: " + nativeUsage.completionTokenDetails().rejectedPredictionTokens());
        }
    }
}

与 ChatClient 一起使用

如果你使用 ChatClient,你可以通过 ChatResponse 对象访问使用量信息:

// 创建聊天提示
Prompt prompt = new Prompt("今天天气怎么样?");

// 创建聊天客户端
ChatClient chatClient = ChatClient.create(chatModel);

// 获取聊天响应
ChatResponse response = chatClient.prompt(prompt)
        .call()
        .chatResponse();

// 访问使用量信息
Usage usage = response.getMetadata().getUsage();

优势

标准化:提供了一种跨不同 AI 模型处理使用量的一致方式 灵活性:通过原生使用量功能支持模型特定的使用数据 简化:通过默认实现减少了样板代码 可扩展性:易于针对特定模型需求进行扩展,同时保持兼容性

类型安全注意事项

在处理原生使用数据时,请谨慎考虑类型转换:

// 安全访问原生使用量的方式
if (usage.getNativeUsage() instanceof org.springframework.ai.openai.api.OpenAiApi.Usage) {
    org.springframework.ai.openai.api.OpenAiApi.Usage nativeUsage =
        (org.springframework.ai.openai.api.OpenAiApi.Usage) usage.getNativeUsage();
    // 处理原生使用量数据
}