当一个人开始亲手制造自己的替代者
前两天看了一篇文章,标题叫《我不得不把才华埋葬在昨天》。
一开始我以为又是那种“AI 会不会取代程序员”的老话题。这两年这类讨论已经多到让人疲劳:程序员还能干几年、哪些岗位最危险、以后是不是只剩下会用 Agent 的人。读下去才发现不太一样——作者就在 DeepSeek 做算子,而且参与了核心 Attention 算子的实现。
他不是站在旁边看 AI 变强,而是在亲手让它变强。更麻烦的是,他自己已经能感觉到:正在做的这件事,正在帮 AI 更快地学会取代自己。
前两天看了一篇文章,标题叫《我不得不把才华埋葬在昨天》。
一开始我以为又是那种“AI 会不会取代程序员”的老话题。这两年这类讨论已经多到让人疲劳:程序员还能干几年、哪些岗位最危险、以后是不是只剩下会用 Agent 的人。读下去才发现不太一样——作者就在 DeepSeek 做算子,而且参与了核心 Attention 算子的实现。
他不是站在旁边看 AI 变强,而是在亲手让它变强。更麻烦的是,他自己已经能感觉到:正在做的这件事,正在帮 AI 更快地学会取代自己。
前几天,DeepSeek v4.1 发布了,将小模型能力的高度又向上推进了一个档次。
AI 发展的速度远远超过了所有人的预期。从那个只会咿呀学语地聊天、上下文长度只有几千 token 的初版 ChatGPT,到具有推理能力的 OpenAI o1、DeepSeek R1 与 Kimi K1.5 Thinking,只不过短短两年;从推理模型到如今能够流畅地在各类 harness 工具中执行命令、完成复杂任务的智能体,也不过一年半。很难想象,倘若再等上一年、两年、三年,彼时的 AI 会成为什么样子,会有多么强大,会不会已经具备了自我进化的能力,并深度渗透进了具身智能等领域。
Anchr 最开始只有一条比较传统的 RAG 链路:用户提出问题,系统搜索相关内容,对候选结果重新排序,再把前几个片段交给模型,最后生成带引用的回答。
1 | 用户提问 → 检索 → 重排 → 构造上下文 → 生成回答 |
对大量事实型问题,这条链路已经够用。比如问“文档重新解析后,旧索引怎么处理”,只要知识库里有对应说明,一次检索通常就能找到主要材料,后面只需要把它们整理成一段连贯的回答。
但另一类问题不太一样:
找出几份设计文档里所有与任务恢复有关的内容,再比较进程重启、网络断开和主动取消三种情况下分别会发生什么。
这种问题很少能靠一个现成片段回答。第一次搜索可能只找到 Agent 运行恢复的说明;读完后才发现还涉及异步任务(Task);继续查 Task,又会遇到进程内状态和持久化状态的区别。等到核对部署约束时,对“恢复”的理解可能已经和第一次检索时不同。
下一步搜什么,开始取决于上一步读到的内容。Anchr 的 Agent RAG 就是从这个问题开始的。
最开始做 Anchr,我想解决的问题很具体:手里的文档越来越多,怎么才能把里面的信息重新找出来、用起来?
目录能解决文件放在哪里,系统自带的全文搜索则要求我还记得原文用过哪些词。资料少时这些都够用;资料一多,更常见的情况是:我记得某份文档讲过这件事,却忘了文件名,也不记得当时的表达。
Anchr 于是从文档搜索做起。搜索基本可用后,我才在检索结果上生成回答;再往后,当一次检索不足以处理跨文档问题时,才有了 Agent。功能名称从 Search 变成 RAG,再变成 Agent,背后却一直在做同一件事:让原始资源稳定地变成模型可以使用、用户又能回到原文核对的证据。
第一次接触 INTJ,很容易留下一个不错的印象。
他们通常说话有分寸,做事有条理,遇到问题也不太慌。该承担的事情会承担,不熟悉的领域很少随口评价,面对不同身份的人,也往往能保持差不多的礼貌。这样的相处并不热络,却让人觉得稳定、可靠。
但接触久了,有些人会察觉到另一面:礼貌还在,距离却一直没有缩短。
你可以和他共事,可以讨论具体问题,甚至会得到认真而坦率的建议,却很难自然地进入他的私人世界。那种疏离未必来自某次矛盾,也不一定是在表达不满。他只是没有因为认识得更久,就默认彼此应该更亲近。
这大概是理解 INTJ 时最容易被忽略的一点:礼貌是他对人的基本态度,亲近则要经过另一套标准。
如果只记得一张图的内容,却忘了文件名,怎么把它找出来?PicIndex 就是为了回答这个问题。
我用多模态 Embedding 把图片和文字映射到同一个向量空间。这样一来,搜索“赛博朋克风格的雨夜街道”或者“一只坐在窗边的猫”,系统就能按照画面语义找到相近的图片。功能跑起来以后,问题也接着冒了出来:图片里的订单号搜不准,大图调用模型太慢,同一个查询还会一遍遍地计算向量。
这些问题最后都没有靠换一个更强的模型解决。PicIndex 后来的大部分调整,发生在模型之外。
这世上有如此多的“流行语”和“最佳实践”,但是让我们把注意力转向更基础的方面。即——开发人员在浏览代码时所感受到的“困惑程度”。
困惑是以时间和金钱为代价的。困惑是由高认知负荷造成的。这不是什么花哨的抽象概念,而是一种人类的基本限制因素。
由于我们花在阅读和理解代码上的时间远远多于编写代码的时间,所以我们应该不断地问自己,我们是否在代码中嵌入了过多会给人带来认知负荷的内容。
很长一段时间里,我一直有一个困惑:为什么我们明明知道学习很重要,也有想要实现的目标,开始以后却总会拖延、分心,很难坚持太久?
以前,我很容易把这些问题归结为自制力不够,或者认为自己还不够努力。后来接触了一些认知科学和心理学的内容,我开始换一个角度理解这件事。学习的回报通常来得很慢,而短视频、游戏和美食都能迅速给出反馈。面对两者,大脑更容易被眼前的奖励吸引,并不奇怪。
理解这一点以后,我关心的问题也变了:学习是否一定要靠痛苦和意志力维持?能不能调整过程,让它变得自然一些,也更容易长期继续?下面这些,是我在学习和调整方法时留下的一些思考。
有一段时间,我经常想起一种变化:有些人明明一直很努力,却越来越觉得生活没有意义;也有人曾经对未来充满期待,在承受了几年持续的压力后,渐渐只想说一句“算了”。
这种变化有时会走向两个看似相反的方向。一种是否定:“努力有什么用,成功又有什么意义?”另一种是及时享乐:“人生这么短,为什么不先让自己开心?”于是,吃一顿好的、买喜欢的东西、玩游戏、看电影和旅行,开始比遥远的目标更有吸引力。
一个趋向虚无,一个转向当下,但它们也许共享着一部分来源:长期没有得到缓解的焦虑,以及随之减弱的掌控感。
这里所说的“虚无”,主要指日常生活中的虚无感,并不是要讨论完整的哲学意义上的虚无主义。我更关心的是:一个人为什么会从“我还想改变未来”,走到“做什么都没有意义”,或者“至少先抓住眼前的快乐”。
第一次接触 MBTI 时,我并没有太认真对待。人格测试很容易制造一种错觉:只要知道自己的类型,就能解释所有行为,甚至提前写好以后会成为怎样的人。
后来继续了解认知功能,我才觉得它有意思的地方并不在于给出答案,而在于提供了一套观察自己的语言。为什么我习惯提前考虑很远?为什么面对问题时,第一反应通常是分析原因,而不是表达情绪?为什么有些事别人很快就能放下,我却会在脑中反复推演?
这些问题当然不能完全由四个字母解释。成长环境、个人经历和所处阶段都会影响一个人。不过,在 INTJ 的描述里,我确实认出了一些熟悉的倾向。
按照常见的认知功能模型,INTJ 的功能顺序是:
这套模型可以被理解为一种观察框架:Ni 倾向于寻找规律和长期方向,Te 关心如何把想法落到现实,Fi 指向个人价值与感受,Se 则提醒人回到当下的具体经验。它不必成为固定标签,却能帮助我看见自己的惯性,以及那些容易被忽略的部分。