测试语言模型令牌限制

生成使用语言模型的应用时,应测试应用如何处理基于令牌的速率限制。 开发人员代理允许使用 LanguageModelRateLimitingPlugin 模拟语言模型 API 的令牌限制。

模拟语言模型 API 的令牌限制

若要开始,请在 LanguageModelRateLimitingPlugin 配置文件中启用。

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v1.0.0/rc.schema.json",
  "plugins": [
    {
      "name": "LanguageModelRateLimitingPlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
      "configSection": "languageModelRateLimitingPlugin",
      "urlsToWatch": [
        "https://api.openai.com/*",
        "http://localhost:11434/*"
      ]
    }
  ]
}

小窍门

该插件适用于任何与 OpenAI 兼容的 API,包括本地语言模型(如 Ollama)。 请在 urlsToWatch 属性中包含您想要测试的所有语言模型 API 终结点。

接下来,使用所选的令牌限制和时间窗口配置插件。

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v1.0.0/rc.schema.json",
  "plugins": [
    {
      "name": "LanguageModelRateLimitingPlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
      "configSection": "languageModelRateLimitingPlugin",
      "urlsToWatch": [
        "https://api.openai.com/*",
        "http://localhost:11434/*"
      ]
    }
  ],
  "languageModelRateLimitingPlugin": {
    "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v1.0.0/languagemodelratelimitingplugin.schema.json",
    "promptTokenLimit": 1000,
    "completionTokenLimit": 500,
    "resetTimeWindowSeconds": 60,
    "whenLimitExceeded": "Throttle"
  }
}

此配置允许 60 秒窗口中最多 1,000 个提示令牌和 500 个完成令牌。 超过任一限制时,后续请求将会被限制,返回标准的 429 响应。

使用配置文件启动开发代理,并使用应用发出语言模型请求。 插件跟踪实际 API 响应中的令牌消耗,并在超出限制时限制请求。

使用自定义错误响应进行测试

在超出令牌限制时,可以通过将whenLimitExceeded设置为Custom并创建自定义响应文件来配置自定义响应。

{
  "languageModelRateLimitingPlugin": {
    "promptTokenLimit": 500,
    "completionTokenLimit": 300,
    "resetTimeWindowSeconds": 120,
    "whenLimitExceeded": "Custom",
    "customResponseFile": "token-limit-response.json"
  }
}

使用所需的错误格式创建自定义响应文件:

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v1.0.0/languagemodelratelimitingplugincustomresponse.schema.json",
  "statusCode": 429,
  "headers": [
    {
      "name": "retry-after",
      "value": "@dynamic"
    },
    {
      "name": "content-type",
      "value": "application/json"
    }
  ],
  "body": {
    "error": {
      "message": "Token quota exceeded. Your application has consumed all available tokens for this time period.",
      "type": "quota_exceeded",
      "code": "TOKENS_EXHAUSTED",
      "details": {
        "quota_type": "tokens",
        "retry_after_seconds": "@dynamic"
      }
    }
  }
}

retry-after 标头的 @dynamic 值会自动计算令牌限制重置前的剩余秒数。

测试不同的方案

方案 1:令牌限制较低以便于频繁测试

{
  "languageModelRateLimitingPlugin": {
    "promptTokenLimit": 100,
    "completionTokenLimit": 50,
    "resetTimeWindowSeconds": 30
  }
}

在开发和测试过程中,使用具有短时间窗口的低限制来快速触发限制。

场景 2:接近生产环境的限制

{
  "languageModelRateLimitingPlugin": {
    "promptTokenLimit": 10000,
    "completionTokenLimit": 5000,
    "resetTimeWindowSeconds": 3600
  }
}

若要测试实际的令牌使用模式,请配置与生产环境类似的限制。

方案 3:非对称限制

{
  "languageModelRateLimitingPlugin": {
    "promptTokenLimit": 2000,
    "completionTokenLimit": 100,
    "resetTimeWindowSeconds": 300
  }
}

完成令牌限制低于提示限制的测试场景,模拟具有成本意识的 API 计划。

后续步骤

详细了解 LanguageModelRateLimitingPlugin