- 博客(62)
- 收藏
- 关注
原创 一夜之间,1902个文件泄露:Cloud Code正在悄悄构建“AI操作系统”
源码泄露了,但方向不会变。AI的下一个形态,不是更强的模型,而是更完整的“存在方式”。它会记住你,会自己规划,会在你睡觉时“做梦”整理记忆,会调用多个Worker并行工作,会在崩溃后自动重启。它不再是“你问它答”的对话工具,而是一个驻留在你电脑里的、永远在线的智能体。这东西如果真跑起来,我们和AI的关系将被彻底重写。你怎么看?欢迎在评论区聊聊。下期见。
2026-04-01 13:34:20
1119
原创 项目实践|ETL Pipeline 完整解析:从多源文档到向量库的全链路实现
分块策略核心说明项目中的适用场景FixedSizeChunker(固定大小)按固定字数分块,简单高效简单文本、日志类文档(结构简单,无复杂语义)RecursiveChunker(递归字符分割)按换行、空格等分隔符递归分割,优先保证语义完整通用文档(如Word、Markdown,有明确的段落结构)SemanticChunker(语义分割)基于文本语义相似度分块,确保每个块的语义连贯复杂文档(如PDF论文、技术文档,语义关联性强)@Data@Builder// 管道唯一标识。
2026-03-31 19:28:12
736
原创 项目实践|MCP协议详解:让AI模型优雅调用外部工具的标准化方案
MCP(Model Context Protocol),即模型上下文协议,本质是一套让AI模型高效、标准化调用外部工具的通信协议,其核心定位是“统一工具调用的语言”,与大家熟知的Function Calling相比,它更注重标准化、可扩展性和工程化落地。标准化:统一工具定义、请求/响应格式、调用流程,解决不同工具调用接口混乱的问题,降低多工具集成成本;可扩展:支持工具的动态注册、按需调用,新增工具无需修改核心逻辑,只需实现对应接口即可;
2026-03-31 19:12:05
592
原创 阿里前高管深夜万字长文:AI的下一个时代,不是“想得更久”,而是“边做边想”
如果你觉得这篇文章对你有帮助,可以多听两遍、多读两遍。理解AI正在经历的这场底层变革,对你判断接下来怎么做产品、怎么用AI、甚至怎么规划自己的方向,都会有特别大的帮助。
2026-03-28 17:01:12
560
原创 Zustand 状态管理实战详解:轻量高效的React状态方案
Zustand的Store创建分为两步:先定义状态接口(TypeScript),再通过create方法创建Store并实现状态和方法。其中,接口定义是关键,它能保证状态的类型安全,避免开发中的类型错误。在TypeScript项目中,我们首先需要定义Store的状态结构,包括“数据状态”“UI状态”和“操作方法(Actions)”,让整个Store的结构清晰可见。// 先定义子类型(根据项目实际需求扩展)id: string;: number;// 未读消息数(扩展字段)id: string;
2026-03-27 13:48:56
553
原创 Ragent项目7种设计模式深度解析:从源码看设计模式落地实践
策略模式的核心是“定义一系列算法,将其封装起来,并且使它们可以相互替换”。它的核心价值在于解耦算法的定义与使用,使得算法可以独立于使用它的客户端而变化。在Ragent项目中,多通道检索是核心业务之一——需要支持意图定向检索、向量全局检索、未来可扩展的ES关键词检索等多种检索方式,且每种检索方式的启用条件、优先级、实现逻辑都不同,这正是策略模式的典型应用场景。工厂模式的核心是“封装对象的创建过程,根据参数决定创建哪种类型的对象”。
2026-03-26 15:08:07
685
原创 模型路由降级机制详解:基于断路器模式,实现高可用AI服务
obsidian在AI服务开发中,模型调用的稳定性是核心痛点之一——无论是第三方模型接口超时、限流,还是自建模型服务故障,只要单个模型异常,就可能导致整个AI服务中断,直接影响用户体验和业务连续性。为解决这一问题,我们设计了一套,通过多模型候选、断路器保护、首包探测等核心设计,实现“单个模型故障不影响整体服务”的高可用目标。本文将从“为什么需要降级”“整体架构”“核心组件源码解析”“流程图解”“实际场景”五个维度,全方位拆解这套机制,结合完整源码和通俗讲解,让开发者既能理解原理,也能快速落地应用。
2026-03-26 15:06:18
544
原创 会话记忆压缩策略揭秘,轻松解决Token爆炸难题
压缩算法是整个策略的核心,我们采用“增量摘要+范围控制”的思路,既保证摘要的准确性(不丢失关键信息),又提升压缩效率(避免重复处理已有摘要)。摘要的质量直接影响模型对上下文的理解,因此我们需要通过合理的Prompt设计和合并逻辑,确保摘要精准、简洁、不偏离原意。增量摘要的核心是“合并去重”,避免重复信息,同时保留新增内容。旧摘要:"用户询问请假流程,助手回答需要提前申请"新对话:用户:我想请年假助手:好的,请问您计划哪天开始?合并后:"用户询问请假和年假申请,计划开始日期待确认"
2026-03-25 17:05:09
606
原创 RAG系统性能天花板:多通道检索架构全解析(附代码与实践)
多通道检索作为RAG系统的核心环节,其核心思想是“并行协同、取长补短”——通过多个检索通道的协同工作,解决单一检索的精准度与召回率矛盾;通过插件化接口设计,实现灵活扩展;通过后置处理器链,保证结果质量。精准优先:有明确意图时,定向检索提升效率和精准度;兜底补全:无意图或意图模糊时,全局检索避免漏检;灵活扩展:新增通道无需修改核心代码,适配业务快速变化;质量可控:后置处理器链对结果进行提纯,提升用户体验。对于企业级RAG系统而言,多通道检索不是“可选功能”,而是“必选架构”。
2026-03-25 13:43:43
543
原创 RAG系统核心之意图识别与意图树实现全解析
意图识别:让LLM做“选择题”,通过置信度过滤和排序,找到最匹配的用户意图。意图树:用树形结构组织所有分类,通过数据库+Redis缓存,实现高效加载和灵活扩展。企业级应用优先选择“数据库+Redis缓存”的意图树实现方式,便于维护和扩展。Prompt设计要清晰,给LLM提供足够的节点描述和示例问题,同时设置低温度参数,保证意图识别的一致性。掌握了意图识别与意图树的实现,你就能搭建出更精准、更高效的RAG系统,为用户提供更优质的问答体验。
2026-03-24 17:14:25
771
原创 从零到一理解RAG完整链路:代码逐行拆解+实战解析
obsidian在大模型应用爆发的当下,RAG(Retrieval-Augmented Generation,检索增强生成)早已不是陌生概念——它解决了大模型“知识过期”“幻觉生成”的核心痛点,让AI能基于实时、精准的知识库内容生成回答,广泛应用于智能客服、文档问答、企业知识库等场景。但很多开发者面对RAG代码时,常常陷入“看得懂单个接口,却串不起完整链路”的困境:为什么要分8个步骤?每段代码在链路中承担什么角色?异步处理、流式输出这些细节到底有什么用?
2026-03-24 17:11:00
694
原创 详解RAG项目链路追踪实现:注解+AOP优雅搞定全流程监控
在对话接口的入口方法上添加@RagTraceRoot注解,作为链路的根节点,自动生成traceId并记录请求入口信息。@Autowired// 根节点:RAG对话入口@RagTraceRoot(name = "RAG对话", conversationIdArg = "conversationId", taskIdArg = "taskId")// 创建SSE发射器,用于流式返回结果// 调用业务方法,执行完整RAG流程。
2026-03-23 18:09:40
548
原创 SSE推送原理与落地实现
SSE是一种基于HTTP协议的服务器向客户端单向推送数据的技术,它打破了传统HTTP“请求-响应”的单向通信模式,允许服务端在没有客户端请求的情况下,主动向客户端发送数据。单向通信:仅支持服务端向客户端推送数据,客户端无法通过SSE向服务端发送数据,适用于“只需要服务端推送”的场景(如AI流式输出、实时通知)。基于HTTP协议:无需额外搭建独立的通信协议(如WebSocket的WS/WSS协议),可直接复用现有HTTP服务的端口、域名,降低部署和维护成本。自动重连机制。
2026-03-23 17:56:57
680
原创 并发编程面试实战:synchronized、volatile、Lock、AQS 应答技巧
很多候选人掌握了知识点,但面试时发挥不好,核心是“不会表达”“不会结合场景”。
2026-03-22 13:02:41
514
原创 并发编程常见问题排查与解决:从死锁到线程竞争的实战指南
Java并发编程的核心是“平衡效率与安全”,而死锁、线程竞争、线程泄漏,正是破坏这种平衡的三大核心问题。定位问题:结合jstack、VisualVM、AsyncProfiler等工具,从线程状态、锁持有情况、CPU耗时等维度,精准找到问题根源(死锁的循环等待、线程竞争的热点锁、线程泄漏的未终止线程)。解决问题:针对不同问题,采取差异化策略——死锁重点破坏循环等待、持有并等待条件;线程竞争重点减少锁竞争强度;线程泄漏重点规范线程生命周期管理。预防问题。
2026-03-22 12:38:53
454
原创 深度解析 Java 线程池:原理、源码与实战调优未命名
/ 线程池负载阈值(0.8表示负载超过80%触发扩容)// 拒绝次数阈值(超过10次拒绝触发扩容)// 拒绝次数计数器@Override// 拒绝次数+1// 打印过载日志。
2026-03-21 20:03:53
582
1
原创 并发编程常用工具类(下):CyclicBarrier 与 Phaser 的协同应用
CyclicBarrier 以“循环复用”为核心,解决了固定线程的多阶段同步问题,代码简洁、易用,适合场景相对简单的分阶段任务;Phaser 以“动态灵活”为核心,弥补了 CyclicBarrier 的局限性,支持动态注册/注销参与者、分层同步和自定义阶段逻辑,是复杂并发场景的首选。结合上一篇的 CountDownLatch 和 Semaphore,这四类工具类构成了 Java 并发协作的“工具箱”——它们底层都依赖 AQS 实现,但封装了不同的同步逻辑,适配不同的业务场景。
2026-03-21 19:37:19
550
原创 06并发编程常用工具类(上):CountDownLatch 与 Semaphore 的协作应用
CountDownLatch 和 Semaphore 是 Java 并发编程中最常用的两个工具类,它们基于 AQS 框架,封装了复杂的同步逻辑,让开发者无需深入底层,就能快速实现线程同步和资源限流。CountDownLatch:核心是“等待多线程完成”,通过一次性计数器实现线程间的同步协调,适合系统初始化、并发测试、多任务协同等场景;Semaphore:核心是“控制并发访问数量”,通过许可管理实现资源限流,适合资源池控制、接口限流、流量控制等场景。
2026-03-20 13:32:30
467
原创 AQS(AbstractQueuedSynchronizer)核心原理探索
AQS 是 Java 并发编程的“基础设施”,是连接底层同步机制与上层并发工具的桥梁。它的核心价值不在于自身能实现某种同步功能,而在于提供了一个通用的同步框架,让开发者无需重复实现复杂的排队、唤醒逻辑,只需专注于业务层面的同步规则。理解 AQS,不仅能让我们看透 ReentrantLock、CountDownLatch、Semaphore 等常用并发工具的底层实现,更能帮助我们领会 Java 并发编程的核心思想——“用状态控制访问权限,用队列管理等待线程”。
2026-03-20 13:18:27
825
原创 04Lock 接口及实现类详解:从 ReentrantLock 到并发场景实践
Lock 接口是 Java 并发包对“锁”机制的抽象封装,它将锁的“获取”与“释放”解耦为独立的方法,摆脱了 synchronized 对代码块、方法的绑定,为开发者提供了更精细的控制能力。与 synchronized 的“隐式同步”不同,Lock 采用“显式同步”,开发者需手动控制锁的获取与释放,这既是灵活性的体现,也对编码严谨性提出了更高要求。
2026-03-19 18:47:06
464
原创 synchronized 深度剖析:从语法到锁升级的完整演进
从 JDK 1.0 的重量级锁,到 JDK 6 的锁升级机制,synchronized 的进化史,就是 Java 并发性能优化的缩影。它的核心价值在于“简单可靠”——即使是新手,也能通过它快速写出线程安全的代码;而锁升级机制,则为它在高并发场景下的性能提供了保障,让它从“被嫌弃”的重量级锁,成为“性价比极高”的同步工具。偏向锁是“无竞争时的偷懒策略”,最大化减少无竞争开销,适配单线程场景;轻量级锁是“轻度竞争时的折中方案”,用自旋换取内核态切换成本,适配线程交替执行场景;
2026-03-19 18:35:04
552
原创 轻量级同步王者volatile:不止可见性,禁止重排才是它的隐藏大招
为了提高程序的执行效率,编译器(Java 编译器)和 CPU 会在不改变程序“单线程语义”的前提下,对指令的执行顺序进行重新排序。这种优化在单线程环境下是安全的,因为它不会影响程序的最终结果,但在多线程环境下,可能会导致逻辑错误。// 单线程环境下,指令重排不影响结果int a = 1;// 操作1int b = 2;// 操作2// 操作3。
2026-03-18 14:18:04
627
原创 Java 并发编程基础概念与常见问题梳理
进程:资源分配的基本单位,相互独立,开销大;线程:执行的基本单位,共享进程资源,开销小;一个进程可以包含多个线程,线程不能独立存在,必须依赖于进程。并发:交替执行,模拟同时,单核即可实现;并行:同时执行,真正同时,必须依赖多核;Java 并发编程的目标:在单核环境下实现高效并发,在多核环境下充分利用并行优势。Java 并发编程在现代软件开发中有着举足轻重的地位——它能充分利用硬件资源,提升系统性能和响应性,解决复杂业务场景下的并发需求,但同时也伴随着线程安全、死锁、活跃度等诸多挑战。
2026-03-18 14:07:03
439
原创 从零起步学习MySQL 第十六章:MySQL 分库分表的考量策略
把一张字段过多的表,按“高频字段”和“低频字段”拆分,拆成多张表,每张表只保留一部分相关字段,实现字段的“解耦”。-- 拆分前:user表(字段过多,访问频率差异大)user(id, -- 主键(高频)username, -- 用户名(高频)password, -- 密码(高频)phone, -- 手机号(高频)email, -- 邮箱(高频)avatar, -- 头像地址(低频,仅个人中心展示)address, -- 地址(低频)
2026-03-17 16:19:14
618
原创 从零起步学习MySQL || 第十五章:MySQL 可重复读隔离级别:它是如何工作的?是否完全解决幻读?
幻读(phantom read)指同一事务中,两次执行相同条件的查询,第二次查询结果中出现了第一次未查询到的“新行”(或缺失原有行),本质是查询集合级别的一致性问题,关注的是结果集中是否有新记录新增或原有记录删除。MySQL InnoDB 的 REPEATABLE READ 隔离级别,通过 MVCC 与 Next-Key Lock 的组合,在绝大多数业务场景下有效解决了幻读问题,是平衡数据一致性与并发性能的最优选择。
2026-03-17 16:09:12
617
原创 从零起步学习MySQL 第十四章:MySQL 事务中如何解决幻读问题
幻读:在同一事务中两次执行相同的查询,第二次比第一次多出(或少了)若干“行”(不是同一行被修改,而是出现/消失了整行记录),通常因为别的已提交事务插入或删除了符合查询条件的新行。示例:T1 的两次 SELECT COUNT(*) FROM orders WHERE status='PENDING',中间 T2 插入了 2 条符合条件的新行并提交,T1 第二次看到的数量变多——这就是幻读。在快照读中,ReadView 提供了事务开始(或语句开始)时的一致性视图;
2026-03-16 16:02:35
629
原创 从零起步学习MySQL 第十三章:MySQL 事务详解:原理、特性、并发问题与隔离级别
隔离级别脏读不可重复读幻读READ UNCOMMITTED(读未提交)允许允许允许READ COMMITTED(读已提交)禁止允许允许REPEATABLE READ(MySQL 默认)禁止禁止多数情况禁止SERIALIZABLE(串行化)禁止禁止禁止事务的本质:一组不可分割的数据库操作,要么全部成功、要么全部失败,是保证数据一致性的核心机制。ACID 四大特性。
2026-03-16 15:46:35
612
原创 从零起步学习MySQL第十三章:MySQL 事务详解:原理、特性、并发问题与隔离级别
MySQL 索引优化的核心不是 “建越多索引越好”,而是 “精准匹配业务场景,平衡查询效率和写入性能”。最后用一张表格总结核心原则和关键技巧,方便大家记忆和落地:维度核心原则关键技巧创建索引WHERE/JOIN/ORDER/GROUP 字段优先主键自增、唯一键保证唯一性,高频查询字段必建不建索引小表 / 高频更新 / 低区分度 / 少用字段索引选择性 < 0.1 不建索引,避免浪费空间优化技巧空间与效率平衡前缀索引(控制长度)、覆盖索引(避免回表)、主键自增(避免页分裂)避坑要点。
2026-03-15 13:52:55
617
原创 从零起步学习MySQL 第十二章:MySQL分页性能如何优化?
在 Web 应用中,分页是将大结果集分成若干页逐步返回给客户端的常见需求,最典型的场景就是商品列表、搜索结果、用户日志浏览、后台数据查询等。比如我们在电商平台搜索“手机”,会看到“第1页、第2页...”的分页控件,点击后只加载当前页的10-20条数据,这就是分页的应用。一键获取完整项目代码分页的核心价值在于“按需加载”:一方面可以节省网络带宽,避免一次性返回几十万、几百万条数据导致的网络拥堵;另一方面可以降低前端渲染成本,减少页面卡顿,提升用户体验。
2026-03-15 13:38:13
645
原创 从零起步学习MySQL 第十一章:MySQL 最常见 6 类索引失效场景
在 MySQL 数据库中,很多时候 SQL 的 CRUD 性能极差,并不是因为数据量真的大到无法处理,而是开发者对索引底层实现不够透彻,写出了让索引 “失效” 的 SQL。本文就带你一次性搞懂:MySQL 中最常见的 6 类索引失效场景,从到,再到,无论是日常开发优化,还是后端面试,都能直接用上。
2026-03-14 14:04:20
610
原创 从零起步学习MySQL 第十章:深入了解B+树及B+树的性能优势
B+ 树(B Plus Tree)是一种多路平衡查找树(Multi-way Balanced Search Tree),专门为磁盘存储场景设计,广泛应用于数据库和文件系统的索引结构。它并非全新的数据结构,而是对B树(B-Tree,注意不是B-树,两者无区别,只是写法不同)的优化和改进,解决了B树在范围查询、磁盘IO效率上的不足。与二叉树(每个节点最多2个子节点)不同,B+树的每个节点可以有m个子节点(称为m阶B+树),m的大小由磁盘页的大小决定——这也是B+树适配磁盘存储的关键设计之一。
2026-03-14 13:55:46
701
原创 从零起步学习MySQL 第九章:从数据页的角度看B+树及MySQL中数据的底层存储原理
解答:回表查询是指通过二级索引查询数据时,因二级索引叶子节点仅存储主键值,需要再通过主键到聚簇索引中查询整行记录的过程。避免回表的方法:使用覆盖索引,即创建的二级索引包含查询所需的所有字段(索引键 + 查询列),此时InnoDB可直接从二级索引的叶子节点获取所有查询数据,无需回表。示例:查询name='Tom'的age,创建索引,该索引覆盖了查询的name和age字段,可避免回表。InnoDB的数据存储遵循表空间-段-区-页-行的层级结构,页是最小的读写和存储单位,默认16KB;
2026-03-13 16:28:36
555
原创 从零起步学习MySQL 第八章:索引深入理解及高级运用
类型原则/技巧说明创建索引WHERE / JOIN / ORDER / GROUP 字段核心原则,提升查询效率不建索引小表 / 高频更新 / 低区分度 / 少用字段节省磁盘空间,避免拖慢写入性能前缀索引email(10)(取前N个字符)节省空间,需测试区分度(接近1最佳)覆盖索引查询字段全在索引中避免回表,减少IO,查询更快主键自增防止数据页分裂,写入性能最优NOT NULL索引列不应为NULL避免索引失效,提升查询效率索引失效函数、OR、%abc、类型不匹配等。
2026-03-13 16:08:34
599
原创 彻底搞懂Token:大模型的“翻译官”是如何炼成的?
简单来说,Token是Tokenizer对人类文字进行切分后,得到的最小语义单位,是连接人类语言和大模型数字运算的桥梁。举个最直观的例子:当你向大模型提问“马克喜欢人工智能吗”,Tokenizer不会直接把这句话整体转换成数字,而是先把它切分成4个Token:「马克」「喜欢」「人工智能」「吗」,再把这4个Token分别映射成对应的数字(也就是Token ID),最后把这串数字传给大模型。这里要重点区分3个概念,避免混淆:概念核心特点示例字人类语言的最小书写单位,无语义关联。
2026-03-12 16:51:43
398
原创 从零起步学习MySQL 第七章:初识索引底层运用及性能优化
索引是数据库中一种用于加快数据查询速度的数据结构,由存储引擎(如InnoDB、MyISAM)负责维护,独立于表数据存在,本质是“对表中一列或多列数据进行排序后的数据结构”。很多人误以为索引是“额外的表”,其实不然:索引是一种独立的存储结构,它存储了索引字段的值和对应数据的物理地址(或主键值),通过这种映射关系,MySQL可以跳过全表扫描,直接定位到目标数据的位置。联合索引会从最左边的字段开始依次匹配,只有按照最左的字段顺序使用索引,索引才会生效;
2026-03-12 16:32:29
447
原创 从零起步学习MySQL 第六章:MySQL数据库中的一条数据是如何存储的?
VARCHAR(n) 中的 n 表示字符数,不是字节数。例如:VARCHAR(10) 表示最多可以存储10个字符,不管每个字符占用多少字节(utf8mb4编码下,一个字符最多4字节)。MySQL 对单行数据的最大字节限制为65535 字节(这是InnoDB和MyISAM引擎的共同限制),这个限制包含:所有列的真实数据、变长字段长度列表、NULL标志位,但不包含记录头信息和隐藏列。因此,VARCHAR(n) 的最大取值,取决于编码格式(每个字符占用的字节数)和其他列的占用空间。
2026-03-12 16:20:15
545
原创 一文读懂RAG:从原理到落地,搭建智能知识库原来这么简单
看到这里,相信你已经对RAG有了全面的了解。其实RAG的核心逻辑很简单:用“检索”解决大模型的上下文限制、成本高、速度慢的痛点,用“生成”保证答案的流畅性和可读性,两者结合,让AI问答更精准、更高效、更可控。它不需要我们掌握复杂的数学知识,也不需要我们开发复杂的模型,只要理解核心流程,选择合适的工具,就能快速搭建属于自己的智能知识库或智能客服。随着技术的不断演进,RAG正从简单的“检索-生成”流水线,向多智能体协作、多模态融合的方向发展,未来会在更多领域释放价值。
2026-03-11 17:41:01
616
原创 从零起步学习MySQL 第五章:select语句的执行过程是怎么样的?
理解SELECT语句的执行过程,最终目的是为了优化查询性能。连接层优化:使用连接池(如Druid、HikariCP),复用长连接,避免频繁创建/销毁TCP连接;同时定期调用,解决长连接内存膨胀问题。SQL优化:使用EXPLAIN查看执行计划,确认优化器是否使用了合适的索引;避免使用SELECT *,减少字段读取和传输成本;优化WHERE条件,让优化器能选择最优索引。索引优化:建立合适的索引(主键索引、联合索引、覆盖索引),提升索引选择性;利用索引下推特性,减少回表次数;
2026-03-11 15:36:53
659
原创 从零起步学习MySQL 第四章:DQL查询全解析
DQL是MySQL中最核心、最常用的语言,从基础的SELECT查询,到条件、排序、分组、分页,再到多表连接、子查询,每一个知识点都对应着实际开发中的场景。对于新手来说,建议先掌握基础用法,多写SQL练习,再逐步学习优化技巧,理解执行顺序和底层逻辑。其实DQL并不难,只要多练、多思考,就能熟练运用,写出高效、规范的查询语句,为后端开发打下坚实的基础。后续我也会分享更多DQL优化技巧和实战案例,欢迎持续关注~
2026-03-11 14:06:15
611
原创 从零起步学习MySQL 第三章:DML语句定义及常见用法示例
DML 的全称是Data Manipulation Language(数据操作语言)DDL操作的是“数据库对象的结构”,而DML操作的是“表中的数据”,不改变表的结构本身。简单来说,DDL是“建房子”(搭建表结构),DML就是“住人、装修”(操作表中数据)。在MySQL中,DML语句的核心作用是对表中的数据进行增、删、改、查,也是我们日常开发中使用频率最高的SQL语句。
2026-03-10 16:29:29
1567
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