- 博客(161)
- 收藏
- 关注
原创 【LangChain-AI】核心组件 -- 文本分割器
如果按照文档加载器给我们分割成的文档,比如说,PDF文档加载器是按照一页一页的给我们进行分割的,但是有可能文档中的描述的一个知识点或者描述的一个问题是被分成两页的(MD文档中的elements模式也会有相同的问题),后面我们将分割后的文档表示成向量的时候也是一个文档被表示成一个向量,那么此时一个问题就可能会被表示成多个向量,但是,我们肯定是希望一个单独的问题或者答案被分成一个文档,将来在被表示成向量的时候,也只生成一份向量数据。LangChain的文本分割器组件就可以按照我们想要的规则对文档进行拆分。
2026-06-22 20:55:11
194
原创 【LangChain-AI】核心组件 --文档加载器
对于【AI 大模型】来说,它最擅长的是语义理解和文本总结,最不擅长的就是获取实时的信息。因为大模型的训练数据是有截止日期的!对于【搜索引擎】来说,它最擅长的就是获取实时的信息,缺点是信息分散,每次都需要人为进行总结。大模型与搜索引擎的结合,就是给 AI 配备了一个活字典,让 AI 可以随时进行查阅。搜索引擎可以帮我们解决实时数据的获取,但获取到的数据也是受限的。它只能获取到公开在网络中的数据,而无法获取到一些本地数据,或企业内部的私有数据等,此时该如何?答案是使用 RAG(检索增强生成)技术!
2026-06-22 19:23:30
199
原创 【LangChain-AI】核心组件 -- 输出解析器
输出解析器负责获取模型的输出,并将输出转换为更结构化的格式。大型语言模型(LLM)的输出本质上是非结构化的文本。但在构建应用程序时,我们通常希望得到结构化的、机器可读的数据,这样可以将其转换为更适合下游任务的格式。输出解析器的作用就是架起这座桥梁:它们将 LLM 的非结构化文本输出转换为结构化格式。
2026-06-18 11:02:00
194
原创 【LangChain-AI】核心组件 -- 少样本提示
定义结构化输出"""一个人的信息。"""name: Optional[str] = Field(default=None, description="这个人的名字")hair_color: Optional[str] = Field(default=None, description="如果知道这个人头发的颜色")skin_color: Optional[str] = Field(default=None, description="如果知道这个人的肤色")
2026-06-17 18:14:33
257
原创 【LangChain-AI】核心组件--提示词模板
提示词模板就是一个可复用的提示词蓝图,它允许我们动态地生成提示词,而不是每次都手动编写完整的提示词。它类似于编程中的字符串格式化功能。你创建一个带有“占位符”的模板,然后在运行时,用具体的值(变量)填充这些占位符,从而生成一个最终发送给 LLM 的完整提示词。
2026-06-06 17:11:45
198
原创 【LangChain-AI】核心组件--消息
LangChain 提供了一种统一的消息格式,可以跨聊天模型使用,允许用户使用不同的聊天模型,而无需担心每个模型提供商使用的消息格式的具体细节。
2026-06-06 15:32:50
221
原创 【LangChain-AI】聊天模型--流式传输
事件循环是 asyncio(Python 标准库中的模块,用于编写异步 I/O操作的代码)的核心,你可以把它想象成一个总调度员或一个高效的待办事项 (To-Do List) 管理员。它维护着一个任务列表(比如:煮水、发短信)。它不断地循环检查每个任务: a. 如果任务处于“等待I/O” 状态(比如等水开、等网络响应),就暂停它,立即去执行下一个已经“就绪” 的任务。b. 如果任务的等待时间到了或者 I/O 操作完成了,事件循环就恢复执行这个任务。
2026-06-06 13:20:21
191
原创 【LangChain-AI】聊天模型--结构化输出
我们可以设置执行 Runnable 后的输出结果指定为Pydantic 类,这将返回一个 Pydantic 对象。当收到模型的响应后,LangChain 会提取出代表Pydantic 参数的 JSON 对象,并用 Pydantic 模型对其进行解析和验证,将这个验证后的 JSON 转换为一个可用的 Pydantic 对象实例返回。
2026-06-06 08:30:00
242
原创 【LangChain-AI】聊天模型--调用工具
JSON 我们大家都很熟悉,JSON schema 是用来描述整个 JSON结构的。有了JSON Schema之后,就可以知道JSON长什么样,用来做校验工作。那么同理,工具也是有属性的,工具 Schema 是用来描述工具结构的。# 定义工具@tool"""两数相加Args:a:第一个整数b:第二个整数"""# 获取工具名称、描述、参数。
2026-06-05 20:04:23
586
原创 【LangChain】-- 定义聊天模型
这种方式相当于是三方集成包提供的。聊天模型的API KEY,可以在定义的时候可以直接写在里面,也可以配置在环境变量中(推荐配置在环境变量中)。!继承了实现了标准的Runnable接口。
2026-06-05 16:07:55
218
原创 【JavaEE】-- spring web MVC入门
本文介绍了Spring Web MVC框架的基本概念和使用方法。主要内容包括:1) Spring MVC是基于Servlet API构建的Web框架,实现了MVC设计模式,分为模型、视图和控制器三部分;2) 通过@RequestMapping注解建立URL路由映射,支持类和方法级别路径配置,可处理GET/POST等请求;3) 参数传递方式,演示了接收单个参数的实现方法,并指出基本类型参数必须传递的注意事项。文章通过代码示例展示了如何创建Spring MVC项目、配置路由和处理请求响应,适合初学者快速了解Sp
2026-06-03 14:07:35
317
原创 【数据结构】-- 栈
单向链表建议从头入栈,从头出栈,时间复杂度均是0(1)。如果从尾巴入栈,入栈时间复杂度为0(N)。假设存在last指向最后一个节点的引用,入栈会变成0(1),但是,由于是单向链表,从尾巴出栈,last找不到前一个结点,还是需要head从前往后遍历找尾巴,所以出栈的时间复杂度还是0(N)。从上图中可以看到,Stack继承了Vector,Vector和ArrayList类似,都是动态的顺序表,不同的是Vector是线程安全的。尾插法:时间复杂度是0(N)。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
2026-06-03 14:01:03
192
原创 【JavaEE进阶】-- Spring原理
本文介绍了Spring框架中Bean的作用域、生命周期及Spring Boot自动配置机制。Bean支持6种作用域,包括单例、原型及Web相关的请求、会话等作用域。Bean生命周期包含实例化、属性赋值、Aware接口注入、初始化前后处理及销毁等阶段。Spring Boot自动配置通过自动加载配置类和Bean到IoC容器,简化了开发配置流程。这些机制共同构成了Spring框架管理对象的核心功能。
2026-03-12 20:08:43
313
原创 抽奖系统测试报告
本文对抽奖系统进行了全面的功能测试,涵盖用户模块、奖品模块等多个功能点。测试环境采用Windows 11系统,使用Edge和Chrome浏览器,配合Selenium工具完成自动化测试。在用户模块测试中,验证了注册、登录、人员列表等功能,重点关注了表单验证和异常处理;奖品模块则主要测试了列表分页功能。测试结果显示系统基本功能正常,能够正确处理各种边界情况和异常输入。通过详细的测试用例和截图记录,验证了系统各模块的功能完整性,为后续优化提供了可靠依据。
2026-03-05 16:20:11
456
原创 【Git】-- 分支管理
本文介绍了Git分支管理的基本操作,包括查看、创建、切换、合并和删除分支。主要内容为:1)使用git branch查看当前分支;2)通过git branch 分支名创建新分支;3)使用git checkout切换分支;4)用git merge合并分支内容;5)通过git branch -d删除分支。重点演示了分支合并冲突的处理方法:当两个分支对同一文件修改后合并时会产生冲突,需要手动编辑冲突文件后提交。最后建议合并后删除多余分支,并介绍了git log --graph查看分支合并图示的方法。
2026-01-18 20:45:32
245
原创 【Git】-- 解决git branch -a打印已被删除的远程分支
查看远程分支的情况,我们可以发现,部分分支已经是stale状态。stale状态的分支就是已经被我们删除了的分支,但是我们查看分支时依旧能看到这些分支。此时,就可以看到这些stale状态的分支已经"被修剪"了。但是本地的分支依旧存在,使用。
2026-01-16 11:15:00
196
原创 【Git】-- 标签管理
本文介绍了Git标签管理的基本操作,包括创建标签、查看标签、给历史提交打标签、添加标签描述、删除标签以及推送标签到远程仓库。标签(tag)是对commit的标识,相比commit id更易记忆,便于版本回溯。通过示例命令展示了如何为最新提交打标签(v1.0)、查看.git目录中的标签存储结构、给特定历史提交打标签(v0.9)、添加带描述的标签(v0.8)等操作。最后说明了如何将单个标签(v1.0)或所有标签(--tags)推送到远程仓库。标签管理是Git版本控制中重要的里程碑标记方式。
2026-01-16 08:45:00
1007
原创 【Git】-- 多人协作
本文介绍了Git多人协作的基本操作流程。主要内容包括:1.查看分支的命令(git branch -r/-a/-vv);2.演示同一分支下多人协作场景,展示开发者1和开发者2在dev分支上修改同一文件时如何处理冲突。详细步骤包括:创建本地分支并关联远程分支、修改文件、提交代码、解决冲突等关键操作,最后通过git pull和git push完成协作开发。文章强调了分支管理的重要性以及解决代码冲突的标准流程。
2026-01-15 11:16:29
821
原创 【RabbitMQ】-- 应用问题
本文探讨了RabbitMQ在实际应用中的三个核心问题:幂等性、顺序性和消息积压。幂等性方面,RabbitMQ支持"最多一次"和"最少一次"传输,需通过业务逻辑避免重复消费;顺序性保障建议采用单队列单消费者或分区消费策略,全局顺序性需结合业务实现;消息积压的解决方案包括提升消费者效率(如多实例、优化逻辑)、限制生产者速率(流量控制、限流)及优化服务器配置。RabbitMQ作为分布式系统,需权衡吞吐量与严格顺序性,实际应用中需根据场景选择策略。
2026-01-15 08:15:00
1711
原创 【RabbitMQ】-- 七种工作模式
RabbitMQ提供七种工作模式:1)简单模式(点对点);2)工作队列(多消费者共享消息);3)发布/订阅(广播消息);4)路由模式(按规则分发);5)通配符模式(灵活路由匹配);6)RPC模式(远程调用);7)发布确认模式(消息可靠性保证)。每种模式适用于不同场景,从简单消息传递到复杂RPC通信,满足各类消息处理需求。
2026-01-14 09:45:00
1004
原创 【RabbitMQ】-- 高级特性
如果将所有的消息都设置为持久化,会严重的影响到Rabbit MQ的性能。写入磁盘的速度比写入内存的速度慢的很多。所以出于对性能的考虑,对于可靠性不是那么高的消息可以不采取持久化处理来提高整体的吞吐量。在选择是否要将消息持久化的时候,需要在可靠性和吞吐量之间做一个权衡。将交换机、队列、消息都设置成持久化之后就能百分百保证数据不丢失吗?并不是。1. 从消费者来说,如果在订阅消费队列时将autoAck参数设置为true,那么消费者接收到相关消息之后,还没来得及处理该消息就宕机了,这样也算是数据丢失。
2026-01-14 07:30:00
1546
原创 【git】-- 远程操作
我们会有并不想将某些文件提交到远程仓库中的需求。只需要在git工作区的根目录下创建一个。将本地仓库中的某一个分支下的内容,推送到远程仓库中的对应分支下。假设现在有其他的小伙伴进行了修改,我们需要拉取远程仓库中的内容。文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件了。如果本地分支名和远程分支名一致的话,可以省略。加了global表示是全局都生效。简化完之后,原来完整的命名依旧生效。origin:是远程仓库的默认名。,同样,如果一样,可以省略。
2026-01-13 09:30:00
1840
原创 【RabbitMQ】-- 核心概念
Channel是在Connection之上的抽象层,在Rabbit MQ中,一个TCP连接中,即一个Connection中可以有多个Channel,每个Channel都是独立的虚拟连接,消息的发送和接收都是基于Channel的。**Producer: ** 消息的生产者,是RabbitMQ Server的客户端,向RabbitMQ发送消息。**Conumer: ** 消息的消费者,是RabbitMQ Server的客户端,从RabbitMQ中接收消息。是RabbitMQ的内部对象,用于存储消息。
2026-01-13 08:30:00
1539
原创 【Git】-- Git基本操作
每add一次,在工作区中修改的内容会写入对象库中一个新的git对象中(Git会为每个被修改/新添加的文件创建一个blob对象,如果文件内容没有变化,就会重用已有的blob对象),同时暂存区中目录树的文件索引会被更新。该git目录是追踪管理git仓库的,如果对该目录进行修改的话,会直接将该git仓库破坏掉。暂存区/索引 和 版本库 中存放的不是具体的内容,而是一个个git对象的索引。:回退版本库中的内容,工作区和暂存区中的内容不进行回退。:回退版本库和暂存区中的内容,工作区中的内容不进行回退。
2026-01-12 09:41:41
1131
原创 【Redis】-- key的过期策略
Redis采用定期删除和惰性删除相结合的key过期策略。定期删除通过每次抽取部分key检查过期时间,避免阻塞主线程;惰性删除则在访问过期key时触发删除操作。这两种策略虽能减少内存占用,但仍存在过期key清理不及时的问题,因此Redis还提供了内存淘汰机制作为补充。整体设计在性能与资源消耗之间取得了平衡,确保了Redis的高效运行。
2026-01-08 22:15:48
486
原创 【Redis】-- 单线程模型
redis 只使用一个线程来处理所有的命令请求,微观上来讲,redis服务器是串行/顺序执行多个命令的。并不是说一个redis服务器内部真的只有一个线程,redis服务器内部的多个线程是在处理网络IO。redis并不会出现多线程中 两个线程尝试同时对一个变量进行自增操作,表面上是进行了两次自增,结果却是自增一次的结果 的问题。redis之所以使用单线程模型可以很好的工作,主要原因是在于redis的核心业务逻辑都是扁平快的,不太消耗cpu资源,自然就不太吃多核了。但是如果redis中的某个操作占用时间长,就会
2026-01-08 09:49:33
411
原创 【多线程】-- JUC中的常见类
通过信号量可以限制系统中并发执行的线程个数,对于计算机而言管理的是有效的资源数,如果在资源有限的场景下,都可以使用信号量去处理。但是方法没有返回值;:表示这是一个函数式接口,接口中有且只有一个未实现的方法,也就意味着可以使用lambda表达式简化创建写法。在创建ReentrantLock类时设置该锁是否是一个公平锁,默认是非公平锁,传入true为公平锁。实现公平锁时,会有一个队列来组织排队的进程,获取锁的顺序就按照线程先来后到的顺序。信号量是用来表示“可用资源的个数的”,本质上是一个计数器。
2026-01-06 10:40:26
1039
原创 【多线程】-- 死锁
线程在获取锁资源的时候,由于获取不到导致线程卡死,多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。哲学家吃面的时候会拿起左右两边的筷子(一边一根),要求先那左边的,再拿右边的;如果桌子上的哲学家同时拿起自己左手边的筷子,这样大家就都拿不到右手边的筷子了,只能都阻塞等待,形成了死锁。只有在线程主动释放锁的时候,其他线程才有可能会获取到锁,别的线程不能直接抢。线程1等待线程2释放锁,线程2等待线程3释放锁,线程3等待线程1释放锁…就这样,锁A在等待锁B,锁B在等待锁A,循环等待造成死锁。
2026-01-05 19:04:07
540
原创 【多线程】-- synchronized原理
自旋锁:如果持有锁的线程能在很短时间内释放锁资源,那么那些等待竞争锁的线程就不需要做内核态和用户态之间的切换进入阻塞挂起状态,它们只需要等一等(自旋,一直让CPU空转,比较浪费CPU资源,因此自旋并不会一直持续进行,而是达到一定的时间/重试次数就不再自旋了,就是所谓的“自适应”),等持有锁的线程释放锁后即可立即获取锁,这样就避免用户线程和内核的切换的消耗。一旦涉及到其他的线程竞争锁(根据锁对象的对象头中记录的信息,很容易姐可以识别当前线程是不是之前记录的线程),再取消偏向锁状态,进入轻量级锁状态。
2026-01-05 17:31:07
411
原创 【多线程】 -- 常见的锁策略
轻量级锁:加锁的过程比较简单,用到的资源比较少,典型的就是用户态的一些操作(Java层面就可以加锁)。优缺点:内核态的操作,会生成对应的加锁指令,要等待被唤醒,在等待的过程中会释放CPU资源。写锁:写操作的时候加写锁(排它锁),只允许一个写锁执行任务,和其他锁是冲突的。重量级锁:加锁的过程比较复杂,用到的资源比较多,典型的就是内核态的一些操作。悲观锁是无论任何时候都加锁,消耗的资源多,所以可以说悲观锁是一种重量级锁。乐观锁是能不加锁就不加锁,消耗的资源少,所以说乐观锁是一种轻量级锁。
2026-01-03 19:35:37
444
原创 【网络】-- 网络层
街道的这个路由器最终是连接到了运营商的网络服务,运营商会提供一个公网IP,给到连接它的路由器,此时街道级别的路由器就可以通过公网IP访问网络上的任何主机了。是分⽚相对于原始IP报⽂开始处的偏移. 其实就是在表⽰当前分⽚在原报⽂中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后⼀个报⽂之外, 其他报⽂的⻓度必须是8的整数倍(否则报⽂就不连续了).不同的网络管理的网络范围是不同的,广域网是全世界,局域网只是一部分,一个网络内的IP地址不能重复,不管是公网还是局域网;
2025-12-01 20:52:51
604
原创 【网络】-- 传输层
定义一个分隔符来界定消息之间的边界如果是换行符:\r\n你好啊,一会儿去吃火锅\r\n行不行呀\r\n是不是在忙\r\nadflsjflsfj;lk;ds\r\n系统会回收进程的资源,包括文件描述符表,回收时相当于调用socket的close(),触发FIN操作。
2025-12-01 13:47:35
753
原创 【网络】-- 网络编程套接字
网络编程是指网络上的主机通过不同的进程,以编程的方式实现网络通信(或称为网络数据传输)。当然,只需要满足进程不同就行,即便是在同一个主机,只要是不同进程基于网络来传输数据也属于网络编程。操作系统为用用提供了一组实现传输协议的接口–Socket API。JDK为系统API进行了封装,Java程序员使用JDK提供的API。ServerSocket是创建TCP服务端Socket的API.主要用于服务器端,创建一个TCP服务。方法签名方法说明创建⼀个服务端流套接字Socket,并绑定到指定端⼝方法签名。
2025-11-24 08:43:30
1056
原创 【JavaEE】-- Spring Web MVC入门
该注解是用来注册接口的的。路由映射:当用户访问一个URL时,将用户的请求对应到程序中的某个类的某个方法的过程。
2025-11-17 08:32:21
556
原创 【Spring】-- IoC & DI
Spring MVC 和 Spring Boot 都属于Spring ,Spring MVC是基于Spring的一个MVC框架,而Spring Boot 是基于Spring 的一套快速开发整合包。这三者专注的领域不同,解决的问题也不一样。总的来说,Spring就像一个大家族,有众多衍生产品,但他们的基础都是Spring。@Bean@Bean定义多个对象的时候我们就不能通过类型来获取对象了,需要使用Bean的名称来获取。IoC: 控制反转。也就是说Spring是一个“控制反转”的容器。
2025-11-13 19:56:54
1031
1
原创 为什么封装第三方组件
本文阐述了封装第三方组件的五大优势:1)通过抽象层实现解耦,降低第三方变更对业务代码的影响;2)统一接口简化调用,屏蔽底层差异;3)封装复杂逻辑提升扩展性;4)规范化错误处理机制;5)通过注释文档增强代码可读性和团队协作效率。同时建议保持原始返回值以便调试。这种封装模式能显著提升项目的可维护性和开发效率。
2025-11-13 12:57:37
262
原创 【JavaEE进阶】-- 加密算法
在数据库中通常存放一些用户的隐私信息,这些隐私信息通常不可以将其明文存放:1. 代码角度:代码bug漏洞可能会导致数据泄漏。2. 管理角度:管理员有权限查看数据表的数据,有可能会直接泄漏表数据。
2025-11-11 21:39:40
432
原创 【Spring Cloud 微服务】-- 服务拆分原则
以上面的电商系统为例,每一个微服务应该有自己的存储,配置,在进行开发,构建,部署,运行和测试时,并不需要过多关注其他微服务的状态和数据。在微服务架构中,一个微服务也应该只负责一个功能或业务领域,每个服务应该有清晰的定义和边界,只关注自己的特定业务领域。服务自治是指每个微服务都应该具备高度自治的能力,即每个服务要能做到独立开发,独立测试,独立构建,独立部署,独立运行.如果一些场景确实无法避免循环依赖或者双向依赖,可以考虑使用消息队列等其他方式实现。微服务之间需要做到单向依赖,严禁循环依赖,双向依赖。
2025-11-07 14:09:02
287
空空如也
在VS上运行代码时,出现这个,是什么意思,应该怎么解决?
2023-12-17
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