多模态 AI 应用开发指南:从模型选型到实战部署
你可能在用 GPT-4 或 Claude 写代码、润色文章,但当需求变成”分析这张截图中的数据”、“理解用户上传的视频内容”时,纯文本模型就不够用了。多模态 AI 要解决的就是这个问题——让模型既能读懂文字,也能”看懂”图像、视频。
过去一年,多模态 AI 的发展速度远超预期。GPT-4o、Claude Vision、Gemini 1.5 Pro 相继推出,能力边界不断拓展。但对开发者来说,真正的问题不是”多模态AI有多强”,而是”我该怎么用、选哪个模型、怎么控制成本”。这篇文章从实战角度,把这些问题逐一拆解清楚。
一、多模态AI核心概念解析
1.1 什么是多模态AI
简单说,多模态AI就是能同时处理多种类型数据的模型。传统文本模型只吃文字,多模态模型能吃文字、图像、音频、视频,输出你想要的结果。
举个例子:你上传一张产品图片,问”价格标签在哪里?多少钱?“模型会先理解图像内容,定位到价格标签区域,读取数字,最后给出答案。这在传统方案里需要目标检测、OCR、文本理解三个模型配合,现在一个多模态调用搞定。
1.2 架构演进:从”拼积木”到”原生融合”
早期多模态方案大多是”拼积木”式的:用视觉编码器(如 CLIP、ViT)把图像变成向量,再喂给大语言模型。GPT-4V 就是这种思路,在 GPT-4 基础上加了个视觉适配器。
问题在于,这种”后加”的视觉能力总有点割裂感。模型理解图像时,本质上是用语言模型的逻辑”猜”视觉内容,遇到需要深度视觉推理的任务容易翻车。
原生多模态模型解决了这个问题。GPT-4o 和 Gemini 从设计之初就考虑了多模态,文本、图像、音频在底层统一处理。区别很直观:原生模型在视觉推理任务上表现明显更好,比如”比较两张图的差异”、“根据图表推导结论”这类任务。
1.3 2025-2026年的技术趋势
2025年被称为”Agent元年”,多模态能力从”锦上添花”变成”标配”。几个明显的趋势:
长上下文突破。Gemini 1.5 Pro 支持 1M+ tokens 的上下文,能一次性处理一小时以上的视频内容。以前处理长视频要逐帧分析、分段总结,现在直接”看完”再回答问题。
成本持续下降。开源模型追赶速度很快,Qwen2-VL、GLM-4V 等国产模型在部分任务上接近闭源水平。成本敏感的场景,私有化部署成了可行选择。
多模态Agent普及。模型不再只是”看图说话”,而是能根据视觉内容执行操作。比如”看到这张截图,帮我点击登录按钮”——这类任务需要视觉理解 + 工具调用 + 任务规划的完整闭环。
二、主流多模态模型对比与选型
选模型时,别只看 benchmark 排名。实际开发中,API 稳定性、成本、调用便捷度、合规要求都可能成为决定性因素。
2.1 OpenAI: GPT-4V 与 GPT-4o
GPT-4V 是 OpenAI 最早的多模态方案,通过视觉适配器让 GPT-4 有了”眼睛”。GPT-4o 是后来的原生多模态版本,整体能力更强。
什么时候选 GPT-4o?
- 需要视觉推理(根据图像推导结论、比较差异)
- 多轮多模态对话(前面提到过图片,后面继续讨论)
- 追求最高准确率
什么时候选 GPT-4V?
- 简单的图像描述、分类任务
- 对延迟敏感(GPT-4V 有时响应更快)
- 兼容旧系统
调用方式上,两个模型基本一致:
from openai import OpenAI
client = OpenAI()
# 方式一:使用图片 URL
response = client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "这张图片里有什么?"},
{"type": "image_url", "image_url": {"url": "https://example.com/image.jpg"}}
]
}]
)
# 方式二:使用 Base64 编码
import base64
with open("image.png", "rb") as f:
image_data = base64.b64encode(f.read()).decode("utf-8")
response = client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "分析这张图片"},
{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{image_data}"}}
]
}]
)
print(response.choices[0].message.content)
2.2 Anthropic: Claude Vision
Claude Vision 在文档分析、细节提取方面表现突出。需要从 PDF、图表、截图中提取结构化信息时,Claude 是个不错的选择。
Claude Vision 的优势场景:
- 文档解析(PDF、扫描件、复杂表格)
- 细节提取(比其他模型更”仔细”)
- 长文档处理(200K context)
调用方式略有不同,Claude 把图像作为独立的 content block:
from anthropic import Anthropic
import base64
client = Anthropic()
# 读取图片并转 Base64
with open("document.png", "rb") as f:
image_data = base64.b64encode(f.read()).decode("utf-8")
response = client.messages.create(
model="claude-sonnet-4-5-20250514",
max_tokens=1024,
messages=[{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/png",
"data": image_data
}
},
{"type": "text", "text": "提取文档中的所有表格数据,以 JSON 格式返回"}
]
}]
)
print(response.content[0].text)
2.3 Google: Gemini 系列
Gemini 的杀手锏是长上下文。Gemini 1.5 Pro 支持 1M+ tokens,能处理超长视频、多文档分析。场景涉及大量视觉内容时,Gemini 值得尝试。
适用场景:
- 长视频分析(超过 10 分钟)
- 多文档批量处理
- 需要在视觉内容间建立关联的任务
2.4 开源选择: Qwen2-VL、GLM-4V
成本敏感、数据敏感、或需要私有化部署的场景,开源模型是现实选择。
Qwen2-VL:阿里开源,中文优化,支持 4K 分辨率图像。在企业应用中表现稳定,调用成本约为闭源模型的 1/10。
GLM-4V:智谱开源,国内合规友好,MoE 架构在推理成本上有优势。
2.5 选型决策矩阵
怎么选?根据实际需求来:
| 场景 | 推荐模型 | 理由 |
|---|---|---|
| 快速原型、MVP | GPT-4o | API 成熟、文档完善、调试方便 |
| 文档解析、数据提取 | Claude Vision | 细节处理能力强、表格识别准确 |
| 长视频分析 | Gemini 1.5 Pro | 超长上下文、多模态推理 |
| 成本敏感、高并发 | Qwen2-VL | 开源可控、调用成本低 |
| 数据敏感、私有部署 | GLM-4V | 本地部署、数据不出域 |
| 中文场景、预算有限 | Qwen2-VL | 中文优化、性价比高 |
三、图像理解与处理实战
3.1 API 调用基础
多模态 API 的核心是构造正确的消息格式。不管是 OpenAI 还是 Anthropic,思路都一样:把图像和文本作为消息的不同部分传给模型。
图像大小要注意。图像按像素计算 token,越大越贵。GPT-4o 的自动缩放策略会把图像调整到合适的分辨率,但想精确控制成本,最好在上传前自己处理。
3.2 图像描述与问答
最基础的场景是让模型描述图像内容或回答相关问题。下面是一个完整的图像问答封装:
from openai import OpenAI
import base64
from pathlib import Path
class ImageAnalyzer:
def __init__(self, model="gpt-4o"):
self.client = OpenAI()
self.model = model
def analyze(self, image_path: str, question: str) -> str:
"""分析图片并回答问题"""
# 读取图片
with open(image_path, "rb") as f:
image_data = base64.b64encode(f.read()).decode("utf-8")
# 确定图片类型
suffix = Path(image_path).suffix.lower()
media_type = {
".jpg": "image/jpeg",
".jpeg": "image/jpeg",
".png": "image/png",
".gif": "image/gif",
".webp": "image/webp"
}.get(suffix, "image/jpeg")
# 构造请求
response = self.client.chat.completions.create(
model=self.model,
messages=[{
"role": "user",
"content": [
{"type": "text", "text": question},
{"type": "image_url", "image_url": {
"url": f"data:{media_type};base64,{image_data}"
}}
]
}],
max_tokens=1000
)
return response.choices[0].message.content
# 使用示例
analyzer = ImageAnalyzer()
result = analyzer.analyze("product.jpg", "这个产品的品牌是什么?价格是多少?")
print(result)
3.3 文档解析(PDF/图表)
处理 PDF 时,先把每页转成图片,然后逐页分析。这是一个实用的文档解析器:
import fitz # PyMuPDF
from PIL import Image
import io
import base64
from openai import OpenAI
def pdf_to_images(pdf_path: str, dpi: int = 150) -> list:
"""将 PDF 转换为图片列表"""
doc = fitz.open(pdf_path)
images = []
for page_num in range(len(doc)):
page = doc[page_num]
# 渲染页面为图片
mat = fitz.Matrix(dpi / 72, dpi / 72)
pix = page.get_pixmap(matrix=mat)
# 转换为 PIL Image
img_data = pix.tobytes("png")
img = Image.open(io.BytesIO(img_data))
images.append(img)
doc.close()
return images
def extract_table_from_page(image: Image.Image, client: OpenAI) -> dict:
"""从单页图片中提取表格数据"""
# 转为 base64
buffer = io.BytesIO()
image.save(buffer, format="PNG")
image_data = base64.b64encode(buffer.getvalue()).decode("utf-8")
response = client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": """
请提取图片中的表格数据,以 JSON 格式返回。
如果有多个表格,用数组表示。
格式示例:{"tables": [{"headers": [...], "rows": [...]}]}
"""},
{"type": "image_url", "image_url": {
"url": f"data:image/png;base64,{image_data}"
}}
]
}],
response_format={"type": "json_object"}
)
import json
return json.loads(response.choices[0].message.content)
# 完整流程
images = pdf_to_images("report.pdf")
for i, img in enumerate(images):
print(f"正在处理第 {i+1} 页...")
tables = extract_table_from_page(img, OpenAI())
print(f"提取到 {len(tables.get('tables', []))} 个表格")
3.4 批量图像处理
处理大量图片时,并发控制很重要。API 有速率限制,无脑并发会被限流:
import asyncio
from openai import AsyncOpenAI
import aiofiles
import base64
class BatchImageProcessor:
def __init__(self, model="gpt-4o", max_concurrent=5):
self.client = AsyncOpenAI()
self.model = model
self.semaphore = asyncio.Semaphore(max_concurrent)
async def process_single(self, image_path: str, prompt: str) -> dict:
"""处理单张图片"""
async with self.semaphore:
try:
async with aiofiles.open(image_path, "rb") as f:
image_bytes = await f.read()
image_data = base64.b64encode(image_bytes).decode("utf-8")
response = await self.client.chat.completions.create(
model=self.model,
messages=[{
"role": "user",
"content": [
{"type": "text", "text": prompt},
{"type": "image_url", "image_url": {
"url": f"data:image/jpeg;base64,{image_data}"
}}
]
}]
)
return {
"path": image_path,
"result": response.choices[0].message.content,
"success": True
}
except Exception as e:
return {
"path": image_path,
"error": str(e),
"success": False
}
async def process_batch(self, image_paths: list, prompt: str) -> list:
"""批量处理图片"""
tasks = [self.process_single(p, prompt) for p in image_paths]
return await asyncio.gather(*tasks)
# 使用示例
async def main():
processor = BatchImageProcessor(max_concurrent=3)
results = await processor.process_batch(
["img1.jpg", "img2.jpg", "img3.jpg"],
"描述这张图片的内容,不超过50字"
)
for r in results:
print(f"{r['path']}: {r.get('result', r.get('error'))}")
asyncio.run(main())
四、视频内容理解实战
视频处理的核心是”降维”——把时间轴上的连续画面变成离散的关键帧,然后逐帧分析。难点在于如何平衡信息完整性和处理成本。
4.1 视频帧提取与处理
import cv2
import base64
from pathlib import Path
class VideoProcessor:
def __init__(self, video_path: str):
self.video_path = video_path
self.cap = cv2.VideoCapture(video_path)
self.fps = self.cap.get(cv2.CAP_PROP_FPS)
self.total_frames = int(self.cap.get(cv2.CAP_PROP_FRAME_COUNT))
self.duration = self.total_frames / self.fps
def extract_frames(self, strategy="interval", **kwargs):
"""提取视频帧
Args:
strategy: 提取策略
- interval: 每隔N秒提取一帧
- scene: 场景变化时提取
- uniform: 均匀提取N帧
"""
frames = []
if strategy == "interval":
interval_sec = kwargs.get("interval", 1.0)
interval_frames = int(interval_sec * self.fps)
frame_idx = 0
while self.cap.isOpened():
ret, frame = self.cap.read()
if not ret:
break
if frame_idx % interval_frames == 0:
frames.append((frame_idx / self.fps, frame))
frame_idx += 1
elif strategy == "uniform":
num_frames = kwargs.get("num_frames", 10)
interval = max(1, self.total_frames // num_frames)
for i in range(num_frames):
self.cap.set(cv2.CAP_PROP_POS_FRAMES, i * interval)
ret, frame = self.cap.read()
if ret:
frames.append((i * interval / self.fps, frame))
self.cap.release()
return frames
def frame_to_base64(self, frame) -> str:
"""将帧转换为 base64"""
_, buffer = cv2.imencode('.jpg', frame)
return base64.b64encode(buffer).decode('utf-8')
# 使用示例
processor = VideoProcessor("demo.mp4")
print(f"视频时长: {processor.duration:.1f}秒")
# 每隔2秒提取一帧
frames = processor.extract_frames(strategy="interval", interval=2.0)
print(f"提取了 {len(frames)} 帧")
4.2 长视频理解策略
处理长视频时,成本会急剧上升。几个实用策略:
分层处理:先用低分辨率、低帧率快速浏览,确定关键片段;再对关键片段进行精细分析。
场景检测:只处理场景变化的帧,跳过重复画面。OpenCV 提供了场景检测的工具。
摘要优先:先让模型为每个片段生成摘要,最后综合所有摘要得出结论。
4.3 实战案例:视频摘要生成
from openai import OpenAI
def generate_video_summary(frames: list, client: OpenAI) -> str:
"""根据关键帧生成视频摘要"""
# 将帧分为批次,每批最多5帧
batch_size = 5
segment_summaries = []
for i in range(0, len(frames), batch_size):
batch = frames[i:i+batch_size]
# 构造消息内容
content = [{"type": "text", "text": "描述这些画面中发生的事情,简洁明了"}]
for timestamp, frame in batch:
frame_base64 = VideoProcessor("").frame_to_base64(frame)
content.append({
"type": "image_url",
"image_url": {"url": f"data:image/jpeg;base64,{frame_base64}"}
})
# 调用 API
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": content}]
)
segment_summaries.append(response.choices[0].message.content)
# 综合所有片段摘要
final_prompt = f"""
以下是视频各片段的摘要:
{chr(10).join(f'{i+1}. {s}' for i, s in enumerate(segment_summaries))}
请综合以上信息,生成完整的视频摘要,包括:
1. 主要内容
2. 关键事件或信息
3. 整体主题
"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": final_prompt}]
)
return response.choices[0].message.content
五、成本优化与性能调优
多模态调用的成本主要来自视觉 token。一张 1024×1024 的图片大约消耗 765 个 token,处理不当,一次请求可能产生几十块的费用。
5.1 视觉 Token 计算
GPT-4o 的 token 计算规则:
| 图像尺寸 | 低分辨率模式 | 高分辨率模式 |
|---|---|---|
| 512×512 | 85 tokens | 255 tokens |
| 1024×1024 | 170 tokens | 765 tokens |
| 2048×2048 | 255 tokens | 2550 tokens |
低分辨率模式适合不需要细节的场景,比如判断图片类型、粗略描述。需要读取文字、识别细节时必须用高分辨率模式。
5.2 图像压缩与预处理
上传前预处理图像是控制成本的有效手段:
from PIL import Image
from pathlib import Path
def optimize_image(image_path: str, max_size: int = 1024, quality: int = 85) -> str:
"""优化图像尺寸和质量"""
img = Image.open(image_path)
# 调整尺寸
if max(img.size) > max_size:
ratio = max_size / max(img.size)
new_size = (int(img.size[0] * ratio), int(img.size[1] * ratio))
img = img.resize(new_size, Image.Resampling.LANCZOS)
# 裁剪关键区域(如果知道位置)
# img = img.crop((left, top, right, bottom))
# 保存优化后的图片
optimized_path = f"optimized_{Path(image_path).name}"
img.save(optimized_path, "JPEG", quality=quality)
return optimized_path
# 使用示例
optimized = optimize_image("screenshot.png", max_size=1024)
# 原图可能是 2MB,优化后可能只有 200KB
5.3 缓存与批处理策略
结果缓存:相同图片的查询结果可以缓存。用图片的 hash 作为 key:
import hashlib
def get_image_hash(image_path: str) -> str:
"""计算图片 hash"""
with open(image_path, "rb") as f:
return hashlib.md5(f.read()).hexdigest()
# 缓存逻辑
cache = {}
image_hash = get_image_hash("product.jpg")
if image_hash in cache:
result = cache[image_hash]
else:
result = analyzer.analyze("product.jpg", "描述这个产品")
cache[image_hash] = result
批量合并:有多张相关图片时,尽量放在一次请求中:
# 不推荐:多次请求
for img in images:
result = analyze_image(img, "描述图片")
# 推荐:一次请求
all_images_content = [{"type": "text", "text": "描述这些图片"}]
for img in images:
all_images_content.append({
"type": "image_url",
"image_url": {"url": img_url}
})
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": all_images_content}]
)
5.4 模型混合调用方案
不是所有任务都需要最强模型。可以分层调用:
def smart_analyze(image_path: str, task_type: str):
"""根据任务类型选择模型"""
if task_type in ["classify", "detect"]:
# 简单分类、检测任务用小模型
model = "gpt-4o-mini"
elif task_type in ["ocr", "extract"]:
# OCR、数据提取用中等模型
model = "gpt-4o"
else:
# 复杂推理用强模型
model = "gpt-4o"
# ... 调用逻辑
六、生产部署最佳实践
从 Demo 到生产环境,还需要考虑很多工程问题。
6.1 错误处理与重试机制
API 调用随时可能失败——网络超时、速率限制、服务端错误。必须实现健壮的错误处理:
import time
from openai import APIError, RateLimitError, APIConnectionError
def robust_api_call(func, max_retries=3, backoff_factor=2):
"""带重试机制的 API 调用"""
for attempt in range(max_retries):
try:
return func()
except RateLimitError:
if attempt < max_retries - 1:
wait_time = backoff_factor ** attempt
print(f"触发速率限制,等待 {wait_time} 秒后重试...")
time.sleep(wait_time)
else:
raise
except APIConnectionError as e:
print(f"网络连接错误: {e}")
if attempt < max_retries - 1:
time.sleep(1)
else:
raise
except APIError as e:
print(f"API 错误: {e}")
raise
6.2 并发控制与速率限制
多模态 API 的速率限制通常比文本 API 更严格。实现一个令牌桶限流器:
import asyncio
import time
class RateLimiter:
def __init__(self, requests_per_minute: int):
self.interval = 60.0 / requests_per_minute
self.last_request = 0
self.lock = asyncio.Lock()
async def acquire(self):
async with self.lock:
now = time.time()
wait_time = self.last_request + self.interval - now
if wait_time > 0:
await asyncio.sleep(wait_time)
self.last_request = time.time()
# 使用示例
limiter = RateLimiter(requests_per_minute=100)
async def process_with_limit(image_path):
await limiter.acquire()
return await async_analyze(image_path)
6.3 监控与日志
记录每次调用的关键信息,便于排查问题:
import logging
from datetime import datetime
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def log_api_call(model: str, input_tokens: int, output_tokens: int, latency: float):
logger.info(
f"API调用 - 模型: {model}, "
f"输入tokens: {input_tokens}, 输出tokens: {output_tokens}, "
f"延迟: {latency:.2f}s"
)
# 在调用后记录
start_time = time.time()
response = client.chat.completions.create(...)
latency = time.time() - start_time
log_api_call(
model="gpt-4o",
input_tokens=response.usage.prompt_tokens,
output_tokens=response.usage.completion_tokens,
latency=latency
)
6.4 完整代码示例
把前面的内容整合成一个可直接使用的工具类:
from openai import OpenAI
from pathlib import Path
import base64
import logging
import time
from typing import Optional, List, Dict
logger = logging.getLogger(__name__)
class MultimodalAnalyzer:
"""多模态分析工具类"""
def __init__(
self,
model: str = "gpt-4o",
max_retries: int = 3,
requests_per_minute: int = 100
):
self.client = OpenAI()
self.model = model
self.max_retries = max_retries
self.min_interval = 60.0 / requests_per_minute
self.last_request_time = 0
def _wait_for_rate_limit(self):
"""速率限制"""
now = time.time()
wait_time = self.last_request_time + self.min_interval - now
if wait_time > 0:
time.sleep(wait_time)
self.last_request_time = time.time()
def _read_image(self, image_path: str) -> str:
"""读取图片并转 base64"""
with open(image_path, "rb") as f:
return base64.b64encode(f.read()).decode("utf-8")
def _call_with_retry(self, messages: list) -> dict:
"""带重试的 API 调用"""
for attempt in range(self.max_retries):
try:
self._wait_for_rate_limit()
start_time = time.time()
response = self.client.chat.completions.create(
model=self.model,
messages=messages,
max_tokens=1000
)
latency = time.time() - start_time
logger.info(
f"API调用成功 - tokens: {response.usage.total_tokens}, "
f"延迟: {latency:.2f}s"
)
return {
"content": response.choices[0].message.content,
"tokens": {
"prompt": response.usage.prompt_tokens,
"completion": response.usage.completion_tokens
}
}
except Exception as e:
logger.error(f"API调用失败 (尝试 {attempt + 1}/{self.max_retries}): {e}")
if attempt == self.max_retries - 1:
raise
time.sleep(2 ** attempt)
def analyze_image(
self,
image_path: str,
prompt: str,
detail: str = "auto"
) -> dict:
"""分析单张图片"""
image_data = self._read_image(image_path)
messages = [{
"role": "user",
"content": [
{"type": "text", "text": prompt},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{image_data}",
"detail": detail
}
}
]
}]
return self._call_with_retry(messages)
def analyze_multiple_images(
self,
image_paths: List[str],
prompt: str
) -> dict:
"""分析多张图片"""
content = [{"type": "text", "text": prompt}]
for path in image_paths:
image_data = self._read_image(path)
content.append({
"type": "image_url",
"image_url": {"url": f"data:image/jpeg;base64,{image_data}"}
})
return self._call_with_retry([{"role": "user", "content": content}])
def extract_text_from_image(self, image_path: str) -> str:
"""从图片中提取文字(OCR)"""
result = self.analyze_image(
image_path,
"请提取图片中的所有文字内容,按原始格式输出"
)
return result["content"]
def describe_image(self, image_path: str) -> str:
"""生成图片描述"""
result = self.analyze_image(
image_path,
"用一段话描述这张图片的内容"
)
return result["content"]
# 使用示例
if __name__ == "__main__":
analyzer = MultimodalAnalyzer()
# 分析单张图片
result = analyzer.analyze_image(
"product.jpg",
"这个产品的品牌是什么?价格是多少?"
)
print(result["content"])
# OCR 提取文字
text = analyzer.extract_text_from_image("document.png")
print(text)
总结
多模态 AI 正从”新奇玩具”变成”实用工具”。选模型时,别只看 benchmark,要结合具体场景:需要长视频分析选 Gemini,文档解析选 Claude,快速原型用 GPT-4o,成本敏感就考虑开源方案。
开发过程中,成本控制是关键。预处理图像、合理选择分辨率、实现缓存机制,这些都能显著降低费用。进入生产环境后,错误处理、速率限制、监控日志一个都不能少。
多模态 AI 的能力边界还在不断拓展。2025年值得关注的几个方向:多模态 Agent 的普及、更长上下文的支持、开源模型的持续进步。掌握这些基础技能,就能在技术演进中快速适应新变化。
参考资料
- GPT-4 Vision: A Comprehensive Guide - DataCamp
- Claude Vision for Document Analysis - GetStream
- GPT-4o Vision Guide - GetStream
- OpenAI Multimodal Cookbook
- 多模态智能体开发指南2025
常见问题
GPT-4o 和 GPT-4V 该选哪个?
多模态 API 的成本怎么控制?
• 预处理图像:上传前压缩尺寸、降低分辨率
• 合理选分辨率:不需要细节时用低分辨率模式
• 实现缓存:相同图片的查询结果缓存起来
处理长视频有什么技巧?
开源多模态模型能用吗?
生产环境需要做哪些准备?
10 分钟阅读 · 发布于: 2026年3月24日 · 修改于: 2026年3月24日

评论
使用 GitHub 账号登录后即可评论