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 日(星期五)发布,并已在 Cursor 上架。不久后,Gemini 2 Flash 也会陆续登场。 上周,对 DeepSeek V3、DeepSeek R1 以及 Claude 3.5 Sonnet 做过类似测试。那次测试结果显示&am…...

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

6 maven工具的使用、maven项目中使用日志
文章目录 前言一、maven:一款管理和构建java项目的工具1 基本概念2 maven的安装与配置(1)maven的安装(2)IDEA集成Maven配置当前项目工程设置 maven全局设置 (3)创建一个maven项目 3 pom.xml文件…...
Day82:创建图形界面(GUI)
在 Python 中,我们可以使用 Tkinter(标准 GUI 库)来创建图形用户界面(GUI)。Tkinter 提供了一系列工具和控件,使开发者可以轻松地创建窗口、按钮、输入框等界面组件。 1. Tkinter 简介 Tkinter 是 Python 内置的 GUI 库,使用它可以创建窗口应用程序,而无需安装额外的库…...

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

【Golang学习之旅】Go + MySQL 数据库操作详解
文章目录 前言1. GORM简介2. 安装GORM并连接MySQL2.1 安装GORM和MySQL驱动2.2 连接MySQL 3. GORM数据模型(Model)3.1 定义User结构体3.2 自动迁移(AutoMigrate) 4. GORM CRUD 操作4.1 插入数据(Create)4.2 …...
Http 的响应码有哪些? 分别代表的是什么?
HTTP 状态码分为多个类别,下面是常见的 HTTP 状态码及其含义,包括 3xx 重定向状态码的详细区别: 📌 HTTP 状态码分类 分类状态码范围说明1xx100-199信息性状态码,表示请求已被接收,继续处理2xx200-299成功…...
深入解析 Linux 系统中 Cron 定时任务的配置与管理
在 Linux 和类 Unix 系统中,cron 是一个非常强大的工具,用于定时执行各种任务,例如自动备份、定时运行脚本和定期清理日志文件。通过合理配置 cron,你可以让很多系统维护任务自动化,从而减轻日常管理的压力。而 cronta…...

关于 IoT DC3 中设备(Device)的理解
在物联网系统中,设备(Device)是一个非常宽泛的概念,它可以指代任何能够接入系统并进行数据交互的实体。包括但不限于手机、电脑、服务器、网关、硬件设备甚至是某些软件程序等所有能接入到该平台的媒介。 内容 定义 目的 示例 …...
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文件夹找到,别忘了给仓库点个小心心~~~ https://github.com/LFF8888/FF-Studio-Resources 在机器学习项目中,实验跟踪和结果可视化是至关重要的环节。无论是调整超参数、优化模型架构,还是监…...
SSM开发(十一) mybatis关联关系多表查询(嵌套查询,举例说明)
目录 一、背景介绍 二、一对一查询(嵌套查询) 三、一对多查询(嵌套查询) 四、嵌套查询效率评估 注:关联查询则是指在一个查询中涉及到多个表的联合查询 一、背景介绍 当对数据库的操作涉及到多张表,这在面向对象语言如Java中就涉及到了对象与对象之间的关联关系。针对多…...
The Simulation技术浅析(六):机器学习
机器学习(Machine Learning)是模拟技术(The Simulation)的重要组成部分,通过从数据中自动学习规律和模式,机器学习能够提升模拟系统的智能化水平,增强其预测、决策和优化能力。 一、监督学习(Supervised Learning) 1. 基本原理 监督学习是指利用标注数据(即输入数…...

apache-poi导出excel数据
excel导出 自动设置宽度,设置标题框,设置数据边框。 excel导出 添加依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.2</version></dependency>…...
唯一值校验的实现思路(续)
本文接着上一篇文章《唯一值校验的实现思路》,在后端实现唯一值校验。用代码实现。 /*** checkUniqueException[唯一值校验]** param entity 新增或编辑的学生实体* param insert 是否新增,如果是传入true;反之传入false* return void* date…...
ffmpeg基本用法
一、用法 ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... 说明: global options:全局选项,应用于整个 FFmpeg 进程,它们通常不受输入或输出部分的限制。 infile options:输入选…...

MYSQL第四次
目录 题目分析 代码实现 一、修改 Student 表中年龄(sage)字段属性,数据类型由 int 改变为 smallint 二、为 Course 表中 Cno 字段设置索引,并查看索引 三、为 SC 表建立按学号(sno)和课程号ÿ…...

联德胜w801开发板(六)手机蓝牙设置wifi名称和密码
一、概述 W801 是一款集成了 Wi-Fi 和蓝牙功能的芯片,本文将介绍如何利用 W801 的蓝牙功能,实现手机 APP 通过蓝牙配置 W801 连接的 Wi-Fi 名称和密码(即配网功能)。 二、文档查看: demo使用手册这里很清楚…...

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

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...

实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...