当前位置: 首页 > news >正文

o3-mini、Gemini 2 Flash、Sonnet 3.5 与 DeepSeek 在 Cursor 上的对决

最新的 OpenAI 模型 o3-mini 已于 1 月 31 日(星期五)发布,并已在 Cursor 上架。不久后,Gemini 2 Flash 也会陆续登场。

上周,对 DeepSeek V3、DeepSeek R1 以及 Claude 3.5 Sonnet 做过类似测试。那次测试结果显示,在日常开发中,Claude 3.5 Sonnet 的表现明显优于两个 DeepSeek 版本。不过,新模型上线后,自然得重新用相同任务对它们进行比较,同时为了好玩,也把两个 DeepSeek 模型的数据保留下来。


测试任务简介

此次测试主要涵盖三种模式:聊天(Chat)代码生成(Composer) 以及 代理模式(Agent Mode)。需要注意的是,目前代理模式仅支持 Anthropic 和 OpenAI 系列模型,其他模型暂不支持这一功能。


聊天任务

任务要求:
检查 CircleCI 部署配置,并说明在部署过程中如何将静态 NextJS 资源推送至 Cloudflare。提供的提示内容如下:

“解释在部署过程中如何将静态 NextJS 资源上传到 Cloudflare。”
(同时我还附上了 CircleCI 配置文件作为参考背景)

期望的回答应该包括:

  • 正确描述在部署中将静态资源送往 Cloudflare 的步骤;

  • 针对 NextJS 配置提出建议,说明如何使用 Cloudflare 作为 CDN。

o3-mini 的回答
它主要描述了如何配置 Cloudflare Pages,并利用 wrangler CLI 来部署静态资源。不过,实际上 Cloudflare Pages 并非最佳的 CDN 解决方案。它还提到了更新站点 DNS 或设置反向代理,但细节略显简略,而且没有指出 NextJS 配置中需要更新的部分。

Claude 3.5 Sonnet 的回答
Sonnet 给出的方案包括安装 AWS CLI 的步骤,并建议在 NextJS 配置中按如下方式修改:

const nextConfig = {output: 'standalone',assetPrefix: process.env.PUBLIC_ASSETS_BASE_URL,// 其它配置项……
}

同时,它推荐使用 Cloudflare R2,而没有提及 Cloudflare Pages。

Gemini 2 Flash 的回答
Gemini 同样建议选用 Cloudflare R2,并指出可能需要更新 assetPrefix,不过没有深入细说。它给出的 NextJS 配置示例如下:

const nextConfig = {// 其它配置……images: {domains: ['your-site-static-assets-production.r2.dev', 'your-site-static-assets-qa.r2.dev'],},
};

DeepSeek V3 的回答
DeepSeek V3 除了建议使用 Cloudflare R2,并清楚描述了如何更新 assetPrefix 外,还建议通过编写 TypeScript 辅助文件,再在 CircleCI 中通过 package.json 脚本执行上传操作。虽然这种做法并非错误,但相比直接使用 CLI 显得有些繁琐。

DeepSeek R1 的回答
R1 的方案与 Sonnet 几乎一模一样,仅在细节上有微小差别。


Composer 代码生成任务

在这部分,我提供了一段处理招聘网站相关功能的服务端代码,该代码用于获取雇主的招聘信息。任务要求是在原有的 getEmployers 服务端操作中增加分页和搜索功能,要求:

  • 能够对雇主名称进行模糊搜索;

  • 接受页码和条数限制;

  • 返回包含总记录数及是否有更多记录的元数据。

现有的代码如下:

export const getEmployers = actionClient.action(async () => {const profile = await getActiveProfileOrThrowError();if (profile.type !== "jobBoard") {throw new Error("Unauthorized");}const applications = await db.query.employerJobBoardApplications.findMany({where: eq(employerJobBoardApplications.jobBoardId, profile.id),with: {employer: true,},});return applications;
});

