响应缓存
当后续请求具有相同缓存 Key 时 ,响应缓存允许 AISIX 复用先前的非流式 Chat Completions 响应。这是网关侧响应缓存,不是模型服务提供方的提示词缓存,也不是控制面的配置快照缓存。如需为 Anthropic 模型配置模型服务提供方侧缓存,请参阅 Anthropic 提示词缓存。若要为相似而非完全相同的提示词返回缓存响应,可在策略上叠加语义缓存。
本指南介绍如何通过 AISIX Cloud Admin API 或声明式资源文件配置模型作用域缓存策略、验证缓存未命中和命中、选择共享范围、绕过与清空缓存条目,并按需使用 Redis 在多个网关实例间共享缓存响应。
响应缓存的工作原理
AISIX 会缓存完全匹配的非流式 Chat Completions 响应。流式响应和其他代理 API 类型不会使用此响应缓存路径。
缓存策略可以应用于所有符合条件的请求、一个模型别名或一个调用方 API Key。每个策略把响应存储在网关的进程内 Memory 缓存中;如果启动时配置了 Redis,也可以存储在 Redis 中。
AISIX 缓存响应之前,网关必须能够使用所选后端,并且请求必须匹配一个已启用的缓存策略。
缓存 Key 匹配
AISIX 根据会影响上游响应的规范化 Chat Completions 请求创建缓存 Key 。只有模型别名、消息角色和规范化内容、采样设置、响应长度以及额外的兼容 OpenAI 请求选项都相同时,两个请求才会共享缓存条目。
JSON 对象 Key 的顺序不会影响缓存匹配,包括嵌套对象中的 Key。数组顺序会影响匹配,因此工具定义相同但顺序不同的两个请求会使用不同缓存条目。
如果存在 temperature 和 top_p,则以 0.001 的精度比较,而不是按浮点数精确相等比较。因此,在其他所有字段都匹配时,位于同一千分位区间内的两个显式值会使用同一个缓存 Key。省略字段与显式设置该字段仍视为不同。
对于多目标模型,缓存 Key 使用调用方请求的别名,而不是处理未命中请求的目标模型。请求 ID 和请求头不参与缓存 Key。
调用方 API Key 是否分隔缓存由策略的 scope 字段控制。默认的 scope: api_key 下条目仅对写入它的 API Key 可见;scope: env 则在环境内所有调用方之间共享。见选择共享范围。
选择缓存后端
每个缓存策略都要选择匹配响应的存储位置:
| 后端 | 行为 |
|---|---|
| Memory | 默认。使用处理未命中请求的网关实例上的进程内缓存。 |
| Redis | 使用网关启动时配置的共享 Redis 缓存。 |
单实例部署或可以接受节点本地缓存条目时使用 Memory。多个网关实例需要共享同一策略的缓存响应时使用 Redis。AISIX 支持单个 Redis 端点、Redis Cluster 和 Redis Sentinel。
配置 Memory 缓存策略
以下示例使用默认的进程内 Memory 后端创建模型作用域策略。请选择控制面或开源配置路径,再使用通用验证步骤。如果已有其他已启用的缓存策略匹配示例请求,请先将其禁用或删除。
准备工作
开始前,请准备以下内容:
- 以下配置路径之一:
- AISIX Enterprise 或 AISIX Cloud,其中包含环境、已接入的网关和具有写权限范围的 Admin Token。对于 AISIX Enterprise,请按照 AISIX Enterprise 快速入门操作。如需申请 AISIX Cloud 访问权限,请联系 API7。
- 加载声明式
resources.yaml文件的开源 AISIX 网关。
- 可以发送非流式 Chat Completions 请求的模型别名和调用方 API Key。
curl。控制面路径还会使用jq。
导出两种路径都会使用的网关连接和资源参数:
# AISIX_PROXY 不含尾部斜杠或 /v1 等端点路径
# 本地快速入门使用 http://127.0.0.1:3000。
export AISIX_PROXY="YOUR_AISIX_GATEWAY_URL"
export AISIX_API_KEY="YOUR_CALLER_API_KEY"
export AISIX_MODEL="gpt-4o-mini"
export CACHE_PROMPT="cache-check-$(date +%s)"
AISIX Enterprise 或 AISIX Cloud
导出控制面连接参数:
# AISIX_CP 包含 /api,且不含尾部斜杠
# 本地 AISIX Enterprise 快速入门使用 http://localhost:8080/api
export AISIX_CP="YOUR_AISIX_CONTROL_PLANE_API_URL"
export AISIX_TOKEN="YOUR_ADMIN_TOKEN"
export ENV_ID="YOUR_ENVIRONMENT_ID"
为示例模型别名创建 Memory 缓存策略。保存策略 ID,因为后面的 Redis 步骤会替换该策略:
CACHE_POLICY_RESPONSE=$(curl -sS -X POST "$AISIX_CP/environments/$ENV_ID/cache_policies" \
-H "Authorization: Bearer $AISIX_TOKEN" \
-H "Content-Type: application/json" \
--data-binary @- <<EOF
{
"name": "default-chat-cache",
"enabled": true,
"backend": "memory",
"applies_to": "model:${AISIX_MODEL}",
"ttl_seconds": 3600
}
EOF
)
export CACHE_POLICY_ID=$(printf '%s' "$CACHE_POLICY_RESPONSE" | jq -r '.cache_policy.id')
printf '%s' "$CACHE_POLICY_RESPONSE" | jq
策略会自动投射到已接入的网关。响应包含策略 ID、环境 ID、所选后端、作用域、TTL 和时间戳。
如果 model: 选择器本身就是通配符模式,例如 model:openai/*,控制面会以 400 拒绝——调用方寻址的是该别名所承载的具体名称,而不是别名本身。环境中没有任何模型能应答的名称同样会被拒绝:只有当某个模型以该名称作为其 display_name,或某个通配符别名承载该名称时,这个名称才成立。
开源 AISIX 网关
在已定义示例模型和调用方 API Key 的资源文件中添加缓存策略:
cache_policies:
- name: default-chat-cache
enabled: true
backend: memory
applies_to: "model:gpt-4o-mini"
ttl_seconds: 3600
applies_to 中的模型名称是调用方在请求中使用的名称:对于具体配置的模型,即其 display_name;而当某个命名空间由 openai/* 这类通配符别名承载时,则是调用方在该命名空间下使用的具体名称(openai/gpt-4o),而不是别名模式本身。验证完整资源文件,然后重新加载网关。可运行的 Docker 工作流参见重新加载资源文件。