视觉理解中的提示词工程:为什么“不写样例”反而更难?

在大模型(LLM)与视觉模型(VLM)协同的结构化信息抽取项目中,我们常常面临一个看似矛盾的挑战:既要让模型精准理解复杂表单,又不能提供任何示例(few-shot)。这并非技术限制,而是出于对数据真实性的严格保护——一旦提供样例,模型就可能在识别不清时直接“抄答案”,导致结果失真。

本文将深入剖析一个基于视觉大模型的手写问卷结构化系统,重点探讨在无法使用样例的前提下,如何通过精心设计的提示词(prompt)来约束模型行为、确保输出规范,并最终实现高精度、可落地的自动化提取。


一、为什么这个项目不能用样例?

在传统的文本抽取任务中,few-shot 示例是提升模型表现的利器。但在视觉理解 + 手写识别场景下,情况截然不同:

  • 图像质量不可控:手写问卷存在字迹潦草、勾选模糊、污渍遮挡等问题,OCR 识别结果本身就带有噪声;
  • 模型可能“作弊”:如果提示词中包含“理想答案”的样例,当模型对当前图像识别不清时,会倾向于直接复制样例内容,而非基于实际图像推理;
  • 业务要求零捏造:医疗或调查类问卷对数据真实性要求极高,任何“推测”“默认”“补全”都是不可接受的。

因此,我们必须放弃 few-shot,转而构建一套仅靠规则约束 + 格式限定的提示词体系。


二、核心策略:用“硬规则”替代“软引导”

既然不能示范“怎么做”,那就必须明确“什么不能做”。我们的提示词设计围绕三大原则展开:

1. 绝对禁止默认选项

这是最核心的规则。在选择题中,人类填写者可能只勾选②或③,但模型若未看清,很容易“安全起见”默认选①。为此,我们在每份提示词中反复强调:

“绝对不能默认假设所有问题都选择第一个选项(①)。每个问题的勾选情况完全独立,必须逐个检查勾选标记的实际位置。”

并进一步细化:

  • “如果勾选标记在②的位置,必须输出‘②’及其对应内容”
  • “如果识别不到勾选标记,输出空字符串\"\",不要默认输出任何选项”

这种绝对化措辞(“必须”“绝对不能”“严禁”)比温和的“建议”“尽量”有效得多。

2. 严格绑定“图像内容”与“输出内容”

为防止模型脑补,我们强制建立“所见即所得”的映射关系:

“所有提取的信息必须完全依据图片上用户实际勾选或填写的内容,不能自己推测、推断或捏造任何信息。”

特别针对两类高风险场景:

  • 条件字段:如“若选择‘是’,请填写原因”。我们规定:“优先识别用户实际填写的内容。如果用户填写了,无论选项识别是否准确,都必须保留;如果未填写,则为空。”
  • 数值+单位:如“65公斤”“8小时”。明确要求:“必须带单位,不能只输出数字”,避免后续解析歧义。

3. 强制 JSON Schema 约束

虽然不能给样例,但我们可以通过精确描述输出格式来引导模型:

{
  "问卷名称": {
    "字段A": "字符串或空字符串",
    "字段B": ["数组或空数组"],
    "嵌套字段": {
      "子字段1": "...",
      "子字段2": "..."
    }
  }
}

这种结构化描述不仅定义了字段名,还隐含了:

  • 哪些字段是必填(即使为空也需存在)
  • 哪些字段是数组(支持多选)
  • 嵌套关系如何组织

配合主流程中的 json.loads() 解析,任何格式偏差都会被立即捕获,形成闭环反馈。


##三、实战技巧:如何让规则“可执行”?

抽象原则容易写,但模型难以执行。我们的关键改进是将规则转化为可操作的判定标准

抽象原则 可执行规则
“不要捏造信息” “如果 OCR 未识别到勾选标记,且无手写内容,则该字段输出空字符串\"\"
“准确识别选项” “选项编号必须与勾选标记的物理位置严格对应:标记在②下方 → 输出‘②内容’”
“处理多选题” “逐项检查每个选项旁是否有√/●/涂黑,有则加入数组,无则跳过”

此外,针对视觉模型特性,我们还加入了图像理解指引

  • “标记优先级:清晰勾选 > 轻微划痕。多个标记时,选最明显/最近的一个”
  • “注意区分‘填写内容’和‘印刷文字’,只提取手写部分”

这些细节虽小,却能显著减少因图像噪声导致的误判。


四、通用输入/输出伪例(完全中立)

【场景描述】
一张手写调查问卷,包含基本信息、多选题、条件填空等。

【输入图像内容(文字化描述)】

  • 问题1(单选):居住地类型?
    ①城市 ②乡镇 ③农村
    (勾选标记在②下方)
  • 问题2(多选):常用交通工具?
    ①自行车 ②公交 ③私家车 ④步行
    (②和④被勾选)
  • 问题3:若选择“私家车”,请填写品牌______
    (未填写)
  • 问题4:平均每日通勤时间______分钟
    (手写“45”)

【期望输出】

{
  "通勤调查问卷": {
    "1.居住地类型": "②乡镇",
    "2.常用交通工具": ["②公交", "④步行"],
    "3.私家车品牌": "",
    "4.平均每日通勤时间": "45分钟"
  }
}

关键点

  • 选项带编号,且与勾选位置一致;
  • 多选用数组,未勾选的不出现;
  • 条件字段未填写 → 空字符串;
  • 数值带单位。

五、工程启示:提示词即“防错协议”

在这个项目中,提示词不再是“引导模型思考的脚本”,而是一份防错协议。它必须做到:

  1. 防御性:预设所有可能的错误路径(默认选项、脑补内容、格式错误),并提前堵死;
  2. 原子化:每条规则只解决一个问题,避免交叉依赖;
  3. 可验证:每条输出都能回溯到图像中的具体位置,确保可审计。

更重要的是,提示词需要与系统架构深度协同

  • OCR 模块负责“看清楚”;
  • VLM 模块负责“理解结构”;
  • 提示词负责“约束行为”;
  • 后处理负责“验证格式”。

四者缺一不可。


六、结语:在限制中创造可控性

很多人认为,不用 few-shot 会让模型“失去方向”。但我们的实践证明:恰当地施加限制,反而能创造出更高的可控性

当模型无法依赖“抄作业”时,它才真正学会“看图说话”。而我们要做的,就是用清晰、强硬、无歧义的规则,为它划定一条既安全又高效的行动边界。

在视觉理解与结构化抽取的交叉领域,提示词工程的本质,已从“如何让模型更聪明”,转向了“如何让模型更守规矩”。而这,或许正是 LLM/VLM 落地工业场景的关键一步。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