预期输出应满足以下几点:

  • 识别出已有代码使用了 zod schema,因此新增部分也应跟进这一规范;

  • 高效地计算分页所需的元数据;

  • 对关联表的雇主名称进行正确的模糊查询。

o3-mini 的回答
它虽然花了一些时间,但在使用 zod schema 这一部分做得不错,也意识到模糊搜索应通过 inner join 来实现。不过,它选择用原生 SQL 语句进行模糊搜索,类似如下做法:

if (search) {conditions.push(sql`"employer"."name" ILIKE ${`%${search}%`}`);
}let totalRecords: number;
if (search) {const totalCountRes = await db.select({ count: sql<number>`count(*)` }).from(employerJobBoardApplications).innerJoin(employers,eq(employerJobBoardApplications.employerId, employers.id),).where(and(...conditions));totalRecords = Number(totalCountRes[0]?.count ?? 0);
} else {const totalCountRes = await db.select({ count: sql<number>`count(*)` }).from(employerJobBoardApplications).where(baseCondition);totalRecords = Number(totalCountRes[0]?.count ?? 0);
}

但这种方法在类型安全上不够理想,同时代码复用也有所欠缺。总体来看,效果一般,还需要进一步引导完善。

Claude 3.5 Sonnet 的回答
Sonnet 很好地识别了原代码中的 zod schema,并在新代码中沿用了这一规范。它将搜索与计数的 where 逻辑进行了复用,但在使用 Drizzle ORM 时,inner join 的处理上不够到位。示例代码如下:

const where = [eq(employerJobBoardApplications.jobBoardId, profile.id)];
if (search) {where.push(ilike(employerJobBoardApplications.employer.name, `%${search}%`),);
}
const [applications, totalCount] = await Promise.all([db.query.employerJobBoardApplications.findMany({where: and(...where),with: {employer: true,},limit,offset,}),db.query.employerJobBoardApplications.count({where: and(...where),}),
]);

在我提示要求使用 inner join 后,它也做出了相应调整。

Gemini 2 Flash 的回答
这款模型反应迅速,采用了 zod schema,但和 Sonnet 类似,在 inner join 这一环节处理不当,其代码示例如下:

const [applications, total] = await Promise.all([db.query.employerJobBoardApplications.findMany({where: and(...whereConditions),with: {employer: true,},limit,offset,}),db.select({count: sql<number>`count(*)`.mapWith(Number),}).from(employerJobBoardApplications).where(and(...whereConditions)).limit(1).then((res) => res[0]?.count ?? 0),
]);

DeepSeek V3 的回答
DeepSeek V3 同样正确使用了 zod schema,但在 inner join 方面没有达到预期效果。它还重复书写了搜索和计数的 where 逻辑,没有做到代码共享:

// 获取总记录数
const totalCount = await db.select({ count: sql<number>`count(*)` }).from(employerJobBoardApplications).where(and(eq(employerJobBoardApplications.jobBoardId, profile.id),search? ilike(employerJobBoardApplications.employer.name, `%${search}%`): undefined,),).then((res) => res[0]?.count ?? 0);// 分页查询结果
const applications = await db.query.employerJobBoardApplications.findMany({where: and(eq(employerJobBoardApplications.jobBoardId, profile.id),search? ilike(employerJobBoardApplications.employer.name, `%${search}%`): undefined,),with: {employer: true,},limit,offset,
});

DeepSeek R1 的回答
R1 同样使用了 zod schema,但尽管思考得较多,inner join 的实现还是未能完善,需要进一步提示以优化 where 逻辑的复用。示例代码如下:

// 主查询:分页和搜索
const data = await db.query.employerJobBoardApplications.findMany({where: (apps, { and, eq, or }) =>and(eq(apps.jobBoardId, profile.id),search ? ilike(apps.employer.name, `%${search}%`) : undefined,),with: {employer: true,},offset,limit,
});// 总记录数查询
const [countResult] = await db.select({count: sql<number>`count(*)`,}).from(employerJobBoardApplications).where(and(eq(employerJobBoardApplications.jobBoardId, profile.id),search? ilike(employerJobBoardApplications.employer.name, `%${search}%`): undefined,),);

