当前位置:首页 > 文章列表 > 科技周边 > 人工智能 > Gemini API context caching怎样复用长文档上下文

Gemini API context caching怎样复用长文档上下文

来源:17golang原创 2026-11-04 12:28:54 0浏览 收藏

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 用秒表示,示例中的一小时只是演示,生产环境应按文档更新频率和请求高峰调整。

Gemini API 长文档经 Files API 创建 cachedContents 缓存并绑定模型、系统指令与 TTL 的结构说明图
图1:Gemini context cache 创建边界的结构说明图,不是截图或运行证据。
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 关联同一份上下文。请求仍然需要指定与缓存一致的模型;回答内容不会自动写回缓存,因此“复用长文档”与“保存多轮对话状态”是两件事。

Gemini cachedContent 连接多个新问题并返回 usage metadata、过期时间与删除边界的关系说明图
图2:cachedContent 复用与生命周期信息的关系说明图,不是截图或运行证据。
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 展开,实际可用的模型、输入限制和计费规则应以官方文档与当前项目配置为准。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Gemini API structured output怎样约束返回 JSON SchemaGemini API structured output怎样约束返回 JSON Schema
上一篇
Gemini API structured output怎样约束返回 JSON Schema
MCP 多轮往返请求怎样让工具调用继续执行
下一篇
MCP 多轮往返请求怎样让工具调用继续执行
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    880次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    876次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    960次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    941次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    768次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码