3.6 多模态 Prompt
承前:从自动优化到跨模态理解
在上一节(3.5)中,我们学习了自动 Prompt 优化技术——通过算法自动搜索、改写和评估 Prompt,让提示词的质量不再完全依赖人工经验。无论是基于梯度反馈的方法(如 APO、GRPO),还是基于大模型自我改进的方法(如 OPRO、Prompt Breeding),它们的核心思想都是:在文本层面反复打磨措辞,让模型更准确地理解我们的意图。
然而,真实世界的请求往往不只有文字。当你想让 AI 帮你审核一份设计稿、解释一张图表、诊断一段报错截图、或者根据手绘草图生成前端代码时,纯文本 Prompt 就显得力不从心了。我们需要一种方式,让模型不仅能"读字",还能"看图"。
这正是多模态 Prompt 的用武之地。从自动优化文本提示,到组合图文两种模态来传递信息,我们的工具箱再次升级。如果说前几节教的是"如何把话说清楚",那么本节要讲的就是"如何图文并茂地把事情交代明白"。本章介绍的诸多技巧——少样本学习、思维链推理、自动优化——在多模态场景下同样适用,只是载体从"纯文字"扩展到了"图+文"。
3.6.1 什么是多模态 Prompt
多模态 Prompt,是指在给大语言模型的输入中,除了文本之外,还同时包含图像(以及可能的音频、视频)等其他模态的信息,让模型综合理解多种信息源来完成任务。
这个概念听起来很高深,但我们可以用一个日常类比来理解。
类比:图文并茂的说明书
想象你买了一台需要组装的家具,打开包装盒后,里面只有一张纯文字的说明书:
"将零件 A 的长边与零件 B 的短边对齐,通过孔位插入螺栓 C,旋紧至手感阻力明显增加……"
读完之后你可能一头雾水——零件 A 到底长什么样?长边和短边怎么区分?孔位在哪里?这些信息全靠脑补。
但如果这份说明书图文并茂,每个步骤都配有示意图,旁边标注了零件的名称和位置,组装起来就轻松多了。文字解释"为什么这样做"和"操作步骤是什么",图片展示"在哪里"和"长什么样",两者互补,信息传递效率大幅提升。
多模态 Prompt 的工作方式与此完全相同:文本负责传达指令、背景和期望,图像负责提供视觉上下文和空间细节。模型像翻阅一本图文说明书一样,同时读取文字和图片,综合理解后给出回答。
┌─────────────────────────────────────────────────────────────┐
│ 多模态 Prompt 的组成结构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 文本部分 │ │
│ │ ┌────────────────────────────────────────────────┐ │ │
│ │ │ System Prompt: 定义角色和任务 │ │ │
│ │ │ User Prompt: 具体问题和指令 │ │ │
│ │ └────────────────────────────────────────────────┘ │ │
│ └──────────────────────────────────────────────────────┘ │
│ + │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 图像部分 │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ 图片1 │ │ 图片2 │ │ 图片3 │ ... │ │
│ │ └─────────┘ └─────────┘ └─────────┘ │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘从图中可以看出,一个完整的多模态 Prompt 包含两个核心部分:
- 文本部分:和普通 Prompt 一样,包含 System Prompt(定义角色、约束条件)和 User Prompt(具体任务描述)。文本负责传达"做什么""怎么做""输出什么格式"。
- 图像部分:一张或多张图片,通过 URL 或 Base64 编码传入。图像负责传达文本难以描述的视觉信息——布局、配色、空间关系、图形特征等。
两者组合在一起,构成了一个多模态 Prompt。模型在内部将图像编码为特征向量,与文本的 token 表示一起送入 Transformer 层进行跨模态的注意力计算,从而实现对图文的综合理解。
需要注意的是,多模态 Prompt 仍然是"Prompt"——我们在前面学到的 Prompt 工程原则(角色设定、任务分解、格式约束、少样本示例)在多模态场景下依然适用。区别仅在于,我们现在多了一种信息载体——图片。
3.6.2 支持多模态的主流模型
在动手写多模态 Prompt 之前,我们先了解一下当前主流的多模态大模型。不同模型在模态支持范围、上下文长度、中文处理能力等方面各有特点,选择合适的模型是多模态应用的第一步。
| 模型 | 提供商 | 模态支持 | 特点 |
|---|---|---|---|
| GPT-4o / GPT-4V | OpenAI | 文本+图像+音频 | 综合能力强,支持多图输入 |
| Claude 3.5 Sonnet | Anthropic | 文本+图像 | 图表理解突出,推理能力强 |
| Gemini 1.5 Pro | 文本+图像+视频+音频 | 百万 token 上下文,支持视频 | |
| Qwen-VL-Max | 阿里 | 文本+图像 | 中文场景优化,文档理解好 |
| Llama 3.2 Vision | Meta | 文本+图像 | 开源可部署,适合私有化 |
这些模型的多模态能力虽然各有侧重,但在 API 调用方式上大同小异。核心都是将文本和图像作为消息内容的不同部分,组合在一起发送给模型。下面我们以 OpenAI GPT-4o 为例,逐步讲解多模态 API 的调用方式。
3.6.3 多模态 API 调用基础
理解多模态 API 的关键是:图片在 API 中并不是以文件附件的形式"挂"在消息上,而是作为消息内容(content)的一部分,与文本平级。
在纯文本 Prompt 中,content 字段是一个字符串。而在多模态 Prompt 中,content 变成了一个列表,列表中的每个元素是一个字典,通过 type 字段区分文本和图像:
# OpenAI GPT-4o 多模态调用示例
# 这段代码展示了如何向模型同时发送文本指令和图片
from openai import OpenAI # 导入 OpenAI SDK
# 创建客户端实例,默认读取环境变量 OPENAI_API_KEY
client = OpenAI()
# 构造多模态消息列表
# messages 数组包含两条消息:system 和 user
response = client.chat.completions.create(
model="gpt-4o", # 使用支持视觉的模型,必须选带视觉能力的版本
messages=[
# System 消息:定义模型的角色和基本行为
{
"role": "system", # 角色为系统,用于设定全局上下文
"content": "你是一个专业的图像分析助手。请用中文回答。"
},
# User 消息:这里的关键变化是 content 变成了列表
# 列表中可以混合文本块和图像块,顺序可以自由组合
{
"role": "user",
"content": [
# 第一个元素:文本指令
{
"type": "text", # 声明这是一个文本内容块
"text": "请分析这张图片中的内容,包括:\n"
"1. 图片类型(照片/图表/截图等)\n"
"2. 主要内容描述\n"
"3. 任何文字信息"
},
# 第二个元素:图像内容块
{
"type": "image_url", # 声明这是一个图像内容块
"image_url": {
"url": "https://example.com/image.jpg",
# detail 参数控制图像分辨率:
# "low" 省费但细节少,适合简单图片
# "high" 费用高但细节丰富,适合复杂图片
# "auto" 让模型自动判断(默认值)
"detail": "high"
}
}
]
}
],
max_tokens=1000 # 限制输出长度,避免费用过高
)
# 提取并打印模型的回复内容
print(response.choices[0].message.content)上面这段代码中有几个关键点值得仔细理解:
content 的两种形态:在纯文本对话中,
content是一个字符串(如"你好")。在多模态对话中,content是一个列表,列表中的每个元素通过type字段声明自己的类型。这是多模态 API 与纯文本 API 最核心的区别。文本块和图像块的顺序:列表中的元素是有序的。模型会按照列表顺序依次"阅读"内容。通常我们先把文本指令放在前面,再放图片——就像说"请看这张图,然后回答以下问题",先给出任务框架,再提供素材。
detail 参数:这个参数控制模型处理图像的精细程度。
"low"会将图片压缩到 512×512 像素左右,消耗约 85 tokens;"high"会切分成多个高分辨率小块,消耗更多 tokens 但能看到更多细节。对于表格截图、小字文档等需要精细识别的场景,建议使用"high";对于简单的风景照,"low"就够了。
3.6.4 图片的三种提供方式
在实际开发中,图片来源各不相同——有的图片在公网上有 URL,有的图片存在本地磁盘上,有的场景需要同时传入多张图片进行比较。多模态 API 提供了三种灵活的图片传递方式。
方式1:通过 URL 传递(推荐)
如果图片已经上传到服务器或 CDN 上,有公开可访问的 URL,这是最推荐的方式。API 只需要接收 URL,模型会自动去获取图片,你不需要在请求中传输大量二进制数据。
# 方式1: 通过 URL 传递图片
# 适用于图片已部署在公网服务器上的场景
# 优点:请求体小、传输快、不占用本地带宽
# 缺点:URL 必须可公开访问,不能是需要认证的内网地址
image_url = "https://example.com/photo.jpg"
# 在消息中使用该 URL
messages = [
{
"role": "user",
"content": [
{"type": "text", "text": "请描述这张图片"},
{
"type": "image_url",
"image_url": {
"url": image_url, # 直接传入 URL 字符串
"detail": "auto" # 让模型自动选择分辨率
}
}
]
}
]方式2:通过 Base64 编码传递(本地文件)
如果图片在本地磁盘上,且没有部署到公网服务器的条件,可以将图片编码为 Base64 字符串,以 data URI 的形式传入。这种方式不需要图片有公网 URL,但会增加请求体的大小(Base64 编码后体积约为原文件的 1.33 倍)。
# 方式2: 通过 Base64 编码传递本地图片
# 适用于图片在本地、无法或不想暴露公网 URL 的场景
import base64 # 导入 base64 模块,用于将二进制文件编码为文本
def encode_image(image_path):
"""
将本地图片文件编码为 Base64 字符串。
参数:
image_path: 图片文件的本地路径,如 "photo.jpg"
返回:
Base64 编码后的字符串
"""
with open(image_path, "rb") as f: # 以二进制模式打开图片文件
binary_data = f.read() # 读取全部二进制数据
# b64encode 将二进制转为 Base64 字节串,decode("utf-8") 转为字符串
return base64.b64encode(binary_data).decode("utf-8")
# 获取 Base64 编码
base64_image = encode_image("local_photo.jpg")
# 拼接成 data URI 格式
# 格式为: data:image/<格式>;base64,<编码后的数据>
# 常见格式: image/jpeg, image/png, image/webp, image/gif
image_content = f"data:image/jpeg;base64,{base64_image}"
# 在消息中使用 Base64 编码的图片
messages = [
{
"role": "user",
"content": [
{"type": "text", "text": "请描述这张图片"},
{
"type": "image_url",
"image_url": {
"url": image_content, # 传入 data URI 格式的字符串
"detail": "high"
}
}
]
}
]方式3:多图组合传递
当需要让模型同时分析多张图片(比如对比两个设计稿、查看代码修改前后的截图)时,只需在 content 列表中放入多个 image_url 块即可。
# 方式3: 多图组合传递
# 适用于需要模型同时分析多张图片的场景
# 例如: 设计稿对比、前后对比、多角度查看等
# 准备多张图片的 URL(或 Base64 编码)
image1_url = "https://example.com/design_v1.jpg"
image2_url = "https://example.com/design_v2.jpg"
# 在 content 列表中依次放入多张图片
# 模型会按照列表顺序理解图片的编号关系
messages = [
{
"role": "user",
"content": [
# 先放文本指令,说明多图的任务要求
{
"type": "text",
"text": "我将上传两张设计稿图片。"
"第一张是旧版本,第二张是新版本。"
"请对比它们在布局、配色和功能上的差异。"
},
# 第一张图片(旧版本)
{
"type": "image_url",
"image_url": {
"url": image1_url,
"detail": "high"
}
},
# 第二张图片(新版本)
{
"type": "image_url",
"image_url": {
"url": image2_url,
"detail": "high"
}
}
]
}
]三种方式的对比总结:
| 方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| URL | 图片在公网可访问 | 请求体小、速度快 | 需要图片有公网地址 |
| Base64 | 本地文件 | 无需公网地址 | 请求体大、传输慢 |
| 多图组合 | 多张图片对比 | 一次调用完成比较 | token 消耗成倍增加 |
3.6.5 视觉 Prompt 技巧
学会了如何把图片传给模型之后,下一个问题是:如何在文本指令中引导模型"看"图片? 毕竟,模型不像人类那样天然知道"先看哪里、重点看什么"。我们需要通过文本 Prompt 来指挥模型的"视线"。
这就像给一个刚入职的新人看一张复杂的系统架构图——如果你只说"看看这张图",他可能会漫无目的地扫一遍,什么重点也没抓住。但如果你说"先看左上角的数据库模块,再看中间的 API 网关,最后看右下角的监控面板",他就能有的放矢地理解整张图。
视觉 Prompt 技巧的核心,就是用文本指令为模型建立"视觉引导路线"。下面介绍四种实用的视觉引导技巧。
技巧1:空间描述定位
人类看图时会自然地使用"左上角""右下角""中间偏右"等方位词来描述位置。多模态模型同样能理解这些空间描述。在 Prompt 中明确指出需要关注的区域,可以引导模型聚焦到关键位置。
请分析图片中左上角的红色按钮,它的功能是什么?
注意图片右下角的水印文字,它是什么内容?这个技巧适用于图片中关键信息有明确空间位置的场景。注意方位词要具体——"左上角"比"上面"更精确,"右下角的蓝色区域"比"蓝色部分"更聚焦。
技巧2:坐标系统定位
对于截图、设计稿等精确度要求高的场景,可以使用像素坐标来指定区域。虽然模型不一定能精确到像素级别,但坐标可以作为大致的范围提示。
请分析这张截图中坐标 (200, 150) 到 (400, 300) 区域内的内容。
该区域显示了一个错误弹窗,请描述错误信息。坐标定位的原理是:模型在内部会将图像切分成网格块(patch),每个 patch 对应一定的像素范围。当你提到坐标时,模型会尝试将坐标映射到对应的 patch 区域,从而聚焦到该区域的视觉特征。
技巧3:添加视觉标记
如果你能预先在图片上画标记(如用红圈框出某个区域、用箭头指向某个元素),然后在 Prompt 中告诉模型"被标记的区域是需要分析的部分",效果往往出奇地好。这种做法本质上是把空间定位信息直接编码在图片中,比纯文本描述更直观。
我将上传一张图片,其中我用红色圆圈标记了需要关注的区域。
请分析被标记区域的内容,并解释其含义。这个技巧的适用场景非常广泛——UI 审查时框出有问题的组件、医疗影像中标注可疑区域、工程图纸中标记关键尺寸等。你甚至可以用不同颜色的标记代表不同类型的问题,然后在 Prompt 中解释颜色含义:
图片中我用以下颜色做了标记:
- 红色圆圈:疑似错误的区域
- 黄色箭头:需要注意的设计问题
- 绿色方框:设计较好的部分
请逐一分析每个标记区域的含义。技巧4:分区域分析
当图片内容复杂、信息量很大时,一次性让模型分析整张图容易遗漏细节。更好的做法是将图片"切分"为若干区域,逐一分析。虽然你不需要真的裁剪图片,只需在 Prompt 中用文字描述区域划分即可。
请将这张图片分为四个象限,逐一分析每个象限的内容:
- 左上象限:
- 右上象限:
- 左下象限:
- 右下象限:
对每个象限,请描述:
1. 该区域包含的主要元素
2. 元素之间的关系
3. 是否有任何异常或需要注意的地方这种"分而治之"的思路与我们在 3.2 节学到的任务分解原则一脉相承——当任务太复杂时,拆分成小任务逐个击破。
3.6.6 多图对比 Prompt
多图对比是多模态 Prompt 最常见的应用场景之一。无论是设计稿 A/B 对比、代码重构前后对比、还是产品迭代版本对比,核心都是让模型同时"看到"多张图片并找出差异。
多图对比的关键在于:不能只说"比较这两张图",而要明确比较的维度和评判标准。 模型不会自动知道你想比较什么——是布局?配色?功能?还是信息密度?
多图对比 Prompt 模板:
我将上传两张图片。请进行以下对比分析:
【图片1说明】设计稿A
【图片2说明】设计稿B
请从以下维度对比:
1. 布局结构差异
2. 配色方案差异
3. 信息层级差异
4. 整体风格评价
最后给出你的推荐:哪个设计更适合电商场景?注意模板中的几个设计要点:首先,每张图片都有文字标注("图片1说明""图片2说明"),这帮助模型理解每张图的身份和角色。其次,比较维度被明确列出,而不是笼统地说"找找差异"。最后,给出了评判标准("适合电商场景"),让模型有据可依地给出推荐。
前后对比(Before/After)Prompt:
前后对比是多图对比的一种特殊形式,适用于展示"变化"——重构前后、优化前后、修复前后。
第一张图片是代码重构前的UI界面,第二张是重构后。
请分析:
1. 重构后有哪些视觉改进?
2. 是否有任何功能缺失?
3. 用户体验是否提升?前后对比 Prompt 的要点是:明确标注图片的时序关系("第一张是前""第二张是后"),让模型理解变化的方向。
3.6.7 图表与数据可视化解读
让模型解读图表和数据可视化,是多模态 Prompt 的一个重要应用方向。商业报表、科研论文中的图表、新闻中的统计图,都可以用模型来快速理解和总结。
图表解读 Prompt 的关键是:引导模型按照"从整体到局部"的层次来分析。
请分析这张图表:
1. 图表类型是什么?(折线图/柱状图/饼图等)
2. X轴和Y轴分别代表什么?
3. 数据的整体趋势是什么?
4. 有哪些异常值或值得注意的数据点?
5. 从中可以得出什么业务结论?这五个问题遵循了"先整体后局部、先观察后结论"的分析逻辑。模型先识别图表的基本属性(类型、坐标轴),再观察数据规律(趋势、异常),最后进行业务层面的推断。这种结构化的分析框架能有效避免模型"只看到数字、看不到含义"的问题。
3.6.8 视觉推理 Prompt
前面介绍的技巧侧重于"让模型看清楚图片内容"。但很多时候,我们不仅需要模型"看到",还需要它"想到"——基于视觉信息进行推理判断。这就是视觉推理 Prompt 的价值所在。
场景1:UI/UX 审查
让模型扮演资深设计师的角色,从专业角度审查界面设计:
你是一位资深UI/UX设计师。请分析这张应用截图的用户体验:
1. 信息架构:主要功能是否容易找到?
2. 视觉层次:重要元素是否突出?
3. 交互设计:按钮和可点击元素是否清晰?
4. 可访问性:文字对比度、字体大小是否合适?
5. 改进建议:列出3-5个具体的改进方案这个 Prompt 的设计亮点在于:角色设定("资深UI/UX设计师")为模型激活了专业知识视角;审查维度(五个方面)确保分析不会遗漏关键角度;输出要求("3-5个具体改进方案")迫使模型给出可操作的建议而非空泛评价。
场景2:代码截图分析
开发者在调试时经常遇到需要分析代码截图的场景——比如在手机上看到的报错信息、同事发来的代码片段截图等:
请分析这张代码截图:
1. 识别编程语言
2. 描述代码的功能
3. 找出潜在的bug或安全问题
4. 提出改进建议
5. 如果有错误信息,解释错误原因代码截图分析的关键挑战在于:图片中的代码可能不够清晰、可能被截断、可能包含高亮或注释颜色干扰。在实际使用中,如果模型频繁识别错误,可以考虑提高 detail 参数为 "high",或者在文本中补充代码的上下文信息。