一架梯子,一头程序猿,仰望星空!
OpenAI开发教程 > 内容正文

视觉模型(Vision)gpt-4-vision-preview


1. GPT-4视觉模型介绍

GPT-4视觉模型(GPT-4V)是OpenAI推出的一种多模态人工智能模型,它在GPT-4的基础上集成了视觉理解功能。与传统的文本处理模型不同,GPT-4V能够接收并分析图像内容,并针对图像提供描述、回答问题或进行交互。

应用场景示例:

  • 商品识别与分类:电子商务平台可以使用GPT-4V识别商品图片,提供商品描述,帮助改善搜索和推荐系统。
  • 辅助医疗决策:虽然GPT-4V不适合直接进行专业的医学影像诊断,但它可以协助医护人员进行初步的图像理解和数据整理。
  • 教育与研究:在教学和科研中,GPT-4V可用于分析图表、实验结果,如自动解读科学图像数据。
  • 交通监控分析:通过分析路况监控图像,GPT-4V能够辅助交通管理系统进行实时状况报告和事故识别。

2. 简单例子

下面通过一个简单的CURL请求示例来展示如何使用GPT-4视觉模型分析图像:

API请求参数说明:

  • model: 指定使用的模型版本,这里为 “gpt-4-vision-preview”。
  • messages: 包含角色定义和内容,其中内容中可以包含文本和图像链接。
  • max_tokens: 指定生成文本的最大长度限制。

CURL请求示例:

curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-4-vision-preview",
    "messages": [
      {
        "role": "user",
        "content": [
          {
            "type": "text",
            "text": "这张图片中有什么?"
          },
          {
            "type": "image_url",
            "image_url": {
              "url": "您的图片链接"
            }
          }
        ]
      }
    ],
    "max_tokens": 300
  }'

通过上方的请求,我们向GPT-4视觉模型提交了一张图片,并问了一个简单的问题:“这张图片中有什么?”。模型会分析图像内容,并根据图像内容提供回答。

3. 以base64编码的方式上传图片

在某些情况下,您可能需要上传本地的图片文件给GPT-4视觉模型。这时,我们可以通过base64编码的方式将图片数据嵌入到API请求中。

Python代码示例:

import base64
import requests

# OpenAI API Key
api_key = "YOUR_OPENAI_API_KEY"

# 将图片转base64格式
def encode_image(image_path):
  with open(image_path, "rb") as image_file:
    return base64.b64encode(image_file.read()).decode('utf-8')

# 本地图片路径
image_path = "path_to_your_image.jpg"

# 获取图片base64编码格式
base64_image = encode_image(image_path)

headers = {
  "Content-Type": "application/json",
  "Authorization": f"Bearer {api_key}"
}

payload = {
  "model": "gpt-4-vision-preview",
  "messages": [
    {
      "role": "user",
      "content": [
        {
          "type": "text",
          "text": "What’s in this image?"
        },
        {
          "type": "image_url",
          "image_url": {
            "url": f"data:image/jpeg;base64,{base64_image}"
          }
        }
      ]
    }
  ],
  "max_tokens": 300
}

response = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=payload)

print(response.json())

在上述代码中,我们首先将本地的图片文件转换为base64编码的字符串,然后将这个字符串作为请求的一部分发送给API。模型返回的内容包含了对图片内容的描述。

4. 处理多图输入

有时候需要一次性分析多张图片。GPT-4视觉模型支持同时接收多个图像输入,并能够让用户询问关于这些图片的问题或比较它们之间的差异。

多图输入示例:

curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-4-vision-preview",
    "messages": [
      {
        "role": "user",
        "content": [
          {
            "type": "text",
            "text": "这些图片中有什么不同?"
          },
          {
            "type": "image_url",
            "image_url": {
              "url": "第一张图片的链接",
            }
          },
          {
            "type": "image_url",
            "image_url": {
              "url": "第二张图片的链接",
            }
          }
        ]
      }
    ],
    "max_tokens": 300
  }'

在这个请求中,我们向API提交了两张图片,模型会分别分析每一张,并根据提出的问题,给出关于图片的描述和比较。这种方法非常适用于需要对图片集进行总体分析的场景。

5. 设置图片分析详情级别

