- 博客(501)
- 资源 (2)
- 收藏
- 关注
原创 chroma向量数据库
如果Chroma收到一个文档列表,它会自动标记并使用集合的嵌入函数嵌入这些文档(如果在创建集合时没有提供嵌入函数,则使用默认值)。如果文档过大,无法使用所选的嵌入函数嵌入,则会出现异常。Chroma中的集合类似于关系型数据库中的表,使得每个集合通过唯一的名称标识,且集合之间的数据相互独立。Chroma集合创建时带有一个名称和一个可选的嵌入函数,如果提供了嵌入函数,则每次获取集合时都必须提供。更新所提供 id 的嵌入、元数据或文档,如果不存在,则创建它们。更新所提供 id 的嵌入、元数据或文档。
2025-12-22 00:42:55
326
原创 从打字机效果实现详解整包/流式传输、长/短连接、SSE、Streamable-HTTP、长轮询、WebSocket
当客户端发起请求后,服务端将响应分多次传输到客户端,每次传输一个分块,称为分块传输。分块传输在传输较大响应时经常使用,每个块前面有大小标识,标识这个块的数据大小,最后以一个零长度块表示结束,多次分块传输算一次响应。要开启分块传输,需要在响应的请求头中添加。:和短连接相比,当服务端完成本次响应后,客户端不关闭TCP连接,下次发送请求时再次复用本次TCP连接,减少三次握手和四次挥手的资源浪费。:当客户端发起请求后,服务端一次性将所有数据传输到客户端,称为整包传输,目前绝大多数的响应都是整包传输。
2025-12-22 00:04:14
898
原创 本地安装Ollama并使用Python调用
总是使用远程的API调用要不就是掉不通,要不就是需要申请key,太麻烦了,应该决定本地进行部署了,而Ollama专注于本地化轻量部署,强调开发者体验和易用性,适合原型开发、隐私敏感场景和资源受限环境。
2025-12-18 00:03:09
321
原创 LangChain
Agent 是 LangChain 中的智能体,简单来说就是一个能自主思考和决策的 AI。它最大的特点是可以根据用户的问题,自己决定该用什么工具、按什么顺序来解决问题。Agent 和 Chain 的核心区别在于执行逻辑。Chain 是固定流程的,你定义好了步骤 A → B → C,它就只会按这个顺序执行,不管输入是什么都一样。但 Agent 是动态决策的,它会先分析问题,然后思考"我该用哪个工具?“,执行后再判断"结果对不对?还需要做什么?”,整个过程是智能的、动态的。
2025-12-12 00:25:46
1039
原创 Transformer 面试题
自回归属性(autoregressive property)是指模型在生成序列数据时,使用之前生成的部分作为输入来预测下一个元素。这个概念在自然语言处理(NLP)和时间序列分析中非常重要。例如,语言模型可以根据已经生成的词语预测接下来最可能的词。
2025-12-12 00:07:14
579
原创 RAG 检索增强生成
RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合了信息检索和内容生成的 AI 技术架构。简单来说,就是让 AI 在回答问题之前先去查资料,基于查到的真实信息来生成答案,而不是完全依赖训练时学到的知识。RAG 的核心工作方式是"先检索,再生成"。当用户提出问题时,系统首先从知识库中检索相关文档,然后把这些文档作为上下文提供给大模型,引导模型基于这些真实材料生成回答。这就像考试时可以翻书查资料,而不是纯靠记忆答题。RAG 主要解决了大模型的三大痛点。
2025-12-11 23:39:18
1124
原创 LangChain 实战课-实战篇
这节课我们完成了前两步的工作。分别是,找到适合推广某种鲜花的大V的微博UID,并且爬取了大V的资料。这为我们后续生成文本、进一步链接大V打下了良好的基础。用提示模板告诉大模型我们要找到内容(UID)。调用LLM。使用Chain。使用Agent。在Agent中,我们使用了一个Customized Tool,因为LangChain内置的SerpAPI Tool不能完全满足我们的需要。这给了我们一个好机会创建自己的“私人定制” Tool。
2025-11-30 14:50:44
709
原创 LangChain 实战课-结束语
与传统固定逻辑的开发方式相比,有了大模型的推理能力和ReAct等框架,就带给了它更高的灵活性、更强的自适应能力、更好的可扩展性和更高效的开发。我们的《LangChain实战课》也是一样,无论是我的课程设计,还是编辑老师的心力注入、耐心打磨,乃至你的刻苦学习、留言讨论,无不汇聚了我们彼此的情感和信心、认可和期盼。一位朋友回答:当然有价值,抛开现在大部分 AI 绘画都是在拼图,还有一个就是人在画中注入的情感、寄托,比如图2,如果 AI 作图,只能画出“母亲”的形象,您女儿画出的才是“妈妈”。
2025-11-30 14:49:17
663
原创 LangChain 实战课-应用篇
学到现在,你应该对LangChain 的核心价值有了更深的感悟吧。它的价值,在于它将模型运行和交互的复杂性进行了封装和抽象化,为开发者提供了一个更简单、更直观的接口来利用大模型。LangChain 提供了一种方法,使得多个模型或策略能够在一个统一的框架下工作。例如,arXiv 是一个单独的工具,它负责处理特定的任务。这种工具可以与其他工具(例如用于处理自然语言查询或者数据库查询的工具)一起作为一个集成的系统存在。
2025-11-30 14:48:27
629
原创 LangChain 实战课-基础篇
这样,你就从头到尾利用大模型开发出来了一个能够自动生成鲜花文案的应用程序!怎么样,是不是感觉和我们平时所做的基于SQL和数据库表以及固定业务逻辑的应用开发很不一样?你看,每一次运行都有不同的结果,而我们完全不知道大模型下一次会给我们带来怎样的新东西。因此,基于大模型构建的应用可以说充满了创造力。总结一下使用LangChain框架的好处,你会发现它有这样几个优势。模板管理:在大型项目中,可能会有许多不同的提示模板,使用 LangChain 可以帮助你更好地管理这些模板,保持代码的清晰和整洁。
2025-11-30 14:47:14
976
原创 LangChain 实战课- 开篇词 & 启程篇
既然 LangChain 这么棒,又这么新,我们怎么学?谁来指导?不怕!在这门课程中,我为你精心设计了 4 大模块。带你从各个角度把LangChain的精髓吃透。启程篇:从0到1在这个模块中,我会介绍LangChain系统的安装流程,以及如何进行快速的入门操作。同时,详细指导你如何使用LangChain来构建一个基于“易速鲜花”本地知识库的智能问答系统,让你直接感受LangChain强大的功能。基础篇:深入 6 大组件模型(Models)
2025-11-30 11:15:49
693
原创 《LangChain 实战课》学习笔记
虽然LLM提供了强大的能力,极大便利了应用程序的开发,个人开发者要基于LLM快速、便捷地开发一个完整的应用程序依然是一个具有较大工程量的任务。针对LLM开发,LangChain应运而生。LangChain是一套专门为LLM开发打造的开源框架,实现了LLM多种强大能力的利用,提供了Chain、Agent、Tool等多种封装工具,基于LangChain可以便捷开发应用程序,极大化发挥LLM潜能。目前,使用LangChain已经成为LLM开发的必备能力之一。
2025-11-27 23:13:42
229
原创 Count-min Sketch 算法
Count-min Sketch 是一个概率数据结构,用于在数据流中快速估算元素的出现频率。它的核心优势是速度快、占用内存极少,但代价是计算出的频率是一个近似值(总是大于等于真实值)。
2025-11-25 00:59:55
1025
原创 Quartz任务调度框架
Quartz是OpenSymphony开源组织在Job scheduling领域的一个开源项目,该项目于 2009 年被 Terracotta收购,目前是 Terracotta 旗下的一个项目。它完全由java编写、可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建运行十个、百个、乃至几万个Jobs这样复杂的程序。官网:http://www.quartz-scheduler.org/
2025-11-18 15:44:50
1029
原创 位图 & 咆哮位图
这就是为什么在现代大数据系统中,Roaring Bitmap 能够取代传统位图成为标准解决方案的原因。位图使用一个比特数组来表示集合。桶0x0003中有很多元素,如。要表示最大值为12的集合,需要。元素数量 ≤ 4096。(在桶0x0001中)元素数量 > 4096。位设为1,否则为0。固定 8192 字节。
2025-11-17 10:26:11
284
原创 图解Redis面试篇
Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景。Redis提供了多种数据类型来支持不同的业务场景,比如String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合)、Bitmaps(位图)、HyperLogLog(基数统计)、GEO(地理信息)、Stream(流),并且对数据类型的操作都是原子性的,因为执行命令由单线程负责的,不存在并发竞争的问题。除此之外,Redis还支持。
2025-11-06 23:17:25
610
原创 零拷贝技术
这涉及到多次的CPU和内存之间的数据拷贝操作,会消耗CPU的时间和内存带宽。零拷贝技术可以利用Linux下的MMap、sendFile等手段来实现,使得数据能够直接从磁盘映射到内核缓存区,然后通过DMA传输到网卡缓存,整个过程中CPU只负责管理和调度,而无需执行实际的数据复制指令。传统的IO需要四次拷贝和四次上下文(用户态和内核态)切换,而MMap只需要三次拷贝和四次上下文切换,从而能够提升程序整体的执行效率,并且节省了程序的内存空间。,避免了中间的拷贝过程,从而提高了数据传输的效率。
2025-11-06 11:57:01
254
原创 深入浅出 Java 虚拟机之进阶部分
我们上面说的这些工具的基础,就是 Java Agent 技术,可以利用它来构建一个附加的代理程序,用来协助检测性能,还可以替换一些现有功能,甚至 JDK 的一些类我们也能修改,有点像 JVM 级别的 AOP 功能。通常,Java 入口是一个 main 方法,这是毋庸置疑的,而 Java Agent 的入口方法叫做 premain,表明是在 main 运行之前的一些操作。Java Agent 就是这样的一个 jar 包,定义了一个标准的入口方法,它并不需要继承或者实现任何其他的类,属于无侵入的一种开发模式。
2025-11-03 23:34:22
440
原创 深入浅出 Java 虚拟机之实战部分
有很多工具能够帮助我们来分析这份内存快照。在前面已多次提到 VisualVm 这个工具,它同样可以加载和分析这份 dump 数据,虽然比较“寒碜”。专业的事情要有专业的工具来做,今天要介绍的是一款专业的开源分析工具,即 MAT。MAT 工具是基于 Eclipse 平台开发的,本身是一个 Java 程序,所以如果你的堆快照比较大的话,则需要一台内存比较大的分析机器,并给 MAT 本身加大初始内存,这个可以修改安装目录中的 MemoryAnalyzer.ini 文件。
2025-11-03 23:34:03
802
原创 深入浅出 Java 虚拟机之垃圾回收
其实,如果没有明显的内存泄漏问题和严重的性能问题,专门调优一些 JVM 参数是非常没有必要的,优化空间也比较小。
2025-11-03 23:33:45
971
原创 深入浅出 Java 虚拟机之基础原理
到这里本课时的内容就全部讲完了,今天我们分别从三个角度,了解了 JVM 在 Java 研发体系中的位置,并以一个简单的程序,看了下一个 Java 程序基本的执行过程。我们所说的 JVM,狭义上指的就 HotSpot。如非特殊说明,我们都以 HotSpot 为准。我们了解到,Java 之所以成为跨平台,就是由于 JVM 的存在。Java 的字节码,是沟通 Java 语言与 JVM 的桥梁,同时也是沟通 JVM 与操作系统的桥梁。
2025-11-03 22:12:10
668
1
原创 如何设计一个秒杀系统(下)
性能优化的过程首先要从发现短板开始,除了我今天介绍的一些优化措施外,你还可以在减少数据、数据分级(动静分离),以及减少中间环节、增加预处理等这些环节上做优化。首先是“发现短板”,比如考虑以下因素的一些限制:光速(光速:C = 30万千米/秒;
2025-11-03 22:08:11
578
原创 如何设计一个秒杀系统(上)
来让我们回顾下前面的内容,我首先介绍了构建大并发、高性能、高可用系统中几种通用的优化思路,并抽象总结为“4要1不要”原则,也就是:数据要尽量少、请求数要尽量少、路径要尽量短、依赖要尽量少,以及不要有单点。当然,这几点是你要努力的方向,具体操作时还是要密切结合实际的场景和具体条件来进行。然后,我给出了实际构建秒杀系统时,根据不同级别的流量,由简单到复杂打造的几种系统架构,希望能供你参考。
2025-11-03 22:07:47
879
原创 《如何设计一个秒杀系统》学习笔记
这玩意是一个经典而又基础的面试题,如果没准备没答好肯定得分不高,但是答好了应该也没辙,估计大家都会准备。2018年更新的专栏,还挺经典的。
2025-11-03 22:06:56
141
原创 其他并发模型
通过上面的介绍,相信你应该已经对Actor有一个感官印象了,下面我们再来看看Actor规范化的定义是什么样的。处理能力,处理接收到的消息。存储能力,Actor可以存储自己的内部状态,并且内部状态在不同Actor之间是绝对隔离的。通信能力,Actor可以和其他Actor之间通信。创建更多的Actor;发消息给其他Actor;确定如何处理下一条消息。其中前两条还是很好理解的,就是最后一条,该如何去理解呢?
2025-10-30 01:52:23
851
原创 案例分析.
经典的限流算法有两个,一个是令牌桶算法(Token Bucket),另一个是漏桶算法(Leaky Bucket)。令牌桶算法是定时向令牌桶发送令牌,请求能够从令牌桶中拿到令牌,然后才能通过限流器;而漏桶算法里,请求就像水一样注入漏桶,漏桶会按照一定的速率自动将水漏掉,只有漏桶里还能注入水的时候,请求才能通过限流器。令牌桶算法和漏桶算法很像一个硬币的正反面,所以你可以参考令牌桶算法的实现来实现漏桶算法。
2025-10-30 01:46:08
595
1
原创 并发设计模式
利用Immutability模式解决并发问题,也许你觉得有点陌生,其实你天天都在享受它的战果。Java语言里面的String和Long、Integer、Double等基础类型的包装类都具备不可变性,这些对象的线程安全性都是靠不可变性来保证的。Immutability模式是最简单的解决并发问题的方法,建议当你试图解决一个并发问题时,可以首先尝试一下Immutability模式,看是否能够快速解决。具备不变性的对象,只有一种状态,这个状态由对象内部所有的不变属性共同决定。
2025-10-30 01:34:14
876
原创 并发工具类
如果你细心观察,会发现我们创建的锁的具体类名是ReentrantLock,这个翻译过来叫可重入锁,这个概念前面我们一直没有介绍过。所谓可重入锁,顾名思义,指的是线程可以重复获取同一把锁。例如下面代码中,当线程T1执行到 ① 处时,已经获取到了锁 rtl ,当在 ① 处调用 get()方法时,会在 ② 再次对锁 rtl 执行加锁操作。此时,如果锁 rtl 是可重入的,那么线程T1可以再次加锁成功;如果锁 rtl 是不可重入的,那么线程T1此时会被阻塞。
2025-10-30 01:18:12
618
原创 实现JdbcTemplate
今天我们继续手写MiniSpring。从这节课开始我们进入MiniSpring一个全新的部分:JdbcTemplate。到现在为止,我们的MiniSpring已经成了一个相对完整的简易容器,具备了基本的IoC和MVC功能。现在我们就要在这个简易容器的基础之上,继续添加新的特性。首先就是 数据访问的特性,这是任何一个应用系统的基本功能,所以我们先实现它。这之后,我们的MiniSpring就基本落地了,你真的可以以它为框架进行编程了。我们还是先从标准的JDBC程序开始探讨。在Java体系中,数据访问的规范是JD
2025-10-30 00:40:24
600
原创 实现Spring AOP
从这节课开始,我们就要进入AOP环节了。在学习之前,我们先来了解一下是AOP怎么回事。AOP,就是面向切面编程(Aspect Orient Programming),这是一种思想,也是对OOP面向对象编程的一种补充。你可能会想:既然已经存在OOP面向对象编程了,为什么还需要AOP面向切面编程呢?这是因为在许多场景下,一个类的方法中,除了业务逻辑,通常还会包括其他比较重要但又不算主业务逻辑的例行性逻辑代码,比如常见的日志功能,它不影响我们的主业务逻辑,但又能在必要时定位问题,几乎每一个业务方法中都需要。又比如
2025-10-30 00:29:53
920
原创 实现Spring MVC
从这节课开始,我们开启一个新的部分:MVC。前面一章,我们实现了一个简单的IoC。麻雀虽小,五脏俱全,相比原生Spring框架而言,我们写的MiniSpring功能简单,但其核心功能已具备。我们会在这个基础上进一步扩展我们的框架。这一章我们来实现Spring MVC。MVC,全名对应Model(模型)、View(视图)、Controller(控制器)。它的基本流程是:前端发送请求到控制器,控制器寻找对应模型,找到模型后返回结果,渲染视图返回给前端生成页面。这是标准的前端请求数据的模型。实现了MVC之后,我们
2025-10-30 00:19:10
742
原创 实现Spring IoC
你好,我是郭屹,一名深耕软件开发行业30年的老兵。欢迎你跟我一起手写MiniSpring,一个mini版的Spring框架。在正式开始学习之前,我先介绍下我自己。说起来,我与Java和Spring打交道也有二十几年了。1998年我就加入了Sun Microsystems的Java团队,担任J2EE研发工程师,并在那里了解了Java专家Rodd Johnson、James Gosling等人的思想,见识了这些行业大牛的功力。我就像是一个跟随哥伦布船队的小船员,有幸亲眼见证了这段精彩的历史。而这些经验和知识也深
2025-10-29 23:55:27
598
原创 并发理论基础
当初我学习Java并发编程的时候,试图上来就看Java SDK的并发包,但是很快就放弃了。原因是我觉得东西太多,眼花缭乱的,虽然借助网络上的技术文章,感觉都看懂了,但是很快就又忘了。实际应用的时候大脑也一片空白,根本不知道从哪里下手,有时候好不容易解决了个问题,也不知道这个方案是不是合适的。我知道根本原因是,我的并发知识还没有成体系。我想,要让自己的知识成体系,一定要挖掘Java SDK并发包背后的设计理念。
2025-10-29 22:33:14
615
原创 模块二 高效实现
在前面的文章中,我曾使用了不少工具来辅助讲解,也收到了不少同学留言,说不了解这些工具,不知道都有什么用,应该怎么用。那么今天我便统一做一次具体的介绍。本篇代码较多,你可以点击文稿查看。今天我主要介绍了 Java 的内存模型。Java 内存模型通过定义了一系列的 happens-before 操作,让应用程序开发者能够轻易地表达不同线程的操作之间的内存可见性。在遵守 Java 内存模型的前提下,即时编译器以及底层体系架构能够调整内存访问操作,以达到性能优化的效果。
2025-10-27 01:46:30
408
原创 模块三:代码优化
在上一篇文章中,我介绍了逃逸分析,也介绍了基于逃逸分析的优化方式锁消除、栈上分配以及标量替换等内容。其中的标量替换,可以看成将对象本身拆散为一个个字段,并把原本对对象字段的访问,替换为对一个个局部变量的访问。举个例子,上面这段代码中的bar方法,经过逃逸分析以及标量替换后,其优化结果如下所示。(确切地说,是指所生成的 IR 图与下述代码所生成的 IR 图类似。之后不再重复解释。)由于 Sea-of-Nodes IR 的特性,局部变量不复存在,取而代之的是一个个值。在例子对应的 IR 图中,返回节点将直接
2025-10-27 01:46:12
957
原创 模块四:黑科技
Graal 是一个用 Java 写就的、并能够将 Java 字节码转换成二进制码的即时编译器。它通过 JVMCI 与 Java 虚拟机交互,响应由后者发出的编译请求、完成编译并部署编译结果。对 Java 程序而言,Graal 编译结果的性能略优于 OpenJDK 中的 C2;对 Scala 程序而言,它的性能优势可达到 10%(企业版甚至可以达到 20%!这背后离不开 Graal 所采用的激进优化方式。今天的实践环节,你可以尝试使用附带 Graal 编译器的 JDK。
2025-10-26 21:03:07
727
原创 模块一:Java虚拟机基本原理
前不久我参加了一个国外程序员的讲座,讲座的副标题很有趣,叫做:“我如何学会停止恐惧,并且爱上 Java 虚拟机”。这句话来自一部黑色幽默电影《奇爱博士》,电影描述了冷战时期剑拔弩张的氛围。程序员之间的语言之争又未尝不是如此。写系统语言的鄙视托管语言低下的执行效率;写托管语言的则取笑系统语言需要手动管理内存;写动态语言的不屑于静态语言那冗余的类型系统;写静态语言的则嘲讽动态语言里面各种光怪陆离的运行时错误。Java 作为应用最广的语言,自然吸引了不少的攻击,而身为 Java 程序员的你,或许在口水战中落了下风
2025-10-26 20:32:30
707
自动刷新生安全教育系列课程
2019-11-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