最近几个月一边写AI相关的项目一边摸各种技术,攒了一堆零散的感悟和踩坑总结,没有特别成体系的大主题,都是平时记在笔记里的碎点,整理出来反而发现各个领域的思路其实是通的。
读开源代码,先放弃逐行啃
之前读开源项目总喜欢从第一行代码开始逐行往下翻,拼拼图不看封面,只盯着单个拼图块看,最后看了几千行还是不知道整个系统到底是怎么跑起来的。
后来试了一套反常识的方法,效率直接翻了好几倍:先把项目全景地图拿到手,把核心功能跑通用一遍,再用AI梳理整体架构、核心调用链路、每个模块的边界定位,最后再动态打断点跟着调用链一步步走,把零散的模块串进主链路里。
最核心的一步是看完之后自己动手复刻MVP,先定义最小可行产品,砍掉所有非必要功能,搭架子、跑通主流程、逐个填充模块,一步一验证,最后对比自己写的版本和原项目的设计差异,搞懂人家为什么那么写,比死啃三天源码有用得多。
前端开发最玄学的问题,90%能两行命令解决
最近写前端生图项目的时候踩了无数次白屏的坑,摸出来一个万能排障公式:页面出了莫名其妙的异常,先执行 rm -rf node_modules/.vite 清掉Vite构建缓存,再跑 npm run dev -- --force 强制启动不使用缓存,之后浏览器按 Cmd+Shift+R 硬刷新清掉浏览器缓存,90%的莫名其妙的白屏都能直接解决。
别上来就去改代码,很多时候根本不是你逻辑写错了,就是缓存在搞鬼。另外部署到GitHub Pages的时候一定要记得在vite.config.ts里把base设为’./‘用相对路径适配,不然部署上去打开全是404,找半天找不到原因。
自己从零实现BM25,反而是更可控的选择
之前做RAG项目的稀疏检索,我没有直接用ES原生的BM25,也没有直接引第三方BM25库,而是从0自己手写了一套简化版的打分逻辑,很多人问我为什么放着现成的轮子不用。
原因很简单:第一,我需要离线评测脚本和Java线上服务的打分逻辑100%对齐,自己实现同一套tokenizer、同一套打分公式,Python和Java跑出来的分数完全一致,评测才可信,用黑盒的ES原生BM25两边参数根本对齐不了;第二,我的Dense+Sparse+RRF融合需要每一步的分数和排名都可访问、可解释,ES原生搜索只给你最终结果,不给你中间的打分明细,出了问题根本没法排查。
最后我甚至主动砍掉了IDF和长度归一化的逻辑,只保留TF累加,虽然功能简化了,但所有逻辑都在我的掌控里,比用黑盒但不清楚里面发生了什么要可靠得多。技术选型不是功能越多越好,你能完全控制的简单方案,很多时候比你摸不透的复杂方案更靠谱。
Agent的记忆设计,完全可以抄操作系统的思路
之前总觉得Agent的长期记忆是很玄乎的东西,要搞什么复杂的向量检索算法,直到看到OpenClaw的四层记忆设计,瞬间反应过来这不就是把操作系统的存储体系直接搬过来了吗:
- Bootstrap Files 就是硬盘,存永久的身份和规则,永远不会被压缩
- Session Transcript 就是文件系统日志,完整对话历史全量落盘,永远不会丢
- Context Window 就是内存,只有当前需要用到的内容才放进来,满了就触发压缩淘汰旧内容
- Retrieval Index 就是搜索引擎,不常用的内容存在这里,需要用的时候再按需加载进内存
根本不需要什么花里胡哨的黑科技,操作系统几十年前就已经把这套多级存储的最优解跑通了,直接照搬过来就够用。
MCP和Skills是天然的互补搭档
刚接触MCP的时候我还以为它就是用来做工具调用的,后来才想清楚两者的分工:MCP是标准化的连接器,相当于JDBC对于数据库的作用,统一了LLM和外部工具、外部数据源之间的调用协议,不用每个工具都单独写一遍接入逻辑;而Skills是能力的打包单元,把一整套SOP、操作流程、约束规则封装成独立模块,按需加载。
两者搭配起来之后,你新增一个外部工具只需要加一个新的MCP Server,新增一个场景能力只需要新增一个Skill文件,完全不需要去改Agent的主流程代码,整个系统的扩展性直接拉满。
大模型训练不是一次性完成的,是互相进化的
之前我以为大模型训练就是先准备好一整个数据集,一次性跑完训练就完事了,后来才了解到现在的主流训练路径是闭环的:先做SFT让模型学会基础指令遵循,再用GRPO强化学习优化推理能力,最后做多场景RL提升泛化和安全性。
整个过程不是「先准备数据→一次性训练模型」,而是训练模型→用更强的模型生成更好的数据→再训练模型→模型更强→再生出更高质量的数据,这样的闭环让模型和数据共同进化,完全避免了初始低质量数据拖后腿的问题。
很多技术其实底层思路都是通的,不管是写代码、做AI系统还是学新东西,小步迭代、慢慢优化、每一步都有正反馈,永远比想着一口吃成胖子靠谱得多。
