Skip to content

博客 ​

技术文章与日常随笔。新文章写好 frontmatter 后会自动出现在下面,无需手动维护列表。

📖 RAG 实战系列建议按顺序读

①最小链路 → ②踩坑实录 → ③工程化 → ④长出 SQL/报表,后一篇建立在前一篇之上;续集是 Agent 进阶。

手写最小 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 的工作原理与降本实践。

👀 本文阅读 ··· 次

基于 VitePress 构建

本站总访问量 ··· 次·访客数 ··· 人