- 博客(48)
- 收藏
- 关注
原创 Langchain快速上手编程-Runnable 与 LCEL
LCEL:采用声明性方法,从现有 Runnable 对象构件新的Runnable对象,通过LCEL构建出新的 Runnable 对象,被称为 RunnableSequence,表示可运行序列。RunnableSequence 也是 Runnable 接口 的示例,它是实现了 完整的 Runnable 接口,因此可以用其他任何 Runnable相同的姿势使用。LCEL(Langchain Expression Language)-----链(编排解决方案)然后使用 invoke 就可以切换大模型。
2026-05-28 22:11:30
240
原创 如何快速使用Langchain上手编程
通过上述步骤,无论是调用大模型,还是输出解析,我们发现每次都调用了一个 invoke()方法,最终才会得到我们想要的结构;将 API key 配置在换进变量中主要是为了保证其隐私性,由于 API key 比较隐私,为了避免暴露,可将 api key 配置在环境变量中,这样程序就可以通过对应的环境变量拿到 api key 了。接入并定义大模型 ----》定义消息 ----》调用大模型---》输入结果。经过上述的简单操作,Langchain 中的 链式 体现在哪里呢?那么我们的链式体现在哪里呢?
2026-05-19 22:12:51
50
原创 接口自动化流程
理解业务需求,了解接口所支持的业务场景和业务逻辑,根据业务需求,明确接口需要实现的具体功能,如数据的获取,修改,删除等操作,以及接口的输入输出要求,分析接口之间的依赖关系,确定接口之间的调用顺序和依赖条件。对于需要频繁执行的测试任务,如回归测试中的接口测试,自动化测试可以避免重复手动测试的繁琐和抵消,提高测试效率。根据接口需求和功能,设计正向测试用例和反向测试用例,包括边界值测试,参数组合测试等等。根据项目的时间,人员的安排和接口的复杂度,挑选适合自动化测试的接口。使用 测试框架 来执行编写的测试用例。
2026-04-12 22:20:25
69
原创 LLM 常见问题与 Langchain 解决方案
将离线文档加载到 Langchain 中 内存中 ,通过文档拆分器 将离线文档按照一定类别拆分成小文档,通过 LLM 将文档 转化成 向量,存储到向量数据库中(知识库),接收用户问题,根据语义相似性搜索相关文本(检索向量数据库),将问题和文本发送给 LLM ,解析LLM输出并返回答案;Langchain 底层有很多的大模型,通过封装好统一的接入方式可以解决:Langchain 底层集成了好多大模型,通过封装好统一的接入方式,不管咋切换模型,应用程序都能比较平滑地过渡,不用太担心输出格式和接口参数的变化。
2026-04-06 17:52:04
222
原创 Python---logging日志模块使用
Logging 是 Python 标准库中的一个模块,它提供了 灵活的 日志记录功能。如果我们看不到 后端服务器的日志,那么此时就可以将日志 内容添加到 文件中。
2026-03-30 16:31:07
35
原创 JSON Schema使用
additionalProperties:控制是否允许对象中存在 未在 properties 中定义的额外属性,默认为:True;JSON Schema 是用来定义和 校验 JSON 的Web 规范:用来检验 json 是否符合预期。uniqueItems:确保数组中的元素是唯一的(默认情况:允许存在重复的数据)接口返回的字段对应的值每次可能是不同的--但同一个接口返回的字段名一定是不变的。object---对象类型,用于嵌套的 JSON 对象。1.校验关键字段的值:可能会漏掉一些重要的字段/值。
2026-03-30 13:44:02
397
原创 YAML简单使用
YAML 是一种数据序列化语言,用于存储人类可读形式存储信息,类似于 XML 和 JSON 文件。YAML 文件后缀名 是 .yaml / .yml;Json 里 key 和字符串类型的值必须用 双引号。YAML 常见操作:存储数据,读取数据。Py 内置类型字典和json非常像。2.YAML 不允许使用 TAB。3. YAML 是遵循严格缩进的。Py 里用 单引号 和 双引号。1.YAML 是区分大小写的。往 yaml 写入数据。从 yaml 读取数据。清空 yaml 数据。
2026-03-28 21:30:46
210
原创 LLM接入方式
最主流,最便捷的接入方式,通过 HTTP 请求,直接调用 部署在 云端的服务。此时就可以通过 接口使用 LLM 了。1.搜索 deepseek。1.下载 openai 库。1.API 远程调用。3.开源模型本地部署。
2026-03-21 18:35:27
79
原创 Redis 缓存穿透/缓存雪崩/缓存击穿问题
缓存预热-->就是用来解决上述问题的:将定时生成 和 实时生成 相结合--先在离线的情况下,先把热点数据导入到 redis 中,此时 导入的这些热点数据,就能帮 mysql 承担很大的压力,随着时间的推移,逐渐使用新的热点数据,淘汰掉旧的数据;当客户端发起请求时,所有的请求,都会访问 mysql 随着时间的推移,redis 上的 数据越来越多,mysql 承担的压力就会逐渐减小。相当于缓存雪崩的特殊情况,针对热点 key 突然过期了,导致大量的请求直接访问到数据库上,甚至引起数据库当即。
2026-03-19 15:03:45
70
原创 wait、notify、sleep 与 线程饥饿问题
注意:要将 sleep 写到 synchronized 外面,否则,由于 t1 t2 执行顺序不确定,就可能会 t2 先拿到锁,此时 t1 就没执行到 wait;t2 就会先执行 notify 结果不符合预期(需要确保,代码时先执行 wait ,后执行notify;3.t2 sleep 结束后,由于 t1 是 wait 状态,锁是释放的,t2 就能拿到 锁;t1 执行后,会先拿到锁,并且打印(t1 wait 前),并进入 wait 方法(释放锁 +阻塞)小绿人(线程 A)抢到锁,进厕所(执行同步块);
2026-03-13 13:54:04
383
原创 RabbitMQ 工作模式实现
生产者 每发送一个消息,就记录这个消息的 id 存储在 集合中,服务器 每返回一个 ack (接收消息的id)就删除 集合中对应的 id;3. 消费者问题.Broker发送消息到消费者,消费者在消费消息时,因为没有处理好,导致broker将消费 失败的消息从队列中删除了。在 日志中 发现,消息的唯一id(deliveryTag)只在 单个消费者内部是唯一的,而在多个消费者之间是可以 重复的。如果接收到的是 批量的,就需要将小于等于 deliveryTag 的集合删除,表示序号已经被 ack了。
2026-03-10 14:10:06
513
原创 RabbitMQ 核心概念
Channel:通道,Channel 是在 Connection 之上的一个抽象层,在RabbitMQ 中 一个 TCP连接可以有多个 Channel,每个Channel 都是独立的虚拟连接,消息的发送和接受 都是基于 Channel的(Channel 的出现主要是为了减少 建立 和关闭 TCP连接的开销)发送的消息通常是一个带有一定业务的数据,例如JSON字符串,消息可以带有标签,RabbitMQ 会根据标签进行路由,将消息发送给感兴趣的消费者。4.生产者 声明一个队列,存放消息。
2026-03-10 13:43:30
414
原创 Spring Boot 发送 QQ 邮箱邮件:从 530/535 错误到成功发送的全踩坑指南
步骤 2:Spring Boot 项目引入依赖。步骤 4:封装邮件工具类。步骤 5:测试邮件发送。
2026-03-04 18:10:28
357
原创 自动化测试---pytest框架
如果测试类中定义了 __init__ 方法,那么当pytest 实例化该类时,__init__ 方法就会被调用,可能会掩盖测试类的实际测试逻辑,并引入 额外的副作用,影响测试结果的准确性;在 fixture_执行前 先调用 fixture_A,此时在测试方法中 调用 fixture_B时,就会 先调用 _A,在调用 _B,再执行 测试方法。当我们需要测试的文件多/复杂时,就需要写很长的 pytest 指令,此时就可以使用 pytest 配置文件,减少工作量;fixture 提供了灵活的控制;
2026-03-04 16:10:43
550
原创 如何实现一个简单的自动化接口测试
Requests 库 是一个非常流行的 HTTP 客户端库,用于发送 HTTP 请求。Requests.get 方法用于发送一个 HTTP get 请求 到指定的 URL。通过上述操作,可以判断:需要先登录,才能访问--个人信息界面,此时就需要用到 登录后,后端返回的 token了;让 Python 程序模拟浏览器,向百度服务器发送一个 “获取首页内容” 的请求,并拿回百度首页的网页数据。返回值:get方法 返回一个 Response 对象 这个对象包含了服务器返回的所有信息。
2026-03-03 20:15:30
66
原创 如何在idea上使用数据库
Database Navigator 是 IntelliJ IDEA 里的一个数据库管理插件,能让你在 IDE 里直接连接各类数据库,执行 SQL、管理数据,并通过可视化方式维护表结构,方便后端开发时一站式操作数据库。1.下载Database Navigator 插件。3.安装好后在边框左侧或右侧会出现标签。2.通过plugins查询插件。6.配置完成后就可以查看数据库。4.点击加号配置 mysql。
2026-02-13 09:22:22
305
原创 ReentrantLock
可重入锁:在以前,Synchronized不够强壮,功能不够强大时,ReentrantLock就是用来实现可重入锁的;传统的锁的风格,这个对象提供了两个方法:lock,unlock;这种写法就容易引起,加了锁之后,忘记解锁;
2026-02-11 23:23:20
291
原创 CAS问题
当线程 B 执行 CAS 操作时,如果此时线程 A 已经完成了 CAS 操作,那么内存地址V处的值已经变为 11,而线程 B 的预期值E还是 10,两者不相等,线程 B 的 CAS 操作失败,不会修改内存地址V的值。线程 B 同样从内存地址V读取当前值,假设线程 B 读取时,线程 A 还未完成 CAS 操作,所以线程 B 读取到的值也是 10,它也设定预期值E为 10,并计算出新值N(同样为 11)。线程 A 执行 CAS 操作,比较内存处的值(也就是A)是否等于预期值E。完成的工作,就是 “比较和交换”
2026-02-11 23:21:59
690
原创 vue3快速创建
是⼀款⽤于构建⽤⼾界⾯的JavaScript框架。它基于标准 HTML、CSS和JavaScript构建,并提供了⼀套声明式的、组件化的编程模型,帮助你⾼效地开发⽤ ⼾界⾯。⽆论是简单还是复杂的界⾯,Vue都可以胜任。前置条件:1.熟悉cmd命令行;2.已安装 18.0及以上版本node.js。1.在想创建目录中使用cmd。2.打开cmd窗口,输入指令。2.性能比 vue2 更好。出现这个界面就说明创建成功。1.vue2停止维护。步骤2:通过npm命令创建vue项目。步骤1:查看安装的版本。
2026-02-10 14:54:40
334
原创 TCP协议特性
数据丢失时,所有接收到的数据都会存储在 服务器 的缓冲区中,依次拍好,服务器会重复返回丢失的数据 的确认号,当客户端收到好几个相同的确认序号,就知道这一条数据丢失,进行重传,只会索要丢失的数据,这种情况称为 “快速重传”syn:数据包,不懈怠载荷,没有应用层的数据,也不代表任何程序的业务逻辑,但是带有IP报头/以太网数据帧帧头/TCP报头,只是一个打招呼的作用----称为“握手”;此时将收到的数据的序号,和缓冲区终端所有数据的序号一一对应,查看是否有重复的,如果有重复的就可以把新收到的数据丢弃;
2026-02-08 22:11:16
570
原创 多线程--锁的策略
1.乐观锁/悲观锁 自适应;1.悲观锁2. 轻量级锁/重量级锁 自适应;2.重量级锁3.自旋锁/挂起等待锁 自适应;3.挂起等待锁4.不是读写锁;4.不是读写锁5.非公平锁 5.非公平锁6.可重入锁6.不可重入锁。
2026-02-08 16:13:04
726
原创 多线程--中断线程/等待线程
作用:查询当前线程是不是被中断了这个方法是一个 boolean 类型的, 初始情况下,这个变量是 false 一旦其他的线程调用 .interrupt方法,就会把这个标志位改为 true;这个操作,是获取当前线程的的实例(thread);哪个线程调用,获得到就是哪个线程的实例;我们可以看到 thread 线程并没有真正的结束查看异常可以发现,是 interrupt 导致的 sleep 出现异常;如果没有sleep , interrupt 可以让线程顺利结束;
2026-02-08 13:40:19
572
原创 线程的状态
4.TIMED_WAITING :指定时间的阻塞,到达一定时间之后自动解除阻塞;(使用 sleep 会进入这个状态,使用带有超时时间的join也会)5.WAITING:不带时间的阻塞(死等);1.NEW :Thread 对象创建好了,但还有没调用 start 方法,在系统中创建线程;2.RUNNABLE:就绪状态:表示这个线程正在 cpu 上执行,或者准备就绪随时可以执行;与线程状态有关,只有当线程状态是,NEW 的时候才能 start;只是 “给了子线程足够的执行时间”,让子线程有机会执行到自身的。
2026-02-08 11:52:06
199
原创 线程和进程的关系
1.进程是包含线程的;2.每个线程,也是一个独立的执行流,可以执行一些代码,并且单独参与到 cpu 的调度中;3.每个进程,有自己的资源,进程中的线程 共用 这一份资源(内存空间,文件描述符表)进程是资源分配的基本单位,线程时调度执行的基本单位;4.进程和进程之间,不会相互影响,如果同一个进程中的某个线程,抛出异常是可能会影响到其他线程,会把整个进程中的所有线程都异常终止5.同一个进程中的线程之间,可能会互相干扰,引起线程安全问题;
2026-02-06 23:40:11
353
原创 Cookie和Session的区别
浏览器禁用Cookie后,无法将sessionID放到 cookie中传递,就可以将 SessionID放到请求的 url 中;
2026-02-05 23:55:54
681
原创 java创建线程的方法
这里的 { } 意思就是要定义一个 类,这个新类继承自 Thread;此处 { } 中可以定义子类的属性和方法,此处最重要的目的就是重写 run 方法;Thread 类是用来管理线程的,而 runnable 对象只是一段可以执行的代码;Runnable :可以理解为“可执行的”,通过这个接口,就可以抽象表示出一段可以被其他实习来执行的代码;thread 指向的实例 并非是单纯的 Thread 而是 Thread的子类;内部类访问外部类的成员,本质上就是可以的;实现类,把它的对象传给。
2026-02-05 19:38:15
379
原创 网络协议----OSI七层网络协议 和 TCP/IP四层(五层)网络协议
交换机的数据链路层就会对接收到的以太网数据帧进行解析:1.取出载荷,2.解析帧头中的信息;根据帧头中的信息,决定下一步将数据往哪发送;网络通信过程中 需要涉及到的细节很多,如果有一个协议来完成网络通信,就需要约定好很多内容和细节,导致协议非常复杂;负责数据的格式转换、加密解密、压缩解压--以把它理解为 “翻译官 / 加密官”,解决不同系统间语法和语义的差异。IP协议 有进一步对数据进行解析,取出载荷;IP协议重新进行封装;将数据进行解析,拿到载荷,交给网络层 IP 协议。将功能定位相似的协议放到同一层;
2026-02-04 22:03:44
449
1
原创 java线程池
ThreadPoolExecutor 用起来比较复杂;标准库还提供了 另一个版本 将ThreadPoolExecutor 封装起来了----->
2026-02-03 13:13:51
576
原创 单例模式及线程安全问题
单例模式 是 一种 设计模式(框架)(棋谱);单例 = 单个实例(对象);某个类,在一个进程中,之应该创建出一个实例(原则上不应该有多个)使用单例模式,就可以对代码进行一个严格校验和检查;举例:例如在一个类中需要创建一个对象来,存放管理 5 个G的数据;如果创建 2,3 个......那么就需要 10G 15G 的空间;这样会造成空间的浪费。
2026-02-02 20:53:32
887
原创 多线程--线程安全
1.本质是:程的随即调度导致执行顺序是不确定的;2.代码结构:代码多个线程同时修改一个变量;3.上述多线程修改操作,本质不是“原子的“;(count++ 是多个cpu指令构成,一个线程执行中就可能会被其他线程调度走)每个cpu 指令都是 ”原子的“要么不执行,要么执行完;4.内存可见性问题5.指令重排问题;将 多个指令执行的操作变成原子,也就是 ”加锁“(锁具有 ”排他“)性在java 中,加锁方式,有很多种:最重要使用的就是---synchronized 关键字。
2026-02-02 20:48:06
521
原创 MySQL 事务
就像你在草稿纸上算的答案,还没抄到正式试卷上(没提交),甚至可能擦掉重算(回滚),别人偷看了你的草稿纸,就等于读到了 “脏数据”。,要么全部都不执行【原子:不可拆分的最小单位】;(原子性含义:将多个操作打包到一起,要么全部执行。
2026-01-30 23:07:33
590
原创 Javase 接口
师傅是 “武功掌门人”,他发给徒弟一本武功秘籍,并指定习武规则:规则 1:必须学会 武功1 并且能流畅使出;规则 2:..................
2026-01-24 09:45:00
606
原创 多线程--死锁
摘要:死锁是多个线程互相持有对方所需资源导致的程序卡死状态,需满足互斥使用、不可抢占、请求保持和循环等待四个条件。常见死锁场景包括:单线程重复加锁、两线程互相等待、多线程循环等待(如哲学家就餐问题)。解决方法主要是破坏必要条件,最实用的是约定加锁顺序(如按编号从小到大获取锁),能有效避免循环等待。其他方案如引入额外锁、限制线程数或银行家算法等,普适性或实现难度较高。
2026-01-23 18:15:13
729
原创 RabbitMQ 推拉模式
推模式特点:消息获取更实时。适用场景:对数据实时性要求较高的场景,例如实时数据处理、监控系统、报表系统等。拉模式特点:消费端可按自身处理速度消费,避免消息积压;允许消费者在准备好后再请求消息,避免资源浪费。适用场景:需要流量控制、或需要大量计算资源的任务。
2026-01-23 09:30:00
299
原创 RabbitMQ 消息分发机制
RabbitMQ消息分发优化方案:默认轮询分发易导致消费者忙闲不均,可通过QoS限流机制优化。核心方法channel.basicQos(prefetchCount)限制消费者最大未确认消息数,实现公平分发。主要应用场景包括:1)系统限流,防止消费者过载;2)负载均衡,解决多消费者处理能力不均问题。设置prefetch=1时,消费者需确认当前消息才能获取下一条,RabbitMQ会根据处理速度动态分配消息。需配合手动应答模式使用,能有效提升系统吞吐量和稳定性。
2026-01-22 18:30:00
1337
原创 RabbitMQ 事务机制
RabbitMQ基于AMQP协议实现事务机制,SpringAMQP提供了相关支持。开发者可通过配置ConnectionFactory、自定义开启事务的RabbitTemplate和注册RabbitTransactionManager来确保消息的原子性操作。这三个组件缺一不可,配合@Transactional注解可实现消息的提交/回滚,当方法抛出异常时所有已发送消息都会被回滚。这种机制保证了消息要么全部成功发送,要么全部失败。
2026-01-22 09:30:00
241
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