这类问题我又碰上了一次。合同 PDF 里的关键条款是扫描图,解析后 chunk 只留下 image_001.png 这样的占位串,检索命中率正常,但模型看不到图,回答一律是文档未提及。

第一反应是「chunk 与图片的映射关系没入库」,验证下来不成立。

把日志和配置对完,能解释这个现象的基本就这几处。解析阶段把图片替换成占位符,正文为空;多模态模型只读了文本块,没有取回对应图片;图片存放在对象存储,检索时没有签名 URL。

动手时先找出正文几乎为空的 chunk

python -c "import json;cs=[json.loads(l) for l in open('chunks.jsonl')];print([c['id'] for c in cs if len(c['text'])<20][:10])"

然后把图片转成可检索的文字描述再入库

python caption.py --dir images/ --model gpt-4o-mini --out captions.jsonl

chunk 里保留 image_key 供回答时取图

python -c "import json;print({'image_key':'contract_12_p3.png','page':3})"

回答前按 image_key 生成带时效的访问链接

python sign_url.py --bucket docs --key contract_12_p3.png --ttl 600

怎么算真的好了,看的是同一批现象。同一批合同问题能答出条款内容并附上图片链接,空正文 chunk 比例降到 2% 以下。

容易忽略的是,只做文本向量化会把图片内容整段丢掉,要么补图像描述,要么在回答阶段把原图一起送进多模态模型。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189