- 博客(468)
- 资源 (6)
- 收藏
- 关注
原创 Agent智能体开发零基础入门概览
Agent代理,AI Agent 智能体代理,也被称为智能体,指的是可以代理自动执行完成一些任务的智能应用。时至今日,Agent,Copilot等概念并无明显区别,都指的是大模型驱动的智能应用。【1】大模型可以指导你如何回复邮件,Al Agent能帮你直接自动回复邮件【2】 大模型可以指导你如何编写SQL代码提数,Al Agent能直接帮你从数据库中提取数据【3】 大模型可以指导你如何设置关键词并进行搜索,Al Agent能直接链接互联网帮你搜索并整合结果;
2025-02-23 14:01:10
528
原创 【实践案例】基于大语言模型的海龟汤游戏
海龟汤”作为一种聚会类桌游,又称情境推理游戏,是一种猜测情境还原事件真相的智力游戏。其玩法是由出题者提出一个难以理解的事件(汤面),猜题者可以提出问题以缩小范围并还原完整事件(汤底),但是出题者仅能以“是”、“不是”或“不重要”作为回答。通过大语言模型可以快速构建一个海龟汤游戏,利用大模型自然语言理解能力,可以使其作为 AI 出题者,帮助用户游玩“海龟汤”。在传统的交互环境中,需要选择一个人作为出题者查看汤底来回答问题,这不仅影响了出题者的游戏体验,也限制了单人游玩的可能。【3】用户开始游戏,用户对话。
2025-02-03 21:49:53
1803
1
原创 【实践案例】使用Dify构建文章生成工作流【在线搜索+封面图片生成+内容标题生成】
使用Dify构建文章生成工作流,使用工具包括:使用 Tavily 执行的搜索查询,使用Flux生成封面图片,使用Stable Diffusion生成封面图片;使用文本大模型生成科普文章内容和标题信息。
2025-01-29 21:54:50
2581
原创 【实践案例】使用Dify构建企业知识库
在自然语言处理(NLP)中,文本的“几维表示方式”指的是将文本转换为向量时,向量的维度数,也就是这些数字表示的“空间”有多少个维度。在混合检索中,系统会先建立关键词索引和向量索引,在用户查询时,分别利用这两种检索方式获取最相关的文档,再将结果进行结合,以提供更加准确和全面的检索结果。RAG的核心思想是通过结合信息检索模型(通常是基于搜索引擎或者专门的检索模型)与生成模型(通常是基于Transformer的生成模型),使得生成模型在生成答案时能够利用外部知识库或文档,增强其生成能力和准确性。
2025-01-29 12:37:39
5168
1
原创 LangChain快速入门示例
可以直接调用LLM的invoke方法,并传入问题作为参数。此外,还可以通过提示模板(prompt template)生成提示词,用于向模型(LLM)发送指令。LangChain可以选择使用多种类型的集成包,这里为了测试方便使用的是通义千问,使用前需要获取API密钥,具体如何获取可以在网上搜索下。LLM的输出通常是一条消息,为了更方便处理结果,可以将消息转换为字符串。要安装LangChain,可以使用Pip和Conda进行安装。在使用LangChain之前,需要导入LangChain x 集成包。
2025-01-26 12:46:42
377
原创 LangChain快速入门与底层原理
LangChain 是一个开源的 Python AI 应用开发框架, 它提供了构建基于大模型的 AI 应用所需的模块和工具。通过 LangChain, 开发者可以轻松地与大型语言模型 (LLM) 集成, 完成文本生成、问答、翻译、对话等任务。LangChain 降低了 AI 应用开发的门槛, 让任何人都可以基于 LLM 构建属于自己的创意应用。LangChain 框架由几个部分组成,包括:●LangChain 库:Python 和 JavaScript 库。
2025-01-26 12:44:40
964
原创 【大模型】提示词工程——12个提示词技巧整理
AI大语言模型融入了人们的日常工作、学习和生活,学习如何用好新的AI工具已经成为每个人的必修课。但是,对于一些稍微复杂的实际问题,AI大语言模型的回答却很不稳定,经常偏离问题甚至完全错误,主要原因就是问题(提示词)写得不好。事实证明,使用恰当的提示词,可以使AI大语言模型解决问题的效果提升数倍甚至数十倍。在每次与AI大语言模型的流畅对话中,提示词都起着至关重要的作用。
2025-01-18 20:28:16
5458
原创 系统开发迭代中的灰度设计工具选型与应用
灰度发布(Canary Release 或 Blue-Green Deployment)是指通过对新功能或版本的发布进行流量控制,使得新版本只对一小部分用户进行推送,然后逐步扩大用户群体,最终完成全面发布。灰度发布通常具备以下几个特点
2025-01-18 12:28:37
789
原创 【Arthas命令实践】heapdump实现原理
ManagementFactory 是 Java 的标准类库,用于获取 JMX(Java Management Extensions)相关的管理接口和 MBean。这个方法的作用是使用 HotSpotDiagnosticMXBean 来调用 JVM 的原生堆转储功能,并将堆转储文件保存到指定路径。live:指示是否只转储存活对象(true 表示只转储存活的对象,false 则转储整个堆,包括未被引用的对象)。fileName:指定堆转储文件的保存路径和文件名。该路径是生成的堆转储文件将保存到的位置。
2025-01-09 22:03:28
467
原创 【MyBatis源码】从0到1手写自定义 MyBatis 框架
本文将基于之前的源码分析和开源文章构建一个简化版的MyBatis框架,帮助大家更好地理解MyBatis的工作原理,并掌握自定义ORM框架的基本步骤。mybatis-config.xml 是 MyBatis 的全局配置文件,用于定义 MyBatis 的各种配置选项,如数据库连接信息、事务管理、缓存、插件、Mapper 的扫描等。Executor 是执行 SQL 语句的核心组件,负责将映射的 SQL 语句发送到数据库,并处理查询结果。执行器是 MyBatis 核心的一部分,处理实际的数据库操作。
2025-01-06 22:40:16
1061
1
原创 【MyBatis源码分析】Spring与MyBatis整合深入解析
MapperScannerConfigurer 是 MyBatis-Spring 框架中的一个非常重要的组件,它帮助开发者自动扫描并注册 MyBatis 的 Mapper 接口。通过 MapperScannerConfigurer,我们不需要手动配置每一个 Mapper 接口的 Bean,而是通过配置扫描路径,自动为每个接口创建代理实例,并将其注册为 Spring 的 Bean。
2025-01-01 19:19:21
1217
1
原创 SqlSession的线程安全问题源码分析
ExecutionPlaceholder.EXECUTION_PLACEHOLDER 是一个查询标记,这个占位符可以避免在查询缓存时出现“脏读”,当多个线程同时查询同一个 key 的缓存,线程 A 还在数据库查询过程中,线程 B 也开始查询相同的 key,但此时线程 A 还没完成查询,缓存中的数据尚未更新,假设此时是同一个 SqlSession,因为cacheKey 是一模一样的,线程B会去一级缓存中取值,取出的数据就是旧的值。SqlSession 中包含了对事务的管理,事务在数据库连接上下文中是绑定的。
2025-01-01 15:08:28
1010
原创 Mybatis 为什么不需要给Mapper接口写实现类,为什么要使用代理而不是硬编码?
在 MyBatis 中,使用代理的方式相比于直接在方法内部获取 namespace 对应的 XML 并解析 SQL,具有几个显著的优点。虽然通过手动解析 SQL 也能实现功能,但代理机制的使用带来了更多的灵活性、简洁性和可维护性。
2024-12-30 21:38:25
1571
2
原创 【MyBatis源码分析】使用 Java 动态代理,实现一个简单的插件机制
通过使用 Java 动态代理,我们可以实现一个灵活的插件机制,允许在运行时动态地拦截和增强目标对象的方法。这个机制非常适合用于类似 MyBatis 的插件系统,可以方便地在目标方法执行前后加入自定义逻辑,而无需修改目标对象的代码。通过这种方式,可以轻松扩展系统功能,增强代码的可维护性和灵活性。
2024-12-21 21:36:06
579
原创 MyBatis主键自增回填功能源码分析
*** 针对Sequence主键而言,在执行insert sql前必须指定一个主键值给要插入的记录,* 如Oracle、DB2,KeyGenerator提供了processBefore()方法。*//*** 针对自增主键的表,在插入时不需要主键,而是在插入过程自动获取一个自增的主键,* 比如MySQL、PostgreSQL,KeyGenerator提供了processAfter()方法*/
2024-12-21 16:11:23
765
原创 MyBatis通过注解配置执行SQL语句原理源码分析
parseStatement 方法是 MyBatis 中 MapperAnnotationBuilder 类的一个重要方法,用于解析 Mapper 接口中的 SQL 注解(如 @Select、@Insert 等),并根据注解创建 SqlSource 和相关的 SQL 配置(MappedStatement)。parse() 方法的功能是遍历 Mapper 接口中的每个方法,解析其中的 SQL 注解,并将对应的 SQL 语句注册到 MyBatis 的配置中,使得接口方法能够直接执行对应的 SQL 语句。
2024-12-20 22:48:57
1090
原创 解决MyBatis在 Oracle 中使用 IN 语句不能超过 1000 问题
在 Oracle 数据库中,IN 语句常用于查询某个字段是否属于一组特定的值。对于大多数开发者而言,IN 是一种简单直观的查询方式,能够提升开发效率,避免过多的 OR 语句。然而,许多人在使用 IN 语句时可能遇到一个问题,即查询中的 IN 子句无法处理超过 1000 个元素。这一限制是 Oracle 数据库的内在设计问题,虽然不常见,但一旦遇到,可能会造成应用程序崩溃或性能问题。
2024-12-15 13:01:57
1024
原创 【MyBatis源码】transaction包JdbcTransaction和 ManagedTransaction源码分析
MyBatis的transaction包是负责进行事务管理的包,该包内包含两个子包:jdbc子包中包含基于 JDBC进行事务管理的类,managed子包中包含基于容器进行事务管理的类。事务功能是由数据库提供的。以 MySQL 数据库为例,MySQL 主要有两种引擎:MyISAM和 InnoDB。MySQL默认操作模式就是自动提交模式。在这种模式下,除非显式地开始一个事务,否则每个查询都被当作一个单独的事务自动提交执行。
2024-12-04 21:33:32
691
原创 【MyBatis源码】详解datasource包,DataSourceFactory,数据库连接池
在数据库连接池中,activeConnections(活跃池)是用来存储当前正在被应用程序使用的数据库连接的容器。在 MyBatis 的 PooledDataSource 中,activeConnections 是一个关键的成员变量,它通过管理活跃连接来优化数据库连接的使用效率,并且帮助处理连接的获取、释放及生命周期管理。
2024-12-03 20:33:12
1221
原创 【MyBatis源码】异常拆包工具ExceptionUtil
ExceptionUtil 是一个异常工具类,它提供一个拆包异常的工具方法unwrapThrowable。该方法将 InvocationTargetException 和UndeclaredThrowableException 这两类异常进行拆包,得到其中包含的真正的异常。/*** 异常拆包工具*//*** 将 InvocationTargetException 和UndeclaredThrowableException 这两类异常进行拆包,得到其中包含的真正的异常。*/} else {
2024-12-01 20:05:11
503
原创 MyBatis异常体系中ErrorContext和ExceptionFactory原理分析
该类是负责生产 Exception的工厂。ExceptionFactory类只有两个方法。构造方法由 private修饰,确保该方法无法在类的外部被调用,也就永远无法生成该类的实例。通常,会对一些工具类、工厂类等仅提供静态方法的类进行这样的设置,因为这些类不需要实例化就可以使用。wrapException方法就是 ExceptionFactory类提供的静态方法,它用来生成并返回一个RuntimeException对象。
2024-12-01 20:03:17
1352
原创 自定义MyBatis分页插件和自定义慢SQL统计插件实践
在 MyBatis 项目中,自定义分页插件是一种灵活且高效的方式,用于满足项目的分页需求。实现思路• 拦截 SQL 执行利用 MyBatis 的插件机制,通过拦截器对 StatementHandler 进行拦截,修改原始 SQL,加入分页逻辑。• 动态拼接分页语句根据数据库类型(如 MySQL、Oracle 等),拼接对应的分页 SQL。• 设置分页参数使用 ThreadLocal 或其他方式传递分页参数。
2024-11-25 21:37:27
947
原创 MyBatis插件原理及应用
MyBatis框架在应用启动时会对标签进行解析。MyBatis 的 XMLConfigBuilder 类是用来解析 MyBatis 配置文件的核心组件之一,其中 pluginElement() 方法的主要功能是解析 标签,并将其中定义的插件实例化后添加到 MyBatis 配置中,形成插件链
2024-11-25 21:34:24
987
原创 FeatureProbe用户稳定进入灰度组原理代码实现
大部分情况下,我们希望在一个功能的灰度放量过程中,某个特定用户一旦进入了灰度放量组,在灰度比例不减少的情况下,总是进入灰度组。在FeatureProbe或类似的灰度发布系统中,实现『用户稳定进入灰度组』的核心在于稳定的用户分流策略,即确保同一用户在同一灰度比例下,始终能被分配到固定的组。使用用户的唯一标识(如 userId 或 uuid),通过哈希算法生成一个固定的值,从而决定用户是否进入灰度组。通过结构可以看到项目的key,走的灰度是一样的,即使调整了灰度百分比,结果也是一样的。
2024-11-21 23:02:58
634
原创 【MyBatis源码】MyBatis缓存机制源码分析
MyBatis提供了一个配置参数localCacheScope,用于控制一级缓存的级别,该参数的取值为SESSION、STATEMENT,当指定localCacheScope参数值为SESSION时,缓存对整个SqlSession有效,只有执行DML语句(更新语句)时,缓存才会被清除。MyBatis的一级缓存,用户只能控制缓存的级别,并不能关闭。需要注意的是,PerpetualCache类重写了Object类的equals()方法,当两个缓存对象的Id相同时,即认为缓存对象相同。
2024-11-18 22:09:55
717
原创 【MyBatis源码】MapperRegistry详解
MapperAnnotationBuilder#parse 是 MyBatis 中用来解析 @Mapper 接口中注解的方法,它的作用是扫描并处理 @Select, @Insert, @Update, @Delete 等 SQL 操作注解,生成对应的 MappedStatement 并将其注册到 Configuration 中。语言驱动用于解析 SQL 语句,可以是注解中的 SQL,也可以是 XML 配置中的 SQL。
2024-11-17 15:49:56
887
原创 【MyBatis源码】SqlSession执行Mapper过程
通过每次调用 getMapper 创建新的代理对象,MyBatis 可以确保每个 SqlSession 使用的是独立的代理实例,避免不同的会话之间共享相同的代理对象,从而保持隔离性。如果直接存储代理实例,则每次获取时只能使用已创建的代理,无法实现这种灵活的控制。【1】 代理类的创建开销:如果在 addMapper 时就直接将代理类实例化并存入 knownMappers 中,这意味着每次添加 Mapper 时都会实例化一个代理对象,这在某些情况下是不必要的,尤其是在大规模的应用程序中,可能会增加性能负担。
2024-11-17 12:32:33
906
原创 【MyBatis源码】深入分析TypeHandler原理和源码
TypeReference 类是 BaseTypeHandler 的父类,因此所有的类型处理器都继承了TypeReference 的功能。这意味着对任何一个类型处理器调用getSuperclassTypeParameter方法,都可以得到该处理器用来处理的目标类型。
2024-11-12 22:25:38
1240
原创 【MyBatis源码】StatementHandler详解
BaseStatementHandler是一个抽象类,封装了通用的处理逻辑及方法执行流程,具体方法的实现由子类完成,这里使用到了设计模式中的模板方法模式。使用PreparedStatement实例执行SQL语句时,可以使用“?Statement接口中定义了执行SQL语句的方法,这些方法不支持参数输入,PreparedStatement接口中增加了设置SQL参数的方法,CallableStatement接口继承自PreparedStatement,在此基础上增加了调用存储过程以及检索存储过程调用结果的方法。
2024-11-11 20:19:34
563
原创 【MyBatis源码】MyBatis核心组件架构设计
StatementHandler组件使用JDBC中的Statement对象与数据库完成交互后,当SQL语句类型为SELECT时,MyBatis通过ResultSetHandler组件从Statement对象中获取ResultSet对象,然后将ResultSet对象转换为Java对象。SqlSession:SqlSession是MyBatis提供的面向用户的API,表示和数据库交互时的会话对象,用于完成数据库的增删改查功能。【2】 序号2的位置是mybatis的具体执行流程相关组件。
2024-11-10 20:58:01
904
原创 【MyBatis源码】SQL 语句构建器AbstractSQL
当我们需要使用Statement对象执行SQL时,SQL语句会嵌入Java代码中。SQL语句比较复杂时,我们可能会在代码中对SQL语句进行拼接,查询条件不固定时,还需要根据不同条件拼接不同的SQL语句。在MyBatis中已经为我们提供了这类开发工具类。MyBatis 中的 AbstractSQL 类是 MyBatis 提供的一个用于构建动态 SQL 语句的工具类。
2024-11-09 21:56:55
1440
原创 【MyBatis源码】ScriptRunner工具分析
SqlRunner 是 MyBatis 提供的一个工具类,主要用于在不依赖 Mapper 接口的情况下直接执行 SQL 语句。它的设计初衷是为了简化操作,适合在某些需要直接执行原生 SQL 的场景中使用。
2024-11-09 17:50:27
650
原创 《华为工作法》读书摘记
唯有痛苦能够带来教益。管理学家彼得·德鲁克说:“一个人必须知道该说什么,一个人必须知道什么时候说,一个人必须知道对谁说,一个人必须知道怎么说。”这些就是沟通的窍门。
2024-11-02 21:39:54
1065
原创 【MyBatis源码】CacheKey缓存键的原理分析
MyBatis生成的 CacheKey 对象中包含了这次查询的所有信息,包括查询语句的 id、查询的翻页限制、数据总量、完整的 SQL语句,这些信息一致就保证了两次查询的一致。结合 CacheKey的 equals方法,我们知道只要通过 equals方法判断两个CacheKey对象相等,则两次查询操作的条件必定是完全一致的。因此,准确度和效率之间往往是相互制约的。CacheKey首先类设计了多个重要属性,这些属性为结合传入的参数信息进行组合计算以提高缓存key的唯一性,并能够以较高的性能进行比较计算。
2024-11-02 21:11:10
1145
原创 WeakReference与SoftReference以及结合ReferenceQueue实践整理
强引用 (Strong Reference):是最常见的引用形式,通常我们通过 new 关键字创建的对象引用都是强引用。只要一个对象有强引用指向它,垃圾回收器就不会回收这个对象// obj 是一个强引用软引用 (Soft Reference):软引用是比强引用弱一些的引用类型,适合用来实现缓存。只有在内存不足时,垃圾回收器才会回收软引用指向的对象。使用 SoftReference 类来实现。弱引用 (Weak Reference):比软引用更弱的引用类型。
2024-11-02 17:25:29
732
原创 【MyBatis源码】BoundSql分析
BoundSql除了封装了Mapper解析后的SQL语句和参数映射信息外,还封装了Mapper调用时传入的参数对象。另外,MyBatis任意一个Mapper都有两个内置的参数,即_parameter和_databaseId。_parameter代表整个参数,包括标签绑定的参数信息,这些参数存放在BoundSql对象的additionalParameters属性中。BoundSql是对SQL语句及参数信息的封装,它是SqlSource解析后的结果。
2024-11-01 21:56:34
579
原创 【MyBatis源码】SqlSession实例创建过程
在MyBatis中,openSession()方法是开启数据库会话的入口,主要作用是生成SqlSession对象。我们从SqlSessionFactory接口入手,其实现类DefaultSqlSessionFactory的openSession()方法用于创建SqlSession实例.
2024-10-30 22:05:59
886
2
原创 【MyBatis源码】SqlSource对象创建流程
languageRegistry:用于注册LanguageDriver,LanguageDriver用于解析SQL配置,将配置信息转换为SqlSource对象。MyBatis中的SqlSource用于描述SQL资源,MyBatis可以通过两种方式配置SQL信息,一种是通过@Selelect、@Insert、@Delete、@Update或者@SelectProvider、@InsertProvider、@DeleteProvider、@UpdateProvider等注解;另一种是通过XML配置文件。
2024-10-29 22:48:36
1191
原创 【MyBatis源码】SqlSessionFactoryBuilder源码分析
SqlSessionFactory 是 MyBatis 的核心接口之一,提供创建 SqlSession 的方法。SqlSession 则是与数据库交互的主要接口,负责执行 SQL 命令和映射结果。SqlSessionFactoryBuilder 类的作用就是从 XML 配置文件或者其他配置源中加载配置信息,构建出 SqlSessionFactory 实例。
2024-10-27 18:17:19
1347
Spring Cloud微服务实战
2020-11-18
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人