代理模式任务

在代理模式测试中,我希望模型完成一个更复杂、多步骤的任务:在一个项目模板中增加新用户引导流程。要求如下:

  • 在用户表中添加三个字段:布尔类型的 isOnboardingComplete、字符串类型的 onboardingPersona,以及 JSON 字符串数组 onboardingTopics

  • 当用户登录且未完成引导时,页面上应弹出一个对话框,该对话框内包含相应的表单供用户选择;

  • 表单提交后,通过服务端操作(采用 next-safe-action)更新引导状态。

需要注意的是,用户表定义在 Drizzle ORM 的 schema 文件中,模型需要自动找到并修改相关定义,同时确保引导流程能够正常工作,且 next-safe-action 的使用与项目中其它部分保持一致。

o3-mini 的回答
o3-mini 在这部分的表现较差。首先,它响应较慢,可能是内部“思考”时间过长,而非网络问题。第一次尝试时,输出似乎中途截断,最后一句像是:“接下来我将更新用户表 schema 来禁用针对 JSON 列的 linter 错误……”,显然未完成;第二次尝试时,则发现生成结果仅在部分地方停留在提示状态,例如:“对于对话框,你可以这样实现……”,给出了占位符示例,但任务并未完全实现。
此外,第一次生成的方案中存在一些明显问题:

  • 文件被直接放在 monorepo 根目录,而预期应该在 next-app 目录下;

  • 自动生成了一个 global.d.ts 文件,用以定义 drizzle-orm 等包的类型,但在正确的 monorepo 结构中其实并不需要;

  • 生成的服务端操作未沿用项目中统一的 zod schema;

  • 对话框组件虽然正确调用了 Shadcn UI 组件,但却采用了内联样式,而非项目中普遍使用的 tailwind 类。

整体来看,o3-mini 在处理 monorepo 环境时明显遇到了困难。

Claude 3.5 Sonnet 的回答
Sonnet 对用户表 schema 的修改做得正确,为实现对话框功能,它选择在整个应用外层包裹一个包装组件,其示例代码如下:

export function OnboardingWrapper({ children }: Props) {const { isOpen } = useOnboarding();return (<><OnboardingDialog isOpen={isOpen} />{children}</>);
}

包装组件中用到的 useOnboarding 钩子定义如下:

import { useEffect, useState } from "react";
import { getUser } from "../actions/user";export function useOnboarding() {const [isOpen, setIsOpen] = useState(false);useEffect(() => {const checkOnboarding = async () => {const user = await getUser();if (user && !user.isOnboardingComplete) {setIsOpen(true);}};checkOnboarding();}, []);return { isOpen };
}

不过,这里有个问题:直接在钩子中调用服务端操作是不被允许的(除非该操作是通过 next-safe-action 封装的)。此外,这种实现会导致页面首次加载时延迟显示对话框,等 getUser 请求完成后才出现。好在对话框组件本身表现不错,且 next-safe-action 的用法也正确;它甚至试图使用 Select 组件来适应前端的 Shadcn UI 风格(尽管项目中尚未加入该组件)。生成的服务端操作代码基本无误,但在 next-safe-action 的语法上略有偏差,建议参照项目中已有用法作出调整。

DeepSeek 与 Gemini 2 Flash(代理模式)
目前这两款模型在 Cursor 平台上还不支持代理模式,这部分测试只能留待未来补充。


总结

虽然对 o3-mini 和 Gemini 2 Flash 都充满期待,但在实际开发中的表现并没有超出预期。所有模型在处理这些实际任务时都有各自的不足,连 Claude 3.5 Sonnet 也不例外,实际效果与各类公开的编码基准测试结果存在明显落差。特别是在代理模式测试中,o3-mini 在 monorepo 环境下的表现不佳。由于经常依赖代理模式,并且非常喜欢 monorepo 架构,目前的选择仍会倾向于使用 Claude 3.5 Sonnet。

最后:

React Hook 深入浅出

CSS技巧与案例详解

