使用像OpenAI的ChatGPT这样的人工智能会消耗资源,并且根据通过API向AI发出的使用和请求情况,生成AI提供者返回的指标。消耗通常是以在给定时间框架(例如每月)内所发出的请求或使用的令牌的形式,AI提供者使用这些来衡量消耗并重置限制。你的速率限制直接由你在注册AI提供者时选择的计划决定。例如,你可以通过跟随链接查看OpenAI的[速率限制](计划详情(https://openai.com/pricing#language-models)。

为了帮助你深入了解你的AI(模型)使用情况和一般使用情况,Spring AI提供了一个API来内省AI提供商在其API中返回的元数据。

春季人工智能定义了3个主要接口来检查这些指标:GenerationMetadataRateLimitUsage。所有这些接口都可以从由AI请求返回和启动的 ChatResponse 中以编程方式访问。

GenerationMetadata` 接口

GenerationMetadata` 接口被定义为:

生成元数据接口
interface GenerationMetadata {

default RateLimit getRateLimit() {
		return RateLimit.NULL;
	}

default Usage getUsage() {
		return Usage.NULL;
	}


}

当通过AI提供商的API发出AI请求并收到AI响应时,`GenerationMetadata`的一个实例会由Spring AI自动创建。您可以通过使用`ChatResponse`来获取AI提供商元数据的访问权。

从`ChatResponse`获取`GenerationMetadata`的访问权限
@Service
class MyService {

ApplicationObjectType askTheAi(ServiceRequest request)

        Prompt prompt = createPrompt(request);

ChatResponse response = chatClient.call(prompt);

        // 处理聊天响应

GenerationMetadata metadata = response.getMetadata();

        // Inspect the AI metadata returned in the chat response of the AI providers API

Long totalTokensUsedInAiPromptAndResponse = metadata.getUsage().getTotalTokens();

        // 根据这些信息采取一些行动
	}
}

你可能想象到,你可以使用AI来限制你自己的Spring应用程序的速率,或者以自动化、智能化和实时的方式限制`Prompt`大小,这将影响你的令牌使用情况。

至少,你可以简单地收集这些指标来监控和报告你的消耗情况。

速率限制

RateLimit` 接口提供了在进行AI请求时,AI提供商关于您的API使用情况返回的实际信息的访问。

RateLimit` 接口
interface RateLimit {

获取请求限制的长整数值。

获取剩余请求次数。

获取请求重置的持续时间。

获取令牌限制的数量;

获取剩余令牌数。

获取令牌重置的持续时间。


}

requestsLimit`和`requestsRemaining`让你知道根据你注册时选择的AI提供商计划,你可以在给定时间框架内总共发起多少次AI请求以及你剩余的次数余额。requestsReset`返回一个时间`Duration,在此之前时间框架将到期并根据你选择的计划重置你的限额。

tokensLimit`、tokensRemainingtokensReset 方法与请求的方法类似,但侧重于令牌限制、余额和重置。

可以从`GenerationMetadata`获取`RateLimit`实例,如下所示:

从`GenerationMetadata`中获取`RateLimit`的访问权限
RateLimit rateLimit = generationMetadata.getRateLimit();

Long tokensRemaining = rateLimit.getTokensRemaining();

// do something interesting with the RateLimit metadata

对于像OpenAI这样的AI服务提供商,速率限制元数据通过他们的(REST)API返回,在https://platform.openai.com/docs/guides/rate-limits/rate-limits-in-headers[HTTP头部]中可以看到,该API可以通过像OkHttp这样的HTTP客户端访问。

因为这可能是一个潜在的耗费资源的操作,必须明确启用对速率限制AI元数据的收集。你可以在Spring Boot的application.properties中通过Spring AI属性来启用这个收集;例如:

从人工智能元数据中启用API速率限制收集
# Spring Boot application.properties
spring.ai.openai.metadata.rate-limit-metrics-enabled=true

用法

如上所示,Usage 数据可以从 GenerationMetadata 对象中获得。Usage 接口定义如下:

"`Usage` 接口"
接口使用情况 {

Long getPromptTokens();

获取代际令牌数。

default Long getTotalTokens() {
		return getPromptTokens() + getGenerationTokens();
	}


}

方法名是不言自明的,但告诉你AI处理`Prompt`并生成响应所需的令牌。

totalTokens` 是 promptTokensgenerationTokens 的总和。Spring AI 默认会进行这一计算,但该信息会在 OpenAI 的 AI 响应中返回。