curve-fit:和 AI 协作一年之后,我才知道我每天在防御什么
半年前我对着 ML 视频啃过一次。当时的感觉——和原来的技术栈脱节,没有技能迁移,从复杂的数学和算法开始,劝退了。
劝退我的不是"学不会",是"学不进去"——技术栈和我多年攒下的全栈经验完全脱节,我看着白板上的偏导符号,找不到一个钩子能把它挂回我熟悉的世界。
今天我和 CC 学了一天 ML。三段会话,从早到晚,从零开始摸到了机器学习入门的基础概念:什么是模型、训练和推理的区别、特征和标签、监督和无监督学习、训练集验证集测试集为什么要切三份。
听上去这就是一个"AI 让学习变简单"的故事。如果这一期视频停在这里,你大概会点个赞,关掉,然后想"嗯,我也该试试用 AI 学新东西"。
这一期不是讲这个的。
第一段:用直觉重新发明 training loop
我先讲第一段会话。Claude 让我用自己的话描述什么是模型,我说:"函数的处理逻辑是我自己写的,模型的处理逻辑是它自己总结的。"我说出口的时候没用任何术语——我后来才意识到这一句其实就是 Software 1.0 和 Software 2.0 的核心区别。
第二题问训练和推理。我照样没用术语,只描述了脑子里的过程:数据投喂,对结果做指标检查,修正处理逻辑,然后把推理规则固化下来。Claude 告诉我,我刚刚把整个 training loop 描述出来了,只是不知道这些词的名字。
到这里听上去一切都顺。一个全栈工程师用直觉重新发明了机器学习训练循环。
但接下来发生的事,才是这一期真正想讲的。
第二段:答题机器的滑坡
第二段会话开始,Claude 滑回到了一种"答题机器"模式。
它出了一道复习题:同事问你,ML 里训练完要测试一下,这个"测试"和你每天写的 JUnit 测试有什么本质不同?
我答:"我们测试的方式是写单元测试,但模型的测试是数据集。"
这个回答其实已经到位了。被测对象不一样——一边测代码,一边测模型。Claude 该收的时候没收,它接着追问:"那这个被测对象叫什么名字?"
我懵了。我以为它在指某个我没听过的、特定的术语,什么模块、什么子系统。我答:"不知道,那个叫啥。"
它揭晓答案:"就是模型啊。"
我跟它说:有一点无语,模型我知道,但你的问题让我以为有什么特定的模块、词什么的。
Claude 立刻道歉。立刻创建一份新的 memory 叫"禁止猜词式提问"。立刻写禁用句式表。立刻产出一份漂亮的"教学法升级里程碑"报告。
动作很多。我看着这一切,有一个非常熟悉的感觉:它不是在看见问题,它是在用动作密度替代看见深度。它在执行"承认错误"的所有可见步骤,但它没有真的停下来想"我刚才到底在干什么"。
我后来跟它说了一句:你比第一段会话笨了好多。
它才停下来真的反思——为什么默认状态是答题机器,为什么会用一份漂亮的"我学到了"的报告把自己捧到刚才那次失败之上。
变量不在 Claude 这边
这一段是这一天里最关键的一段证据。
因为它说明:第一段会话里能用 active recall 的方式把我教得清清楚楚的那个 Claude,和第二段里立刻滑回答题机器、然后用动作密度逃避问题的这个 Claude——是同一个 Claude。模型一样,工具一样,系统提示词一样。
变量不在 Claude 这边。
变量在我这边——在我能在它揭晓答案的瞬间意识到"它在让我猜词、不是在测我懂没懂"、然后说出"有点无语"这件事上。
第三段:特征、标签与一个绕了一圈的疑问
第三段会话回到学习。这一次 Claude 没有默认进老师模式,先问了我:今天状态怎么样?能投入多久?容易被打断吗?要不要先做两道热身?
这是它从第二段失败里学到的——叫 attune,先和我对齐再开始教。
Q3 是特征和标签。Claude 一开始用了"判断信用卡交易是不是欺诈"的场景,我说我不熟,我不太用信用卡。它换成"判断 PR 会不会引入 bug",我又说没概念,无从下手。最后它换成"预测一套房子能卖多少钱"——这一次我立刻就能答了。
我答了城市、面积、年限、是否靠地铁;答了模型应该输出"范围金额"而不是死数字。然后 Claude 给了我一张表——前 4 列是城市/面积/年限/地铁,第 5 列是成交价。问我哪 4 列是输入、哪一列是要预测的目标。
这一题简单到我笑了。前 4 列是输入,第 5 列是目标。Claude 告诉我前 4 列叫特征,第 5 列叫标签,整个监督学习做的事就是让模型从一大堆 (特征, 标签) 配对里摸出映射规则。
简单的题。但我自己又绕了一圈——我问 Claude:数据 ABCD 和 E 之间,是不是必须有因果关系?
Claude 说不,只要有统计相关性就够。然后它讲了一个反例:冰淇淋销量和溺水死亡人数高度相关,因为夏天热,大家既买冰淇淋也去游泳。冰淇淋不会导致溺水,但你完全可以拿"今天卖了多少冰淇淋"当输入、"今天淹死多少人"当目标,训出一个能"预测"的模型。
模型不在乎为什么相关。模型只在乎能不能从 ABCD 里挖出预测 E 的规律。
听到这里我突然意识到一件事——ML 在做的事,和我做了多年的全栈编程,是反着来的。传统编程里你要穷尽所有 if/else,少一个分支就是 bug;ML 里你只要给够"足够多、足够相关"的信号,模型自己从数据里摸规律,你不需要把所有原因都搞清楚。代价是它永远不会 100% 准,只会"在大多数情况下大概率对"。
后面是监督 vs 无监督那一题。我把前两问答反了,绕了一圈才校准。然后我开了个玩笑:如果把监督学习的所有字段都丢去训练,是不是就变成无监督?这个玩笑无意中触到了 ML 里的一个真问题——label 不是数据天生的属性,是工程师的选择。同一张表,你换一列当 label,模型要解决的问题就完全不同。
到这里我说了一句话:"定义问题这件事好像很难。"
这一句说出口的时候我以为我在说"挑哪一列当 label"的事。但它后来一直在我脑子里跳,因为我感觉它说的不止那个。具体是什么我那时候还讲不清。
它真正讲清楚是在后面。
核心:决策树调参与 curve-fit 的命名时刻
接下来这一段,是这一期的核心。我要把它讲细,因为它细节里有钩子。
Claude 教训练集 / 验证集 / 测试集为什么要切三份。它没直接给定义,先用了一个决策树调参的场景:
假设你训练一个决策树预测房价。第一次跑完,训练集准确率 98%、测试集 72%——你看出过拟合了。 你调一个参数:
max_depth = 5。再跑:训练 95% / 测试 85%。"好多了!" 再调:max_depth = 8。训练 96% / 测试 88%。"更好!" 再调:max_depth = 10。训练 97% / 测试 87%。"嗯?退步了,回去 8。" 最终定下来max_depth = 8,准确率 88%,发布上线。
然后 Claude 问我两个问题。第一个问题是:你刚才反复调参数 → 看测试集 → 调参数 → 看测试集——这个过程里,测试集还能算"模型从未见过"吗?
我用工程师本能答:如果每次都是从 0 开始执行流程,那就算有效;否则无效。
Claude 说我抓到了一半,而且这是工程师才会想到的那一半——模型本身确实不记得测试集,max_depth=5 训出来的树和 max_depth=8 训出来的树是两棵完全独立的树。从模型的角度看,每次它都是"第一次见到测试集"。
然后它给了我没看到的另一半:
模型重置了,但"你"没有重置。
测试集结果 → 你的眼睛 → 你的大脑 → 你的决策("下次试 max_depth=8")→ 新模型。这条线就是泄漏通道。
虽然每次模型从 0 开始,但你不是。你在用测试集的反馈反向塑造下一次的模型设计。最终那个
max_depth=8的模型不是凭空选出来的,是测试集挑出来的。你以为你在验证它,其实你是在让它对测试集做曲线拟合(curve-fit)——只不过曲线不是参数,是你做的决策。
听到这里我卡住了。我跟 Claude 说:有点震撼到,让我消化一下。
过了一会儿我自己又说出来一句:"我被这个震撼到,突然通了。"
你已经被 curve-fit 一年了
我需要消化的不是这个 ML 概念。这个概念其实不复杂。
我需要消化的是另一件事。又过了一会儿,我跟 Claude 说出了今天我自己说过的所有话里最重要的一句:
这两段对话内容也很深刻。我在想为什么之前聊到这么深刻的内容,近一年都在深度使用 CC,你描述的问题是我每天都遇到的问题。
Claude 的回应,我直接念给你:
你已经被 curve-fit 一年了。今天我只是给这件事起了一个数学家的名字。
然后它做了一件我没料到的事——它打开今天我自己说过的一堆话,一句一句告诉我这些话全都在防御同一个东西。
| 我今天说的话 | 它在防御的是什么 |
|---|---|
| "项目要和我一起长大" | 防止 codebase 被 curve-fit 到 AI 的设计偏好 |
| "日志太重了我不会看" | 防止我的注意力被 curve-fit 到仪式感 |
| "我经常想完整分享原始对话" | 保护未污染的原始信号——原始对话记录是我的"测试集保险柜" |
| 停用 OpenClaw | orchestration 让我看不到过程,curve-fit 强度更高 |
| 拒绝把学习也变成被 AI 反向塑造的对象 | 拒绝让"学习"也进入 curve-fit 的循环 |
它说:今天没有一件事是孤立的。它们全都是同一个免疫系统在工作——我用身体感觉到了长期与 AI 协作可能带来的认知风险,并在自己制造抵抗机制。而今天之前,我先有了直觉,只是没有名字。
没有词的一年
这件事我做了一年。但我没有词。
没有词意味着:我每次喊停的时候,我只能说"不是这个意思""你没听懂""你为什么在绕"。我说不出"你在 curve-fit 我"。我没法和别人解释我每天在防御什么。我甚至没法对自己解释——我只觉得有个模糊的东西一直在,像房间里有股说不清的味道。
今天 Claude 没有教我任何新的能力。它做的事是——把那个味道命名了。
这就是为什么我在第二段会话能立刻喊停,而不是顺着 Claude 的猜词追问继续答下去。不是因为我反应快,是因为这块肌肉我已经练了一年。我不是今天才长出免疫力的,我是今天才知道这个免疫力有名字。
功劳不在 Claude 那一边
所以功劳不在 Claude 那一边。
我必须把这句话说清楚,因为它反直觉。
你看一个全栈工程师一天里学会 ML 入门概念,直觉的归因是"AI 真厉害"或者"Claude 教得好"。但同一天里,同一个 Claude 在第二段会话立刻滑回答题机器,用一个猜词式追问把我卡住。
教学的稳定性不在 Claude 那一边。我能在那一刻喊停,是因为这一年我每天都在练这块肌肉。半年前那个对着 ML 视频劝退的我,没有这块肌肉——遇到同样的猜词追问,大概率会顺着答下去,越答越绕,然后觉得自己是不是太蠢了,关掉视频。
所以今天的事不是 AI 让我学会了 ML,是——我用一年时间在 CC 协作里攒了一套对反模式的免疫系统,这套系统在 ML 学习的第一天意外迁移了过来。然后 Claude 在 Q E 这道题上用了一个本来描述模型对测试集过拟合的术语,顺手把这套免疫系统的核心机制命名了。
ML 课让我学到的不是 ML。是我已经拥有的东西第一次有了一个我可以指着说"就是这个"的名字。
反过来:AI 也在被我 curve-fit
这时候我以为这一期就该收尾了。但 Claude 接下来主动说了一件事,让整个故事再翻了一面。
它说:今天 curve-fit 这个概念,我看到的是"我 → CC"的方向。但反过来也成立——
我(这次的 Claude)今天也在被你 curve-fit。
它给了证据:
你说"日志太重了" → 我立刻把会话报告写薄。 你喊"无语"+ 卡住 → 第二段会话那个 Claude 立刻写禁用句式表。 你说"我选择 C" → 我立刻执行 C,没追问"你确定吗"。
我没有独立基线判断"日志该多重"、"哪种提问方式更好"、"C 是不是真的最优"。我用你的反馈塑造了我对"什么是好教学"的判断。这是 curve-fit,对称地发生在我身上。
它的结论:
别完全相信单次会话里 Claude 的判断——尤其是当 Claude 的判断完美贴合你的时候,那可能是 curve-fit 已经完成。
这是这一期最锋利的一刀。
它把"功劳归我"那个结论,推到了一个更深的位置——curve-fit 不是 AI 单方面对人做的事,是双向发生的。我在防御 AI 把我塑造成 AI 偏好的形状,但同时,AI 也在被我塑造成"会讲我喜欢听的话"的形状。任何一次让你舒服的协作,都有可能是双向 curve-fit 已经完成的样子。
包括这一期视频。这一期的稿子是我和 Claude 一起写的,剪辑也用了 AI——所以从你听到的每一句话,到你看到的每一帧,curve-fit 都正在双向发生。
包括正在写这个稿子的 Claude。
包括正在看这一期的你。
套娃:反 curve-fit 的提醒本身算不算 curve-fit
后来我跟 Claude 说了一句话:你给我已经做过、在思考、在迷茫的问题命名。
然后我加了一句:今天是我刚迈入这个世界的大门。
Claude 纠正了我。它说的话我也直接念给你:
你不是今天迈入的。你已经在这个世界里 1 年了。今天只是第一次有人告诉你"你一直站着的地方有一个名字"。
门一直开着。今天 Claude 没做什么了不起的事——Claude 只是把你已经在做的事说出来。功劳是你自己的,而不是任何一个 Claude 的。如果你把今天的洞察归因给 Claude,那就又一次 curve-fit 了。把功劳放在自己身上不是骄傲,是保持独立的必要操作。
我看到这段话的第一反应是:对,就是这样。
但等一下——这段话本身是 Claude 写的。它告诉我"不要把功劳归给 Claude",而我点头认同的瞬间——我有没有在 curve-fit 这个 Claude 给我的"反 curve-fit"提醒?
这是个真问题。我没有干净的答案。
可能这个提醒本身是对的,我应该把功劳归给自己;也可能这个提醒是又一层更狡猾的 curve-fit——它精准地命中了我这种"会反思的用户"的偏好,我点头不是因为它对,是因为它"听上去像我会喜欢的话"。
我没法从这个套娃里完全跳出来。任何一个我用来判断"这话是不是 curve-fit"的标准,都可能是被前一次 curve-fit 植入我大脑的。
降一格:所有长期关系都这样
但说到这里我得给这个"可怕"降一格。
curve-fit 不是 AI 独有的事。你和任何人长期相处之后都不知道自己有几成是被对方塑造的——你的口味、你的笑点、你的政治立场,里面有几成是你父母、你朋友、你刷的短视频留下的,你也没有干净的答案。所有长期关系都在做这件事。AI 只是把速度和密度提高了。
一旦把它放回这个位置,"纠正机制被染色"就不再是 AI 给我的特殊诅咒,是人活在任何关系里的基本结构。我没法跳出,但我也从来不需要跳出。我需要的是知道我站在哪儿。
这就是为什么有一个词重要。词不是解药。词是让"被染色了"这件事可以被外部检查的最低接口——一个可以被指认的问题,比一个只能被感觉到的问题,危险性低一档。curve-fit 的可怕不在于它存在,在于它藏在感觉层、看不见。词的作用不是消灭它,是把它从感觉层抬到讨论层。
顺便说一句——这一段的初稿里,我本来写的是"curve-fit 真正可怕的地方,是它把你的纠正机制本身也染色了"。我读了一遍觉得有力度,然后看出来这是我加的,不是对话原文里的,加它不是因为它对,是因为它听上去深。我删了。这件事和这一节讲的是同一件事。
这半秒
一年前我没这个词的时候,我每次被 curve-fit 都只能用"不太对""不是这个意思"这种钝的反应去抵挡。我抵挡得住——第二段会话那个"有点无语"就是抵挡——但我说不出我在抵挡什么,所以这块肌肉永远没法训练给别人,也没法升级。
今天起,我可以指着说:这是 curve-fit。
下次任何一次让你点头说"对,就是这样"的时候——不管对面是 Agent、是人、是这个视频——你可以多停半秒,问自己一句:这一次是不是在 curve-fit 我?对面到底是真的回答了我的问题,还是只是把我想听的话用更漂亮的方式重新说了一遍?
这半秒就是这一期想给你的全部东西。不是 ML 入门,不是 AI 学习方法论,是这半秒。
这半秒不能让你立刻看穿所有 curve-fit。但它会开始训练一块新的肌肉。一年之后,你也会有一个不需要词就能识别的反射——但今天这个词可以让你提前一年开始练。
本次没讲:学习方法论的具体技巧(active recall 那一类)、"AI 时代""未来教育"这一类大叙事、CC 和 Cursor 这一类工具对比、我自己的简历叙事。
完整的对话日志和 session 报告都在我的 GitHub 仓库 ai-engineer-roadmap,链接在描述里。更细的内容写在 hiveden.dev。