vue2与vue3技巧合集

VueUse源码解读

相关文章:

o3-mini、Gemini 2 Flash、Sonnet 3.5 与 DeepSeek 在 Cursor 上的对决

最新的 OpenAI 模型 o3-mini 已于 1 月 31 日&#xff08;星期五&#xff09;发布&#xff0c;并已在 Cursor 上架。不久后&#xff0c;Gemini 2 Flash 也会陆续登场。 上周&#xff0c;对 DeepSeek V3、DeepSeek R1 以及 Claude 3.5 Sonnet 做过类似测试。那次测试结果显示&am…...

如何在Vscode中接入Deepseek

一、获取Deepseek APIKEY 首先&#xff0c;登录Deepseek官网的开放平台&#xff1a;DeepSeek 选择API开放平台&#xff0c;然后登录Deepseek后台。 点击左侧菜单栏“API keys”&#xff0c;并创建API key。 需要注意的是&#xff0c;生成API key复制保存到本地&#xff0c;丢失…...

6 maven工具的使用、maven项目中使用日志

文章目录 前言一、maven&#xff1a;一款管理和构建java项目的工具1 基本概念2 maven的安装与配置&#xff08;1&#xff09;maven的安装&#xff08;2&#xff09;IDEA集成Maven配置当前项目工程设置 maven全局设置 &#xff08;3&#xff09;创建一个maven项目 3 pom.xml文件…...

Day82:创建图形界面(GUI)

在 Python 中,我们可以使用 Tkinter(标准 GUI 库)来创建图形用户界面(GUI)。Tkinter 提供了一系列工具和控件,使开发者可以轻松地创建窗口、按钮、输入框等界面组件。 1. Tkinter 简介 Tkinter 是 Python 内置的 GUI 库,使用它可以创建窗口应用程序,而无需安装额外的库…...

字节跳动大模型应用 Go 开发框架 —— Eino 实践

前言 开发基于大模型的软件应用&#xff0c;就像指挥一支足球队&#xff1a;组件是能力各异的队员&#xff0c;编排是灵活多变的战术&#xff0c;数据是流转的足球。Eino 是字节跳动开源的大模型应用开发框架&#xff0c;拥有稳定的内核&#xff0c;灵活的扩展性&#xff0c;完…...

【Golang学习之旅】Go + MySQL 数据库操作详解

文章目录 前言1. GORM简介2. 安装GORM并连接MySQL2.1 安装GORM和MySQL驱动2.2 连接MySQL 3. GORM数据模型&#xff08;Model&#xff09;3.1 定义User结构体3.2 自动迁移&#xff08;AutoMigrate&#xff09; 4. GORM CRUD 操作4.1 插入数据&#xff08;Create&#xff09;4.2 …...

Http 的响应码有哪些? 分别代表的是什么?

HTTP 状态码分为多个类别&#xff0c;下面是常见的 HTTP 状态码及其含义&#xff0c;包括 3xx 重定向状态码的详细区别&#xff1a; &#x1f4cc; HTTP 状态码分类 分类状态码范围说明1xx100-199信息性状态码&#xff0c;表示请求已被接收&#xff0c;继续处理2xx200-299成功…...

深入解析 Linux 系统中 Cron 定时任务的配置与管理

在 Linux 和类 Unix 系统中&#xff0c;cron 是一个非常强大的工具&#xff0c;用于定时执行各种任务&#xff0c;例如自动备份、定时运行脚本和定期清理日志文件。通过合理配置 cron&#xff0c;你可以让很多系统维护任务自动化&#xff0c;从而减轻日常管理的压力。而 cronta…...

关于 IoT DC3 中设备(Device)的理解

在物联网系统中&#xff0c;设备&#xff08;Device&#xff09;是一个非常宽泛的概念&#xff0c;它可以指代任何能够接入系统并进行数据交互的实体。包括但不限于手机、电脑、服务器、网关、硬件设备甚至是某些软件程序等所有能接入到该平台的媒介。 内容 定义 目的 示例 …...

