譯者 | 李睿
審校 | 重樓
隨著技術的發展和進步,人工智能模型越來越智能,但究竟哪一種人工智能模型能在壓力下展現出真正的推理能力?本文對o3、o4-mini和Gemini 2.5 Pro這三種人工智能模型進行了一系列測試:物理謎題、數學問題、編碼任務和現實世界的智商測試。
而應對這些挑戰并沒有任何捷徑,而只有對它們思維能力的考驗。本文將深入剖析這三種人工智能模型在不同領域中的高級推理表現。無論是密切關注人工智能領域的最新動態,還是了解哪種人工智能模型能夠脫穎而出,本文將進行揭曉。
o3和o4-mini是什么?
o3和o4 mini是OpenAI公司最新推出的推理模型,它們是o1和o3 mini的繼任者,通過運行更深層次、更長的內部“思維鏈”,超越了模式匹配。它們可以自主地調用全套ChatGPT工具,并擅長STEM、編碼和邏輯推理。
- o3:作為旗艦模型,其計算能力是o1的10倍,具備“通過圖像進行思考”的能力,可以直接進行視覺推理;適用于深度分析任務。
- o4 mini:該模型是緊湊而高效的對應模型,針對速度和吞吐量進行了優化;以較低的成本提供強大的數學、編碼和視覺性能。
用戶可以在ChatGPT中或通過響應API訪問。
o3和o4-mini的主要特性
以下是o3和o4-mini這兩種先進且強大的推理模型的一些關鍵特性:
- 自主行為:o3和o4-mini都展現出主動解決問題的能力,能夠自主確定復雜任務的最佳方法,并高效執行多步驟解決方案。
- 高級工具集成:這些模型能夠無縫地利用web瀏覽、代碼執行和圖像生成等工具來增強它們的響應,并有效地處理復雜的查詢。
- 多模態推理:它們能夠處理并將視覺信息直接整合到推理鏈中,從而能夠解讀和分析圖像以及文本數據。
- 高級視覺推理(“通過圖像進行思考”):這些模型能夠解讀復雜的視覺輸入,例如圖表、白板草圖,甚至模糊或低質量的照片。它們甚至能夠在推理過程中操作這些圖像(例如如縮放、裁剪、旋轉、增強)以提取相關信息。
Gemini 2.5 Pro是什么?
Gemini 2.5 Pro是谷歌DeepMind最新的人工智能模型,旨在提供比其前身更好的性能、效率和功能。它是Gemini 2.5系列中的Pro級別版本,它為開發人員和企業在功率和成本效率之間取得了平衡。
Gemini 2.5 Pro的主要特性
Gemini 2.5 Pro引入了一些顯著增強的功能:
- 多模態功能:該模型支持文本、圖像、視頻、音頻、代碼庫等多種數據類型,能夠處理各種輸入和輸出,使其成為跨不同領域的通用工具。
- 高級推理系統:Gemini 2.5 Pro的核心是其復雜的推理系統,它使人工智能能夠在系統地生成響應之前分析信息。這種深思熟慮的方法允許更準確和與上下文相關的輸出。
- 擴展上下文窗口:它具有100萬個令牌的擴展上下文窗口。這使其能夠同時處理和理解大量信息。
- 增強的編碼性能:該模型展示了編碼任務的顯著改進,為開發人員提供了更高效、更準確的代碼生成和幫助。
- 擴展知識庫:與大多數其他模型相比,它是在最近的數據上進行訓練的,知識截止日期為2025年1月。
用戶可以通過Google AI Studio或Gemini網站訪問Gemini 2.5 Pro。
o3 vs o4 mini vs Gemini 2.5:任務比較對決
為了探究哪一款模型真正能夠在現實世界的挑戰中脫穎而出,讓o3、o4 mini和Gemini 2.5分別完成了五項截然不同的任務并進行對比:
- 諧振衰減推理:計算光線色散氣體介質的吸收系數,相速度排序和諧振折射率。
- 數值序列謎題:破解一個逐漸增長的數列,找出缺失的項。
- LRU緩存實現:在代碼中設計一個高性能,常數時間最近最少使用的緩存。
- 響應式作品網頁:運用語義化 HTML 和自定義 CSS 打造簡潔且適配移動設備的個人網站。
- 多模態任務分解:分析每個模型如何處理基于圖像的挑戰。
每項測試都探討了不同的優勢,包括深度物理推理、模式識別、編碼能力、設計流暢性和圖像上下文理解;因此,可以準確地看到每個模型的優缺點。
任務1:推理
輸入提示:色散氣體介質。研究發現,稀薄氣體介質在頻率上表現出單一的光學諧振 \\(\omega _0 = 2 \pi\cdot 10^{15} \\赫茲。頻率上平面波的電場 \\(\omega _0) \\)在這種介質中傳播,在10米的距離上衰減了2倍。吸收共振的頻率寬度為 \\( \Delta \omega \\). (a)吸收系數是多少 \\( \alpha \\)共振?(b)按升序排列各頻率的傳播速度是多少 \\(\omega _0, \omega _0 + \Delta\omega / 10 \\),和 \\(\omega _0 - \Delta\omega / 10 \\)?并展示推理。(c)如果介質中不存在其他諧振,諧振時折射率和傳播速度的近似數值是多少?
(1)o3的輸出:
(2)o4-mini的輸出:
(3)Gemini 2.5的輸出:
(4)輸出比較
評判標準 | o3 | o4-mini | Gemini 2.5 |
吸收系數的計算方法 | 推導正確;使用場衰變方程和比爾-朗伯定律 | 表述準確簡明;清晰關聯消光系數κ與吸收系數α | 正確并詳細;使用對數變換并包含單位 |
相速度的排序方式 | 正確的數學清晰度和物理解釋 | 邏輯嚴謹,推導簡潔 | 正確,有很強的概念背景和直觀的推理能力 |
諧振時的折射率和速度 | 具有單位轉換和含義的精確值 | 近似處理但表述清晰;假設背景折射率≈1 | 定性解釋;定量略低 |
解釋的清晰度與深度 | 深刻但技術性強 | 簡潔易懂,適合學生理解 | 概念豐富且結構良好;高度可讀的 |
(5)最終結論
這三種人工智能模型都提供了正確和連貫的答案,但Gemini 2.5整體表現最好。o3提供了最嚴格的技術,但o4-mini在速度和清晰度方面表現出色。Gemini 2.5在深度、概念清晰度和結構化演示之間達到了最佳平衡。它不僅提供了正確的結果,而且還用直觀的推理解釋了底層物理原理,使其成為理解和驗證的理想選擇。
任務2:數值推理
輸入提示:在下列序列中,從給定的選項中選擇可替換問號(?)的數字:16、33、100、401、?
- 1235
- 804
- 1588
- 2006
(1)o3的輸出:
(2)o4-mini的輸出:
(3)Gemini 2.5的輸出:
(4)輸出比較
評判標準 | o3 | o4-mini | Gemini 2.5 |
正確性 | 正確答案為2006 | 正確答案為2006 | 正確答案為2006 |
模式識別 | 清楚識別增加的乘數+1 | 簡潔地標識遞歸公式 | 逐步地講解邏輯 |
解釋風格 | 有點技術性,但很簡潔 | 干凈簡約 | 最詳細直觀 |
清晰易懂的表達 | 適合中級學習者 | 有助于快速理解 | 適合所有級別 |
(5)最終結論
所有三個模型都正確地識別了模式并得出了正確的答案(2006)。Gemini 2.5提供了詳細的逐步的解釋,而o3則清晰地解釋了邏輯,而o4-mini則以其優雅和數學精度脫穎而出。
通過將序列表示為一般公式,an=an-1×n+1a_n=a{n-1}\times n+1an=a?1×n+1,o4 mini以最簡潔和結構化的方式捕獲了底層模式。這使得它非常適合那些欣賞清晰和簡潔推理的學習者。o4 mini提供了最佳的整體解釋。
任務3:編碼任務
輸入提示:設計并實現最近最少使用(Least Recently Used,LRU)緩存的數據結構。用以下方法實現LRUCache類:
- ' get(key: int) -> int ':如果存在則返回鍵的值,否則返回-1。
—“put(key: int, value: int)”—“> None”:如果存在鍵值,則更新鍵值,如果不存在則插入鍵值對。當緩存達到其容量時,它應該使最近最少使用的項無效。
對于這兩個操作,緩存的時間復雜度應該為0(1)。
(1)o3的編碼:
class Node:
"""Doubly linked list node holding a cache entry (key, value)."""
__slots__ = ("key", "value", "prev", "next")
def __init__(self, key: int, value: int):
self.key = key
self.value = value
self.prev = None
self.next = None
class LRUCache:
def __init__(self, capacity: int):
if capacity <= 0:
raise ValueError("Capacity must be positive")
self.cap = capacity
self.map: dict[int, Node] = {}
# Dummy head/tail simplify edge case handling
self.head = Node(0, 0) # Most recently used sentinel
self.tail = Node(0, 0) # Least recently used sentinel
self.head.next = self.tail
self.tail.prev = self.head
# ───────────────────────── Internal helpers ──────────────────────────
def _add_to_front(self, node: Node) -> None:
"""Insert node right after head (MRU position)."""
node.prev = self.head
node.next = self.head.next
self.head.next.prev = node
self.head.next = node
def _remove(self, node: Node) -> None:
"""Unlink node from list."""
node.prev.next = node.next
node.next.prev = node.prev
# ───────────────────────── Public API ────────────────────────────────
def get(self, key: int) -> int:
"""Return value if present; else 1. Marks entry as recently used."""
if key not in self.map:
return -1
node = self.map[key]
self._remove(node)
self._add_to_front(node)
return node.value
def put(self, key: int, value: int) -> None:
"""
Insert/update (key,value).
If capacity exceeded, evict the least recently used entry.
"""
if key in self.map: # Update existing
node = self.map[key]
node.value = value
self._remove(node)
self._add_to_front(node)
return
# Insert new key
node = Node(key, value)
self.map[key] = node
self._add_to_front(node)
# Evict if over capacity
if len(self.map) > self.cap:
lru = self.tail.prev # Real LRU node
self._remove(lru)
del self.map[lru.key]
(2) o4-mini的編碼:
class Node:
__slots__ = ('key', 'value', 'prev', 'next')
def __init__(self, key: int = None, value: int = None):
self.key = key
self.value = value
self.prev = None
self.next = None
class LRUCache:
def __init__(self, capacity: int):
self.capacity = capacity
self.cache = {} # key → Node
# Dummy head/tail
self.head = Node()
self.tail = Node()
self.head.next = self.tail
self.tail.prev = self.head
def _remove(self, node: Node):
"""Disconnect node from list."""
prev, nxt = node.prev, node.next
prev.next = nxt
nxt.prev = prev
def _add_to_front(self, node: Node):
"""Insert node right after head."""
node.next = self.head.next
node.prev = self.head
self.head.next.prev = node
self.head.next = node
def get(self, key: int) -> int:
if key not in self.cache:
return -1
node = self.cache[key]
# Move to front
self._remove(node)
self._add_to_front(node)
return node.value
def put(self, key: int, value: int) -> None:
if key in self.cache:
# Update existing node and move it to front
node = self.cache[key]
node.value = value
self._remove(node)
self._add_to_front(node)
else:
# Insert new node
new_node = Node(key, value)
self.cache[key] = new_node
self._add_to_front(new_node)
# Evict LRU if over capacity
if len(self.cache) > self.capacity:
# Tail.prev is LRU
lru = self.tail.prev
self._remove(lru)
del self.cache[lru.key]
(3)Gemini 2.5的編碼:
import collections
class Node:
"""Node for the doubly linked list."""
def __init__(self, key, value):
self.key = key
self.value = value
self.prev = None
self.next = None
class LRUCache:
def __init__(self, capacity: int):
if capacity <= 0:
raise ValueError("Capacity must be a positive integer")
self.capacity = capacity
self.cache = {} # Stores key -> Node mapping
# Initialize sentinel nodes for the doubly linked list
self.head = Node(0, 0) # Dummy head
self.tail = Node(0, 0) # Dummy tail
self.head.next = self.tail
self.tail.prev = self.head
def _remove_node(self, node: Node):
"""Removes an existing node from the linked list."""
prev_node = node.prev
next_node = node.next
prev_node.next = next_node
next_node.prev = prev_node
# Optional: clear node pointers for garbage collection if needed
# node.prev = None
# node.next = None
def _add_to_front(self, node: Node):
"""Adds a node right after the head (most recently used)."""
node.prev = self.head
node.next = self.head.next
self.head.next.prev = node
self.head.next = node
def get(self, key: int) -> int:
"""
Return the value of the key if it exists, otherwise return -1.
Moves the accessed node to the front (most recently used).
"""
if key in self.cache:
node = self.cache[key]
# Move accessed node to the front
self._remove_node(node)
self._add_to_front(node)
return node.value
else:
return -1
def put(self, key: int, value: int) -> None:
"""
Update the value of the key if it exists, or insert the key-value pair.
Moves the updated/inserted node to the front.
Evicts the least recently used item if capacity is exceeded.
"""
if key in self.cache:
# Key exists, update value and move to front
node = self.cache[key]
node.value = value
self._remove_node(node)
self._add_to_front(node)
else:
# Key doesn't exist, insert new node
new_node = Node(key, value)
self.cache[key] = new_node
self._add_to_front(new_node)
# Check if capacity is exceeded
if len(self.cache) > self.capacity:
# Evict the least recently used item (node before tail)
lru_node = self.tail.prev
self._remove_node(lru_node)
# Remove from cache as well
del self.cache[lru_node.key]
# Example Usage:
try:
cache = LRUCache(2)
cache.put(1, 1) # cache is {1=1}
print(f"Cache after put(1, 1): {[(k, v.value) for k, v in cache.cache.items()]}")
cache.put(2, 2) # cache is {1=1, 2=2}
print(f"Cache after put(2, 2): {[(k, v.value) for k, v in cache.cache.items()]}")
print(f"get(1): {cache.get(1)}") # returns 1, cache is {2=2, 1=1} (1 is now MRU)
print(f"Cache after get(1): {[(k, v.value) for k, v in cache.cache.items()]}") # Order in dict might not reflect LRU order
cache.put(3, 3) # LRU key 2 was evicted, cache is {1=1, 3=3}
print(f"Cache after put(3, 3): {[(k, v.value) for k, v in cache.cache.items()]}")
print(f"get(2): {cache.get(2)}") # returns -1 (not found)
cache.put(4, 4) # LRU key 1 was evicted, cache is {3=3, 4=4}
print(f"Cache after put(4, 4): {[(k, v.value) for k, v in cache.cache.items()]}")
print(f"get(1): {cache.get(1)}") # returns -1 (not found)
print(f"get(3): {cache.get(3)}") # returns 3
print(f"Cache after get(3): {[(k, v.value) for k, v in cache.cache.items()]}")
print(f"get(4): {cache.get(4)}") # returns 4
print(f"Cache after get(4): {[(k, v.value) for k, v in cache.cache.items()]}")
except ValueError as e:
print(f"Error: {e}")
(4)輸出比較
評判標準 | o3 | o4-mini | Gemini 2.5 |
可讀性 | 優秀的結構與注釋 | 非常簡潔,但可讀性較差 | 清晰易懂,附帶有用的注釋 |
設計與模塊化 | 模塊化設計出色,使用私有方法 | 極簡設計,缺乏模塊化安全性 | 模塊化設計,包含輔助方法和檢查 |
性能 | 結合 __slots__ 和哨兵值實現最優方案 | 最優且內存高效 | 最優方案,提供可選的GC建議 |
安全性和穩健性 | 驗證機制強大,錯誤處理清晰 | 缺少輸入檢查(例如:容量≤0的情況) | 包含驗證和安全防護機制 |
(5)最終結論
o3在可讀性、安全性、設計和性能方面提供了最佳平衡,使其最適合用于生產和長期使用。
任務4:創建網頁
輸入提示:設計一個響應的個人投資組合網頁使用HTML和CSS。該頁面應包括以下部分:
- 頁眉:顯示用戶名和簡短的標題。
- 關于:簡短描述用戶背景和技能的段落。
- 項目:展示至少三個帶有標題、描述和鏈接的項目。
- 聯系人:提供聯系方式或聯系表。
確保設計干凈,便于移動設備使用。使用語義HTML元素并包含基本的CSS樣式來增強視覺吸引力。避免使用外部CSS框架;為樣式編寫自定義CSS。
實現網頁在一個單一的HTML文件與嵌入CSS。
(Design a responsive personal portfolio webpage using HTML and CSS. The page should include the following sections:
1. Header: Display the user’s name and a brief tagline.
2. About Me: A short paragraph describing the user’s background and skills.
3. Projects: Showcase at least three projects with titles, descriptions, and links.
4. Contact: Provide contact information or a contact form.
Ensure the design is clean and mobile-friendly. Use semantic HTML elements and include basic CSS styling to enhance the visual appeal. Avoid using external CSS frameworks; write custom CSS for styling.
Implement the webpage in a single HTML file with embedded CSS.)
(1)o3的輸出:
(2)o4-mini的輸出:
(3)Gemini 2.5的輸出:
(4)輸出比較
特性 | o3 | o4-mini | Gemini 2.5 |
設計美學 | 現代,彩色漸變標題和一致的主題顏色 | 簡潔明了,帶有基本邊框和方框陰影 | 簡潔的布局和極簡主義的設計。利用容器寬度和填充來提高響應速度 |
代碼結構與語義 | 出色地使用語義HTML和注釋;一致的邊界元風格類命名 | 簡潔的語義HTML,但模塊化或注釋較少 | 結構良好,HTML、CSS和JS清晰分離。專注于語義HTML,正確使用<header>、<section>和<footer>等元素 |
響應性(適配性) | 通過clamp()、自動調整網格和媒體查詢實現高度響應 | 通過靈活包裝和簡單的媒體查詢實現基本響應 | 響應良好,可動態調整各種屏幕尺寸,確保跨設備的適當用戶體驗 |
包含的功能 | 完整功能集:頁眉、關于、項目網格、聯系人(表單和信息)、干凈的頁腳 | 類似的部分,但在布局、交互性和造型技巧方面缺乏潤色 | 類似的部分,但在布局、交互性和造型技巧方面缺乏潤色 |
(5)最終結論
它具有更精致的用戶界面(UI),改進的響應性,現代CSS技術(如變量和clamp)以及專業的整體呈現。它可以用于生產,并展示了對CSS的更深入的掌握。
任務5:圖像分析
輸入圖像:
輸入提示:采用簡單的單詞解釋圖像,大約60個單詞
(1)o3的輸出:
(2)o4-mini的輸出:
(3)Gemini 2.5的輸出:
(4)輸出比較
評判標準 | o3的輸出 | o4-mini的輸出 | Gemini 2.5的輸出 |
清晰度 | 清晰、簡單、易于理解。 | 稍微詳細一點,仍然清晰。 | 簡單,容易理解。 |
解釋深度 | 平衡的解釋和必要的細節。 | 關于色彩如何漸變的更多細節 | 對這個概念的非常基本的解釋 |
語氣/風格 | 中立、科學,但易于理解 | 有點像對話,但還是很正式 | 非常有教育意義,旨在快速理解 |
長度 | 緊湊,簡潔,涵蓋所有要點 | 更長,提供了更多的深度 | 非常簡明扼要 |
(5)最終結論
o3模型在清晰度、完整性和簡潔性之間取得了最佳平衡,使其成為普通受眾的理想選擇。它清晰解釋了彩虹的形成過程,既未讓讀者被過多細節淹沒,又涵蓋了折射、內部反射以及多個水滴如何共同作用形成彩虹等關鍵內容。其簡潔的風格易于理解和吸收,是解釋彩虹現象的最有效選擇。
總體評價
o3模型在所有維度上都是整體表現最好的。它在科學準確性和易于理解之間取得了完美的平衡。雖然Gemini 2.5適合非常基礎的理解,而o4-mini適合更多的技術讀者,但o3最適合普通受眾和教育目的,提供完整而引人入勝的解釋,而不會過于技術化或過于簡單化。
基準比較
為了更好地了解尖端人工智能模型的性能,可以在一系列標準化基準測試中比較Gemini 2.5 Pro、o4 mini和o3。這些基準測試評估了各種能力的模型,其范圍從高等數學和物理到軟件工程和復雜推理。
關鍵要點
- 數學推理:o4-mini在AIME 2024(93.4%)和AIME 2025(92.7%)中領先,略優于o3和Gemini 2.5 Pro。
- 物理知識:Gemin i2.5 Pro在GPQA中得分最高(84%),表明其在研究生級別的物理方面具有很強的領域專業知識。
- 復雜推理挑戰:所有模型在“人類終極考試”中表現不佳(<21%),其中o3以20.3%的成績領先。
- 軟件工程:o3在SWE-Bench中取得69.1%的成績,略高于o4-mini(68.1%)和Gemini 2.5 Pro(63.8%)。
- 多模態任務:o3在MMMU中以82.9%的成績領先,盡管差距微小。
解釋與啟示
這些結果突出了各個模型的優勢:o4-mini在結構化數學基準方面表現出色,Gemini 2.5 Pro在專業物理方面表現出色,而o3在編碼和多模態理解方面表現出平衡的能力。所有模型在“人類終極考試”中的低分表明,抽象推理任務仍有改進空間。
結論
最終,o3、o4-mini和Gemini 2.5 Pro這三種模型都代表了人工智能推理的最前沿,每種模型都有不同的優勢。o3因其在軟件工程、深度分析任務和多模態理解方面的平衡能力而脫穎而出,這要歸功于其圖像驅動的思維鏈和跨基準測試的強大性能。o4-mini憑借其優化的設計和較低的延遲,在結構化數學和邏輯挑戰方面表現出色,使其成為高吞吐量編碼和定量分析的理想選擇。
Gemini 2.5 Pro的大型上下文窗口和對文本、圖像、音頻和視頻的原生支持使其在研究生級別的物理和大規模多模態工作流程中具有明顯的優勢。在它們之間進行選擇取決于用戶的特定需求(例如,o3的分析深度、o4-mini的快速數學精度或Gemini 2.5 Pro的大規模多模態推理),但在每種情況下,這些模型都在重新定義人工智能可以完成的任務。
常見問題解答
O模型(o3, o4-mini)和Gemini 2.5的主要區別是什么?
Gemini 2.5 pro支持多達200萬個令牌的上下文窗口,明顯大于O模型。
哪個模型更適合編碼任務:O模型還是Gemini 2.5?
在高級編碼和軟件工程任務中,o3和o 4-mini的表現普遍優于Gemini 2.5。然而,Gemini 2.5更適合需要大型上下文窗口或多模式輸入的編碼項目。
這些模型在定價方面如何比較?
Gemini 2.5 Pro在輸入和輸出令牌方面的成本效益大約是o3的4.4倍。這使得Gemini 2.5成為大規模或預算緊張的應用程序的強有力的選擇。
這些模型的上下文窗口大小是多少?
- Gemini 2.5 Pro:最多200萬個令牌。
- o3和o4-mini:通常支持多達20萬個令牌。
- Gemini龐大的上下文窗口使其能夠一次性處理更大的文檔或數據集。
所有這些模型都支持多模態嗎?
支持,但關鍵的區別是:o3和o4-mini包括視覺功能(圖像輸入)。
Gemini 2.5 Pro本身是多模式的,可以處理文本、圖像、音頻和視頻,更適合跨模態任務。
原文標題:o3 vs o4-mini vs Gemini 2.5 pro: The Ultimate Reasoning Battle,作者:Soumil Jain