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多平台发布


柏企科技圈
1 声望0 粉丝

时间差不多了,快上车!~