EP08. "Claude 进阶功能:Extended Thinking/看图读 PDF/Prompt Caching"
🔒 登录后可标记已读- Extended thinking 让 Claude 在给最终答案前先"想一下",回应会多出一段推理过程(reasoning content),但该不该开要看评测分数说话,不是想开就开——多花的每个 thinking token 都要付钱
- Claude 能直接分析图片和 PDF,格式分别用
"image"和"document"两种消息结构,插图/PDF 一样能套用 prompt engineering 技巧(给方法论、给范例)大幅提升分析准确度 - Citations 功能让 Claude 在读 PDF 回答问题时,明确标出每句话是从原文哪里来的——解决"AI 说的话到底可不可信"这个 PDF 场景下最大的痛点
- Prompt caching 把之前处理过的内容的运算结果存起来,重复内容下次请求能直接读缓存,省时间也省钱——但缓存不是自动的,要自己手动插入 cache point,而且有好几条硬性规则要满足
- 前置知识:EP01 的基本请求结构、
chat()封装函数
重点内容
Extended Thinking:给 Claude 留时间想
Extended thinking 是 Claude 的进阶功能,让模型在给出最终答案前,先花时间推理复杂问题。开启后,回应会包含两个部分而不是一个:
- Reasoning Content Part:Claude 内部的思考过程
- Text Part:最终真正要给用户的回答
📌 Reasoning content 会具体展示 Claude 怎么拆解问题、考虑了哪些因素、怎么一步步推导出最终答案。
取舍要权衡:复杂任务上准确度会更好;但所有 thinking token 都要付费,成本更高;推理需要额外处理时间,延迟也会增加。
💡 判断该不该开:先跑评测。如果 prompt 已经优化过、准确度还是不够,这时候才该考虑上 extended thinking——不是凭感觉开。
Signature 机制:Claude 生成的 thinking 内容会带一个签名,确保这段思考文字不能被篡改。如果要在后续对话里带上 Claude 之前的推理过程,这个签名能验证内容有没有被动过手脚。
Redacted content(被隐去的内容):安全系统有时会标记某些 thinking 内容,这种情况下拿到的不是可读文字,而是一个 redactedContent 字段——内容是加密的,但依然可以在后续对话里原样传回给 Claude,不会丢失上下文。
Claude Opus 5 / Sonnet 5 这类当前模型:thinking 是 adaptive(自适应),默认就开着,Claude 自己判断该花多少力气推理。要看到推理内容,把 display 设成 summarized:
additional_model_fields["thinking"] = {
"type": "adaptive",
"display": "summarized"
}
开着 adaptive thinking 时,简单问题通常很快就有答案,难题会自动拿到更多推理时间。effort 参数可以软性引导推理力度的分配,取代了手动管理 token 预算的做法。
⚠️ 旧的手动配置正在淘汰:thinking.type: "enabled" + budget_tokens 在 Claude Opus 4.6 / Sonnet 4.6 上已经标记弃用;Claude Opus 4.7 及更新版本(包括 Opus 5、Sonnet 5)会直接对手动 budget 请求返回 400 错误。
Claude 4.5 及更早的模型没有 adaptive thinking,还是要手动给 token 预算:
additional_model_fields["thinking"] = {
"type": "enabled",
"budget_tokens": thinking_budget
}
thinking_budget 控制 Claude 能花多少 token 做推理,最低 1024 token,复杂问题可能需要更多。对应的 chat() 函数要加上这几个参数:
def chat(
messages,
system=None,
temperature=1.0,
stop_sequences=[],
tools=None,
tool_choice="auto",
text_editor=None,
thinking=False,
thinking_budget=1024
):
📌 每次在新任务上开 extended thinking,都该抽几条有代表性的请求读一下 reasoning content、重新跑一次评测,确认这个设置真的该留着,而不是开了就不管。
Image Support:看图分析
限制条件:单次请求最多 20 张图;单张文件大小上限 3.75MB;像素尺寸不超过 8000px(长或宽);token 换算公式:tokens = (宽px × 高px) / 750。
插入图片的消息结构:
with open("image.png", "rb") as f:
image_bytes = f.read()
add_user_message(messages, [
{
"image": {
"format": "png",
"source": {"bytes": image_bytes}
}
},
{"text": "What do you see in this image?"}
])
可以一次发多张图,让 Claude 分析图片之间的关系、做比较,或回答需要综合理解多张图的问题。
📌 图片一样适用文字场景学过的所有 prompt engineering 技巧——给清楚的方法论比丢一句简单问题效果好得多。例如数弹珠:
Analyze this image of marbles and determine the exact count using this methodology:
1. Begin by identifying each unique marble one at a time. Assign each a number as you identify it.
2. Verify your result by counting with a different method. Start from the bottom-left corner and work row by row, from left to right.
What is the exact, verified number of marbles in this image?
也可以用 one-shot:先给一张范例图片和正确分析结果,再让 Claude 分析目标图片。
真实案例:火灾风险评估——保险公司用卫星图像评估火灾风险,不用实地勘查。评估要点:住宅附近树木是否密集紧靠、消防车能不能顺利进出、树枝有没有悬在住宅上方、整体树木密度和间距。
with open('./images/prop7.png', 'rb') as f:
image_bytes = f.read()
messages = []
add_user_message(messages, [
{"image": {"format": "png", "source": {"bytes": image_bytes}}},
{"text": prompt}
])
response = chat(messages)
💡 处理图片时不要偷懒用简单 prompt——把处理文字时学到的 prompt engineering 手法套用过来,能大幅提升图像分析的准确度。
PDF Support:直接读 PDF
Claude 读 PDF 跟处理图片一样直接,能用在文档分析、摘要、问答这类工作流。
读文件、转成二进制:
with open("./earth.pdf", "rb") as f:
file_bytes = f.read()
消息结构用的是 "document",不是 "image":
add_user_message(
messages,
[
{"document": {"format": "pdf", "name": "earth", "source": {"bytes": file_bytes}}},
{"text": "Summarize this document in one sentence"},
],
)
关键结构要点:
- 用
"document"而不是"image" "format"设成"pdf"- 要有
"name"字段(文件名,不带扩展名) "source"放文件的字节内容
Claude 会分析整份 PDF 内容,连带复杂排版的多页文档也能给出完整摘要。能做到的事:抽取并总结关键信息、回答文档内容相关的具体问题、分析文档结构和格式、有效率地处理多页文档、处理同时含文字和图片的 PDF。
Citations:让 PDF 分析有据可查
📌 用 Claude 处理 PDF 最大的痛点是「信任」——用户常常只能选择相信 AI 有正确理解文档内容。Citations(引用) 功能直接解决这个问题:明确标出信息是从源文档哪里来的。
开启方式:在 document 设置里加一个参数:
with open("./earth.pdf", "rb") as f:
file_bytes = f.read()
messages = []
add_user_message(
messages,
[
{
"document": {
"format": "pdf",
"name": "earth",
"source": {"bytes": file_bytes},
"citations": {"enabled": True}
}
},
{"text": "How were Earth's atmosphere and oceans formed?"},
]
)
response = chat(messages)
关键就是 document 配置里多加一个 "citations": {"enabled": True}。
开启后,回应结构会多出:
- Text parts:正常的回答内容
- Citations content parts:结构化数据,把每句陈述对应回源文档里的具体位置(页码、相关原文)
📌 Citations 的价值:Verification(用户能对照原文核实说法)、Confidence(来源透明,更容易建立信任)、Transparency(AI 的推理过程变得可见、可审计)、Accuracy(因为要标注来源,反而会鼓励更细心地抽取信息)。
Prompt Caching:省时间也省钱
Claude 处理每个请求前要走几步预处理:把 prompt 切成 token、给每个 token 生成 embedding、根据上下文补充语境、才轮到生成输出文字。这些预处理工作每次请求完就丢掉了。
问题在于:后续请求如果包含之前处理过的内容,Claude 还是要把这些预处理工作重新做一遍——多轮对话场景下特别浪费。
解法:把预处理结果存进缓存,缓存的是「输入消息 → 对应运算结果」的映射。后续请求如果内容一样,就直接从缓存读,不用重新处理。
好处:命中缓存的请求更快、更便宜;第一次请求负责写入缓存;后续请求从缓存读取;缓存保留 5 分钟;特别适合会反复发送相似内容的场景,比如聊天机器人、文档分析工具。
Prompt Caching 的规则
⚠️ 缓存不会自动发生,要自己手动加一个 cachePoint 标记消息片段,告诉 Claude「这个标记之前的所有运算工作都要缓存起来」。
在 user message 里加 cache point:
user_message = {
"role": "user",
"content": [
{"text": ""},
{"cachePoint": {"type": "default"}}
]
}
📌 基本规则:cache point 之前的工作会被缓存,之后的内容不会被存进缓存。
命中条件很严格:只有当 cache point 之前的内容跟上次一字不差完全相同时,缓存才会生效。哪怕只是多加了一个 "Please" 这种小改动,都会让缓存失效,触发完整重新处理。
跨消息缓存:cache point 可以横跨多条消息,包括 assistant 的回应——等于能把一整段对话历史(到某个点为止)都缓存起来,让这部分完整的处理工作能被重复利用。
最低内容长度:cache point 之前所有消息/片段加起来的 token 数,至少要达到 1024 token 才会真正触发缓存。像 "Hi there!" 这种短内容不够格,但重复个 500 次凑够长度就可以了。
Cache point 还能放在 system prompt 和 tool 定义里——这两处反而是最有价值的缓存位置,因为它们在多次请求之间通常都不会变:
system = [
{"text": "You are a senior software..."},
{"cachePoint": {"type": "default"}}
]
tools = [
{"toolSpec": add_duration_to_datetime_schema},
{"toolSpec": get_current_datetime_schema},
{"cachePoint": {"type": "default"}}
]
⚠️ 缓存只保留 5 分钟——最适合短时间内会被重复用到的内容,不是长期存储方案。
常见错误
- ❌ 不先跑评测就直接开 extended thinking——成本和延迟都会上升,该先确认 prompt 优化到位后分数还不够,再考虑开
- ❌ 手动给 Claude Opus 4.7+/Opus 5/Sonnet 5 设置
budget_tokens——这些新模型是 adaptive thinking,手动传 budget 会直接收到 400 错误 - ❌ 处理图片/PDF 时只丢一句简单问题——一样要套用 prompt engineering 技巧(给方法论、给范例),不然准确度上不去
- ❌ 以为加了
citations: {enabled: True}就万事大吉,不去解析回应里的 citations content parts——引用数据要自己从回应结构里取出来用 - ❌ 以为设了 cache point 就一定会命中缓存——cache point 之前的内容必须一字不差完全相同,而且总长度要够 1024 token,两个条件缺一不可
- ❌ 把 prompt caching 当长期存储用——只保留 5 分钟,过期就要重新处理
Sources
官方文档:
- Claude with Amazon Bedrock(Claude Academy 课程)— https://academy.claude.com/courses/claude-with-amazon-bedrock