尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

半夜冲奶粉,我用码道 Agent 写了个_会吹凉奶瓶的倒计时_,还顺手给牛顿冷却定律做了个 CT

半夜冲奶粉,我用码道 Agent 写了个_会吹凉奶瓶的倒计时_,还顺手给牛顿冷却定律做了个 CT 半夜冲奶粉我用码道 Agent 写了个会吹凉奶瓶的倒计时还顺手给牛顿冷却定律做了个 CT一、这玩意儿是干嘛的新手爸妈都懂那个抓狂的瞬间奶刚烧开 100°C宝宝哭得撕心裂肺你手背试了半天也试不出到底还要等多久才能到能入口的 40°C。倒多了凉透倒少了烫嘴。我做了个网页选杯型、填水温和室温、点开始它给你一个实时倒计时——“再等 8 分 12 秒凉到 40°C可以喂”。旁边一条温度曲线往下走走到 40 那条虚线正好归零。听着就是个套公式的小工具对吧难点不在这。难点在于我凭什么信这个倒计时是准的我总不能说因为我用了牛顿冷却定律书上这么写的。所以这个项目真正花心思的地方是怎么给它建一条能被别人一键复现、又骗不了人的验证链。这条链我差点自己把自己骗过去是评审 Agent 一巴掌扇醒的。这个后面细说。先给结论最终这个模型对文献实测的冷却数据拟合优度 R² 0.9999三种独立算法互相比对最大偏差 3.4×10⁻¹² °C数值积分器的四阶收敛比实测 16.71理论值 16。整个项目是喂华为云码道 CodeArts Agent一轮一轮建的我只负责出题、验收、和填它挖的坑。说白了代码是它写的但这代码到底能不能信这件事是我跟一个 AI 评审较真较出来的。二、为什么做这个我表姐家孩子那阵子半夜三点起来冲奶是常态。她说有回把 100 度的水直接兑了点凉的就塞给宝宝烫得哇哇哭她比自己挨烫还难受。我那天正好在研究散热随口说这不就是牛顿冷却定律吗一个指数衰减能算。话一说出口我就知道活儿来了。真要算得回答一堆问题k那个衰减快慢的系数到底是多少不同杯子差多少凭什么说我算的时间是对的——每一个问题背后都是一个能翻车的坑。先说 k 这个系数。它不是一个魔法数字是能从物理量推出来的k h·A / (m·c_p)h 是对流换热系数、A 是水暴露在空气里的表面积、m 是水的质量、c_p 是水的比热容。玻璃杯口大、h 高k 就大凉得快保温杯 h 极低k 小凉得慢。所以只要给每个杯型定一组 (h, A, m)我就能反算出它专属的 k进而算出从 100 度凉到 40 度要几分钟。选题我给自己三条铁律一秒看懂、有客观真值、别撞车。升旗、头像框、版图、中秋月相、日地月 3D、会算题的烟花这些获奖过的全划掉。冲奶倒计时这个角度带真实痛点、又能拿物理定律对拍行。三、先跑起来看看零运行时依赖纯 Node 20 ES Moduleclone 三条命令gitclone https://atomgit.com/lskcode/formula-cooler.gitcdformula-coolernode--test# 15 项测试全绿nodebin/dev.mjs# http://localhost:3000玻璃杯、奶瓶、保温杯、纸杯四种预设切一个倒计时立刻变。保温杯那条线明显躺得平——凉得慢符合常识。页面上那个大号的剩余时间是每秒刷新的走到 40°C 那条虚线数字归零显示可喂 · Safe to feed。我特意按自己那套审美做的纯深底#0b1120只有一处冷蓝#4d9dff没有花里胡哨的发光描边。工具嘛别抢戏。想验证模型准不准一条命令跑外部锚定nodeevidence/external_check.mjs# k_ref 0.024958 /min, R² 0.99990这条命令做的事很朴素把一组文献里别人用温度计实测出来的热水冷却数据喂给 fitK让它反解出 k再用闭式解去描这条曲线算拟合优度。R² 越接近 1说明牛顿冷却这个假设越贴真实世界。这一步不依赖我前面任何一段代码的自我循环是实打实拿外部数据打的分。四、怎么钉码道 Agent跟上一篇一样的套路码道跑在华为云上只能在我登录的 AtomGit 账号里干活参赛截图带我账号。提示词必须钉到函数级结尾永远挂那句铁律直接建文件并git add -A git commit git push不要只描述、不要贴代码正文只回复 git log 文件树 测试 pass/fail。第一轮的核心提示词原样【R1 · 冲奶钟 formula-cooler 核心算法层】 建 public 仓库 formula-cooler。Node 20 ES Module零依赖node:test。 - src/newton.mjs closedForm(T0,TAmb,k,t)TAmb(T0-TAmb)*exp(-k*t) timeToReach(T0,TAmb,k,Ttarget)ln((T0-TAmb)/(Ttarget-TAmb))/k - src/numerical.mjs integrateRK4 数值积分 dT/dt-k(T-TAmb) - src/calibrate.mjs fitK 用 ln(T-Tamb) 线性化最小二乘反解 k - test 硬断言closedForm(100,25,0.005,60)≈68.066(±0.001) 直接建文件并 git commit git push只回复 git log 文件树 测试 pass/fail切成 5 轮喂R1 核心算法、R2 输入层物理反演、R3 前端倒计时、R4 三算法对拍、R5 README。每轮跑完我本地git clone自己node --test复核——码道说绿不算绿。五、架构三把尺子量同一件事牛顿冷却定律的数学内核就一个 ODEdT/dt -k(T - T_amb)。我让码道用三种完全不同的方式去解它再互相比对路径方法独立性closedForm解析解T∞(T0−T∞)e^(−kt)基准RK4四阶龙格库塔数值积分真独立不看解析解fitK从数据点线性回归反解 k起初是同源后修方案上我也犹豫过要不要引入辐射散热的非线性项严格说牛顿冷却只是对流主导的近似但冲奶这个温区40–100°C对流占绝对主导加辐射项是过度设计我把它写进 README 当已知不足。还有个取舍是关于要不要联网查实时室温。我一开始想调天气 API 拿用户所在城市的当前气温当 T_amb后来放弃了一是引入外部依赖破坏了零依赖这个我很在意的工程约束二是室内温度和室外温度差得远反而不准。最后让用户自己填室温一个滑块搞定简单可靠。做小工具最怕的就是为了智能把简单事情搞复杂。六、核心算法掰开揉碎解析解一行搞定// src/newton.mjsexportconstclosedForm(T0,TAmb,k,t)TAmb(T0-TAmb)*Math.exp(-k*t);exportconsttimeToReach(T0,TAmb,k,Ttarget){if(TtargetTAmb)thrownewRangeError(水不会自己凉到室温以下);if(TtargetT0)thrownewRangeError(目标温度不低于初温无需冷却);returnMath.log((T0-TAmb)/(Ttarget-TAmb))/k;};RK4 数值积分完全不用上面的闭式解只认微分方程本身// src/numerical.mjsexportfunctionrk4Step({T,Tamb,k},dt){constf(temp)-k*(temp-Tamb);constk1f(T),k2f(Tdt/2*k1),k3f(Tdt/2*k2),k4f(Tdt*k3);returnTdt/6*(k12*k22*k3k4);}fitK 反演把T(t)T∞(T0−T∞)e^(−kt)两边取对数ln(T−T∞)ln(T0−T∞)−kt就成了y b − k·t的直线最小二乘求斜率即得 k// src/calibrate.mjsexportfunctionfitK(points,Tamb){constxspoints.map(pp.t_min);constyspoints.map(pMath.log(p.T_C-Tamb));// 标准 OLSk -slopereturn-slope(ols(xs,ys));}// 最小二乘斜率slope Σ(x-x̄)(y-ȳ) / Σ(x-x̄)²functionols(xs,ys){constmxavg(xs),myavg(ys);letnum0,den0;for(leti0;ixs.length;i){num(xs[i]-mx)*(ys[i]-my);den(xs[i]-mx)**2;}returnnum/den;}七、差点栽在假独立上这一节是我这个项目最大的收获也是被评审 Agent 逼出来的。我第一版的得意之作为 R4把 closedForm、RK4、fitK 三路跑同一条曲线结果最大偏差 3.4×10⁻¹² °C我截图的时候心里美啊——三个算法对到小数点后 12 位这验证多硬然后我把代码丢给技术评审 Agent。它回了一段让我后背发凉的话核心是closedForm↔RK4 是解析 vs 数值真独立。但 fitK 是从同一个 exp 律反解出来的你 selfcheck 里喂给它的还是无噪声、由同一 exp 律生成的数据回收 k 到 1e-13 是必然不校验物理。三路对拍对物理护城河是自证。我愣了半天。它说得对。这就像我出三道题其实三道题答案都抄自同一份标准答案然后我宣布你看三个答案完全一致说明我算对了——一致是应该的但它没证明任何东西。真正该问的是这套模型对不对得上现实世界里那杯真实在凉的水这个教训我觉得比代码本身值钱。它总结成一句话就是多个方法互相印证只有在这些方法真的独立、且至少有一个锚定了外部现实时才叫验证否则只是把同一个假设复述了三遍。我后来把这条写进了项目的 README也写进了我自己做这类可验证小工具的检查清单。我当场补了一个 R6 修复轮三件事第一加外部真值锚定。让码道内置一组文献实测的热水自然冷却数据T092°C、室温 21°C、每 2 分钟一个点共 20 个点用 fitK 去反演它的 k再用 closedForm 算拟合优度// evidence/external_check.mjsconstk_reffitK(REFERENCE_SERIES,21);// 反演实测 kconstr2computeR2(REFERENCE_SERIES,k_ref,21);// 模型 vs 真实观测// 断言 r2 0.99结果k_ref 0.024958 /minR² 0.99990。这下牛顿冷却对真实观测成立不再是三个算法关起门来自嗨。第二加一条真正独立于解析解的数值验证RK4 步长减半收敛测试。四阶方法的误差应该随步长减半而降到 1/16。我让码道用 dt0.4/0.2/0.1 各跑一遍比对误差比// test/numerical.test.mjs —— 只依赖 RK4 自身不碰 closedFormconstE(dt)Math.abs(rk4(dt)-closedFormExact);assert.ok(Math.abs(E(0.4)/E(0.2)-16)3);// 实测 16.71实测比值 16.71四阶收敛坐实。这条是纯数值严谨性跟物理模型对不对无关但能证明我的积分器没写错。第三修了个功能硬伤。评审还发现我 validate 里校验了 volume_ml但 k 计算根本没用体积质量取的是 preset 固定值——那240ml 比 120ml 凉得慢这个常识在代码里压根不成立。改成m 密度×体积、面积按体积 2/3 次幂缩放volume 才真正驱动 k。八、测试15 项现在测试链是这样的每一环锚不同的东西// 解析解基准assert.ok(Math.abs(closedForm(100,25,0.005,60)-68.066)0.001);// 数值 vs 解析 真独立// RK4 四阶收敛 独立于解析解// fitK 从实测数据反演 R²0.99 外部锚定// volume 驱动 k 的单调性九、真实的坑坑 1假独立。上面第七节整节都是这个。这是我这个项目最值钱的教训——多算法互洽不等于验证除非它们真的独立、且至少有一路锚定外部现实。坑 2收敛比不总是干净的 16。我算 E(0.4)/E(0.2)16.71 很满意再算 E(0.2)/E(0.1)55.63 就懵了。后来想通dt0.1 时离散误差已经小到接近浮点舍入误差的量级比值被舍入噪声搅乱了。理论只在离散误差主导的区间成立。这个我也如实写进 README没藏。坑 3volume 是个摆设。评审揪出来的功能硬伤校验了却不用。改完之后我把体积驱动 k这条也补成了测试// test/physics.test.mjs —— 常识必须在数值上成立test(同杯型水越多凉得越慢,(){constk120kPerMinute(PRESETS.glass_mug,120);constk240kPerMinute(PRESETS.glass_mug,240);assert.ok(k120k240);// 120ml 的 k 更大 → 凉得快assert.ok(timeToReach(95,22,k240,40)timeToReach(95,22,k120,40));});坑 4码道配额中途耗尽 上下文反复顶满。跑到后面 deepseek-v4-flash 弹配额不足切 GLM-5.2上下文几度顶到 100% 自动压缩压缩后它偶尔会忘记前面定的接口得在提示词里把函数签名再钉一遍。这些都得盯着不能撒手。十、提效数据环节码道 Agent我建仓库 写 20 个文件✅出题三算法对拍初版✅验收识破假独立❌✅ 评审 我外部 R² 锚定 收敛测试✅ 实现定方案volume 驱动 k 修复✅评审发现写这篇文章❌✅码道写代码是真快你需求钉得越细它越准。但它会把自证当验证交给你——这种认知层面的坑得靠人或你自建的评审 Agent兜。具体说这个项目从出题到能跑码道大概花了不到一小时把 20 多个文件全建出来、测试全写出来这个速度我自己敲至少两天。但真正让我这个项目站得住的那三个动作——识破假独立、决定用文献实测做外部锚定、要求 RK4 步长减半收敛测试——没有一个是码道主动想到的。它是个执行力极强的初级工程师你让它干嘛它干嘛但这件事该不该这么验这种判断它给不了你。所以我的体会是用 AI 干活人的价值正在从写代码往定义什么叫写对了上移。十一、五维自检眼前一亮会吹凉奶瓶的倒计时新手爸妈一秒懂。可验证护城河外部实测 R²0.9999 RK4 四阶收敛 16.71 解析/数值双路独立node evidence/external_check.mjs一键复现。原创度三算法交叉对拍 破自证的方法论不是套模板。工程质量15 项测试、零依赖、分层清晰。诚实度假独立、收敛比噪声、volume 摆设、辐射项未建模——全写进 README。这五条里我最看重的其实是最后一条。一个项目敢不敢把自己没修完的坑、模型不成立的边界条件明明白白写出来比它堆了多少功能更能说明作者有没有真懂。我见过太多一切顺利的参赛 demo反而不敢点进去看。我这个 R² 只有 0.9999 不是 1.0、Charleston 那种大潮差站误差会放大、dt 太小时收敛比会失真——这些我全留着因为它们才是这个项目真实的样子。十二、本地跑 写在最后nodebin/dev.mjs# 倒计时 UInodeevidence/external_check.mjs# 对文献实测算 R²# k_ref 0.024958 /min, R² 0.99990最后说点掏心窝的。这个项目一开始我以为三个算法算出同一个数就是铁证直到被评审点破那三道题其实抄的同一份答案。真正的验证是你得敢把模型扔给一个它没见过的现实——那杯真在凉的水、那份文献里别人实测的温度序列——然后看它对不对得上。R² 从三个算法互洽的自嗨到对真实观测 0.9999的踏实中间隔的就是评审那一巴掌。AI 能帮你把代码写得飞快但分辨算得一致和算得对这两种截然不同的事眼下还得靠人。我现在的习惯是任何看起来在自我验证的东西先逼自己回答一句——如果我把这个结论扔掉还有什么外部证据能撑起它答不上来就是自证。这个习惯放在写代码上叫交叉验证放在别的地方大概也叫独立思考。仓库在这欢迎 clone 下来跑也欢迎拿你家那杯正在凉的奶来对https://atomgit.com/lskcode/formula-cooler这是我会算 XX 的小工具系列第二篇。上一篇算了潮水这一篇算了奶瓶下一篇打算去山上算几点能登顶。三篇用的是同一套打法选题要一秒看懂、护城河要有客观真值、评审要真敢挑刺。如果对你有启发点个赞收藏一下是我继续肝的最大动力。
返回列表