在使用 GPT-4 视觉模型进行图片分析时,您可以根据需求设置分析的详情级别。通过调整 detail 参数,可选择 low(低)、high(高)或 auto(自动)中的一个。下面为您详细解释每个选项的含义及如何设置:

  • low:选择低详情级别会禁用“高分辨率”模型。该模型将接收低分辨率的512像素 x 512像素版本的图片,并用65个tokens的预算来代表图片。这适用于不需要高细节的场景,有助于获得更快的响应速度且消耗更少的输入tokens。
  • high:高详情级别允许模型首先看到低分辨率的图片,然后基于输入图片的大小,创建512像素方格的详细裁剪版本。每个详细裁剪以65个tokens的双倍预算(即129 tokens)表示。
  • auto:自动详情级别将根据图片输入的大小决定是使用 lowhigh 详情级别。

通过如下代码示例可以展示如何设置详情级别:

import base64
import requests

# OpenAI API密钥
api_key = "你的OPENAI_API_KEY"

# 图片路径
image_path = "path_to_your_image.jpg"

# 对图片进行base64编码
base64_image = base64.b64encode(open(image_path, "rb").read()).decode('utf-8')

headers = {
  "Content-Type": "application/json",
  "Authorization": f"Bearer {api_key}"
}

payload = {
  "model": "gpt-4-vision-preview",
  "messages": [
    {
      "role": "user",
      "content": [
        {
          "type": "text",
          "text": "这张图片中有什么?"
        },
        {
          "type": "image_url",
          "image_url": {
            "url": f"data:image/jpeg;base64,{base64_image}",
            "detail": "high"  # 设置为高详情级别
          }
        }
      ]
    }
  ],
  "max_tokens": 300
}

response = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=payload)

print(response.json())

6. 理解模型的局限和管理图片

6.1. 模型的局限性

GPT-4视觉模型尽管功能强大,但它并非万能,了解其局限性对于使用它来进行图片理解至关重要。以下是一些已知限制的概述:

  • 医学影像:模型不适合解释专业医学影像,如CT扫描,不应被用作医疗建议。
  • 非英文文字:模型处理含有非拉丁字母表文本的图片时可能性能不佳,如日语或韩语文字。
  • 空间定位:模型在需要精确蕴含位置关联的任务上表现欠佳,例如识别棋盘上棋子的位置。
  • 图像细节:模型可能难以理解图像中的图表或颜色和样式(如实线、虚线)变化的文本。
  • 图像旋转:模型可能误解倾斜或颠倒的文本和图像。

6.2 管理会话中的图片

由于Chat Completions API是无状态的,因此需要自己管理传递给模型的消息(包括图片)。如果您希望多次使用相同的图片,每次API请求时都需要重新传递图片数据。

# ...之前示例代码...

# 在需要时重复使用base64_image变量
# 不需要再次进行图片编码,除非你需要更新或更换图片

# 再次请求API作出对新问题的回应
additional_payload = {
  "model": "gpt-4-vision-preview",
  "messages": [
    {
      "role": "user",
      "content": [
        {
          "type": "text",
          "text": "根据这张图片,你有哪些建议?"
        },
        {
          "type": "image_url",
          "image_url": {
            "url": f"data:image/jpeg;base64,{base64_image}"
          }
        }
      ]
    }
  ],
  "max_tokens": 300
}

new_response = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=additional_payload)

print(new_response.json())

7. 成本计算

使用detail: low选项的每张图片固定消耗85个tokens。对于detail: high选项的图片,首先把图片按比例缩放以适应2048px x 2048px的尺寸,然后确保图片短边为768px。之后统计图片分为多少个512px的方块,每个方块消耗170个tokens,并在最后总计数中增加85个tokens。

例如,如果一张图片的尺寸是1024px x 1024px并且选择detail: high,它的token花费将是:

  • 首先,1024小于2048,所以没有初始大小调整。
  • 然后,最短的边是1024,所以我们将图像缩小到768 x 768。
  • 需要4个512px的正方形块来表示图像,因此最终的令牌成本为170 * 4 + 85 = 765。

如需详细了解成本计算方法,请参考GPT-4视觉模型的文档。

8. 常见问题

下面列举了一些使用 GPT-4 视觉模型时,用户可能遇到的常见问题及其答案:

Q: 是否可以针对gpt-4的图像功能进行微调?

A: 目前我们不支持对gpt-4的图像功能进行微调。

Q: 我可以使用gpt-4生成图像吗?

A: 不,您可以使用dall-e-3生成图像,使用gpt-4-vision-preview来理解图像。

Q: 支持哪些类型的文件上传?

A: 我们目前支持PNG (.png)、JPEG (.jpeg和.jpg)、WEBP (.webp)和非动态GIF (.gif)。


关联主题