golang 版 E签宝请求签名鉴权方式

E签宝 请求签名鉴权方式说明 package utilsimport ("crypto/hmac""crypto/md5""crypto/sha256""encoding/base64""fmt""github.com/gogf/gf/v2/util/gconv" )type Sign struct {secret string }func NewSign(sec…...

QTreeView和QTableView单元格添加超链接

QTreeView和QTableView单元格添加超链接的方法类似,本文仅以QTreeView为例。 在QTableView仿Excel表头排序和筛选中已经实现了超链接的添加,但是需要借助delegate,这里介绍一种更简单的方式,无需借助delegate。 一.效果 二.实现 QHTreeView.h #ifndef QHTREEVIEW_H #def…...

【WB 深度学习实验管理】使用 PyTorch Lightning 实现高效的图像分类实验跟踪

本文使用到的 Jupyter Notebook 可在GitHub仓库002文件夹找到&#xff0c;别忘了给仓库点个小心心~~~ https://github.com/LFF8888/FF-Studio-Resources 在机器学习项目中&#xff0c;实验跟踪和结果可视化是至关重要的环节。无论是调整超参数、优化模型架构&#xff0c;还是监…...

SSM开发(十一) mybatis关联关系多表查询(嵌套查询,举例说明)

目录 一、背景介绍 二、一对一查询(嵌套查询) 三、一对多查询(嵌套查询) 四、嵌套查询效率评估 注:关联查询则是指在一个查询中涉及到多个表的联合查询 一、背景介绍 当对数据库的操作涉及到多张表,这在面向对象语言如Java中就涉及到了对象与对象之间的关联关系。针对多…...

The Simulation技术浅析(六):机器学习

机器学习(Machine Learning)是模拟技术(The Simulation)的重要组成部分,通过从数据中自动学习规律和模式,机器学习能够提升模拟系统的智能化水平,增强其预测、决策和优化能力。 一、监督学习(Supervised Learning) 1. 基本原理 监督学习是指利用标注数据(即输入数…...

apache-poi导出excel数据

excel导出 自动设置宽度&#xff0c;设置标题框&#xff0c;设置数据边框。 excel导出 添加依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.2</version></dependency>…...

唯一值校验的实现思路(续)

本文接着上一篇文章《唯一值校验的实现思路》&#xff0c;在后端实现唯一值校验。用代码实现。 /*** checkUniqueException[唯一值校验]** param entity 新增或编辑的学生实体* param insert 是否新增&#xff0c;如果是传入true&#xff1b;反之传入false* return void* date…...

ffmpeg基本用法

一、用法 ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... 说明&#xff1a; global options&#xff1a;全局选项&#xff0c;应用于整个 FFmpeg 进程&#xff0c;它们通常不受输入或输出部分的限制。 infile options&#xff1a;输入选…...

MYSQL第四次

目录 题目分析 代码实现 一、修改 Student 表中年龄&#xff08;sage&#xff09;字段属性&#xff0c;数据类型由 int 改变为 smallint 二、为 Course 表中 Cno 字段设置索引&#xff0c;并查看索引 三、为 SC 表建立按学号&#xff08;sno&#xff09;和课程号&#xff…...

联德胜w801开发板(六)手机蓝牙设置wifi名称和密码

一、概述 W801 是一款集成了 Wi-Fi 和蓝牙功能的芯片&#xff0c;本文将介绍如何利用 W801 的蓝牙功能&#xff0c;实现手机 APP 通过蓝牙配置 W801 连接的 Wi-Fi 名称和密码&#xff08;即配网功能&#xff09;。 二、文档查看&#xff1a; demo使用手册这里很清楚&#xf…...

Linux:库

目录 静态库 动态库 目标文件 ELF文件 ELF形成可执行 ELF可执行加载 ELF加载 全局偏移量表GOT(global offset table) 库是写好的&#xff0c;成熟的&#xff0c;可以复用的代码 现实中每个程序都要依赖很多的基础的底层库&#xff0c;不可能都是从零开始的 库有两种…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...