本页目录
Lesson 04 练习
改
code.py和src/kb_qa/vision.py里的代码,运行python code.py观察变化。本课 VLM 无 key 时走 mock(预录描述),有 key 真调 glm-4v-plus。
练习 1:调描述 prompt,对比描述质量
vision.py 里的 _DESCRIBE_PROMPT 决定了描述的结构。改成「废话版」对比:
# vision.py
_DESCRIBE_PROMPT = "请描述这张图片。" # 废话版:不要求结构化
有 API key 时跑 code.py,看描述变成什么样。
思考:废话 prompt 的描述大概会是「这是一张 2024 年度季度营收的柱状图,显示了四个季度的数据」——没有具体数值。这种描述对检索有用吗?(能搜到「营收」相关问题)对问答有用吗?(Q3 多少答不出,因为没数值)。prompt 决定了描述的信息密度——要数值/标签/趋势,不要「这是一张...」的开场白。这就是 L04 prompt 设计的核心。
练习 2:构造一个多子图,测试 VLM 的理解边界
在 generate_poison_pdf.py 里,给图表页加一个更复杂的图——双柱并列(实际 vs 预算):
# make_chart_page 里改成双柱
quarters = ["Q1", "Q2", "Q3", "Q4"]
actual = [1800, 2400, 2100, 2900]
budget = [2000, 2000, 2500, 2500]
x = range(len(quarters))
ax.bar([i-0.2 for i in x], actual, width=0.4, label="实际", color="#4C72B0")
ax.bar([i+0.2 for i in x], budget, width=0.4, label="实际", color="#C44E52")
ax.legend()
重新生成,跑 code.py(有 key),看 VLM 能不能区分「实际」和「预算」两组柱子。
思考:多子图/分组柱状图是 VLM 的难点——它可能把两组柱子混着读。记录它读对和读错的地方。这就是「诚实标注 VLM 能力边界」:简单单系列柱状图准、复杂多系列可能混。两段式里,复杂图表更依赖现场看图(段二)而非描述(段一)。
练习 3(设计实验):量化「描述答 vs 现场看图答」的精度差
这是本课的设计实验验证题——用真实数据量化两段式各段的价值。
在 code.py 的演示 2 里,加几道「描述答得出但可能不准」的趋势题:
questions = [
"Q1 的营收是多少万元?", # 简单数值:描述就该够
"哪个季度的营收最高?", # 比较:描述能答
"Q2 到 Q3 是涨了还是跌了?", # 趋势:描述可能过度概括
"全年总营收大约多少?", # 求和:描述要算,可能错
]
有 key 时跑,对比「只用描述答」和「现场看图答」的准确性。
思考: 1. 哪些题描述答得和现场看图一样准?(简单数值——说明描述够用,不必现场看图) 2. 哪些题现场看图明显更准?(趋势/求和——说明这些题值得花 VLM 的钱现场看) 3. 这个分界线就是你路由策略的依据:简单题用描述答(省钱),复杂题触发现场看图(花钱保准)。记录每题两种答法的对比,这就是两段式的收益证据。
练习 4(进阶):实现「描述质量抽查」机制
描述缓存意味着同一张图永远用第一次的描述。如果第一次描述质量差(VLM 偶尔抽风),错误会被缓存固化。实现一个抽查机制:
# vision.py 加一个函数:
def describe_with_quality_check(image_bytes, *, sample_rate=0.1):
"""描述 + 按概率抽查质量。sample_rate=0.1 表示 10% 的图重新描述对比。"""
import random
desc = describe_image(image_bytes)
if random.random() < sample_rate:
# 抽查:重新描述一次,对比差异
desc2 = describe_image(image_bytes, force_refresh=True)
if desc != desc2:
# 两次描述不一致 → 质量不稳定,标记人工复核
log_warning(f"描述不稳定,建议人工复核: {image_hash}")
return desc
思考:抽查的本质是「用少量额外 VLM 调用换质量保证」。sample_rate 怎么定?——取决于你的容错度。财务数据 0 容错 → 抽查率 100%(每次都重新描述对比);一般知识库 10% 够了。这是成本-精度主线在「描述质量」维度的延伸:缓存省钱,抽查保质量,两者平衡。
✅ 完成本课后,你应该能回答
- 图表为什么不能用 OCR?(数值是图形编码,不是文字)
- 三种图片消费模式(只描述/只看图/两段式)的成本-精度取舍?为什么选两段式?
- 描述 prompt 为什么要求结构化(数值/标签/趋势)而非泛泛描述?
- 描述缓存按什么去重?为什么用内容哈希而非文件名/页码?
- glm-4v-plus 读图表的能力边界在哪?(单点数值准、趋势判断可能过度概括)
- 现场看图什么时候触发?(L05 检索命中图表元素后按类型路由)
- (落地)kb-qa 的
enable_image_caption开启后,图表 image 元素 content 是什么?