AI TOOLS

EP08. "Claude 进阶功能:Extended Thinking/看图读 PDF/Prompt Caching"

首页 › AI 工具 › Claude · Developer and Platform · Amazon Bedrock · EP08
约 22 分钟· #EP08#Claude#Amazon Bedrock
🔒 登录后可标记已读
  • 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

官方文档:

  1. Claude with Amazon Bedrock(Claude Academy 课程)— https://academy.claude.com/courses/claude-with-amazon-bedrock