- 博客(181)
- 问答 (1)
- 收藏
- 关注
原创 python输出彩色日志
摘要:本文介绍如何使用Python的colorlog库为日志添加颜色,提升可读性和调试效率。通过YAML配置文件定义不同日志级别对应的颜色(如红色表示错误,黄色表示警告),并使用colorlog.ColoredFormatter实现彩色日志输出。文章详细说明了配置文件的编写方法,并提供了完整的代码示例,展示了如何加载配置并测试不同级别的彩色日志输出效果。这种方法特别适合开发阶段的本地调试,能帮助开发者快速识别关键日志信息。
2025-12-28 19:42:39
180
原创 LLMIndex的使用
本文介绍如何使用LangChain框架构建本地RAG(检索增强生成)系统,实现基于私有知识的LLM问答。通过Python代码示例,详细展示了从加载文档、文本分块、向量化存储到配置本地Qwen模型和构建RAG链的完整流程。该系统利用FAISS向量数据库进行高效检索,结合本地部署的LLM保障数据隐私。相比LlamaIndex,LangChain更适合简单RAG场景,提供模块化的链式编程体验。文章还解释了环境配置和关键参数设置,为开发者构建私有知识问答系统提供了实用指导。
2025-12-22 08:48:37
678
原创 LangGraph与LangChain如何协同工作?
LangGraph与LangChain是互补协同的关系,LangGraph在LangChain基础上扩展了复杂流程控制能力。LangChain提供基础组件(LLM封装、工具调用等),而LangGraph负责编排执行流程(循环、条件分支等)。两者结合可实现:1)用LangChain构建节点功能;2)用LangGraph设计复杂控制流;3)集成记忆机制实现多轮对话;4)快速开发高级智能体系统。典型应用包括客服流程控制、数据分析循环和多智能体协作等场景,LangChain解决"做什么",Lan
2025-12-15 08:12:38
371
原创 简单实现一个LangChain Agent
LangChain Agent是一种结合大语言模型与外部工具的执行系统,赋予AI自主决策和行动能力。本文演示了如何利用LangChain框架构建一个简单的加法计算Agent。通过本地部署的Qwen2.5-7B模型,配置了只支持加法的工具函数,并采用ReAct机制实现"推理-行动-观察"的决策循环。当用户提问"123加456等于多少"时,Agent会先判断需要调用计算工具,执行加法运算后返回最终结果579。这种架构突破了传统语言模型只能回答的局限,使AI具备了实际解决问
2025-12-07 20:56:50
212
原创 spring AI都能做什么
Spring AI 是 Spring 官方推出的 Java AI 集成框架,简化了在 Spring Boot 应用中接入 AI 能力的过程。它支持集成主流大语言模型(如 OpenAI、Gemini 等),提供 ChatClient 和 ChatModel API 进行对话交互,支持 Prompt 模板和变量替换。框架还包含 RAG 功能,可将文本向量化存储到各类向量数据库,并支持对话记忆管理,通过 @Tool 注解实现函数调用能力。开发者可以像使用普通 Spring 组件一样,通过依赖注入等方式快速构建 A
2025-11-30 21:46:23
372
原创 Java一定是平台无关吗?
摘要:Java以"一次编写,到处运行"的跨平台特性著称,通过JVM实现平台无关性。但随着云原生技术的发展,Java开始采用AOT编译和GraalVM NativeImage等静态编译方案,使程序变得平台相关。这种转变源于云原生环境下平台差异的弱化,容器化部署的普及,以及追求更快的启动速度、更高的资源利用率和简化部署流程的需求。这并非放弃跨平台优势,而是针对特定场景在性能和平台无关性之间做出的权衡。
2025-11-24 08:32:33
164
原创 什么是AI Agent?
文章摘要: Agent(智能体)是具备工具调用能力的AI系统,如小爱同学能自动完成点餐流程。其核心能力包括:1)感知环境输入(用户指令和记忆);2)决策规划(选择合适工具);3)执行行动(调用API等)。实现Agent需结合大模型(LLM)、记忆模块(短期/长期记忆)和工具调用能力(Tools+Planning),形成“感知-决策-行动”闭环,从而解决传统大模型无法操作工具的问题。典型应用如语音助手自动完成复杂任务。
2025-11-17 08:40:07
224
原创 纯CPU运行的Kokoro-82M本地部署
Kokoro TTS是由hexgrad团队开发的轻量级开源文本转语音模型,特别适合CPU环境部署。本文介绍了其安装配置过程:首先安装CPU版PyTorch,然后手动安装espeak-ng并配置环境变量,再安装其他依赖项。模型可通过huggingface-cli下载,测试代码展示了如何在CPU上加载模型、配置语音参数并合成语音。测试结果显示系统能高效生成语音文件并计算实时因子,最终输出保存为WAV格式。这套方案为开发者在资源受限环境下实现高质量TTS提供了实用解决方案。
2025-11-10 08:39:31
399
原创 读写分离遇到主从延迟怎么办?
摘要:MySQL主从复制实现读写分离时,主从延迟会导致写后读不一致问题。解决方案包括:1)将读请求分为可延迟和不可延迟两类,后者强制读主库;2)事务上下文中的核心操作直接读主库;3)二次读取方案(先读从库,失败再读主库);4)主备一致性方案如Sleep延迟、监控复制延迟、等主库位点或GTID方案。其中强制读主库和请求分类是较常用方案,后两种特殊方案可确保强一致性但实现复杂。
2025-11-03 08:50:11
302
原创 如何用Redis实现乐观锁?
Redis通过WATCH命令实现乐观锁机制,其核心是基于CAS(Compare And Swap)原理。具体操作流程为:1)使用WATCH监视键;2)获取当前值;3)MULTI开启事务;4)执行修改操作;5)EXEC提交事务。若监视键在事务期间未被修改,则执行成功,否则事务回滚。示例代码展示了使用Jedis客户端实现原子增量操作的过程,通过事务执行结果判断是否成功。这种机制保证了数据一致性,适用于并发修改场景。
2025-10-20 20:44:43
245
原创 充血模型和贫血模型
本文对比了Java开发中的贫血模型和充血模型。贫血模型将数据和业务逻辑分离,对象仅有属性和getter/setter方法,业务逻辑集中在Service层,违反了面向对象原则。充血模型则将数据和行为封装在领域对象内部,符合面向对象设计理念。文中通过用户管理示例展示了两种实现方式:贫血模型将激活、扣款等逻辑放在UserService中,而充血模型让User类自行处理这些业务逻辑。充血模型更有利于业务逻辑的封装和复用,是领域驱动设计推荐的做法。
2025-09-30 14:19:08
268
原创 Timer实现定时调度的原理是什么?
摘要:Java的Timer类通过内部维护的TaskQueue和TimerThread实现定时任务调度。TaskQueue按执行时间排序存储定时任务,TimerThread则不断检查队列中最早的任务是否到达执行时间。当任务到期时,TimerThread会执行任务的run()方法,并根据是否为周期性任务决定是否重新入队。新任务通过sched方法加入队列并唤醒线程重新检查。这种机制确保了定时任务的有序执行,但要注意Timer是单线程的,长时间任务可能影响调度准确性。
2025-08-03 20:22:13
174
原创 多级缓存如何应用
摘要 多级缓存在电商秒杀场景中发挥重要作用,包含五个层级:1)客户端缓存(如倒计时数据),2)CDN缓存(静态资源),3)Nginx缓存(静态资源及前置校验),4)本地缓存(低频变化数据),5)分布式缓存(如Redis处理库存扣减)。这种分层设计有效降低服务器压力,提升系统性能,其中每层缓存根据数据特性选择合适策略,确保系统高效稳定运行。
2025-07-06 21:11:46
897
原创 深入理解Spring的ResponseBodyAdvice接口
摘要:ResponseBodyAdvice是Spring4.2引入的接口,用于在控制器返回响应前统一处理响应数据。它提供两个核心方法:supports判断是否生效,beforeBodyWrite进行实际处理。典型应用包括统一响应封装、数据脱敏和国际化处理。使用时需注意执行顺序、异常处理和性能影响。该接口只对带有@ResponseBody或@RestController的方法生效,是Spring MVC响应处理的重要扩展点,能有效减少重复代码,提高开发效率。
2025-06-22 16:58:31
571
原创 openai-java
OpenAI-Java是一个Java开源库,用于简化与OpenAI模型的交互。文章介绍了如何通过Maven引入依赖,创建OpenAIClient实例(建议全局复用),以及使用本地部署的Qwen3-8b模型实现简单对话。示例代码展示了如何配置请求参数(包括提示词和模型设置),并解析返回的JSON响应。测试结果显示了模型生成的一段自我介绍文本,包含模型能力和服务目标说明。该库让Java开发者可以方便地集成AI对话功能到应用中。
2025-06-02 21:08:02
1884
原创 qwen3 + qwen agent
阿里最近发布了Qwen3开源模型,据称其性能超越了DeepSeek。Qwen3的8B版本性能相当于Qwen2.5的14B版本。Qwen-Agent是阿里基于Qwen大语言模型构建的智能体应用开发框架,支持指令遵循、工具调用、记忆能力和多代理协作等功能。本文介绍了如何在LM Studio上部署Qwen3模型,并通过Qwen-Agent框架实现一个简单的数学计算助手。代码示例展示了如何定义计算器工具、配置本地模型、创建Agent并测试其计算功能。文章还提到Qwen3默认开启推理模式,并展示了开启和关闭推理模式下
2025-05-19 08:34:49
669
原创 本地模型+MCP实践
MCP(Model Context Protocol,模型上下文协议)是由Anthropic公司推出的开放标准协议,旨在为大型语言模型(LLM)与外部数据源、工具及服务提供统一的通信框架MCP主机:发起请求的应用(如Claude Desktop)。MCP客户端:负责与服务器通信。MCP服务器:提供资源(如数据库)、工具(如API调用)和提示模板。
2025-04-28 08:52:39
2183
2
原创 父子线程之间怎么共享/传递数据?
当我们在同一个线程中,想要共享变量的话,是可以直接使用ThreadLocal的,但是如果在父子线程之间,共享变量,ThreadLocal就不行了。因为ThreadLocal 变量是为每个线程提供了独立的副本,因此不同线程之间只能访问它们自己的副本。那么,想要实现数据共享,主要有两个办法,第一个是自己传递,第二个是借助InheritableThreadLocal。
2025-04-13 19:36:45
417
原创 LM Studio本地部署大模型
LM Studio 是一款专为本地运行大型语言模型(LLMs)设计的桌面应用程序,支持 Windows 和 macOS 系统。它允许用户在个人电脑上无需联网即可高效部署和交互开源大模型(如 LLaMA、Mistral、GPT-NeoX 等),兼顾隐私性与灵活性。
2025-04-06 18:06:19
1982
原创 xdocreport+freemarker导出docx&pdf
之前导出docx与pdf都是使用freemarker模板引擎+html文档来渲染的, 这种方式缺点在于每个模板都需要自己手动去调整改起来很不方便, 现在有了新的方式。
2025-03-30 20:32:26
717
原创 CompletableFuture的使用
默认使用 ForkJoinPool.commonPool(),可通过参数指定自定义线程池优化资源管理:这里可以结合spring 定义全局线程池来实现统一管理, 使用时将容器中的executor当做入参即可。
2025-03-23 18:46:12
388
原创 java读取Markdown配置文件
之前的文章中自定义实现过一个简单的状态机, 以前想的是读取json文件, 这样读起来更方便一点, 但是后来发现过于复杂的流程如果还是用json文件作为配置文件的话就比较麻烦了, 因此, 我们需要更直观地配置文件, 正好markdown能够完美满足我们的需求。
2025-03-09 20:47:59
422
原创 什么是充血模型/贫血模型?
充血模型(Domain Driven Design)是一种面向对象的软件设计方法,它强调将业务逻辑封装在领域对象中。假设有一个电商网站,需要对商品进行购买、库存管理等操作。在充血模型中,我们可以定义一个Product类来表示商品。Product类会包含商品的属性(例如名称、价格、库存等),并且也会包含一些行为(例如购买商品、更新库存等)。这些行为是直接封装在Product类中的,以便于对商品进行操作。
2025-03-02 17:40:27
474
原创 线程池中怎么设置超时时间?一个线程如果要运行10s,怎么在1s就抛出异常
在使用线程池时,如果希望设置线程的超时时间,并在超时后抛出异常,可以根据不同的线程池实现方式和任务管理策略进行设置。常见的Java线程池实现包括 ExecutorService 和 ScheduledExecutorService,以及如何使用 Future 和 Callable 来控制任务执行和超时。
2025-02-16 09:55:46
1177
原创 分区和分表有什么区别?
数据库中数据量过多,表太大的时候,不仅可以做分库分表,还可以做表分区,分区和分表类似,都是按照一定的规则将一张大表进行分解。听上去好像也差不多,不就是将表拆分吗?那具体有什么差别呢?
2025-01-19 21:21:36
1107
原创 为什么预编译可以避免SQL注入?
也就是说,用户输入的恶意代码会被当作普通的数据处理,而不会被解释为SQL语句的一部分。数据库的预编译(Prepared Statement)是一种数据库查询优化技术,在预编译中,可以先先提交带占位符的 SQL ,MySQL 先将其编译好,然后用户再拿着SQL中定义的占位符对应的参数让 MySQL 去执行。),是作为参数的位置标记存在的,而不是作为SQL语句的一部分。那么也就是说,用户输入的整个部分,都作为字符串的一部分了,会去数据库中查询username为hollis\';
2025-01-12 20:51:10
480
原创 使用minioClient迁移minio
MinIO是一个分布式对象存储服务器,专为大规模私有云基础架构设计,也适用于云原生环境和大规模数据存储需求。最重要的是它是开源的, 因此应用极为广泛, 今天来研究一下如何迁移minio桶中的数据要将 MinIO 中某个桶(Bucket)中的数据全部导出,可以使用mc(MinIO Client)工具来实现。mc是 MinIO 提供的一个命令行工具,专门用来与 MinIO 或其他兼容 S3 的存储服务交互。通过mc,你可以方便地将 MinIO 桶中的所有数据导出。
2025-01-05 22:21:01
2304
原创 Mybatis的工作原理
无论是Mybatis也好,Spring也罢,它们的执行过程无非可分为启动阶段和运行阶段:启动阶段:1. 定义配置文件,如XML,注解2. 解析配置文件,将配置文件加载到内存当中运行阶段:1. 读取内存中的配置文件,并根据配置文件实现对应的功能对于执行SQL的逻辑来讲,有如下步骤:当配置完成之后,假如说我们要执行一个下面一个sql,那么该如何执行呢?
2024-12-29 20:33:10
577
原创 Windows服务器修复SSL/TLS协议信息泄露漏洞等...
为了保证生产环境的安全, 我们会定期对服务器进行漏洞扫描, 一般情况下我们都是使用Linux服务器, 某些情况会用到Windows服务器出现SSL/TLS协议信息泄露漏洞问题一般情况下是远程连接使用了不安全的加密算法, 需要禁用这些加密算法。
2024-12-22 21:28:24
1058
原创 基于mybatis-plus对数据库数据批量加密
对数据库加密是个老生常谈的问题, 一般来说都是在开发阶段就会考虑到对于一些敏感的用户信息进行加密处理, 但是有一些情况是需要对之前不需要加密的数据进行加密, 这样一来就比较麻烦了, 需要对数据库已有的数据进行加密, 为了减轻负担, 搞了一个工具类。
2024-12-15 11:53:23
555
原创 使用加固助手加密apk后无法安装
我们开发好的安卓APP, 在上线之前为了安全会对apk进行加密操作, 可能会用到一些加固工具, 我使用到的是360加固助手, 但是会有一个问题, 就是加固之后再安装的时候会出现安装包被损坏的情况, 经过查询,发现是加固之后的apk需要再次签名才可以, 接下来来介绍一下操作步骤。
2024-12-01 19:27:41
590
原创 Nexus私服迁移
开始之前先简单介绍一下nexus的基本结构, 以下是Nexus私服的所有库的列表, 我们平时使用maven的setting文件使用的都是maven-public, 但是我们要导出的话是不可以使用,maven-public的,因为它是一个集合(可以注意看一下他得type), 其中集合了多个库, 如果我们要迁移自己的私服一般只需要迁移maven-releases库即可(自定义的除外)
2024-11-25 16:55:04
1317
原创 jenkins的安装(War包安装)
它提供了一个开放易用的平台,使软件项目能够实现持续集成。Jenkins的功能包括持续的软件版本发布和测试项目,以及监控外部调用执行的工作。。
2024-11-17 21:14:40
1547
原创 jenkins国内插件源
Jenkins是一个开源的持续集成和持续部署(CI/CD)工具, 可以大大减轻部署的工作量, 但是jenkins作为一个国外的软件, 在国内下载插件会很麻烦, 因此我们可以将其换为国内源。
2024-10-25 18:16:03
2282
原创 ArrayList的序列化是怎么实现的?
在序列化过程中,如果被序列化的类中定义了writeObject 和 readObject 方法,虚拟机会试图调用对象类里的 writeObject 和 readObject 方法,进行用户自定义的序列化和反序列化。如果没有这样的方法,则默认调用是 ObjectOutputStream 的 defaultWriteObject 方法以及 ObjectInputStream 的 defaultReadObject 方法。
2024-10-13 21:12:05
323
空空如也
idea远程开发使用rsync
2022-04-15
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