ZengLiangYi avatar
ZengLiangYi

博客

技术思考、实践总结与开源分享

01
订阅2026-06-101 min read

批量导入 1000 条对话的性能优化实战

本文分享了优化大规模对话导入性能的六个关键点,从最初1200条对话导入导致OOM崩溃,到最终实现1000条对话47秒完成导入的优化过程。主要优化措施包括:控制sql.js内存峰值、流式解析JSONL数据避免内存积累、导入期间暂停数据库自动保存、及时关闭源数据库实例、合理控制任务队列并发策略等。这些方法有效降低了内存占用,提升了导入效率,适用于需要处理大量对话数据的开发者。

02
订阅2026-06-101 min read

AI 编程工具对话管理方案对比

本文对比了Claude Code、Cursor、GitHub Copilot和Trae四种AI编程工具的对话数据管理方案,分析了它们在数据格式、可迁移性、搜索能力和知识提取方面的差异。Claude Code采用简单的JSONL文件存储,可迁移性最佳但缺乏内置搜索;Cursor和Trae使用SQLite数据库,结构化存储但导出复杂;Copilot采用JSONL快照,折中但存在数据冗余。文章指出数据可迁移性的长期价值在于支持工具切换、知识沉淀和跨工具关联,并介绍了ChatCrystal的统一格式翻译架构如何解决

03
订阅2026-06-091 min read

GEO 到底是不是噱头?我把这平台的两套优化机制都实测了一遍

本文探讨了CSDN「AI数字营销平台」中的GEO(生成式引擎优化)功能,分析了其与SEO的区别及重要性。作者通过实测验证了平台的两套GEO机制:内容生成时的自动优化勾选框和独立的GEO工具。测试发现,开启优化后内容更符合AI引用格式,但GEO工具的建议仍需更具体。文章肯定了平台将GEO与SEO并重的策略,并建议增加量化效果指标。作者强调GEO是AI时代内容可见性的关键,但效果验证需要时间观察。

04
订阅2026-06-091 min read

本地向量数据库选型:vectra vs chroma vs hnswlib

