Archives
2026
11 月
- 模型的上下文到底由什么决定:从自注意力、KV Cache 到 1M 窗口 面试里被问「上下文是什么」,答「对话历史」只能算及格。这篇从「为什么旗舰模型停在 1M」倒推:上下文由谁敲定、自注意力怎么读它、KV cache 怎么复用、prefill/decode 为什么又慢又贵,最后给一套初级 Agent 面试能直接用的答法。
- 从一团噪声到一张图:文生图到底是怎么工作的? 文生图不是搜索,也不是模型照着画。它把提示词编码成条件,从随机噪声出发,在几十步里去噪,最后用 VAE 解码成图片。本文用尽量少的公式讲清扩散、CLIP、Latent Diffusion、CFG、DiT 和 Flow Matching,以及为什么模型仍然会数错手指。
- 机器人怎么从客厅走到卧室?一个纯 Python 家庭导航仿真 在一个 14×10 米的 2D 家里,让机器人从客厅走到卧室:占据栅格、粒子滤波、A*、DWA、PID,每一层都在回答一个问题。本文不堆公式,按一条完整的导航链路讲清家庭机器人是怎么「认路、看人、躲开、走到」的,也诚实说明它和真机、完整 SLAM 的距离。
10 月
- PostgreSQL 入门:AI 时代它为什么又火了,以及和 MySQL 的关键差异 AI 应用把 PostgreSQL 重新推回选型中心:pgvector 让向量和业务数据同库同事务,JSONB、全文检索、地理和扩展让一个库承担更多角色。本文不写操作手册,重点讲清 PG 的设计取向、和 MySQL 在 MVCC、存储、索引、复制上的关键差异,以及什么时候该选 PG、什么时候 MySQL 仍然更合适。
- Agent 实战(参考篇):Claude Code、pi、Codex、Gemini CLI 是怎么 compact 的 同一件事——上下文快满了——五套实现给出了五种答案:Claude Code 贴近上限才压、还会在缓存冷了之后清理旧工具结果;pi 保留最近 20k token,把摘要做成可迭代的检查点;Codex 保留用户原话、重写其余历史;Gemini CLI 在 50% 就压缩,还做二次校验;OpenCode 把摘要提前到后台算。本文按「触发、切点、摘要、注入、失败恢复」五个决策逐份对照源码,所有引用都带 commit 和文件路径。
- 分布式锁选型:一个扣库存场景,五种方案,以及那个不需要锁的做法 分布式锁的选型问题,第一问不是「Redis 还是 ZooKeeper」,而是「锁失效了,后果是什么」。这篇用一个「扣库存」场景走完五种方案——Redis、Redlock、ZooKeeper、etcd、数据库——沿途把 Redlock 那场著名争论的双方论点都摆出来,最后会发现:有一条 SQL 根本不需要锁。
- 向量数据库选型:先弄懂 HNSW 在算什么,再决定要不要上专用库 做 RAG 的第一个选型题,通常是「用哪个向量数据库」。这篇文章不列产品对比表——那类表最容易过时。它只做一件事:把向量检索的原理讲到你能自己估出「我的数据量下内存够不够、延迟什么量级、建索引要多久」,然后你会发现,在量过之前,默认答案就是 PG。
- 大模型训练笔记(三):LoRA、蒸馏与强化学习,以及你自己怎么上手 SFT 教会模型「怎么答」,但没教它「哪个答法更好」——因为 SFT 的 labels 里只有唯一那句标准回复。后训练要解决的就是这件事:LoRA 让它便宜、蒸馏让它抄得更多、DPO 和 PPO/GRPO/CISPO 让它从「比较」里学会偏好。这篇把这条链走完,最后给一条你真能上手的最短路径。
- 大模型训练笔记(二):预训练与 SFT,从词语接龙到听指令 「训练」在代码上是一段 22 行的循环,而「预训练」和「SFT」共用同一段循环、同一个 forward、同一行交叉熵——区别只在喂进去的 labels 长什么样。这篇把这两件事在代码层面剖开:loss 是个什么数字、为什么猜下一个词就能学会知识、以及 SFT 到底多做了什么。
- 大模型训练笔记(一):模型下载下来到底是什么,以及为什么它得靠显卡 你写 client.chat.completions.create(model="xxx") 的时候,那个字符串背后是一台机器上的一个文件夹。这篇把它拆开:里面四个文件各是什么、为什么叫「权重」、PyTorch 到底提供了什么、以及为什么这件事非得用显卡。用一个 64M、292 行代码就能读完的开源模型当参照物,标称参数量可以自己算出来验证。
- 摄像头怎么数人:实时区域人数统计入门,以及数字为什么会跳 需求很简单——摄像头对着会议室,实时告诉你有几个人。但从一帧画面到屏幕上那个数字,中间隔着六步。这篇不堆术语,就顺着这条链路走一遍:每一步为什么必须存在、它产出什么、下一步为什么需要它。读完了你会知道每个环节在干嘛,也知道数字跳的时候是哪里出了问题。
- Kafka、RabbitMQ、RocketMQ:场景、原理、选型与实战 三个消息队列的对比表到处都是,但表格回答不了"我该用哪个"。这篇按四层来讲:它们各自被用来干什么、底层是"队列"还是"日志"这两种世界观、六个问题决定选型、以及 Java 里三者写法的关键差异。顺带纠正三个被传抄多年的错误数字。
- 什么技术用什么通信:TCP、HTTPS、gRPC、MCP 的选型原理 同样是两个程序说话,为什么后端之间用 gRPC、浏览器与后端用 HTTP、Agent 调本地工具用 stdio、调远程工具又换回 HTTP?这篇文章不列协议清单,只回答一个问题:每种技术之所以用某种通信方式,是被什么问题逼出来的。从域名解析一路讲到 MCP,每一节都给可复现的验证方法。
- 微服务该怎么拆:边界、时机与落地路径 拆分微服务最容易踩的坑,是把「拆服务」当成「把代码拆小」。本文给出三个可操作的边界判据(按可靠性排序)、五条收益各自的前置条件、六种典型拆错方式,以及从模块化单体到物理拆分的完整落地路径;再讲清拆完之后两件最难的事——服务间怎么通信与共享数据(含 Outbox 与幂等这两个绕不开的环节),以及服务治理的四个层次。最后拆解 Prime Video「省下 90% 成本」这个被反复误读的案例,说明它到底证明了什么。
- AI 是如何识别一只猫的:最好懂的神经网络解释 神经网络支撑着今天这轮 AI 热潮。要理解它,只需要一张地图、一只猫,以及几千个维度。本文翻译 Quanta Magazine 的图解长文——原文的插图大部分是 Lottie 动画,这里按原位置还原。
- 电梯调度:LOOK、RSR 与目的楼层派梯 「我按了按钮,它为什么还不来?」电梯算法比看起来复杂。本文翻译 john.fun/elevators 全文,并把它的可交互演示移植成可以在页面里直接跑的版本——引擎与原站逐帧一致。
- Git Worktree:同一份仓库,同时签出多个分支 改到一半被人叫去修线上 bug,你是不是先 stash 再切分支?worktree 让你在同一个仓库上同时签出多个分支,各有独立的工作目录,不用 stash、不用等 checkout 重建文件。这篇讲它的来历、典型场景,以及底层到底怎么实现的——顺便解释为什么它几乎不占额外磁盘空间。
- MCP 实战(六):把这些零件拼起来,然后诚实盘一遍还差什么 系列收尾。把前五篇的零件拼成一条完整链路,然后诚实盘一遍:每一层换来的是什么、代价是什么,以及如果要拿去做真实项目,这套东西还差哪些部分。最后是我做完这一轮之后,对 MCP 这件事的三点判断。
- MCP 实战(五):给 MCP 加三道安全墙,以及为什么 prompt 不算安全边界 上一篇做完,东西能用了。但「能用」和「能安全地用」是两件事。这一篇给数据库 MCP 加三道墙,并用 12 个用例验证它们真的挡得住。核心结论只有一句:安全必须做在模型管不到的地方——靠 prompt 约束模型,本质上是在赌。
- MCP 实战(四):做一个能查数据库的 MCP,以及工具描述到底有多重要 前两篇的工具是玩具,这一篇换成真实场景——让 AI 用自然语言查数据库。做完之后我最大的体会是:模型看不见你的库,它 SQL 写得对不对,九成取决于你怎么描述表结构。写工具描述这件事,比想象中重要得多。
- MCP 实战(三):把 Claude 接进来,然后发现 agent 就是个 while 循环 上一篇链路跑通了,但决定调哪个工具的是你自己。这一篇把 Claude 接进来,让它来做这个决定。你会看到两件事:连接两者的桥接层只有 30 行,因为 MCP 和 Claude 用的是同一套 JSON Schema;而所谓 agent,剥掉所有包装就是一个 while 循环。
- MCP 实战(二):手写一个 MCP Server,故意不接大模型 这篇写一个能跑的 MCP Server 和一个能调它的 Client,全程不到 300 行——而且刻意不引入任何大模型。这不是偷懒,是为了让「MCP 是程序调工具的协议」这件事变得无法回避。等你亲眼看到一个没有任何 AI 的程序调用 MCP 工具,那个概念的混淆就再也不会发生了。
- MCP 实战(一):MCP 是什么,以及它和 Function Calling 到底是什么关系 给 AI 接工具这件事,过去是 N 个模型乘 M 个工具的排列组合。MCP 想把它变成加法。这个专栏用一套 Java 代码从零实现 MCP Server 和 Client,最后落到一个能用的只读数据库查询服务。第一篇先把概念理清——尤其是那个几乎所有人都会搞混的问题:MCP 和 function calling 到底是不是一回事。
- AI 应用开发面试笔记:RAG、Agent 与工程化全链路 面向 AI 应用开发岗的面试笔记:从 LLM 基础、Prompt 工程到 RAG、Agent、工程化与成本优化,一条主线的全链路高频考点与答题框架。
09 月
- 谈谈 Docker 的优缺点:一篇 2015 年的文章,与 2026 年的答案 一篇 2015 年的文章把 Docker 讲透了:镜像贯穿流水线、永远从空环境开始、Dockerfile 就是环境文档;代价是多一层复杂度、共享内核隔离弱、以及银行这类强监管领域的阻力。十年后回看,哪些被解决了、哪些纹丝不动、哪些换了形式——再补一整节「今天实际怎么做」:多阶段构建、distroless、BuildKit、供应链签名与准入控制,以及 Docker 在 2026 年的新战场:给 AI Agent 当边界。
- 把 5 万行 Java 移植到 Go:一份完整的实战复盘 一位承包商花 601 小时把 RavenDB 的 Java 客户端移植成 Go。他最大的时间开销不是架构设计,而是反转变量声明顺序;他用 HTTP 流量比对做差分测试;他当年写下「Go 还没有泛型」——而泛型方法直到 Go 1.27 才落地。本文是原文的完整中文翻译,逐节补齐 2026 年的现状勘误,并新增一整节:今天用 Go 1.27 重写这个客户端,会怎么写。
- RAG 实战(六):把散落的零件拼成完整项目 系列收尾。把前五篇的零件拼成一条完整链路,然后诚实地盘一遍:每一层优化换来了什么、代价是什么,以及如果要上生产,这套东西还差哪些部分。
- 异步编程(一):阻塞 I/O 与非阻塞 I/O 从「I/O 到底有多慢」讲起,拆开一次 socket 通信的两个阶段,再看阻塞、非阻塞、I/O 多路复用到底在哪儿等、为谁等;顺带厘清水平触发与边沿触发,以及为什么 asyncio 其实并不是真正的异步 I/O。
- RAG 实战(五):给 RAG 做量化评估 前四篇每次优化都靠「感觉变好了」,这一篇把它变成数字。检索指标可以精确计算,生成指标却必须借助 LLM 裁判——而示例代码里那两个生成指标只是占位实现,不能拿来当结论。
- RAG 实战(四):Rerank 重排序 粗排追求找全,精排追求找准,两者的模型结构就注定了它们不能是同一个。这一篇讲清 Bi-Encoder 和 Cross-Encoder 的本质差别,并用 Cohere Rerank 落地粗排-精排两阶段架构。
- RAG 实战(三):混合检索与 RRF 融合 纯向量检索漏关键词、纯关键词检索漏语义,两者的短板恰好互补。这一篇用 BM25 + 向量双路召回、RRF 融合排序,并说清 PostgreSQL 做中文全文检索绕不开的那个前置条件。
- RAG 实战(二):跑通最简 RAG 链路 不引入任何优化,先用 Spring Boot + Spring AI + pgvector 把「切分 → 向量化 → 检索 → 组装 Prompt → 生成」这条链路完整跑通,并且搞清楚每个环节在代码里对应哪几行。
- RAG 实战(一):RAG 是什么,以及环境怎么搭 大模型知道很多,但不知道你们公司的事。这个专栏用一套 Spring Boot + Spring AI 的代码,从最简链路一路做到混合检索、Rerank 精排和量化评估。第一篇先把 RAG 到底解决什么问题讲清楚,再把环境搭起来。
- Agent 实战(五):接上第二个 Provider 和 MCP,验证抽象到底成不成立 一个抽象只有一个实现时,你无法判断它是否成立。第五篇接入 Anthropic 协议和 MCP,实测发现两家的 input_tokens 语义并不一样,也实测出 MCP 这一层究竟抹平了什么、抹不平什么。
- Agent 实战(四):上下文管理,压缩历史为什么会让缓存失效 上下文是预算,不是容器。第四篇讲 token 估算、压缩策略和 KV 缓存的前缀匹配——以及一个意外发现:压缩会让缓存命中率掉下来,省下的 token 可能还不够赔的。
- Agent 实战(三):写工具与权限系统,让它从「能跑」变成「敢用」 给了 agent 写文件和跑命令的能力之后,第一个问题就是:它让你删库,你要不要照做?第三篇讲信任模型、风险分级、路径沙箱和危险命令拦截,以及为什么「每次都问一遍」最终会导致审批疲劳。
- Agent 实战(二):工具系统与核心循环,agent 的心跳在这里 「模型说要调工具,你执行完把结果喂回去」——这个循环是整个 agent 的心跳。第二篇实现 tool_use 循环、增量参数累积和虚拟线程并发,并踩中思考模式下 reasoning_content 必须回传的那个坑。
- Agent 实战(一):打通流式对话,把 SSE 一寸寸拆开看 流式输出看起来是个 UI 问题,实际是协议问题。第一篇从一次真实请求的原始数据流入手,手写 SSE 解析,把各家的协议方言归一化成一套统一事件——不引任何 agent 框架,全程只有 1 个第三方依赖。
- 系统扩展:从 0 到 1000 万用户 从单服务器到多区域单元化,系统扩展的七个阶段:何时该拆数据库、连接池该开多大、缓存与 CDN 的先后顺序、分片之前该穷尽哪些手段、微服务的真实动机,以及 CAP 如何按业务分而治之。
- Agent 实战(零):从零手写一个编码 Agent,先想清楚这六条铁律 用 Java 21 从零手写一个编码 agent,不依赖任何 agent 框架。总览这一篇讲清楚选型理由、实测的模型事实,以及贯穿全程的六条铁律——每一条都是踩过坑之后总结的,违反了会出很难查的 bug。
- Claude Code 多窗口配置思路:每个窗口,各配各的模型 每个 Claude Code 窗口各有分工,如何让它们各配各的模型?一份独立配置就能做到。
06 月
- Java - 网络与 IO 篇 用寄快递和点外卖的类比讲清网络与 IO:TCP 三次握手四次挥手、粘包与拥塞控制、HTTP/1.1 → 2 → 3、TLS 1.3、五种 IO 模型与 epoll、零拷贝、Reactor 与 Netty,以及线上的 TIME_WAIT、CLOSE_WAIT、端口耗尽排查。
- Java - JVM 篇 用一家餐厅的类比讲透 JVM:运行时数据区、对象的一生、垃圾回收算法与收集器、内存分配策略、类加载与双亲委派、JIT 编译,以及 CPU 100% / OOM / 内存泄漏的线上排查剧本。按 JDK 25 现状更新:G1 默认、ZGC 分代化、紧凑对象头。
- Java - 多线程篇 线程基础、synchronized、JMM、CAS、volatile、AQS、ReentrantLock、线程池、ThreadLocal、ConcurrentHashMap等核心知识点。
- Java - 集合篇 ArrayList、LinkedList、HashMap底层原理、扩容机制、寻址算法、死锁问题等核心知识点。
- Java - 消息中间件篇 RabbitMQ和Kafka的核心概念、消息可靠性、重复消费、死信队列、消息堆积、高可用等核心知识点。
- Java - 微服务篇 Spring Cloud 组件、注册中心、负载均衡、熔断降级、限流、分布式事务、接口幂等性等核心知识点。已按 2026 现状更新:Spring Boot 4.0 / Spring Cloud 2025.1、Nacos 3.x 的 MCP Registry、Resilience4j 与 Sentinel 的分工、Seata 2.x 与 XXL-JOB 3.x,以及 Transactional Outbox、去重表幂等、服务网格等新章节。
- Java - Spring 篇 Spring 单例Bean、AOP、事务失效、Bean生命周期、循环依赖、Spring MVC、自动配置、MyBatis等核心知识点。
- Java - MySQL 篇 MySQL 慢查询定位、索引原理、SQL 优化、事务 ACID 与隔离级别等核心知识点。
- Java - Redis 篇 Redis 缓存穿透、布隆/布谷鸟过滤器、RedisBloom、击穿、雪崩、双写一致性、持久化、分布式锁、集群等核心知识点。
- Java - 基础篇 补上其它几篇默认你已懂的「地基」:基本类型与装箱、String 与字符串池、equals/hashCode 契约、面向对象、异常、泛型擦除、反射与动态代理、SPI、Java 8 函数式,以及 JDK 9 → 25 的现状(record / sealed / 模式匹配 / 虚拟线程 / 结构化并发)。
- Java - 完整笔记(带图) Java后端完整学习笔记,包含Redis、MySQL、Spring、微服务、消息中间件、集合、多线程等核心知识点,附带大量图解。