导读:本期聚焦于徐致远创作的《大模型多模态输入怎么用?图片加文本混合请求完整教程》,敬请观看详情。想让大模型看懂图片并回答问题吗?多模态输入已经从实验特性变成了主流模型的标配能力。本文围绕图片加文本混合请求这一核心场景,详细讲解多模态输入的基本原理、消息结构的设计思路,以及如何用Python代码构建包含图片的请求体。内容涵盖Base64编码与图片URL两种传图方式的对比、OpenAI与Anthropic等主流接口的格式差异、常见报错的原因排查,以及控制成本和响应速度的实用技巧。无论你是想搭建图文问答机器人、实现截图分析工具,还是做商品图片审核,这篇教程都能帮你快速跑通第一个多模态请求。

多模态输入能力让大模型不再局限于文字对话,用户可以直接上传一张截图、一张照片,再配上一句提问,模型就能结合画面内容给出回答。这种图文混合请求看似简单,但第一次上手时不少人会踩坑:图片传不上去、格式不被支持、报错信息看不懂。本文从消息结构讲起,带你看懂多模态请求的本质,再给出可以直接运行的代码示例和常见问题的排查思路。

大模型多模态输入怎么用?图片加文本混合请求完整教程

一、多模态请求的消息结构是怎样的

要理解多模态输入,首先要明白主流大模型API的消息组织方式。绝大多数接口都采用一个名为messages的数组,数组里每个元素代表一条消息,包含role(角色)和content(内容)两个字段。在纯文本对话中,content就是一个字符串,而在多模态请求中,content升级为一个列表,列表中可以混合存放文本块和图片块。

这种设计的好处非常明显:模型可以根据需要灵活组合任意数量的文本和图片,一次请求可以传一张图也可以传十张图,图片之间还能穿插文字说明。比如你想让模型对比两张设计稿的差异,就可以先放第一张图,再放一段文字说明“这是旧版本”,接着放第二张图,最后提出具体问题。模型会按照内容的顺序理解上下文。

一个典型的多模态消息结构如下(以OpenAI风格为例):

messages = [
    {
        "role": "user",
        "content": [
            {
                "type": "text",
                "text": "这张图片里有什么内容?请详细描述。"
            },
            {
                "type": "image_url",
                "image_url": {
                    "url": "https://ipipp.com/images/sample.jpg"
                }
            }
        ]
    }
]

注意看content变成了列表,文本块用type: text标识,图片块用type: image_url标识。不同厂商的接口在字段命名上略有差异,但整体思路完全一致:都是把消息内容拆分成带类型的块,让模型知道每一块是文字还是图像。

二、Base64编码与图片URL两种传图方式对比

传图片给大模型有两种主流方式:一是提供图片的公开URL,二是把图片文件读入内存后进行Base64编码,直接嵌在请求体里发送。两种方式各有适用场景,选错了不仅影响速度,还可能直接导致请求失败。

图片URL方式最简单,只需要一个可公网访问的链接。服务端收到请求后会自行下载图片再进行推理,你的请求体非常轻量。但前提是这张图片的URL必须能被模型服务商的服务器访问到,如果你传的是内网地址、本地路径或者带鉴权的链接,就会下载失败。Base64方式则相反,它把图片完整编码后塞进请求体,不依赖外部网络,适合处理本地文件、用户刚上传还没落盘的图片,缺点是请求体会变得很大,一张几MB的高清图编码后体积还会膨胀约三分之一,网络传输和解析开销都不小。

下面是用Python把本地图片转成Base64并发起请求的完整示例:

import base64
import requests

# 读取本地图片并编码为Base64字符串
def image_to_base64(path):
    with open(path, "rb") as f:
        return base64.b64encode(f.read()).decode("utf-8")

api_key = "你的API密钥"
img_b64 = image_to_base64("test.jpg")

resp = requests.post(
    "https://api.openai.com/v1/chat/completions",
    headers={
        "Authorization": "Bearer " + api_key,
        "Content-Type": "application/json"
    },
    json={
        "model": "gpt-4o",
        "messages": [
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": "用一句话概括这张图片"},
                    {
                        "type": "image_url",
                        "image_url": {
                            "url": "data:image/jpeg;base64," + img_b64
                        }
                    }
                ]
            }
        ],
        "max_tokens": 500
    }
)

print(resp.json()["choices"][0]["message"]["content"])

注意Base64方式的URL前缀写法:data:image/jpeg;base64,后面紧跟编码字符串。图片格式要和实际文件一致,png图片就要写成image/png,写错了部分接口会直接报格式错误。如果图片比较大,建议先做压缩和等比缩放,长边控制在1024到2048像素之间通常就足够模型识别细节了,没必要传原图,能显著降低费用和延迟。

三、不同厂商接口的格式差异与常见报错排查

虽然各家多模态接口思路相同,但字段命名差异不小。OpenAI使用image_url包裹一个含url的对象;Anthropic的Claude则使用image类型,直接包含source字段,其中要明确标注typemedia_typedata三个子字段;谷歌Gemini又是另一套写法,图片放在parts数组里用inline_data标识。切换接口时最容易出问题的就是这些细节,建议参考对应官方文档逐字段核对。

以Claude为例,它的图片消息结构是这样的:

messages = [
    {
        "role": "user",
        "content": [
            {
                "type": "image",
                "source": {
                    "type": "base64",
                    "media_type": "image/jpeg",
                    "data": img_b64  # 纯Base64字符串,不需要data前缀
                }
            },
            {
                "type": "text",
                "text": "描述一下这张图"
            }
        ]
    }
]

可以看到Claude直接用data字段放Base64字符串,不需要data:image/jpeg;base64,这个前缀,这和OpenAI的要求正好相反,是新人最常踩的坑之一。

再说说几个高频报错。第一种是400错误提示invalid image format,多半是图片格式不在支持列表里,主流接口一般支持jpeg、png、gif和webp,bmp、tiff、heic这些格式需要先转换。第二种是报图片过大,通常单张图片限制在20MB以内,超了就压缩或裁剪。第三种是URL方式报下载超时或403,这说明模型服务器访问不到你的图片,检查链接是否公开、是否有防盗链、是否做了IP限制。还有一种隐蔽的问题是Base64字符串里混入了换行符或者拼接了data:前缀却用了不支持该写法的接口,都会导致解析失败。

最后提醒一点成本控制:多模态请求中图片会按尺寸折算成token计费,一张高清大图折算的token可能比一段长文本还多。批量处理图片时,除了压缩图片尺寸,还可以考虑让模型只输出关键结论、限制max_tokens,这样整体开销能降下来不少。跑通第一个请求后,建议先用小图测试流程,确认无误后再接入生产环境,排查问题会轻松很多。

多模态输入大模型API图文混合请求修改时间:2026-09-05 20:12:55

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/20260905/51117.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。