AI Search 中的基于相似度的缓存,可让你为与先前请求相似的查询从 Cloudflare 缓存提供响应,而不是为每个请求创建新的、唯一的响应。通过复用含义相近问题的答案,可加快响应速度并降低成本。
与基本缓存(每次请求都创建新响应)不同,使用基于相似度的缓存时,收到请求后会发生以下情况:
- AI Search 检查是否曾回答过相似的提示(基于你选择的阈值)。
- 若找到匹配,则立即返回缓存的响应。
- 若未找到匹配,则生成新响应并将其缓存。
要查看响应是否来自缓存,请检查 cf-aig-cache-status 标头:HIT 表示缓存命中,MISS 表示新生成。
使用相似度缓存时请考虑以下行为:
- 易失缓存:若两个相似请求同时到达,第一个可能来不及为第二个完成缓存,导致
MISS。 - 可配置时长:缓存响应根据实例的
cache_ttl设置过期。默认值为 48 小时。 - 数据依赖:缓存响应与特定文档 chunk 绑定。若这些 chunk 更改或被删除,缓存会清除以保持答案新鲜。
AI Search 的相似度缓存使用 MinHash 与 Locality-Sensitive Hashing (LSH) 来查找并复用措辞相似的提示的响应。
当新提示进入时,工作流程如下:
- 提示被拆分为重叠的小词块(称为 shingle),例如 "what's the" 或 "the weather"。
- 这些 shingle 通过 MinHash 转为“指纹”。两个提示重叠越多,其指纹越相似。
- 指纹放入 LSH 桶中,帮助 AI Search 快速找到相似提示,而无需逐一比较。
- 若同一桶中的过去提示足够相似(基于你配置的阈值),AI Search 会复用其缓存响应。
相似度阈值决定两个提示需要多接近才能复用缓存响应。你可以在实例级别设置阈值,或按请求覆盖。
| 阈值 | API 值 | 说明 | 匹配示例 |
|---|---|---|---|
| Exact | super_strict_match |
仅近乎相同的匹配 | "What's the weather like today?" 匹配 "What is the weather like today?" |
| Strong | close_enough(默认) |
高语义相似度 | "What's the weather like today?" 匹配 "How's the weather today?" |
| Broad | flexible_friend |
中等匹配,命中更多 | "What's the weather like today?" 匹配 "Tell me today's weather" |
| Loose | anything_goes |
低相似度,最大复用 | "What's the weather like today?" 匹配 "Give me the forecast" |
创建或更新实例时设置 cache_ttl,以控制实例保留缓存响应的时长。允许的值包括:
| 时长 | API 值 |
|---|---|
| 10 分钟 | 600 |
| 30 分钟 | 1800 |
| 1 小时 | 3600 |
| 2 小时 | 7200 |
| 6 小时 | 21600 |
| 12 小时 | 43200 |
| 24 小时 | 86400 |
| 48 小时 | 172800 |
| 72 小时 | 259200 |
| 6 天 | 518400 |
要立即清除实例的所有缓存响应,使用清除缓存操作:
curl -X POST "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/ai-search/instances/$INSTANCE_NAME/purge_cache" \
-H "Authorization: Bearer $CLOUDFLARE_API_TOKEN"清除缓存会轮换实例的内部缓存密钥,因此新查询不会复用先前的缓存响应。
你也可以从 Cloudflare 仪表板的实例设置页面清除缓存响应。
你可以使用 ai_search_options 中的 cache 参数,按请求覆盖实例级缓存设置:
const instance = env.AI_SEARCH.get("my-instance");
const results = await instance.search({
messages: [{ role: "user", content: "What is Cloudflare?" }],
ai_search_options: {
cache: {
enabled: true,
cache_threshold: "flexible_friend",
},
},
});