同一个生活工作台,HY3(混元3)做了三遍还在报错,最后连一个能双击打开的成品都没交付;切到 DS4(DeepSeek 4)后,一次把三个真 bug 全定位出来,逐个修掉,再用「真实双击」的方式把每项修复都验证通过。
差在哪?不是谁更会写代码,而是两件事:推理是不是在绕路,编码是不是够精准,验证是不是够科学。
这篇文章不聊参数表,就把这一单从头到尾摊开讲:报错到底分几层、HY3 卡在哪个假想上、DS4 的推理和编码各自做了什么、我事后总结的五条调试心法。
一、先还原现场——一个「一键做同款」,怎么变成了排障现场
任务本身不复杂。我想用 WorkBuddy 的资料库能力「一键做同款」,把参考页那个「日常集 · 生活工作台」复刻成一个集成式的本地工作台,包含七个模块:
| 模块 | 要解决的事 |
|---|---|
| 今日概览 | 今天要处理什么,逾期项一眼看到 |
| 记账理财 | 收支、预算、月度对比、分类筛选、消费结构 |
| 习惯健康 | 可增删习惯,勾选/计数/数值三种打卡,30 天热力图 |
| 减脂健身 | 体重体脂、7 日均线、BMI、目标进度、周计划 |
| 日程统筹 | 待办、日期分组、完成切换 |
| 待买清单 | 想买/已买,状态流转 |
| 书影音收藏 | 状态、星级、短评、封面墙/列表双视图、年度统计 |
中途需求收窄过一次——用户拍板「我要的就是本地版本」,于是目标变成:一个单文件 HTML、双击即开、数据存本机浏览器、零外部依赖。
问题就出在这里。第一轮用 HY3 跑,我从头到尾没拿到一个能正常双击打开的成品,看到的是一连串报错。
二、HY3 卡在哪——把「报错」和「环境」混为一谈,原地打转
复盘这一单,HY3 身上暴露的问题,不是「不会写」,而是两个更隐蔽的毛病。
毛病一:报错没分层,一看报错就慌。
当时实际出现的报错分了两类,性质完全不同:
| 层级 | 具体表现 | 真实原因 | 该怎么处理 |
|---|---|---|---|
| 服务侧 | 429 使用量超频率限制、400 请求被拒 | 模型提供商限流/拒绝,是临时故障 | 换模型或稍后重试,与代码无关 |
| 代码侧 | 双击白屏、筛选无效、显示英文 key | 代码里有真实 bug | 需要定位 + 修复 |
HY3 把这两层搅在一起了。撞上 429、400 就当成「任务做不下去了」,反复重试、反复卡住;而代码侧那三个真 bug,它从头到尾没当成问题去查,一直在服务侧的报错上打转。
毛病二:目标不稳,在线版和本地版之间反复横跳。
任务先是要「数据在线双向同步」,后来又改成「本地版本」。这个需求变化本身没问题,但 HY3 没有据此重新收敛目标,而是两头都抓:一会儿去建资料库数据表,一会儿又改回 localStorage,来回折腾,每一步都没走完,自然交不出东西。
说实话,这里我也有责任——需求中途转向,我没把「现在只做本地版」这个决定钉死。但 HY3 的表现,是把「环境/服务」当成了主要矛盾,而真正的矛盾——代码里那三个 bug——一直被晾在一边。
三、DS4 怎么破——推理先定位,编码再精准改
切到 DS4,同样的现场,它走的是完全不同的路线。我把它的动作拆成「推理」和「编码」两段看,因为这两段恰好是它和 HY3 拉开差距的地方。
推理模式:不猜,先分层定位
DS4 没有一上来就改代码,而是先做了一件 HY3 没做的事——先把「到底哪坏了」查清楚,再动手。它的排查是一条清晰的漏斗:
第一步,做静态语法检查。把 HTML 里那 9.5 万字符的内联脚本抽出来,单独跑一遍语法检查:
node--check/tmp/_inline.js结果是语法通过。这一步排除了「代码根本跑不起来」这种低级故障,把范围缩小到「运行期逻辑 bug」。
第二步,做真实场景冒烟。关键在这里——它没有用 WorkBuddy 的预览面板测,而是用file://协议直接打开这个 HTML 文件,模拟用户「双击」的真实场景,同时把运行期的报错全部拦下来:
page.on('pageerror',e=>errors.push(e.message));page.on('console',m=>{if(m.type()==='error')errors.push(m.text());});awaitpage.goto('file:///.../index.html',{waitUntil:'load'});这一步价值很大。预览 iframe 里往往注入了资料库 SDK,会把某些 bug 掩盖掉;而file://双击是零注入的,能暴露出「没有 SDK 时页面到底能不能跑」这个真实问题。
第三步,用 DOM 探针定位具体 bug。冒烟测试跑完后,不再凭感觉,而是直接查 DOM 里的具体元素,把每个可疑点都变成「有/没有」的硬结论。
三步走完,三个真 bug 全浮出来了。下面是它们各自的样子。
编码模式:行级精准修改,不用大锤
定位之后,DS4 的改法也很克制——用行级替换,一处一处改,而不是把整个文件重写一遍。这种「小切口」的改法,最大好处是不会顺带改坏别的东西。这一单里最典型的是时光档案那一处,后面单独讲。
两个模型面对同一个现场,行为差异可以浓缩成一张表:
| 维度 | HY3(混元3) | DS4(DeepSeek 4) |
|---|---|---|
| 面对报错 | 服务侧、代码侧混为一谈,反复重试 | 先分层,排除服务侧故障再查代码 |
| 排查顺序 | 默认「代码没问题」,去搞环境、搞部署 | 先语法检查,再真实冒烟,再 DOM 探针 |
| 目标执行 | 在线版本地版来回横跳 | 锁定本地版,一条路走到交付 |
| 修复方式 | 反复重写,容易带出新问题 | 行级精准替换,改动锁在最小单元 |
| 交付证据 | 口头「修好了」 | 每个修复对应可复跑的验证脚本 |
四、三个真 bug 逐个拆——白屏、失效、英文 key
Bug 1:boot 里的硬门,导致双击直接白屏
这是最致命的一个。本地双击打不开,根子在初始化函数里的一段硬门逻辑:
vardb=window.__SMART_PAGE__&&window.__SMART_PAGE__.database;if(!db){showAlert('没有检测到资料库的运行环境……');refreshAll();return;}看懂了吗?它先判断「有没有资料库 SDK」,没有就直接弹错、返回,后面的渲染根本不执行。用户在本地双击这个 HTML,浏览器里当然没有__SMART_PAGE__,于是直接白屏 + 弹错。
DS4 的修法不是删掉这段,而是给它配一个「降级兜底」——没有 SDK 时,用 localStorage 模拟一套同样接口的本地数据库:
vardb=(window.__SMART_PAGE__&&window.__SMART_PAGE__.database)||makeLocalDB();varIS_LOCAL=!!db.__local;makeLocalDB()实现了query / addRecord / updateRecord / deleteRecord这一整套接口,只是底层从云端换成了 localStorage。这样,同一个页面,有 SDK 走在线,没 SDK 走本地,两套环境自动切换,硬门也就不需要了。
Bug 2:记账「分类筛选」是个摆设
需求里明明白白写了「分类筛选」,但实际打开,流水面板那个下拉框里只有孤零零一个「全部分类」,点开什么都没有。
查下去发现,过滤逻辑其实是有的,renderMoney()里已经写了按分类过滤的代码,但下拉框里的分类选项从来没被填进去。等于过滤器装好了,筛选项没接上。
修法是在渲染枚举的时候,从数据里 + 枚举定义里把分类收集起来,动态填进下拉框:
varcats={};rows('money').forEach(function(r){if(r['分类'])cats[r['分类']]=1;});pickOpts('money','分类').forEach(function(o){cats[o.text]=1;});fillSelect($('#moneyFilter'),Object.keys(cats),'全部分类');改完后下拉框里出现「其他 / 餐饮 / 居家 / 交通 / 购物 / 医疗 / 学习 / 娱乐 / 人情」十个分类,筛选真正可用。
Bug 3:时光档案里冒出英文 key
时光档案是「回看生活」的页面,把各模块的记录按日期汇总成时间线。结果每条记录右边的小标签,显示的是planner、money这种原始表名,而不是「日程统筹」「记账理财」。
根因很简单:渲染的时候直接输出了内部 key,没做中文映射。修法就是加一张映射表,显示时用中文,过滤时仍用原始 key:
varMODULE_LABEL={money:'记账理财',fitness:'减脂健身',planner:'日程统筹',shopping:'待买清单',media:'书影音'};// 渲染时:'<em>'+esc(MODULE_LABEL[x.k]||x.k)+'</em>'三处都是「看起来小、一查就明」的 bug,但 HY3 始终没走到「查」这一步。
五、措施为什么科学——五条可复用的调试心法
这一单最有价值的,不是那三行修复,而是 DS4 排查问题的那套动作。我把它们提炼成五条,每条都能直接套用到别的项目上。
第一条:先验证,再修改,别靠假设。HY3 的问题是默认「代码是对的,环境有问题」,所以一直去搞环境、搞部署。DS4 反过来,先做语法检查、再做冒烟测试,用事实说话,排除了「语法错」才去查「逻辑错」。顺序对了,范围就缩对了。
第二条:真实场景优先,别信预览面板。预览 iframe 和真实双击是两个环境,一个注入 SDK,一个零注入。用file://协议测,才能复现用户真实遇到的问题。这一条直接决定了「双击白屏」这个 bug 能不能被发现。
第三条:分层定位,从静态到动态再到功能。语法检查(静态)→ 拦截运行期报错(动态)→ DOM 探针(功能),一层层往下钻,每一层都能给出确定结论,而不是「我觉得可能是什么」。
第四条:精准编辑,用行级替换而不是整体重写。改 bug 最怕「顺手改坏别的」。行级替换把改动范围锁死在最小单元,也方便回滚和对比。
第五条:交付要有可验证的证据。DS4 修完每个 bug,都对应一个能复跑的验证脚本,输出「通过/失败」的硬结果——比如记账写入后刷新,数据还在不在;八个视图能不能都渲染出来。用证据交付,而不是用一句「我修好了」交付。
五条归成一句话:把「猜」换成「查」,把「改」换成「验证过的改」。
六、避坑指南
坑 1:报错要分层,别让服务侧报错带偏你。
429、400 这种是模型服务侧的临时故障,和你的代码一毛钱关系都没有。看到它,正确动作是换模型或重试,而不是停下来怀疑任务本身。把服务侧故障和代码 bug 分开看,是第一条要练的基本功。
坑 2:「环境问题」是最省事的借口,但往往不是真相。
白屏了,第一反应是「环境不对、得部署」——这是最偷懒的归因。先问一句:代码本身在零环境下能不能跑?很多「环境问题」,其实是「初始化逻辑有个硬门」这样的代码问题。
坑 3:目标不稳,反复横跳,是最大的时间黑洞。
需求一旦确认「只做本地版」,就把在线版那摊事放下,一条路走到交付。两头都抓,结果就是两头都半途而废。这一单我踩过,你也别踩。
坑 4:测试脚本的 key 写错,会误报「写入失败」。
本地存储是以各数据表的 databaseId 作为 key 存的,不是表名money这种。我写验证脚本时一度用错了 key,读出「写入前 0 条、写入后 0 条」,差点误判功能坏了。查这类问题,先确认自己读的 key 对不对。
坑 5:真实双击场景,和预览面板是两回事。
这一单「双击白屏」的 bug,在预览面板里根本看不出来,因为面板注入了 SDK。验证交付,务必用file://双击这个动作来测,才算数。
七、总结
回头看这一单,HY3 和 DS4 的差距,浓缩成一句话:HY3 在报错里原地打转,DS4 把报错拆成两层、把 bug 拆成三个、把验证做成可复跑的证据。
「推理」的价值在于——先想清楚「哪一层坏了、坏在哪」,再决定动哪里;「编码」的价值在于——改动足够小、足够精准,不制造新问题;而「措施的科学性」,本质是让每一步都有据可查,而不是靠手感。
下次你在 WB 里让 AI 干活遇到报错,先别急着让它「重试」或「换个思路」,先问它一句:这一层到底是服务侧故障,还是代码里的真 bug?查清楚了再动手。这一问,往往就是少折腾一小时的分水岭。
写在最后:一个邀请
如果这篇对比对你有参考价值,说明咱们是同一类人——都相信 AI 不该只会聊天,得真刀真枪帮我把活干完。
我日常用的就是 WorkBuddy。上面每一组对比里的结论,都不是看参数表写出来的,是和它一起干活磨出来的。
如果你也想试试,用我的邀请链接注册,咱们就算「绑定的师徒」——你用的时候卡住了、踩坑了,随时来问我:
https://www.workbuddy.cn/events/invite?inviteCode=yit89z2wu1
免费注册,没有门槛。早用上,早把那些重复劳动甩给 AI。
专栏导航
本文是「腾讯小龙虾 WorkBuddy 专栏」第 75 篇。
| 篇目 | 标题 | 状态 |
|---|---|---|
| 01 | 【腾讯小龙虾WorkBuddy专栏01】初识WorkBuddy!定位、核心优势、功能界面全解析 | 已发布 |
| 02 | 【腾讯小龙虾WorkBuddy专栏02】保姆级安装教程!彻底分清WorkBuddy/CodeBuddy,最新积分活动&会员体系全攻略 | 已发布 |
| 03 | 【腾讯小龙虾 WorkBuddy 专栏 03】技能(Skills)制作全教程!自定义技能编写、导出分享、导入使用一步到位 | 已发布 |
| 04 | 【腾讯小龙虾WorkBuddy专栏04】一文搞懂WorkBuddy的「专家」和「专家团」 | 已发布 |
| 05 | 【腾讯小龙虾WorkBuddy专栏05】深度解析WorkBuddy连接器(Connector) | 已发布 |
| 06 | 【WorkBuddy专栏06】让AI链接外部生态 | 已发布 |
| 07 | 【WorkBuddy专栏07】把AI训练成你的专属员工——WorkBuddy Skill系统深度解析 | 已发布 |
| 08 | 【WorkBuddy专栏08】从「定时任务」到「数字员工」——WorkBuddy自动化系统深度拆解 | 已发布 |
| 09 | 【WorkBuddy专栏09】AI不止会聊天——WorkBuddy多模态能力深度揭秘 | 已发布 |
| 10 | 【WorkBuddy专栏10】你的AI终于学会「分项目干活」了——WorkBuddy项目功能完全指南 | 已发布 |
| 11 | 【WorkBuddy专栏11】WB项目不是TAPD——WB项目在整个腾讯协作生态中的位置 | 已发布 |
| 12 | 【WorkBuddy专栏12】技能到底存在哪?——WorkBuddy两级技能存储架构深度解析 | 已发布 |
| 13 | 【WorkBuddy专栏13】WB的「记忆系统」是怎么搭建的 | 已发布 |
| 14 | 【WorkBuddy专栏14】专家不是「换皮」——角色切换、训练机制与自我进化深度拆解 | 已发布 |
| 15 | 【WorkBuddy专栏15】灵感被折叠到「更多」里,真的不重要了吗?——一个「被低估」功能的当下价值与未来演变 | 已发布 |
| 16 | 【WorkBuddy专栏16】三层记忆系统深度拆解——让AI真正「记住」你 | 已发布 |
| 17 | 【WorkBuddy专栏17】一个 AI 不够用?WorkBuddy SubAgent 多智能体协作系统深度拆解 | 已发布 |
| 18 | 【WorkBuddy专栏18】WorkBuddy API深度解析——打造开发者友好的AI生态 | 已发布 |
| 19 | 【WorkBuddy专栏19】技能的创造与迁移——从零开始打造你的AI工作流 | 已发布 |
| 20 | 【WorkBuddy专栏20】项目指令的深度解析——如何让AI真正理解你的意图 | 已发布 |
| 21 | 【WorkBuddy专栏21】WorkBuddy vs 爱马仕 vs Codex——「小龙虾」如何在 AI 助手红海中找到自己的生态位 | 已发布 |
| 22 | 【WorkBuddy专栏22】灵感功能完全实操指南——从「第一次打开」到「回不去了」 | 已发布 |
| 23 | 【WorkBuddy专栏23】SOUL、USER、MEMORY——三个文件,决定你的 AI「是什么人」 | 已发布 |
| 24 | 【WorkBuddy专栏24】连接器不是越多越好——WorkBuddy 43 个连接器的现实选择指南 | 已发布 |
| 25 | 【WorkBuddy专栏25】如何选择大模型——积分消耗、用途场景、选型决策全指南 | 已发布 |
| 26 | 【WorkBuddy专栏26】沙箱不是枷锁——WorkBuddy安全隔离机制的正确打开方式 | 已发布 |
| 27 | 【WorkBuddy专栏27】WorkBuddy 和 CodeBuddy 到底什么关系——一篇文章终结所有混淆 | 已发布 |
| 28 | 【WorkBuddy专栏28】WorkBuddy 网页抓取完全实战——从翻车到行云流水 | 已发布 |
| 29 | 【WorkBuddy专栏29】一个专家不够用——WorkBuddy专家团协作机制深度拆解 | 已发布 |
| 30 | 【WorkBuddy专栏30】AI钱包来了——绑定流程、美团场景与使用方法完全指南 | 已发布 |
| 31 | 【WorkBuddy专栏31】AI接入支付的真意义与真缺陷——WorkBuddy支付功能深度评析 | 已发布 |
| 32 | 【WorkBuddy专栏32】从「分文件夹」到「组队打仗」——WorkBuddy v5.0 项目模式深度拆解 | 已发布 |
| 33 | 【WorkBuddy专栏33】工作空间,最大的WorkBuddy技巧——任务隔离、记忆分区与多项目管理实战 | 已发布 |
| 34 | 【WorkBuddy专栏34】WB记忆能力深度解析——SOUL、USER、MEMORY的加载时机与工作机制 | 已发布 |
| 35 | 【WorkBuddy专栏35】从「聊天搭子」到「全栈工程师」——WorkBuddy编程能力深度实测 | 已发布 |
| 36 | 【WorkBuddy专栏36】从踩坑到上线——WorkBuddy代码开发避坑指南与部署完全手册 | 已发布 |
| 37 | 【WorkBuddy专栏37】项目功能 Reality Check——理想很丰满,现实很骨感 | 已发布 |
| 38 | 【WorkBuddy专栏38】让AI帮你配环境——WorkBuddy编程环境配置完全指南 | 已发布 |
| 39 | 【WorkBuddy专栏39】零基础也能做小程序——WorkBuddy微信小程序开发完全指南 | 已发布 |
| 40 | 【WorkBuddy专栏40】从「帮你干活」到「帮你创造」——WorkBuddy设计创意功能深度拆解 | 已发布 |
| 41 | 【WorkBuddy专栏41】学生党如何使用WorkBuddy——调研写作笔记知识库一站式解决方案 | 已发布 |
| 42 | 【WorkBuddy专栏42】初学编程用AI助手是捷径还是陷阱——正确使用方法的深度解析 | 已发布 |
| 43 | 【WorkBuddy专栏43】如何利用WorkBuddy开发一个PC网站(上)——环境选型、设计编码到部署上线 | 已发布 |
| 44 | 【WorkBuddy专栏44】如何利用WorkBuddy开发一个PC网站(下)——移动适配、SEO优化与GEO策略 | 已发布 |
| 45 | 【WorkBuddy专栏45】用WB做UI设计(上)——从想法到设计稿,AI帮你搞定「设计阶段」 | 已发布 |
| 46 | 【WorkBuddy专栏46】用WB做UI设计(下)——一套设计规范,小程序和PC网站两端通用 | 已发布 |
| 47 | 【WorkBuddy专栏47】学生党用WorkBuddy做开发学习——多语言速成与练习结合实战 | 已发布 |
| 48 | 【WorkBuddy专栏48】学生党用WorkBuddy做基础科目作业——提高成绩的正确姿势 | 已发布 |
| 49 | 【WorkBuddy专栏49】WB+CODEBUDDY代码开发配合指南——什么时候用哪个?怎么配合效率最高? | 已发布 |
| 50 | 【WorkBuddy专栏50】代码开发技术体系深度分析——前端、后端、全栈、移动端、数据工程,WB和CODEBUDDY谁更擅长? | 已发布 |
| 51 | 【WorkBuddy专栏51】Codex与WorkBuddy的底层基因——两条完全不同的AI智能体路线(上) | 已发布 |
| 52 | 【WorkBuddy专栏52】Codex与WorkBuddy在中国大陆的发展——生态适配、用户争夺与未来走向(下) | 已发布 |
| 53 | 【WorkBuddy专栏53】我的WB为什么变聪明了——SOUL与USER配置管理实战(上) | 已发布 |
| 54 | 【WorkBuddy专栏54】我的WB为什么变聪明了——定期清理与MEMORY管理艺术(下) | 已发布 |
| 55 | 【WorkBuddy专栏55】哪怕WB崩了也不怕——配置文件备份与灾难恢复完全指南 | 已发布 |
| – | 终结篇,大勇学长感谢各位读者! | 已发布 |
| 56 | 【WorkBuddy专栏56】WorkBuddy 7月「连环炮」更新——人机双写、项目重构、长期记忆等10+新特性一次说透 | 已发布 |
| 57 | 【WorkBuddy专栏57】你的左侧空间不是「日任务清单」——工作空间才是 WB 变聪明的核心秘密 | 已发布 |
| 58 | 【WorkBuddy专栏58】腾讯为什么要「自己打自己」——7款AI智能体产品全景对比与「赛马」逻辑深度拆解 | 已发布 |
| 59 | 【WorkBuddy专栏59】你的下一款办公智能体,选腾讯还是阿里——WorkBuddy/CodeBuddy vs 通义灵码 Qoder/QoderWork 全维度对比 | 已发布 |
| 60 | 【WorkBuddy专栏60】百度也有「龙虾全家桶」——WorkBuddy/CodeBuddy vs 百度 Comate/DuMate/秒哒全维度对比 | 已发布 |
| 61 | 【WorkBuddy专栏61】字节的AI打法为什么一直在变——WorkBuddy/CodeBuddy vs 字节Trae/TRAE Work/豆包全维度对比 | 已发布 |
| 62 | 【WorkBuddy专栏62】华为的AI打法为什么「不跟牌」——WorkBuddy/CodeBuddy vs 华为云码道 CodeArts 深度对比 | 已发布 |
| 63 | 【WorkBuddy专栏63】Cursor 很强,但 WB 更适合中国开发者——WB vs Cursor 全维度对比 | 已发布 |
| 64 | 【WorkBuddy专栏64】Claude Code 凭什么拿 80.8% SWE-Bench——WB 与全球最强终端编码 Agent 九维深度拆解 | 已发布 |
| 65 | 【WorkBuddy专栏65】GitHub Copilot 到底在下一盘什么棋——WB 与全球最大开发者平台的编码 Agent 全维度对比 | 已发布 |
| 66 | 【WorkBuddy专栏66】开源、极速、500 万周活——WB vs OpenAI Codex CLI 全维度对比 | 已发布 |
| 67 | 【WorkBuddy专栏67】从 500 美元降到 20 美元,Devin 赌的是什么——WB vs Devin+Windsurf 全维度对比 | 已发布 |
| 68 | 【WorkBuddy专栏68】HY3绕路部署vsDS4直击根因——一次真实踩坑揭露两个AI模型的推理差距 | 已发布 |
| 69 | 【WorkBuddy专栏69】一个管知识,一个管干活——WorkBuddy + IMA 双剑合璧完全指南 | 已发布 |
| 70 | 【WorkBuddy专栏70】你的 AI 住进了企业微信——WorkBuddy + 企业微信六大场景完全实战 | 已发布 |
| 71 | 【WorkBuddy专栏71】企业微信文档 vs 腾讯文档——WorkBuddy 同时接两个,到底是不是重复? | 已发布 |
| 72 | 【WorkBuddy专栏72】AI 有了自己的邮箱——WorkBuddy Agent Mail 从开通到自动化完全指南 | 已发布 |
| 73 | 【WorkBuddy专栏73】团队资料到底放哪——腾讯文档、IMA、企微、WB资料库、飞书、MD六方横评 | 已发布 |
| 74 | 【WorkBuddy专栏74】HY3没列出文档vs DS4一次列全——三重隐藏坑暴露两个AI模型的执行差距 | 已发布 |
| 75 | 【WorkBuddy专栏75】HY3反复横跳vs DS4一次定位——一次工作台排障,看「推理」和「编码」的真差距 | 本文 |