本文比较了本地优先项目中三种向量数据库(vectra、chroma、hnswlib)的选型考量。vectra作为纯JS实现,以零依赖、易部署的优势胜出,特别适合Node.js/TypeScript项目和小规模数据(千到万级)。chroma功能丰富但依赖Python,hnswlib性能卓越但需处理原生绑定。最终选择应基于项目约束:部署复杂度、技术栈匹配和数据规模。ChatCrystal因本地优先、零原生依赖的需求选择了vectra,虽牺牲了扩展性但完美契合其个人知识库场景。文章建议开发者根据自身需求(语言生态

05
订阅2026-06-091 min read

5 种 AI 对话数据格式全解析

本文分析了五种主流AI编程工具(Claude Code、Codex CLI、Cursor、Trae、Copilot)的对话数据格式及其解析难点。Claude Code采用简单的JSONL格式,但存在系统标签污染和嵌套工具调用问题;Codex CLI使用JSONL事件流,需要重建对话;Cursor和Trae采用SQLite数据库存储,前者通过键值对间接引用消息,后者以"任务制"组织对话;Copilot的JSONL快照格式规整但存在冗余存储。这些格式在存储结构、解析复杂度和元数据完整性方面差异显著,开发者需要统

06
订阅2026-06-081 min read

版本管理:npm 发布 + Electron 打包 + CI/CD

本文介绍了如何为同时提供npm CLI和Electron桌面端的开源项目搭建自动化发布流水线。主要内容包括: 双版本号管理:遵循SemVer规范,独立管理npm和Electron版本号,支持灵活发布模式。 一键发版脚本:通过release.mjs实现版本号更新、提交、打标签和推送,支持全量、仅npm或仅Electron发布。 npm发布优化:利用Trusted Publisher和--provenance参数确保安全发布,精简files字段控制发布内容。 Electron打包配置:通过electron-bu

07
订阅2026-06-081 min read

测试策略:单元测试 + 集成测试怎么写

本文介绍了如何为全栈TypeScript项目建立测试体系,通过测试金字塔模型(单元测试70%、集成测试适量、少量E2E测试)分层实施。以ChatCrystal项目为例,使用Node.js内置的node:test模块实现零依赖测试方案,涵盖纯函数单元测试(如正则清洗、文本分块、路径解析)、集成测试(sql.js内存数据库与Fastify路由测试)以及CI自动化。文章强调单元测试应快速验证函数输入输出,集成测试需关注模块协作,所有代码示例可在GitHub仓库查看。该方案适合追求轻量级、原生ESM支持的TypeS

08
订阅2026-06-061 min read

困扰我多年的“今天写啥“,被这个选题功能解决了大半

这篇文章测评了CSDN「AI数字营销平台」的「选题发现」和「热点洞察创作」功能。作者作为技术博主,认为选题是最痛苦的环节,而该功能通过实时热点推荐和结构化创作流程(选题→策略→大纲→内容)大幅提升了效率。亮点包括:AI领域热点精准且实时,四步流程保留创作者对大纲的掌控,默认优化SEO/GEO。但生成内容仍需人工润色,AI味较浓。建议扩展非AI领域热点、丰富策略选项、优化内容自然度。总体评价该功能能解决选题难题,值得一试。

09
订阅2026-06-061 min read

用了一周 CSDN 的 AI 数字营销平台,我把它从头到尾摸了个遍

CSDN推出的「AI数字营销平台」并非简单的AI写作工具,而是覆盖了从选题到发布的全链路内容营销解决方案。体验一周后发现,其亮点在于实时热点追踪(尤其AI领域)、SEO/GEO自动优化及多平台一键分发功能,大幅节省内容创作的前后期精力。但存在生成内容稳定性待提升、批量额度有限等问题。该平台更适合需要持续产出的技术博主或内容运营团队,对低频创作者可能过重。后续将分模块深入测评其选题、批量生产等核心功能。

10
订阅2026-06-061 min read

代码规范:ESLint + Prettier 配置实战

本文介绍了在TypeScript + React monorepo项目中落地Lint工具链的完整方案。重点内容包括: 采用ESLint Flat Config新格式配置客户端React/TS专项检查,整合TypeScript ESLint和React插件; 通过Biome(全仓库通用检查)和ESLint(客户端专项检查)双层架构实现职责分离; 处理Prettier与ESLint的规则冲突,建议使用eslint-config-prettier关闭冲突规则; 配置编辑器即时反馈和pre-commit hooks

11
订阅2026-06-061 min read

TypeScript 项目配置:tsconfig、ESM、路径别名

本文针对TypeScript工程化配置需求,详细讲解了在monorepo环境下管理多包编译的最佳实践。以ChatCrystal项目为例,展示了一个包含shared、server、client和electron四个子项目的配置方案。重点内容包括: 通过tsconfig.base.json实现基础配置共享 shared包采用零构建方案直接导出TS源文件 server包使用tsx实时转译的开发模式 client包采用Vite+Project References的三文件配置方案 关键配置项详解:target、mo

12
订阅2026-06-052 min read

AI Agent 时代的知识库应该长什么样

AI Agent时代知识库的六大核心能力 传统知识库依赖人工检索,而AI Agent需要具备自主记忆与知识调用能力。本文提出下一代知识库应具备的六大能力: 主动调用接口:通过MCP协议提供任务导向的语义搜索与结构化记忆工具; 自动写入与质量门控:LLM驱动的相关性、信息密度和重复性检测确保知识质量; 双向记忆循环:任务启动时自动关联历史知识,结束时沉淀新经验; 多源数据融合:整合不同AI工具产生的碎片化知识形成统一网络; 结构化知识图谱:建立笔记间的逻辑关系,支持深度推理; 离线可用性:本地化存储与计算保障

13
订阅2026-06-051 min read

从 RAG 到知识图谱:个人知识管理的演进

本文梳理了信息检索技术的四代演进:从关键词搜索(直接匹配但忽视同义和上下文)、全文搜索(引入分词和权重仍缺乏语义理解)、RAG与向量搜索(通过向量距离衡量语义相似性但无法表达结构化关系),到知识图谱(构建实体间关系网络实现关联推理)。作者提出混合架构解决方案——ChatCrystal结合向量搜索的语义召回、知识图谱的关系连接和LLM的推理能力,形成三层检索流程,并实现从被动搜索到AI主动记忆的转变。该架构通过自动化知识沉淀和智能关联,正在缩短信息与知识间的距离。

14
订阅2026-06-042 min read

本地优先 vs 云端:AI 工具的隐私之争

本文探讨了开发者在使用AI编程工具时面临的本地与云端方案选择问题。云端工具(如GitHub Copilot)提供开箱即用的强大模型能力和零运维成本,但存在数据隐私、合规风险及供应商锁定等问题。本地优先方案(如ChatCrystal)通过将数据保留在用户设备上,保障数据主权和低延迟,但受限于模型能力和硬件门槛。文章提出分层混合架构的折中方案:高频隐私敏感操作(如语义搜索)默认本地处理,复杂任务可选云端模型,同时保持核心数据本地存储。最终建议开发者根据自身场景(如行业合规要求、代码敏感度等)权衡选择,并始终明确

15
订阅2026-06-041 min read

AI 编程工具的数据格式为什么不能统一

不同AI编程工具(Claude Code、Codex CLI、Cursor、Trae、GitHub Copilot)采用差异化的数据存储格式(JSONL、事件流、SQLite等),根源在于各自的技术起点和设计优先级。ChatCrystal通过适配器模式(SourceAdapter接口)统一处理这些差异,将格式转换逻辑隔离在系统边界,实现多工具对话数据的标准化导入。该方案包含detect()检测数据源、scan()扫描元数据、parse()解析内容三个关键步骤,最终输出结构一致的ParsedConver

16
订阅2026-06-031 min read

MCP 协议到底解决了什么问题

MCP Server 通过});},return {},参数用 Zod schema 定义,MCP SDK 自动转换为 JSON Schema 发送给 Host。Host 的 LLM 看到工具描述和参数 schema,就能在对话中决定何时调用、传什么参数。MCP 是跨进程、跨应用的标准协议,而 Function Calling 是单次 API 调用内的工具定义。

