Gemini API context caching怎样复用长文档上下文
来源:17golang原创
时间:2026-11-04 12:28:54 394浏览 收藏
Gemini API 复用长文档的关键,是先创建显式 context cache,后续请求只提交新问题并引用缓存名称。长文档、固定系统指令和工具配置放进缓存,变化的提问留在 generate_content 调用中;这样可以减少重复传输和重复处理,但缓存不是跨模型通用的永久知识库。
官方地址:https://ai.google.dev/gemini-api/docs/generate-content/caching
- 显式缓存使用
cachedContents资源,创建时绑定模型和长文档。 - 后续请求通过
cached_content引用缓存,把新问题单独传入。 - TTL、模型绑定、文档版本和 usage metadata 是排查成本与命中问题的四个重点。
先区分显式缓存和隐式缓存
Gemini API 有两种 context caching。隐式缓存由平台根据相似前缀自动尝试,代码不需要创建缓存对象;显式缓存则由应用主动创建、命名和设置生命周期,适合一本手册、接口文档、会议转录或规则库会被连续提问的场景。需要可控地复用一份长文档时,优先使用显式缓存。
当前文档还说明,Interactions API 只支持隐式缓存;下面的手动创建方式使用 generateContent API 和 Google GenAI SDK。缓存资源创建后绑定具体模型,不能创建一次再随意换模型使用。
先把长文档变成可复用的缓存资源
下面示例把本地文本上传到 Files API,再创建一个带系统指令的缓存。ttl 用秒表示,示例中的一小时只是演示,生产环境应按文档更新频率和请求高峰调整。

from google import genai
from google.genai import types
import os
# API key 从环境变量读取,避免把凭据写进源码或缓存配置。
client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])
# 先上传会被反复引用的长文档,返回的文件对象交给缓存资源。
document = client.files.upload(file="docs/product-manual.txt")
# 缓存资源绑定模型;TTL 到期后需要重新创建或续期。
cache = client.caches.create(
model="gemini-2.5-flash",
config=types.CreateCachedContentConfig(
contents=[document],
system_instruction="只根据缓存文档回答,并指出无法从文档确认的内容。",
ttl="3600s",
display_name="product-manual-v1",
),
)
print(cache.name) # 保存 cachedContents/{id},后续请求只引用这个名称。
这里的 contents 是固定上下文,system_instruction 也属于缓存资源的一部分。不要把会频繁变化的用户问题放进创建阶段,否则每个问题都要重新建立缓存。文档更新时也不要继续沿用旧的 display_name 作为版本依据,建议在应用数据库中保存源文件摘要、缓存名称和创建时间。
后续请求只发送新问题
拿到 cache.name 后,每个问题都通过 cached_content 关联同一份上下文。请求仍然需要指定与缓存一致的模型;回答内容不会自动写回缓存,因此“复用长文档”与“保存多轮对话状态”是两件事。

from google import genai
from google.genai import types
import os
# 生产环境应从持久化配置中读取缓存名称,而不是每次重新创建缓存。
client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])
cache_name = "cachedContents/replace-with-your-cache-id"
response = client.models.generate_content(
model="gemini-2.5-flash",
contents="请列出退款流程中的人工审核条件,并按文档章节给出依据。",
config=types.GenerateContentConfig(cached_content=cache_name),
)
print(response.text)
# usage metadata 用于观察输入 token 与缓存命中情况,字段以 SDK 版本为准。
print(response.usage_metadata)
需要注意的是,缓存只保存可复用的输入上下文,不等于把所有后续问题和答案永久累积。若业务需要连续对话,应另外保存 previous_interaction_id 或自己的会话记录;不要把会话状态和显式 context cache 混成一条数据。
TTL、版本和命中情况怎么排查
| 现象 | 优先检查 | 处理方式 |
|---|---|---|
| 引用时报资源不存在 | TTL、缓存名称、项目凭据 | 读取缓存元数据,过期后按当前文档重建 |
| 请求提示模型不匹配 | 创建时的 model 与调用时的 model | 让两者保持一致,不能只改调用参数 |
| 成本没有下降 | 是否真的重复使用、文档是否足够长、usage metadata | 把固定内容前置,区分缓存输入与新问题 |
| 文档已更新但回答仍旧 | 应用保存的文档版本与 cache.name | 新建新版本缓存,灰度切换引用名称 |
缓存的过期可以用创建时的 ttl,也可以使用绝对的 expireTime。长期运行的服务应在应用侧保存“源文档版本 → cache.name”的映射,在到期前预热新缓存;不要等第一个用户请求失败后再同步上传大文件。确认不再使用的资源则调用删除接口释放管理负担。
# 续期或删除前,先从配置中心取出真实 cache_name,避免误操作其他文档版本。 cache = client.caches.get(name=cache_name) print(cache.name, cache.model, cache.expire_time) # 文档版本废弃后删除对应资源;删除动作应放在发布确认之后。 client.caches.delete(name=cache.name)
落地前的最小检查清单
- 长文档和固定规则确实会被多次查询,短文档不要为了“使用缓存”强行接入。
- 创建和调用使用同一个模型,应用持久化 cache.name、源文档版本和过期时间。
- 把新问题放在请求内容中,定期读取 usage metadata,不把一次成功调用当成命中率证明。
- 文档变更先创建新缓存,再切换流量;旧缓存到期或确认无引用后再删除。
相关问题
显式缓存能不能跨模型复用?
不能把它当成跨模型资源。缓存创建时已经绑定模型,调用时应保持同一模型;需要换模型时重新创建对应缓存。
每次提问都要重新上传长文档吗?
不需要。上传和创建缓存是准备阶段,后续请求使用 cache.name 引用固定上下文,只传新的问题和必要的临时参数。
为什么用了缓存仍然要关注 TTL?
缓存是有生命周期的资源,不是永久知识库。TTL 到期后引用可能失效,文档更新也可能让旧缓存产生过时回答,因此必须把过期和版本切换纳入应用逻辑。
以上示例围绕 Gemini API 的显式 context caching 展开,实际可用的模型、输入限制和计费规则应以官方文档与当前项目配置为准。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
157 收藏
-
234 收藏
-
135 收藏
-
230 收藏
-
344 收藏
-
312 收藏
-
458 收藏
-
科技周边 · 人工智能 | 1小时前 | python · 人工智能 · gemini · 结构化输出 · Pydantic JSON Schema Gemini API google-genai structured output136 收藏
-
486 收藏
-
322 收藏
-
250 收藏
-
167 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习