vision-image-input · ZH · 2026-09-27

图像 / 视觉输入

介绍如何通过 OpenAI 兼容接口的 image_url 内容块向多模态模型发送图像输入,涵盖消息结构、图像传入方式(URL 与 base64)、多图与图文混排、常见注意事项,以及在不同模型间切换时的兼容性要点。

什么是 image_url 内容块

在 OpenAI 兼容的 Chat Completions 接口中,messages 里每条消息的 content 不再只是一个字符串,而可以是一个「内容块数组」。其中图像块用 type: "imageurl" 表示,值里放一个 url 字段。这就是通常说的「imageurl 内容块」。

多模态模型(支持视觉输入的模型)通过解析这些内容块,把图像和文本一起放进同一次请求里理解。

消息结构长什么样

一条带图的 user 消息,结构大致是:

{
  "model": "<支持视觉的模型名>",
  "messages": [
    {
      "role": "user",
      "content": [
        { "type": "text", "text": "请描述这张图" },
        { "type": "image_url", "image_url": { "url": "https://example.com/cat.jpg" } }
      ]
    }
  ]
}

要点:

  • content 是数组,数组里可以同时有 text 块和 image_url 块。
  • 顺序有意义:模型按数组顺序理解,通常把文字说明放在图前面或后面都可以,但把「问题」和「对应图片」放得清楚一些,效果更稳定。
  • 纯文本消息仍可以写成字符串,两种写法在同一请求里可以共存。

两种传图方式

方式一:传公网 URL

{ "type": "image_url", "image_url": { "url": "https://example.com/photo.png" } }

优点:请求体小,直接把图片链接交给服务端去抓取。

注意:

  • URL 必须是模型服务端能访问到的公网地址。内网地址、需要登录鉴权的地址、带防爬校验的地址通常抓不到。
  • 图片格式建议用常见类型(如 JPEG、PNG、WebP),服务端不一定支持所有冷门格式。
  • 链接最好稳定,避免一次成功一次失败的临时签名地址。

方式二:传 base64 data URL

{
  "type": "image_url",
  "image_url": {
    "url": "data:image/jpeg;base64,<base64编码后的内容>"
  }
}

优点:不依赖外部可访问性,本地图片、需要鉴权的图片都能发。

注意:

  • data URL 的 MIME 类型要和真实图片一致,否则可能解析失败。
  • base64 会让请求体变大,图片越大越明显,注意请求体大小限制。
  • 编码时不要漏掉 data:image/<类型>;base64, 前缀。

多图与图文混排

一次请求里可以放多张图,只要在 content 数组里加多个 image_url 块即可:

{
  "role": "user",
  "content": [
    { "type": "text", "text": "比较这两张图的差异" },
    { "type": "image_url", "image_url": { "url": "https://example.com/a.jpg" } },
    { "type": "image_url", "image_url": { "url": "https://example.com/b.jpg" } }
  ]
}

实践建议:

  • 用文字标清楚哪张图对应哪个问题,例如「第一张图是……第二张图是……」。
  • 多图会明显增加输入量,注意成本和上下文长度。

兼容性与切换模型

不同厂商对视觉输入的支持程度不完全一致。用同一套 OpenAI 兼容格式调用多个模型时,要注意:

  • 并不是所有模型都支持图像输入。调用前确认目标模型具备视觉能力。
  • 有的实现只接受 URL,有的只接受 base64,有的两者都行。切换模型时如果报错,先换另一种传图方式试。
  • image_url 里可能有额外字段(如 detail 之类的细节控制)。这些字段属于各家实现细节,兼容性不一,不用时建议不要带。

常见问题排查

  • 报「无法获取图片」:多半是 URL 服务端访问不到,改用 base64 试试。
  • 报格式错误:检查 MIME 类型前缀、base64 是否完整、是否被截断。
  • 模型答非所问:把文字指令写得更明确,并确认图片块确实在 content 数组里而不是被当成普通字符串。
  • 请求过大:压缩图片尺寸,或改用 URL 方式。

用聚合 API 时的一点说明

通过聚合站的一个 API key 调用多个模型时,图像输入的请求格式仍然按 OpenAI 兼容写法组织即可,换模型主要改 model 字段。计费按官方价 ×1.3 扣费,图像输入会按模型自身的计费规则折算成输入量,所以传图多、图大时费用会相应上升,使用前可以先算一下量。