- 博客(182)
- 资源 (5)
- 收藏
- 关注
原创 我将腾讯 ima 开源了,请看 Happy Friday Lite !
Happy Friday Lite 是一款基于 Electron + Vue 3 开发的桌面端个人知识智能助手。它集成了 AI Agent、RAG 知识检索、富文本笔记和日程日历功能,所有数据本地存储,注重隐私保护。核心功能包括: Friday 智能助手:基于 DeepAgent SDK + LangChain 构建,支持 12+ 工具和 HITL 确认机制 知识库管理:支持多格式文档处理,使用 Zvec 向量数据库实现 RAG 全流程 富文本笔记:基于 TipTap 编辑器,支持 AI 补全和版本历史 日
2026-08-20 22:58:56
403
原创 Codex安全盲区:代码漏洞生成实测
本文通过系统性测试,揭示基于GPT-3.5/4的Codex模型在代码生成任务中可能产生的安全漏洞盲区。我们将从SQL注入、XSS、命令注入、路径遍历、内存安全等维度进行实测分析,探讨AI辅助编程时代的新型安全挑战与应对策略。
2026-08-21 21:05:55
254
原创 Langchain.js 实战五:Agent 实战
文章摘要: Agent(智能代理)是大模型通过循环调用工具完成任务的技术架构,其核心公式为Agent = Model + Harness。Model作为"大脑"决策,Tools作为"四肢"执行,Harness(约束机制)通过提示词、工具和中间件控制大模型行为边界。文章通过LangChain实现了一个天气查询Agent,演示了基础调用、结构化输出和进度追踪功能,并强调中间件是定制Agent行为的关键。当前AI技术落地的核心仍是大模型(LLM)和提示词(Prompt)的组合运用。
2026-08-15 14:46:03
192
原创 Langchain.js 实战四:工具的使用
工具与智能体交互机制 工具作为Agent与外界交互的接口,通过明确定义的输入输出实现功能扩展。本文介绍了工具的核心概念、创建方法及高级应用技巧: 核心架构 工具三要素:名称(唯一标识)、描述(功能说明)、参数Schema(输入约束) 工作流程:用户输入 → Agent决策 → 工具执行 → 结果返回 → 生成响应 开发实践 推荐使用tool函数配合Zod进行声明式定义 描述编写需明确功能边界和使用场景 Schema通过.describe()增强模型参数理解 错误处理应返回可读信息供模型自我修正 进阶能力 通
2026-08-15 14:45:33
272
原创 Langchain.js 实战三: RAG 知识库增强搜索
LangChain 文档处理与语义搜索教程摘要 本教程介绍了使用LangChain构建语义搜索引擎的核心组件,主要包括: 文档加载器:支持多种文件格式(CSV、JSON、PDF、Word等),将不同来源的数据统一转换为Document对象,包含内容、元数据和可选ID。 文本处理流程: 使用文本分割器将长文档分块 通过嵌入模型将文本向量化 存储在向量数据库中实现高效检索 关键应用:特别适用于检索增强生成(RAG)场景,为LLM提供外部知识支持。 教程通过实际代码示例演示了文本文件和PDF的加载过程,展示了如何
2026-08-15 14:44:56
217
原创 Langchain.js 实战二:会话消息
本文介绍了LangChain中的消息系统,包括消息类型(SystemMessage、HumanMessage、AIMessage、ToolMessage)及其作用,并提供了实战演示代码。消息包含角色、内容和元数据,用于与语言模型交互。代码示例展示了如何创建和使用这些消息类型,包括多轮对话场景和工具调用场景(ToolMessage)。文章还说明了手动组装消息的方法以及不同消息类型的具体结构,帮助开发者理解如何与语言模型进行有效交互。
2026-08-15 14:44:18
207
原创 Langchain.js 教程一:快速入门
LangChain.js 是一个简化构建智能体和基于大语言模型(LLM)应用的工具库,支持对接多种主流AI平台。本文介绍了其安装配置和基础使用方法。
2026-03-14 22:55:59
1371
原创 Kubernetes的自我修复
Kubernetes使用一个专门的Service对象来为在Pod中运行的应用提供网络连接。它有另一个称为Deployment的专用对象,用于提供自我修复(self-healing)。事实上,Deployment也可以实现扩缩容和滚动更新。与Pod和Service对象一样,Deployment对象也是在YAML清单文件中定义的。下图显示了一个Deployment清单文件。它被做了一些标记,展示了容器是如何嵌套在Pod中的,以及Pod是如何嵌套在Deployment中的。容器提供操作系统和其他应用依赖。
2025-04-21 10:00:00
1204
原创 Kubernetes扩缩容与滚动更新
第14行和第15行强制Kubernetes一次更新一个Pod,运行机制是:第14行中maxSurge=1允许Kubernetes在更新操作中增加一个额外的Pod,期望状态需要5个Pod,所以Kubernetes可以在更新期间将其增加到6个;如果以后你编辑deploy.yml文件,指定一个容器镜像被更新过的版本,并重新发送给Kubernetes,你也会将副本的数量增加到10。在本节中,你将手动编辑Deployment YAML文件,将副本的数量增加到10个,并重新将其发送给Kubernetes。
2025-04-21 09:00:00
764
原创 Kubernetes 基本概念总结
Kubernetes是云原生微服务(cloud-native microservice)应用的编排器(orchestrator)。微服务:将大型单体应用拆分为若干个可以独立运行的服务,这些不同的微服务整体替代了大型单体应用的能力。云原生:云原生应用是具有弹性的、可以自动扩缩容的,并且可以在不停机的情况下进行更新。它们还可以在任何拥有Kubernetes的地方甚至是内部环境运行。
2025-04-20 02:11:34
1131
原创 重构艺术 | 内联与查询替代临时变量
在代码重构的殿堂里,临时变量常常扮演着双面角色:既是代码清晰的助力器,也可能成为代码腐败的温床。本文将深入探讨两种处理临时变量的重要手法:内联临时变量(Inline Temp)与用查询替代临时变量(Replace Temp with Query)。
2025-04-12 17:56:51
740
原创 重构艺术 | 如何优雅地“提炼函数“
在工作中总数遇到非常多的长代码,俗称“屎山”,这类代码读起来特别费劲。自己想重构一遍,但是总感觉缺乏经验指导,因此,多读书,读好书可能是最优解之一。读《重构改善即有代码的设计》有感,便写下此篇博客,积累经验!在软件开发的浩瀚星河中,函数是最基本的代码单元。当我们面对臃肿冗长的函数时,《重构》一书给出的第一剂良方便是"提炼函数"。这个看似简单的重构手法,实则是提升代码质量的关键转折点。
2025-04-12 14:57:48
1175
原创 Redis集群主从切换源码解读
主从切换方法中,既包括自动主从切换,也执行了手动主存切换的逻辑。类似代码,这里节点解释就是设置集群的标记,参数就是标记,然后在每次进入事件驱动库的主循环之前(理解为另外一个定时任务),都会调用。方法,这个方法主要是用于处理收到的请求,我们找到处理投票请求和手动切换请求的消息处理逻辑。定时任务,其详细注释的源码已经贴在下文了。设置为1,表示接下来的代码可以通过该标记直接执行主从切换逻辑。,找到如下代码,这里运行了一个定时任务,每隔100毫秒执行一次。设置手动故障转移的代码如下,假设在某个从节点上执行了。
2025-02-18 22:43:40
999
原创 生产Redis批量删除数据
生产Redis不能直接删除大量的Key,避免占用主线程阻塞正常业务,因此需要批量多次删除。一下代码经过生成磨炼,可以直接测试使用。
2024-11-28 20:49:19
857
原创 【Spring 底层原理】手搓一个Spring框架
最近工作接触到的知识比较底层,因此为了突破瓶颈,彻底搞明白Spring到底帮我们干了些啥。学习了很多关于Spring的知识,看了这么多资料能讲清楚的人不多,我将尝试将Spring的原理和读者讲明白。我们手写一个简单的Spring框架用于搞清楚其核心原理,这个手写框架我把它叫做Summer框架,平行时空的Spring框架。 追求高质量文章需要兄弟萌支持,一键三连!
2024-09-22 21:58:03
1815
原创 概念辨析(1)
注解表示该函数为事务方法,其中的操作要么全部执行成功或者全部不执行。如果一个所谓的“原子性函数”内部的实现并非真正的原子操作,或者存在其他可能导致线程不安全的因素(如共享了非原子操作的全局变量等),那么它就不是线程安全的。原子操作:原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch 线程切换。原子操作一定具备原子性,是线程安全的。具有原子性的函数或者方法并发一个原子操作不一定具备线程安全性。原子性:事务具有原子性,在一个函数上面加上。
2024-08-05 21:30:21
670
原创 Spring Core——资源加载与访问(Resource)
Resource接口为所有资源类型提供了一个通用的抽象,使得无论资源来自文件系统、类路径还是网络,开发者都可以通过一致的方式进行访问。通过使用这些实现类,开发者可以轻松地从不同来源获取资源,而不必担心底层的实现细节。总之,Resource接口及其实现类为资源访问提供了一种高度抽象和简化的解决方案,是Spring框架中一个非常有用的功能。Spring中将所有的资源抽象成了Resource对象,对于不同的资源类型有着不同的实现类,它为访问底层资源提供了一个统一的抽象,从而使得代码可以独立于实际资源的类型。
2024-07-28 23:56:48
1060
原创 Redis 关于内存碎片的解决方法
今天生产机报内存爆满异常被叫过去查看问题,通过各种排除最终定位到了Redis的内存碎片的问题,这篇博客将详细介绍Redis内存碎片问题并给出最佳实践解决此问题。
2024-07-18 21:53:17
2451
原创 映射器代理工厂
我们在使用Mybatis时,只需要写Mapper和Dao接口就行,使用的时候只需要调用Dao中的方法就能完成数据的增删改查。那么Dao中的方法是谁实现的呢?难道Mybatis自动帮我们写了一个Dao的实现类吗?非也!而是使用了映射器代理工厂来实现的。映射器代理工厂(Mapper Proxy Factory)在Mybatis框架中扮演着至关重要的角色。它是用来创建映射器接口的代理对象的工厂类,通过这个工厂类,可以实现对数据库操作的抽象和简化。
2024-07-14 12:55:14
669
原创 设计模式——多例模式(23种之外)
多例模式(Multiton Pattern)是一种特殊的设计模式,它属于创建型模式。与单例模式(Singleton Pattern)相比,多例模式允许一个类有多个实例,但是实例的数量是有限制的,并且这些实例在全局范围内是共享的。这种模式适用于当系统中有且仅有几个对象实例被频繁使用,且这些对象的创建和销毁开销较大时。在我的SpringBoot项目中遇到的一个问题,最后使用多例模式解决了。
2024-07-13 15:24:16
960
原创 RedisTemplate 中序列化方式辨析
在Spring Data Redis中,RedisTemplate 是操作Redis的核心类,它提供了丰富的API来与Redis进行交互。由于Redis是一个键值存储系统,它存储的是字节序列,因此在使用RedisTemplate时,需要指定键(Key)和值(Value)的序列化方式。不同的序列化方式适用于不同的场景。下面将详细介绍几种序列化方法。
2024-07-10 22:28:00
1870
原创 FactoryBean 原理简介
FactoryBean 首先是一个工厂类,它可以生产指定的Bean,特殊之处在于它可以向Spring容器中注册两个Bean,一个是它本身,一个是FactoryBean.getObject()方法返回值所代表的Bean。通过实现 FactoryBean 接口,你可以控制某个 Bean 的实例化过程,提供比默认机制更复杂的创建逻辑。
2024-07-03 23:32:00
1344
原创 ImportBeanDefinitionRegistrar 简单原理
ImportBeanDefinitionRegistr动态地向Spring应用上下文中注册额外的。这使得开发者能够在配置阶段根据特定条件或者逻辑动态地添加 Bean,而不是静态地声明所有的 Bean。那么应用场景是什么呢?在SpringBoot中我们定义一个Bean,只需要在类上面注解@Component即可,然后容器就帮我们管理了一个默认的单例Bean。那么,它就是借助来完成的。总结就是,当需要我们根据条件(这个条件可以是判断特定的注解、可以是是否是某个接口的实现等)来注册Bean时,我们可以使用来实现。
2024-07-02 12:32:37
1536
原创 BeanFactoryAware 机制简介
BeanFactoryAware 是 Spring 框架中的一个接口,它允许一个 bean 在其初始化时感知到其所在的 BeanFactory。这通常用于在 bean 内部进行一些高级配置或访问 Spring 容器中的其他 bean。
2024-07-01 14:23:25
1405
原创 Netty篇章(1)—— 核心原理介绍
Netty是一个Java NIO客户端/服务器框架,是一个为了快速开发可维护的高性能、高可扩展的网络服务器和客户端程序而提供的异步事件驱动基础框架和工具。如果要开发一个网络通信模块,那么Netty是首选,知名的Dubbo、Zookeeper、RocketMQ 网络通信模块全都是Netty实现的,我发现阿里的分布式框架网络通信模块很喜欢使用Netty作为网络通信框架。Netty的目标之一,是使通信开发可以做到“快速和轻松”。
2024-01-22 18:09:44
1230
原创 Java-NIO篇章(5)——Reactor反应器模式
Reactor就是一种网络编程的设计模式,如果不知道Reactor那么学Netty的时候会非常困难,因为很多概念就是Reactor,因此学会了Reactor在学Netty就非常简单。其次,懂得高并发中间件的网络通信设计的底层原理对提升自己的技术也是非常重要的,所以,学习像Netty这样的“精品中的精品”框架,肯定也是需要先从设计模式入手的。而Netty的整体架构,就是基于这个著名反应器模式。
2024-01-21 20:29:37
1749
原创 不同线程之间如何传参?
假设在主线程中的某个对象需要传入到另外一个线程中进行处理,那么两个线程之间如何传递参数?例如:主程序中有个字符串,使用异步子线程进行空格拆分,结果应该输出hello和world。
2024-01-21 20:25:06
953
原创 设计模式篇章(4)——十一种行为型模式
这个设计模式主要思考的是如何分配对象的职责和将对象之间相互协作完成单个对象无法完成的任务,这个与结构型模式有点像,结构型可以理解为静态的组合,例如将不同的组件拼起来成为一个更大的组件;而行为型更是一种动态或者具有某个动作触发的事件,具有一定行为的设计模式。现在不清楚没关系,学完23种设计模式再回头看就能理解了。行为型模式包括:模板方法模式、策略模式、命令模式、职责链模式、状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式共11种。
2024-01-19 14:30:39
1597
原创 Java-NIO篇章(4)——Selector选择器详解
选择器的使命是完成IO的多路复用,其主要工作是通道的注册、监听、事件查询。一个通道代表一条连接通路,通过选择器可以同时监控多个通道的IO(输入输出)状况。选择器和通道的关系,是监控和被监控的关系。 选择器提供了独特的API方法,能够选出(select)所监控的通道已经发生了哪些IO事件,包括读写就绪的IO操作事件。 一般是一个单线程处理一个选择器,一个选择器可以监控很多通道。所以,通过选择器,一个单线程可以处理数百、数千、数万、甚至更多的通道。在极端情况下(数万个连接),只用一个线程就可以处理所有的通道。
2024-01-19 13:25:08
2912
1
原创 Java-NIO篇章(3)——Channel通道类详解
Java NIO中,一个socket连接使用一个Channel(通道)来表示。对应到不同的网络传输协议类型,在Java中都有不同的NIO Channel(通道) 相对应。其中最为重要的四种Channel(通道)实现: FileChannel、 SocketChannel、 ServerSocketChannel、 DatagramChannel。
2024-01-18 14:01:18
2733
1
原创 Java-NIO篇章(2)——Buffer缓冲区详解
Buffer类是一个抽象类,对应于Java的主要数据类型,在NIO中有8种缓冲区类,分别如下: ByteBuffer、 CharBuffer、 DoubleBuffer、 FloatBuffer、 IntBuffer、 LongBuffer、 ShortBuffer、MappedByteBuffer。 本文以它的子类ByteBuffer类为例子讲解。ByteBuffer子类就拥有一个byte[]类型的数组成员final byte[] hb,作为自己的读写缓冲区,数组的元素类型与Buffer子类的操作类型相
2024-01-17 19:17:17
2088
原创 Java-NIO 开篇(1)
高性能的Java通信,离不开Java NIO组件,现在主流的技术框架或中间件服务器,都使用了Java NIO组件,譬如Tomcat、 Jetty、 Netty、Redis、RabbitMQ等的网络通信模块。在1.4版本之前, Java IO类库是阻塞式IO;从1.4版本开始,引进了新的异步IO库,被称为Java New IO类库,简称为Java NIO。 称“老的”阻塞式Java IO为OIO(Old IO)。总体上说, NIO弥补了原来面向流的OIO同步阻塞的不足。
2024-01-17 15:46:46
1500
原创 行为型设计模式——命令模式
将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理
2024-01-14 13:06:49
1393
原创 行为型设计模式——中介者模式
中介者模式主要是将关联关系由一个中介者类统一管理维护,一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,这是一种过度耦合的架构,即不利于类的复用,也不稳定。中介者模式又叫调停模式,定义一个中介角色来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。
2024-01-14 12:23:59
1217
原创 行为型设计模式——备忘录模式
备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原,很多软件都提供了撤销(Undo)操作,如 Word、记事本、Photoshop、IDEA等软件在编辑时按 Ctrl+Z 组合键时能撤销当前操作,使文档恢复到之前的状态;还有在 浏览器 中的后退键、数据库事务管理中的回滚操作、玩游戏时的中间结果存档功能、数据库与操作系统的备份操作、棋类游戏中的悔棋功能等都属于这类。
2024-01-13 22:49:49
1464
原创 行为型设计模式——观察者模式
观察者模式也不难,这个模式用大白话将就是若干个观察者类都订阅一个发布类(被观察者类),当发布者需要发表消息的时候,观察者都能够收到消息。定义:又被称为发布-订阅(`Publish/Subscribe`)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。
2024-01-12 15:31:29
1170
原创 行为型设计模式——状态模式
状态模式是比较简单的设计模式,它的主要作用是减少代码中大量的 if-else 或者 switch-case 等逻辑判断(俗称屎山)。它将每个状态定义为一个类,而每个状态类有自己对应的方法,因此当需要根据状态执行逻辑代码时不需要写大量的if-else判断是哪个状态然后执行对应的逻辑,而只需要创建某个状态对象,直接调用它对应的方法即可。定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。
2024-01-12 14:42:07
1399
原创 行为型设计模式——责任链模式
又名职责链模式,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。用大白话讲,就是一个任务,有多个处理类可以进行处理,但是多个处理类只有一个处理类可以处理它,这需要根据这个任务类的本身情况决定,因此需要将这个任务按照处理类的顺序进行处理,我们只需要将这个任务丢给第一个处理类即可返回结果,因为它如果无法处理会自动转交给下一个更强的处理类,一直找到合适的处理类为止,否则返回null。
2024-01-11 20:00:21
1468
hello-spring-boot-starter
2023-06-24
cascade.xml
2020-03-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