17
订阅2026-06-031 min read

Vercel AI SDK 多 Provider 统一抽象

本文介绍了面向AI应用开发者的多模型服务商统一解决方案,重点分析了Vercel AI SDK和ChatCrystal的Provider工厂模式。文章首先指出开发者切换不同LLM/Embedding服务商时面临的接口不统一问题,随后展示了ChatCrystal支持的6种Provider类型及其特性。核心解决方案是通过Provider工厂模式(Map)实现模型创建的抽象化,并结合AI SDK的generateText、generateObject和embed等统一A

18
订阅2026-06-021 min read

vectra 本地向量搜索的实现原理

Vectra是一个轻量级本地向量数据库,采用纯TypeScript实现,无需外部依赖。它通过单文件JSON存储所有向量和元数据,支持内存内线性扫描和余弦相似度计算,提供事务式写入保障数据一致性。Vectra适合小规模应用场景,具有部署简单、透明可调试的特点,但存在全量加载、无近似检索等局限。在ChatCrystal中,Vectra与SQLite协同完成从向量搜索到结果展示的完整流程,满足个人知识库管理需求,但在大规模场景下可能需要迁移到专业解决方案。

19
订阅2026-06-021 min read

sql.js WASM 深度解析

本文介绍了如何在Node.js/Electron应用中使用纯WASM版本的SQLite(sql.js)替代原生编译方案。主要优点包括免编译安装、跨平台兼容性,虽然性能略低但足够应对单用户本地数据库场景。文章详细解析了sql.js的核心使用方案:内存模型(全量加载+手动持久化)、自动保存机制(定时30秒保存)、查询结果标准化转换、嵌套事务实现(通过SAVEPOINT),以及无ORM的Schema迁移策略。特别说明了处理外键约束重置的陷阱和开发/生产环境下的WASM文件定位方案,为开发者提供了完整的WASM S

20
订阅2026-06-011 min read

React Query + REST API 最佳实践

本文介绍了如何利用React Query构建React应用的REST API数据层。主要内容包括: React Query解决了传统useState+useEffect方案存在的缓存缺失、状态同步困难和竞态风险等问题 详细说明了QueryClient的配置参数(staleTime、retry等)及其最佳实践 设计了统一的API请求层,包括错误处理和开发环境代理配置 通过自定义Hook封装查询逻辑,实现代码复用和集中管理 介绍了queryKey的设计原则和条件查询的使用 展示了useMutation的写操作实

21
工具2026-03-143 min read

用 1300 行原生 JS 做了一个 Chrome DevTools 扩展

让前后端不再为接口报错截图扯皮——一个实用的 DevTools 面板扩展的设计与实现过程。

22
工具2026-03-112 min read

PPT Timer:一个置顶于PPT全屏放映之上的LCD倒计时器

如何用 Electron 实现一个始终置顶于 PPT 放映之上的透明计时器,解决演讲超时问题。

23
前端2026-03-102 min read

用 AudioContext.suspend()/resume() 作为流式音视频的同步门控

深入 Web Audio API,探讨如何用 AudioContext 的暂停/恢复机制实现流式音视频的精确同步。

24
前端2026-03-053 min read

React 事件订阅的稳定引用问题:从 useEffect 到 useEffectEvent

分析 React 中事件订阅的闭包陷阱,以及 useEffectEvent 如何优雅地解决稳定引用问题。

25
开源2026-03-022 min read

Git 仓库批量迁移:从 Gitee/GitLab 到 GitHub 的自动化方案

一键批量迁移数十个仓库,保留完整 commit 历史,支持双向迁移。

26
思考2026-02-203 min read

前端工程师的 AI 产品思维:从 Prompt Engineering 到产品设计

作为前端工程师,如何将 AI 能力融入产品设计,从提示词工程到用户体验的完整思考。