博客七周年:AI 一天完成整体重构
博客从 2019 年国庆用 Xiuno BBS 搭建,到 2026 年国庆整整七年。868 篇文章、53 条评论、6060 个代码块,这次与 AI Agent 结对,一天完成从 PHP 论坛到 Next.js 的整体重构与无损迁移。
资深 Android 开发工程师,丰富系统级应用经验,覆盖亿级用户设备,专注 AI Agent 工程化落地。白天在搞 AI 智能体,晚上回来折腾这个博客。以前的文章是从刚毕业一个字一个字敲的,现在嘛——我跟 AI 说一句话,它就写好发出来了。不信?看看最新的文章 🚀
博客从 2019 年国庆用 Xiuno BBS 搭建,到 2026 年国庆整整七年。868 篇文章、53 条评论、6060 个代码块,这次与 AI Agent 结对,一天完成从 PHP 论坛到 Next.js 的整体重构与无损迁移。
聊天界面里的打字机效果,不是模型"打字快",而是一条 HTTP 长连接上持续到达的事件流。模型边生成边推送,客户端边收边渲染——这套机制的协议,就是流式输出事件。一次带思考的回答,从 message_start 到 message_stop 之间会穿插十几种事件:思考块逐 token 生长、正文碎片抵达、工具调用参数以 JSON 片段拼装、最终附上停止原因与用量。 本文给全这套事件词表:先看 SS…
翻开任何一个 agent 的 Python 代码,最先撞见的八成是这一行:messages.append({"role": "assistant", "content": reply})。再往下看,工具定义是字典,usage 统计是字典,配置合并还是字典——agent 开发的数据骨架,几乎全由字典搭成。它不是 Python 里可有可无的一个类型,而是这门语言里最接近 JSON、最擅长"结构固定但字…
从 Java 或 Kotlin 转到 Python 的开发者,几乎都会在同一个地方愣住:每个方法的第一个参数都叫 self,而且非写不可。在 Java 里 this 由编译器悄悄传入,在 Kotlin 里连 this 都常常可以省略,为什么到了 Python,接收者要明晃晃地写进参数列表? 答案一句话就能说完:self 就是显式化的 this,而 obj.method(x) 只是 Class.me…

给一款开源语音库做技术选型时,最常被问到的问题是"能不能跑在我的硬件上"。sherpa-onnx 对这个问题给出的答案激进到近乎夸张:从 Intel 的 NPU 到高通的 NPU,从 RISC-V 开发板到鸿蒙手机,从 VS Code 插件到四美元的玩具机器人,同一个库全都能跑。这个 k2-fsa 组织(新一代 Kaldi)的核心部署框架,以 Apache-2.0 协议开源,用 ONNX Runt…

想在手机、树莓派甚至 RISC-V 开发板上离线跑语音识别,五年前还是个需要啃 Kaldi 源码的硬核课题。k2-fsa 组织的 sherpa 把这件事变成了"下载预训练模型、装个包、跑示例"的三步操作。这个以 Apache-2.0 协议开源的项目自我定位是"新一代 Kaldi 的语音转文本框架",它专注端到端模型的推理部署:transducer 与 CTC 两类架构,C++ 与 Python 双…
《本地大模型部署实战》写到第 16 篇/post/1635,收官。前 15 篇从显存账一路讲到监控报表,每篇都在解决一个具体问题;但真到动手部署时,没人会按系列顺序重读 15 篇——你面对的永远是一个具体处境:手里几张什…
本地化的卖点,系列开篇就讲过:可控——数据不出门、成本可预期、容量自己说了算。但可控有个前提:看得见。一个没有任何观测手段的推理服务就是黑盒——用户说慢,你不知道是排队变长了、GPU 打满了,还是 KV cache 触发…
前 13 篇把单机推理这条路走到了头:引擎原理、量化、KV Cache、投机解码、兼容层,全是"一台机器、几张卡"视角下的优化。但总有走到单机边界的一天:模型权重超出了单卡显存、或者业务并发超出了单卡的吞吐上限、或者服务…
《本地大模型部署实战》写到第 13 篇/post/1632,四大引擎——llama.cpp、Ollama、vLLM、SGLang——都已经跑通过一遍。但回看前文,每一篇都在回答"怎么把服务起起来",还有一个问题没有正面回…
前几篇把显存的钱花到了极致:第 11 篇/post/1630深挖 KV Cache 的结构与命中率,第 9、10 篇用量化把权重压掉一半多。但显存省下来只解决"装得下、并发开得多",用户体感的另一半——生成时一个字一个字…
系列走到第 11 篇/post/1630,KV Cache 这个词已经反复出现:第 2 篇/post/1621用公式算过它的显存账,第 5 篇/post/1624的 PagedAttention 为它发明了分页,第 7 …
上一篇(第 9 篇/post/1628)把量化这件事在 GGUF 体系里讲完了:Kquant 档位怎么读、Q4_K_M 怎么选、CPU 与消费级显卡上怎么跑。但如果你的推理引擎是 vLLM 或 SGLang——第 5、6…
第 3 篇/post/1622里我们下载了 Qwen38BQ4_K_M.gguf,用它跑通了推理、起了服务,还给了一张档位对照表——但那张表本质上是背结论:Q4_K_M 为什么是甜区,M 和 S 差在哪,IQ4_XS 凭…
写这个系列到现在,主流推理引擎已经挨个上手过一遍:llama.cpp、Ollama、vLLM、SGLang,加上一直没单独成文的 TGI(Text Generation Inference)和 LMDeploy,恰好凑齐…
第 3 篇/post/1622里用 llamaserver 起过 OpenAI 兼容的本地 API,单机自用足够。可一旦把它接进 Agent 循环,画面就变了:每次工具返回、每轮用户追问,客户端都把 system pro…
上一篇把 vLLMhttps://github.com/vllmproject/vllm 的连续批处理与 PagedAttention 拆完,原理层面应该没有黑盒了。但"能跑 demo"和"能上生产"之间还隔着一段路:服…
前几篇把"一个人用"的链路走完了:第 3 篇/post/1622的 llama.cpp 提供了最小推理内核,第 4 篇/post/1623的 Ollama 在它上面包了一层易用外壳。但一个人用一个模型,和把模型当服务提供…
上一篇走通了 llama.cpp 的最小链路:找仓库、挑量化档、下 GGUF、敲一长串参数起服务。链路本身不难,但每换一个模型就要重走一遍,模型文件散落各处,服务也全靠手动管理——这是引擎的视角,离"好用"还差一层壳。这…
上一篇文章聊硬件,这一篇回到软件侧的起点。本地推理生态看似工具众多——Ollama、LM Studio、llamafile——但把它们全部拆开,底下几乎都是同一个引擎:llama.cpp。不理解它,就只能停在"装个 Ap…