Deepseek-r1、o3-Mini和Qwen 2.5 MAX,谁才是你的菜?
OpenAI急于捍卫市场地位,于周五推出O3 Mini,这明显是在回应DeepSeek的R1模型。这下它终于坐不住了,发布了新推理模型系列o3-mini。这个模型不仅首次向免费用户开放,成本还比之前的o1系列降低了15倍。
和GPT-4O、GPT模型家族不同,AI模型的“O”系列专注于推理任务。虽说它创造力稍弱,但内置了思维推理链,在解决复杂问题、追溯错误分析和构建优质代码方面更胜一筹。
阿里巴巴也没闲着,发布了新版本的Qwen 2.5人工智能模型。与此同时,Qwen还在开发超大型MoE模型Qwen2.5-Max,这个模型用超过20万亿个代币的预训练数据,结合精心设计的后处理训练方法进行训练。相较于上一代,Qwen 2.5在计算能力、处理速度和多功能性上都有显著提升,在商业和研究领域的应用前景十分广阔。
不过,有传言说Qwen2.5-Max和o3-Mini会超越DeepSeek-R1。接下来,我们就通过剖析它们的功能和机制,挖掘o3-Mini和Qwen2.5-Max的真正价值与未来潜力,并和竞品模型做一番比较。
什么是o3-Mini?
o3-mini是OpenAI首个支持开发人员所需函数的小型推理模型。它继承了o1-mini低成本、低延迟的优点,还支持函数调用、流式处理和结构化输出等功能。开发者能根据需求选择推理强度,平衡思考深度和响应速度。但它不支持视觉任务,要是涉及视觉推理,还得用o1。
o3-Mini有什么特点?
- 推理能力出色:和前身o1-mini相比,o3-Mini给出的答案更精准、更清晰,推理能力更强,能让人深入理解问题,进行逻辑思考,这在解决复杂问题时至关重要。
- 响应速度快:它的响应时间比o1-mini快24%,平均只需7.7秒。就算在对实时响应要求高的场景下,用起来也毫无压力。
- 聚焦STEM领域:在科学、数学、编码和各类工程专业方面表现亮眼。
- 面向开发者的功能:配备了函数调用、结构化输出和开发者消息等实用功能,作为工程工具,可用性大大增强。
- 推理选项灵活:提供低、中、高三种推理工作量选项,大家可以按需选择最佳性能。
- 性价比高:在保持o1-mini低成本、低延迟优势的同时,还增添了更高级的功能,性价比超高,各类用户都能轻松使用。
o1 pro和o3-mini呢?
顺便说一句,它和O1 Pro的性能有什么区别?当然,这只是一个使用问题,所以不能做严格的比较。但是O1 Pro一开始很慢。无论你在写什么代码,即使你为每个函数给出详细的说明,通常也需要3分钟左右。它需要大量的代码编写,所以在O1 Pro上不是很实用。这就是为什么o3-mini是目前为止最容易使用的。如果出现o3-mini-high会报错的情况,我本想试试O1 Pro,但到目前为止我还没有遇到任何错误,所以无法进行比较。
什么是Qwen2.5-Max?
Qwen 2.5 Max是该系列中高性能的代表,凭借超越DeepSeek V3的基准分数吸引了众多目光。它的推理速度、处理各类任务的能力都很出色,和外部服务、插件的集成度也更高。Qwen 2.5 Max不仅具备语言理解能力,还融合了图像和视频生成功能。这让它既能处理基于文本的对话,也能应对多模态输入,应用场景十分丰富。
Qwen2.5-Max有什么特点?
那么,Qwen2.5-Max到底有哪些过人之处呢?下面为你详细介绍。
- 混合专家(MoE)架构:和常见的基于Transformer的语言模型不同,这种架构融合了多个“专家”子模型,针对特定任务优化起来更轻松,处理效率和准确性都得到了提升。
- 大规模预训练:在超过20万亿个代币上进行预训练,使得它对各种领域的语言理解和生成能力都很强。它广泛学习新闻文章、学术论文、社交媒体帖子等各类文本数据,因此在处理多领域问题时优势明显。
- 先进的微调(SFT和RLHF):通过结合监督微调(SFT)和基于人类反馈的强化学习(RLHF),构建了一套能更精准、自然生成用户期望回复的机制。这让模型不再只是机械重现训练数据,而是能根据用户的“偏好”和“意图”给出针对性回复。
- 高扩展性:借助阿里云的Model Studio服务,可通过API访问Qwen 2.5 Max。它还支持兼容OpenAI的API,和现有开发环境及工具的兼容性极佳,便于快速实施和拓展。
DeepSeek-R1、o3-Mini、Qwen2.5-Max大对决
我们从以下几个方面来验证:
编码能力
编写一个p5.js脚本,模拟100个彩色小球在球体内反弹。每个小球要留下渐淡的轨迹,展示其运动路径。球形容器要缓慢旋转,并且要做好碰撞检测,确保小球一直在球体内。
DeepSeek-R1
let balls = [];
let numBalls = 100;
let sphereRadius = 300;
let rotationAngle = 0;
function setup() {
createCanvas(800, 800, WEBGL);
for (let i = 0; i < numBalls; i++) {
balls.push(new Ball());
}
noStroke();
}
function draw() {
background(0);
rotateX(rotationAngle);
rotateY(rotationAngle * 0.5);
push();
fill(0, 0, 0, 0);
stroke(255);
sphere(sphereRadius);
pop();
for (let ball of balls) {
ball.update();
ball.display();
}
rotationAngle += 0.005;
}
class Ball {
constructor() {
this.pos = p5.Vector.random3D().mult(sphereRadius * 0.8);
this.vel = p5.Vector.random3D().mult(2);
this.color = color(random(255), random(255), random(255), 200);
this.trail = [];
this.trailLength = 20;
}
update() {
this.pos.add(this.vel);
let distance = this.pos.mag();
if (distance > sphereRadius) {
let normal = this.pos.copy().normalize();
this.vel = p5.Vector.reflect(this.vel, normal);
this.pos = normal.mult(sphereRadius * 0.99);
}
this.trail.push(this.pos.copy());
if (this.trail.length > this.trailLength) {
this.trail.shift();
}
}
display() {
for (let i = 0; i < this.trail.length; i++) {
let alpha = map(i, 0, this.trail.length, 50, 255);
fill(this.color.levels[0], this.color.levels[1], this.color.levels[2], alpha);
noStroke();
push();
translate(this.trail[i].x, this.trail[i].y, this.trail[i].z);
sphere(5);
pop();
}
fill(this.color);
noStroke();
push();
translate(this.pos.x, this.pos.y, this.pos.z);
sphere(10);
pop();
}
}
o3-Mini
let balls = [];
const numBalls = 100;
let containerRadius;
const ballRadius = 5;
const maxTrailLength = 30;
function setup() {
createCanvas(windowWidth, windowHeight, WEBGL);
containerRadius = min(width, height) * 0.4;
for (let i = 0; i < numBalls; i++) {
let pos = randomPointInSphere(containerRadius - ballRadius);
let vel = p5.Vector.random3D().mult(random(1, 3));
let col = color(random(255), random(255), random(255));
balls.push(new Ball(pos, vel, col));
}
strokeWeight(2);
}
function draw() {
background(0, 20);
rotateY(frameCount * 0.005);
rotateX(frameCount * 0.003);
for (let ball of balls) {
ball.update();
ball.display();
}
noFill();
stroke(255, 50);
sphere(containerRadius);
}
function randomPointInSphere(maxRadius) {
let v = p5.Vector.random3D();
v.mult(random(0, maxRadius));
return v;
}
class Ball {
constructor(pos, vel, col) {
this.pos = pos;
this.vel = vel;
this.col = col;
this.trail = [];
}
update() {
this.pos.add(this.vel);
let d = this.pos.mag();
if (d + ballRadius > containerRadius) {
let normal = this.pos.copy().normalize();
let dot = this.vel.dot(normal);
this.vel.sub(p5.Vector.mult(normal, 2 * dot));
this.pos = normal.mult(containerRadius - ballRadius);
}
this.trail.push(this.pos.copy());
if (this.trail.length > maxTrailLength) {
this.trail.shift();
}
}
display() {
noFill();
beginShape();
for (let i = 0; i < this.trail.length; i++) {
let pos = this.trail[i];
let alpha = map(i, 0, this.trail.length - 1, 50, 255);
stroke(red(this.col), green(this.col), blue(this.col), alpha);
vertex(pos.x, pos.y, pos.z);
}
endShape();
push();
translate(this.pos.x, this.pos.y, this.pos.z);
noStroke();
fill(this.col);
sphere(ballRadius);
pop();
}
}
Qwen2.5-Max
let balls = [];
let numBalls = 100;
let sphereRadius = 200;
let angleX = 0;
let angleY = 0;
function setup() {
createCanvas(600, 600, WEBGL);
colorMode(HSB, 360, 100, 100, 100);
for (let i = 0; i < numBalls; i++) {
balls.push(new Ball());
}
}
function draw() {
background(0);
rotateX(angleX);
rotateY(angleY);
angleX += 0.005;
angleY += 0.01;
noFill();
stroke(255, 50);
sphere(sphereRadius * 2);
for (let ball of balls) {
ball.update();
ball.display();
ball.checkCollision();
}
}
class Ball {
constructor() {
this.position = createVector(
random(-sphereRadius, sphereRadius),
random(-sphereRadius, sphereRadius),
random(-sphereRadius, sphereRadius)
);
this.velocity = p5.Vector.random3D().mult(random(1, 3));
this.color = color(random(360), 80, 100, 100);
this.history = [];
this.maxHistory = 20;
}
update() {
this.position.add(this.velocity);
this.history.push(this.position.copy());
if (this.history.length > this.maxHistory) {
this.history.shift();
}
}
display() {
noFill();
stroke(this.color);
beginShape();
for (let i = 0; i < this.history.length; i++) {
let pos = this.history[i];
vertex(pos.x, pos.y, pos.z);
}
endShape();
noStroke();
fill(this.color);
push();
translate(this.position.x, this.position.y, this.position.z);
sphere(5);
pop();
}
checkCollision() {
if (this.position.mag() > sphereRadius) {
this.velocity.reflect(this.position.normalize());
}
}
}
这些代码都有问题。比如,DeepSeek-R1在处理100个小球时就出了岔子,看动图就会发现,它让球跑到了圆外面。O3-Mini倒是生成了100个小球,但由于背景是灰色的,圆看起来不太清晰。Qwen2.5-Max在生成圆和100个小球方面表现不错,可小球的尺寸有问题,比预期的要大。总之,这些模型都离不开人工干预,仅靠一次提示,它们还生成不了正确代码。
数学能力
对数字1757051进行因式分解,并解释为什么它是考验人类的好例子。
Deepseek-r1和o3-mini给出了正确答案,但o3-mini在推理方面略逊于Deepseek-r1。即便回答正确,o3-mini也会遗漏一些公式和关键细节。Qwen2.5-Max连正确答案都没生成。就我个人而言,如果遇到复杂的数学问题,我更倾向于用Deepseek-r1。
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。