Skip to content

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-4VOpenAI文本+图像+音频综合能力强,支持多图输入
Claude 3.5 SonnetAnthropic文本+图像图表理解突出,推理能力强
Gemini 1.5 ProGoogle文本+图像+视频+音频百万 token 上下文,支持视频
Qwen-VL-Max阿里文本+图像中文场景优化,文档理解好
Llama 3.2 VisionMeta文本+图像开源可部署,适合私有化

这些模型的多模态能力虽然各有侧重,但在 API 调用方式上大同小异。核心都是将文本和图像作为消息内容的不同部分,组合在一起发送给模型。下面我们以 OpenAI GPT-4o 为例,逐步讲解多模态 API 的调用方式。


3.6.3 多模态 API 调用基础

理解多模态 API 的关键是:图片在 API 中并不是以文件附件的形式"挂"在消息上,而是作为消息内容(content)的一部分,与文本平级。

在纯文本 Prompt 中,content 字段是一个字符串。而在多模态 Prompt 中,content 变成了一个列表,列表中的每个元素是一个字典,通过 type 字段区分文本和图像:

python
# 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)

上面这段代码中有几个关键点值得仔细理解:

  1. content 的两种形态:在纯文本对话中,content 是一个字符串(如 "你好")。在多模态对话中,content 是一个列表,列表中的每个元素通过 type 字段声明自己的类型。这是多模态 API 与纯文本 API 最核心的区别。

  2. 文本块和图像块的顺序:列表中的元素是有序的。模型会按照列表顺序依次"阅读"内容。通常我们先把文本指令放在前面,再放图片——就像说"请看这张图,然后回答以下问题",先给出任务框架,再提供素材。

  3. detail 参数:这个参数控制模型处理图像的精细程度。"low" 会将图片压缩到 512×512 像素左右,消耗约 85 tokens;"high" 会切分成多个高分辨率小块,消耗更多 tokens 但能看到更多细节。对于表格截图、小字文档等需要精细识别的场景,建议使用 "high";对于简单的风景照,"low" 就够了。


3.6.4 图片的三种提供方式

在实际开发中,图片来源各不相同——有的图片在公网上有 URL,有的图片存在本地磁盘上,有的场景需要同时传入多张图片进行比较。多模态 API 提供了三种灵活的图片传递方式。

方式1:通过 URL 传递(推荐)

如果图片已经上传到服务器或 CDN 上,有公开可访问的 URL,这是最推荐的方式。API 只需要接收 URL,模型会自动去获取图片,你不需要在请求中传输大量二进制数据。

python
# 方式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 倍)。

python
# 方式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 块即可。

python
# 方式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",或者在文本中补充代码的上下文信息。