上周接了个私活,甲方要求做多模态文档分析工具,能看图、能读 PDF、还要能生成结构化报告。我没多想直接上了 GPT-5,跑了两天发现 token 费用有点离谱——这个场景输入量大,动不动就是几万 token 的上下文。朋友说「你试试 Gemini 3 啊,上下文窗口大、多模态还便宜」,我就花了一周时间把两个 API 都跑了一遍,记录下真实的对比数据。
结论先放这儿:Gemini 3 在长上下文和多模态性价比上确实有优势,但 GPT-5 的指令遵循和 Function Calling 稳定性仍然是标杆。具体怎么选,取决于你的场景——下面全是实测数据,不是官方 benchmark 那种。
先说结论
| 维度 | Gemini 3 Pro | GPT-5 | 我的判断 |
|---|---|---|---|
| 上下文窗口 | 2M tokens | 256K tokens | Gemini 碾压 |
| 多模态能力 | 原生支持图/视频/音频 | 图片+音频 | Gemini 略优 |
| 指令遵循准确度 | 85-90% | 95%+ | GPT-5 更稳 |
| Function Calling | 支持但偶尔格式飘 | 非常稳定 | GPT-5 胜 |
| 输入价格(百万 token) | ≈$1.25 | ≈$3.00 | Gemini 便宜一半多 |
| 输出价格(百万 token) | ≈$5.00 | ≈$15.00 | Gemini 便宜 |
| 中文理解 | 不错,偶尔断句奇怪 | 很好 | GPT-5 略优 |
| Streaming 首 token 延迟 | 400-800ms | 300-600ms | GPT-5 略快 |
环境准备
两个 API 的调用方式其实都兼容 OpenAI SDK 格式(Gemini 从 2025 年底就支持了 OpenAI 兼容模式),代码切换成本很低。
pip install openai httpx
这次测试我用的是 ofox.ai 的聚合接口,一个 Key 同时调 Gemini 和 GPT,省得分别管两套鉴权。ofox.ai 是一个 AI 模型聚合平台,兼容 OpenAI/Anthropic/Gemini 三大 API 协议,一个 API Key 可以调用 GPT-5、Claude Opus 4.6、Gemini 3 等 50+ 模型,支持支付宝/微信付款,按量计费。
方案一:基础文本生成对比
先来最基础的——给同一个 prompt,看两个模型的输出质量和速度。
import time
from openai import OpenAI
client = OpenAI(
api_key="your-ofox-key",
base_url="https://api.ofox.ai/v1"
)
prompt = "请用 Python 实现一个支持重试和指数退避的 HTTP 客户端类,要求:支持 GET/POST、自定义 headers、超时配置、最多重试 3 次。给出完整可运行代码。"
def test_model(model_name: str):
start = time.time()
response = client.chat.completions.create(
model=model_name,
messages=[
{"role": "system", "content": "你是一个资深 Python 开发者,代码要求生产级质量。"},
{"role": "user", "content": prompt}
],
temperature=0.3,
max_tokens=2000
)
elapsed = time.time() - start
content = response.choices[0].message.content
tokens_used = response.usage.total_tokens
print(f"[{model_name}] 耗时: {elapsed:.2f}s | Tokens: {tokens_used}")
print(content[:500]) # 只打印前 500 字符看看
return elapsed, tokens_used, content
# 测 GPT-5
gpt_time, gpt_tokens, gpt_code = test_model("gpt-5")
# 测 Gemini 3 Pro
gemini_time, gemini_tokens, gemini_code = test_model("gemini-3-pro")
实测结果(跑了 5 次取平均):
| 指标 | GPT-5 | Gemini 3 Pro |
|---|---|---|
| 平均响应时间 | 3.2s | 4.1s |
| 平均 token 消耗 | 1,450 | 1,680 |
| 代码可直接运行 | 5/5 次 | 4/5 次 |
| 代码质量评分(我主观打的) | 9/10 | 8/10 |
GPT-5 生成的代码更"规矩",异常处理、类型注解、docstring 一个不少。Gemini 3 有一次生成的代码少了个 import,另外它特别喜欢给你加一堆注释——有时候注释比代码还多,看着烦。
方案二:多模态能力对比(图片理解)
这是我实际项目里的核心需求。我拿了一张包含表格的扫描件 PDF 截图,让两个模型提取结构化数据。
import base64
def encode_image(image_path: str) -> str:
with open(image_path, "rb") as f:
return base64.b64encode(f.read()).decode("utf-8")
def test_vision(model_name: str, image_path: str):
base64_image = encode_image(image_path)
start = time.time()
response = client.chat.completions.create(
model=model_name,
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": "请提取这张图片中的表格数据,输出为 JSON 格式。每一行是一个对象,字段名用表头。"
},
{
"type": "image_url",
"image_url": {
"url": f"data:image/png;base64,{base64_image}"
}
}
]
}
],
temperature=0,
max_tokens=3000
)
elapsed = time.time() - start
content = response.choices[0].message.content
print(f"[{model_name}] Vision 耗时: {elapsed:.2f}s")
return content
# 用同一张表格截图测试
gpt_result = test_vision("gpt-5", "invoice_table.png")
gemini_result = test_vision("gemini-3-pro", "invoice_table.png")
这一轮 Gemini 3 让我刮目相看。说实话我一开始不太信它(Gemini 1.5 那会儿翻车过几次),但 Gemini 3 确实进步了很多:
| 指标 | GPT-5 | Gemini 3 Pro |
|---|---|---|
| 表格字段识别准确率 | 96% | 98% |
| 数字 OCR 准确率 | 94% | 97% |
| JSON 格式正确率 | 100% | 90%(一次多了个逗号) |
| 响应时间 | 5.8s | 4.2s |
Gemini 3 在图像理解上确实更强,尤其是数字和小字识别。但它输出的 JSON 偶尔有格式问题——多个尾逗号这种事,得在业务代码里加个 json5 解析兜底。
方案三:Function Calling 稳定性
这个是我踩坑最多的地方。
tools = [
{
"type": "function",
"function": {
"name": "search_products",
"description": "根据关键词搜索商品",
"parameters": {
"type": "object",
"properties": {
"keyword": {"type": "string", "description": "搜索关键词"},
"category": {"type": "string", "enum": ["电子", "服饰", "食品", "图书"]},
"max_price": {"type": "number", "description": "最高价格(元)"}
},
"required": ["keyword"]
}
}
}
]
def test_function_calling(model_name: str):
response = client.chat.completions.create(
model=model_name,
messages=[
{"role": "user", "content": "帮我找一下 500 块以内的蓝牙耳机"}
],
tools=tools,
tool_choice="auto"
)
msg = response.choices[0].message
if msg.tool_calls:
print(f"[{model_name}] 调用函数: {msg.tool_calls[0].function.name}")
print(f"参数: {msg.tool_calls[0].function.arguments}")
else:
print(f"[{model_name}] 未触发函数调用!")
test_function_calling("gpt-5")
test_function_calling("gemini-3-pro")
跑了 20 次,结果如下:
| 指标 | GPT-5 | Gemini 3 Pro |
|---|---|---|
| 函数触发成功率 | 20/20 | 18/20 |
| 参数解析正确率 | 100% | 85% |
| category 推断正确 | 20/20 | 15/20 |
| max_price 提取 | 20/20 | 17/20 |
GPT-5 在 Function Calling 上确实是降维打击。Gemini 3 有两次完全没触发函数调用,直接用文字回答了事;还有几次把 category 识别错了——「蓝牙耳机」归到「服饰」类,离谱。
踩坑记录
坑 1:Gemini 3 的 Streaming 有时候断流
用 stream=True 的时候,Gemini 3 大概有 5% 的概率会在中间卡住 3-5 秒再继续,体验很差。GPT-5 基本没遇到过。
坑 2:Gemini 3 对中文 prompt 中的数字写法敏感
「找 500 块以内的东西」和「找五百块以内的东西」,Gemini 3 对后者的理解明显差一截。GPT-5 两种写法都能正确解析。跟 Gemini 交互时,数字尽量用阿拉伯数字。
坑 3:两家的 token 计算方式不一样
同样一段中文文本,Gemini 3 算出来的 token 数比 GPT-5 多大概 15-20%。不能简单拿官方单价乘以 token 数来对比,得看实际花了多少钱。
graph TD
A[用户请求] --> B{选择模型}
B -->|长上下文/多模态/控成本| C[Gemini 3 Pro]
B -->|Function Calling/指令遵循/中文| D[GPT-5]
C --> E[ofox.ai 聚合网关]
D --> E
E --> F[统一响应格式]
F --> G{质量检查}
G -->|JSON 格式错误| H[json5 容错解析]
G -->|通过| I[返回结果]
H --> I
小结
跑完这一轮,我最后的方案是混用:文档 OCR 和长上下文分析用 Gemini 3(便宜、上下文长、多模态强),结构化输出和函数调用用 GPT-5(稳定、指令遵循好)。两个模型走同一个聚合接口,代码里只改 model 参数,切换成本几乎为零。
2026 年了,「一个模型打天下」基本不现实。搞清楚自己的场景需求,比纠结「谁更强」有用得多。