博客
技术文章与日常随笔。新文章写好 frontmatter 后会自动出现在下面,无需手动维护列表。
手写最小 WebSocket 封装:百行左右理解心跳、重连与消息分发
上一篇拆了项目里的真实封装,这篇把骨架亲手写出来——单例、topic 分发、心跳、重连与资源清理,再用实验看清“能发送心跳”和“能检测断线”的距离。
心跳、重连、回执、活跃状态:一个 WebSocket 封装到底替你扛了多少事
以真实项目中的平台 WebSocket 封装为样本,拆解消息协议、心跳、重连、回执与页面活跃状态,并说明它做到了什么、还缺什么。
AI 能改页面之后,谁为这次操作负责?
从删除客户的真实副作用出发,拆清 Tool Call、人工确认与业务事务的边界,并讨论权限、幂等、未知结果、审计以及 CopilotKit、Tambo 和手写动作桥接的责任。
消息数组够用吗?从 useChat 到对话运行时
从消息、part、run、thread、branch 和 persistence 六个对象拆解 AI 对话状态,并比较手写数组、AI SDK useChat、Ant Design X SDK 与 assistant-ui runtime 的责任边界。
一条 SSE 怎么长成 AI 消息:text、reasoning、tool 与 data part
从字节流到语义事件,再到稳定的消息 part,设计一套可演进、可去重、可恢复的 AI UI 消息协议。
AI UI 不能只测截图:三类状态的契约测试清单
用 reducer、协议夹具、组件行为和故障注入,验证 AI UI、对话与业务状态,而不是只检查最终截图。
刷新页面,回答还在生成:AI 对话的持久化与断线恢复
区分消息持久化、流重放与任务续跑,设计刷新、断网、多标签页和服务重启后的 AI 对话恢复链路。
UI 状态怎么管:流式回答为什么总让聊天页面乱跳
只讨论输入草稿、附件临时态、自动滚动、折叠和复制反馈这些 UI 状态,并对比 Ant Design X、AI Elements、MateChat、Deep Chat、NLUX、ChatScope 与 assistant-ui primitives 的边界。
AI UI 怎么选:先看三类状态归谁管
Ant Design X、assistant-ui、AI Elements、CopilotKit 看起来都在做聊天界面,真正的差别却是 UI 状态、对话状态和业务状态分别由谁接管。
多步 Agent 转圈 10 秒,答案砸脸上:AI 应用的等待体验设计
多步 Agent 最怕的不是慢,是“看起来死了”。节点级流驱动步骤进度,token 级流驱动打字机,两种粒度各管界面一块。
你的 AI 应用一发版,用户记忆全没了
MemorySaver 本质是进程内存里的一个 Map——后端一发版,所有用户的对话记忆瞬间蒸发。这不是体验瑕疵,是数据丢失事故。
手写 Agent 循环 vs LangGraph:框架到底替我做了什么
同一个 Agent,手写 for 循环和 LangGraph 各实现一遍摆在一起对账——不教框架,只回答"什么时候该上框架"。
大模型写的 SQL 为什么一跑就报错?一套 RAG 地基长出三个能力
RAG 系列完结篇:同一套检索器,换段 prompt 就能长出问答/SQL/报表三个能力,主角是"复用"。
前端也能搞懂流式输出:从 SSE 到打字机效果
只用原生 fetch + ReadableStream,从原理到代码实现"AI 一个字一个字往外蹦"。
前端也能搞懂 Agent:从 Function Calling 到自主编排
只用原生 JS 和一个 while 循环,把 Agent 从"听起来很玄"变成"我知道它每一行在干嘛"。
前端 RAG 工程化:混合检索 + 重排序 + 多轮
混合检索、规则重排序、多轮记忆三块工程化拼图,把"能跑"的 RAG 调成"能用"。
前端手写 RAG 踩坑实录:四个让检索"翻车"的坑
切块的两个极端、连接被重置、高分却答非所问——每个坑都附现象、排查、解法和背后原理。
前端也能搞懂 RAG:用 JS 手写一条最小检索增强链路
不调框架、不碰向量数据库,只用 100 来行原生 JS,把 RAG 从"听过这个词"变成"我亲手跑通过"。
模型缓存策略详解
从注意力机制出发,逐层推导 KV Cache 和 Prompt Cache 的工作原理与降本实践。