处理图表与幻灯片
Anthropic 官方 Cookbook。讲清怎么把图表密集的 PDF 交给模型、常见的三个坑,以及「叙述法」——让模型逐页口述整份 deck,把它转成可检索的文字稿。
- 原作者
- Anthropic
- 原文标题
- Working with Charts, Graphs, and Slide Decks
- 原发布平台
- Anthropic Claude Cookbooks
- 原发布日期
- 2024/03/04
译者说明:本文译自 Anthropic 官方 Claude Cookbooks 中的 multimodal 教程,为完整翻译。原文以 Jupyter Notebook 形式发布,包含可运行的 Python 代码;此处保留全部说明性内容与提示词,代码部分做了必要的精简。
⚠️ 时效提示:原文中关于「哪些模型支持 PDF」「需要 beta 请求头」的具体说明,是原文撰写时的状态。这类接口细节变化很快,实际使用时请以 Anthropic 官方 API 文档为准。文中的方法本身不受影响。
关于日期:Cookbook 是持续更新的仓库,页面上没有发布日期。本文的日期取自该 notebook 在 GitHub 上的首次提交日期,也就是这份内容第一次被生产出来的时间。
Claude 处理图表、曲线图和整份幻灯片的能力很强。根据你的具体用途,有一些技巧值得掌握。这份指南会展示使用这类材料时的常见模式。
图表与曲线图
大部分情况下,用 Claude 处理图表很简单。下面走一遍怎么把它们交给 Claude,以及一些能改善结果的常见技巧。
传入与调用 API
把图表交给 Claude 的最佳方式,是利用它的视觉能力和 PDF 支持功能——也就是给 Claude 一份包含该图表的 PDF 文档,配上一个关于它的文字问题。
(原文注:撰写时仅部分模型支持 PDF 功能,且该功能处于 beta 阶段,需要提供 beta 请求头。)
基本的调用结构是这样的:把文档以 base64 编码作为 document 类型传入,问题作为 text 类型跟在后面:
messages = [
{
"role": "user",
"content": [
{
"type": "document",
"source": {
"type": "base64",
"media_type": "application/pdf",
"data": base64_string,
},
},
{"type": "text", "text": "这份文档里是什么?用一句话回答。"},
],
}
]
原文用一份年报作为示例,依次问了几个具体问题:
- 该公司 2020 年的营收是多少?
- 自 2014 年以来新增了多少个市场?
- 2016 年每售出一台零售单位的营收是多少?
可以看到,Claude 能够回答关于图表的相当细致的问题。不过,有一些技巧能帮你把它用得更好。
三个技巧
一、算术能力有时会碍事。
你会注意到,上面第三个问题如果多跑几次,偶尔会输出错误的最终答案,因为它把算术算错了。可以考虑给 Claude 提供一个计算器工具,避免这类错误。
二、特别复杂的图表,先让它数点。
面对非常复杂的图表,可以要求 Claude「先描述你在文档中看到的每一个数据点」——这能带来与传统思维链(Chain of Thought)类似的改善效果。
三、靠颜色传递信息的图表要特别处理。
Claude 在处理那些依赖大量颜色来传达信息的图表时偶尔会吃力,比如分组很多的分组柱状图。先让 Claude 用 HEX 色值把图里的颜色识别出来,能提升它的准确率。
幻灯片
既然 Claude 是处理图表的好手,很自然就该把它延伸到图表真正的主场——幻灯片。
对许多领域(包括金融服务业)来说,幻灯片是关键的信息来源。虽然你可以用 PyPDF 这类工具从幻灯片里抽取文字,但它们图表密集的特性往往让这成为一个糟糕的选择,因为模型很难拿到它真正需要的信息。
PDF 支持功能因此是个很好的替代方案。它在处理 PDF 文档时同时使用抽取出的文字和视觉能力。
把一份典型的幻灯片交给 Claude,最好的方式就是把它导出成 PDF,然后直接传给 Claude。
这个方法很适合入门,对某些用途来说也是性能最好的。但它有两个限制:
- 单次请求中,所有提供的文档合计最多 100 页(官方表示计划逐步提高这个上限)
- 如果你要把幻灯片内容用于 RAG,把多模态 PDF 引入你的向量嵌入会带来问题
好在,我们可以利用 Claude 的视觉能力,得到一份文字形式的幻灯片表示,其质量远高于普通的 PDF 文字抽取。
叙述法
我们发现最好的做法是:让 Claude 从头到尾依次叙述整份 deck。
下面是原文给出的叙述提示词。实际使用时应根据 deck 的性质调整内容,但结构基本保持不变:
You are the [公司] CFO, narrating your Q4 2023 earnings presentation.
The entire earnings presentation document is provided to you.
Please narrate this presentation from [公司]'s Q4 2023 Earnings as if you
were the presenter. Do not talk about any things, especially acronyms,
if you are not exactly sure you know what they mean.
Do not leave any details un-narrated as some of your viewers are
vision-impaired, so if you don't narrate every number they won't know
the number.
Structure your response like this:
<narration>
<page_narration id=1>
[Your narration for page 1]
</page_narration>
<page_narration id=2>
[Your narration for page 2]
</page_narration>
... and so on for each page
</narration>
Use excruciating detail for each page, ensuring you describe every visual
element and number present. Show the full response in a single message.复制为纯文本,换行与缩进原样保留,可直接粘贴进对话框。
这份提示词的中文对照:
你是这份财报演示的 CFO,正在讲解 2023 年第四季度的财报演示。
整份财报演示文档已提供给你。
请像主讲人那样,把这份演示完整讲述一遍。任何你不能确切理解其含义的
内容——尤其是缩写——都不要提及。
不要遗漏任何细节,因为你的部分观众有视力障碍;你不叙述出来的数字,
他们就无法得知。
请按以下结构组织你的回答:
<narration>
<page_narration id=1>
[第 1 页的叙述]
</page_narration>
<page_narration id=2>
[第 2 页的叙述]
</page_narration>
……以此类推,每一页都要有
</narration>
每一页都要写到极其详尽,确保描述出现的每一个视觉元素和每一个数字。
在单条消息中给出完整回答。复制为纯文本,换行与缩进原样保留,可直接粘贴进对话框。
拿到结果后,用正则把 <narration> 标签之间的内容切出来:
import re
pattern = r"<narration>(.*?)</narration>"
match = re.search(pattern, completion.strip(), re.DOTALL)
if match:
narration = match.group(1)
else:
raise ValueError("没有拿到叙述内容,很可能是模型回答被截断了。")
拿到文字稿之后
现在我们有了一份基于文字的叙述稿(远称不上完美,但相当不错),就可以把这份 deck 用在任何纯文本的工作流里了——包括向量检索。
最后做一次检验,基于这份纯叙述稿提几个问题:
prompt = f"""You are an expert financial analyst analyzing a transcript
of the earnings call.
Here is the transcript:
<transcript>
{narration}
</transcript>
Please answer the following question:
<question>
{question}
</question>"""
原文用来检验的三个问题分别是:某业务线占第四季度总营收的百分比、季度营收增速在上升还是下降、某年度的收购营收(含负营收)。
结果不错。掌握了这些技巧,你就可以开始把模型应用到幻灯片这类图表密集的内容上了。
译后附记
原文面向的是开发者与财报分析场景,但方法本身与领域无关。叙述法真正解决的问题是:把一份「只能反复重新解析」的图文材料,一次性转成「可以反复追问、可以检索、可以归档」的文字。
对研究咨询工作而言,最贴近的对应场景是:客户给的历史汇报、竞品的投资者演示、行业协会的年度报告——这些都是图表密集、需要反复追问的材料。
有两个使用边界值得注意:纯文字的长文档不需要这一步(直接给 PDF 更快),只问一个问题也不划算(转文字稿本身要花一次调用)。
另外,原文提到的算术问题值得再强调一次:凡是涉及加减乘除的结论,自己按一遍,或者让它把算式写出来你核。 它读数通常没错,错的是算。