之前的文章集合:
一些可以参考文章集合1_xuejianxinokok的博客-CSDN博客
一些可以参考文章集合2_xuejianxinokok的博客-CSDN博客
一些可以参考的文档集合3_xuejianxinokok的博客-CSDN博客
一些可以参考的文档集合4_xuejianxinokok的博客-CSDN博客
一些可以参考的文档集合5_xuejianxinokok的博客-CSDN博客
一些可以参考的文档集合6_xuejianxinokok的博客-CSDN博客
一些可以参考的文档集合7_xuejianxinokok的博客-CSDN博客
一些可以参考的文档集合8_xuejianxinokok的博客-CSDN博客
一些可以参考的文档集合9_xuejianxinokok的博客-CSDN博客
一些可以参考的文档集合10_xuejianxinokok的博客-CSDN博客
一些可以参考的文档集合11_xuejianxinokok的博客-CSDN博客
一些可以参考的文档集合12_xuejianxinokok的博客-CSDN博客
一些可以参考的文档集合13_xuejianxinokok的博客-CSDN博客
一些可以参考的文档集合14_xuejianxinokok的博客-CSDN博客
20240220
20240203
Linux虚拟文件系统(Virtual File System,VFS)是Linux操作系统中的一个重要组成部分,它提供了一个统一的接口,使得用户和应用程序可以通过相同的方式访问不同类型的文件系统。
VFS的设计目标是将不同类型的文件系统抽象为一个统一的接口,使得用户和应用程序无需关心底层文件系统的具体实现细节。通过VFS用户可以使用相同的系统调用(如open、read、write等)来访问不同类型的文件系统,包括本地文件系统(如ext4、XFS等)、网络文件系统(如NFS、CIFS等)以及虚拟文件系统(如procfs、sysfs等)。
20240130
用rust 写的sql解析器
20240125
数据库高可用,很常见的一种方式,使用双主同步+keepalived+虚ip的方式进行。
如上图所示,两个相互同步的主库使用相同的虚ip。
当主库挂掉的时候,虚ip自动漂移到另一个主库,整个过程对调用方透明,通过这种方式保证数据库的高可用。
20240123
操作系统为应为应用层提供了 mmap、brk 等系统调用来申请内存。但是这些系统调用在很多的时候,我们并不会直接使用。原因有以下两个
-
系统调用管理的内存粒度太大。系统调用申请内存都是整页 4KB 起,但是我们平时编程的时候经常需要申请几十字节的小对象。如果使用 mmap 未免碎片率也太大了。
-
频繁的系统调用的开销比较大。和函数调用比起来,系统的调用的开销非常的大。如果每次申请内存都发起系统调用,那么我们的应用程序将慢如牛。
所以,现代编程语言的做法都是自己在应用层实现了一个内存分配器。其思想都和内核自己用的 SLAB 内存分配器类似。都是内存分配器预先向操作系统申请一些内存,然后自己构造一个内存池。当我们申请内存的时候,直接由分配器从预先申请好的内存池里申请。当我们释放内存的时候,分配器会将这些内存管理起来,并通过一些策略来判断是否将其回收给操作系统。
通过这种方式既灵活地管理了各种不同大小的小对象,也避免了用户频率地调用 mmap 系统调用所造成的开销。常见的内存分配器有 glibc 中的 ptmalloc、Google 的 tcmalloc、Facebook 的 jemalloc 等等。我们在学校里学习 C 语言时候使用的 malloc 函数的底层就是 glibc 的 ptmalloc 内存分配器实现的。
聊聊C语言中的malloc申请内存的内部原理https://mp.weixin.qq.com/s/7ZyCXUABL0Urso4VeaEdBQ
20240122
-
当线程池小于corePoolSize,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。
-
当线程池达到corePoolSize时,新提交任务将被放入 workQueue 中,等待线程池中任务调度执行。
-
当workQueue已满,且 maximumPoolSize 大于 corePoolSize 时,新提交任务会创建新线程执行任务。
-
当提交任务数超过 maximumPoolSize 时,新提交任务由 RejectedExecutionHandler 处理。
-
当线程池中超过corePoolSize 线程,空闲时间达到 keepAliveTime 时,关闭空闲线程 。
20240117
方差的增量计算基于以下公式:
新方差 = (旧方差 × 旧数据个数 + 新数据与旧均值的差的平方) / 新数据个数
这个公式允许我们在已知旧数据集方差和均值的情况下,通过简单的计算就能得出新数据集的方差。需要注意的是,这个公式计算的是总体方差(即除以数据个数n),而非样本方差(除以n-1)。
20240115
2005 年,C++ 专家 Herb Sutter 在 Dr. Dobb’s Journal(DDJ)发表了著名的文章《The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software》, 谈到随着摩尔定律的终结,计算机软件将不得不、或者说被迫处理好基于多核处理器的大规模并发程序的效率问题,这对软件的并发性能提出了极致的要求,这也是 Go、Kotlin 等语言把 Coroutine 纳入到语言标准支持的原动力。
在业务领域,Java 和 Go 还是会占据主导地位。原因在于 Rust 的学习成本的确比较高。如果语言本身的学习成本比较高,而业务又要快速发展的话,往往会导致一些问题,比如,公司的人员储备以及对技术的学习理解和掌握都会出现一些不匹配或者产生较大的矛盾。业务本身的迭代会非常快,比如在阿里,一个 Java 应用每一星期可能会有三到四个版本的发布。这样的快速业务迭代就需要技术本身的平民化。 就像 James Gosling 在 1997 年发表的论文《The Feel of Java》所言,Java 是一门蓝领语言。它非常平民化,适合快速发展的业务,每门语言都有自己的定位。
20240111
1)Raft可视化测试以及各语言版本实现的Raft:https://raft.github.io/
2)Raft算法-动画演示(很好的入门教程):http://thesecretlivesofdata.com/raft/
tianai-captcha 目前支持的行为验证码类型
- 滑块验证码
- 旋转验证码
- 滑动还原验证码
- 文字点选验证码
- 图标验证码
- 语序验证码
- 刮刮乐验证码
- 后面会陆续支持市面上更多好玩的验证码玩法... 敬请期待
在线文档:http://doc.captcha.tianai.cloud
体验地址:http://captcha.tianai.cloud/
源码地址
tianai-captcha: 可能是java界最好的开源行为验证码[滑块验证码、点选验证码、行为验证码、旋转验证码, 滑动验证码]
GitHub - dromara/tianai-captcha: 可能是java界最好的开源行为验证码 [滑块验证码、点选验证码、行为验证码、旋转验证码, 滑动验证码]
20240109
在postgresql数据库中,需要安装plpythonu的extension,才可以使用python语言,plpythonu分两种。
一种是python2的版本plpython2u,
一种是python3的版本plpython3u。
语音识别(ASR)在人机交互方面发挥着重要的作用,可用于:转录、翻译、听写、语音合成、关键字定位、语音日记、语言增强等场景。语音识别基本过程一般包括:分析音频、音频分解、格式转换、文本匹配,但实际的语音识别系统可能会更复杂,并且可能包括其他步骤和功能组件,例如:噪声抑制、声学模型、语言模型和置信度评估等。
多年来,语音识别技术的进步令人印象深刻,我们可以使用语音识别技术实现智能家居、控制汽车实现自动驾驶、与ChatGPT等大模型对接进行对话、智能音箱、居家机器人等等。这些年来也因为自然语言处理、语音识别等技术的发展,诞生了很多优秀的公司,例如:讯飞**。
随着AI技术发展,越来越多的人或组织投入到语音识别相关领域的研究,也促进了该领域的开源项目蓬勃发展。开源项目往往更加易于定制化开发、使用成本更低、透明,并且可私有化部署,数据安全可控。这使得开源语音识别引擎在应用开发中越来越受到技术人员的青睐。
2024年已开始,AI热度不减,以下是几个截止目前比较优秀的开源语音识别引擎。
java并发编程好文章
20240108
JEP 457,类文件API(Class-File API,预览),最近已经集成到了 JDK 22 中。该 JEP 建议提供一个 API 来解析、生成和转换 Java 类文件。它最初将作为 JDK 中 Java 字节码操作和分析框架ASM的内部替代品,并计划将其作为公共 API 开放。甲骨文的 Java 语言架构师Brian Goetz将 ASM 描述为“带有大量遗留包袱的旧代码库”,并提供了关于该草案将如何发展并最终取代 ASM 的背景信息。
JEP 457 具有变革性的一个方面是如何解决 Java 生态系统中类文件格式的快速发展所带来的挑战。通过提供与 JDK 一起演进的标准 API,它能够确保使用该 API 的框架和工具会自动支持来自最新 JDK 的类文件。这种能力对于新语言和 VM 特性非常重要,它们在类文件中可能会有相应地表述。
ClassFile cf = ClassFile.of();
ClassModel classModel = cf.parse(bytes);
byte[] newBytes = cf.transform(classModel, (classBuilder, ce) -> {
if (ce instanceof MethodModel mm) {
classBuilder.transformMethod(mm, (methodBuilder, me)-> {
if (me instanceof CodeModel cm) {
methodBuilder.transformCode(cm, (codeBuilder, e) -> {
switch (e) {
case InvokeInstruction i
when i.owner().asInternalName().equals("Foo") ->
codeBuilder.invokeInstruction(i.opcode(), ClassDesc.of("Bar"),
i.name().stringValue(),
i.typeSymbol(), i.isInterface());
default -> codeBuilder.with(e);
}
});
}
else
methodBuilder.with(me);
});
}
else
classBuilder.with(ce);
});
20240102
用Go语言实现的网络协议解析功能是基于Google公司开发一个开源库:gopacket, 该库帮我们完成了网络协议的一些底层封装, 它允许我们能够捕获、解析和处理网络数据包, 与Wireshark一样,也支持对离线抓包文件的分析。gopacket库提供了一系列功能,包括:数据包捕获、解析和构建, 以及对多种协议的支持,如:Ethernet、IP、TCP、UDP、HTTP等。它还提供了方便的API, 以帮助开发者操作和分析网络数据包。
Jasypt(Java Simplified Encryption)是一个专注于简化Java加密操作的工具。它提供了一种简单而强大的方式来处理数据的加密和解密,使开发者能够轻松地保护应用程序中的敏感信息,如数据库密码、API密钥等。
Jasypt的设计理念是简化加密操作,使其对开发者更加友好。它采用密码学强度的加密算法,支持多种加密算法,从而平衡了性能和安全性。其中,Jasypt的核心思想之一是基于密码的加密(Password Based Encryption,PBE),通过用户提供的密码生成加密密钥,然后使用该密钥对数据进行加密和解密。
该工具还引入了盐(Salt)的概念,通过添加随机生成的盐值,提高了加密的安全性,防止相同的原始数据在不同的加密过程中产生相同的结果,有效抵御彩虹表攻击。
Jasypt与Spring Boot天然契合,可以轻松集成到Spring Boot项目中,为开发者提供了更便捷的数据安全解决方案。通过Jasypt,开发者可以在不深入了解底层加密算法的情况下,轻松实现数据的安全保护,使得应用程序更加可靠和安全。
官网地址: http://www.jasypt.org/
20231229
它不是微服务或单体应用;这是你首先需要理解的认知负荷
“不要在整体架构或微服务架构之间进行选择,而是设计软件以适应最大的团队认知负载”
如果您只有一个团队,请考虑调整您的架构以匹配团队的容量。支持整体式、内聚性和模块化架构。
如果您有多个团队,请考虑使用微服务或类似类型的架构,以便他们可以独立工作。
微服务的目的是有效的拆分应用,实现敏捷开发和部署。
在单体架构下,没有什么有效阻断错误传播的手段,系统中“整体”与“部分”的关系没有物理的划分,系统质量只能靠研发与项目管理措施来尽可能地保障,少量的技术专家很难阻止大量螺丝钉式的程序员或者不熟悉原有技术架构的外包人员在某个不起眼的地方犯错并产生全局性的影响,不容易做出整体可靠的大型系统。这时微服务可以作为专家掌控架构约束力的技术手段,由高水平的开发、运维人员去保证关键的技术和业务服务靠谱,其他大量外围的功能即使不靠谱,甚至默认它们必定不靠谱,也能保证系统整体的稳定和局部的容错、自愈与快速迭代。
协程(Coroutines)一般指一个可以被暂停和恢复执行的逻辑体。普通的函数有 2 个常规的操作和行为:调用(Call)和返回(Return)。协程可以允许这个被调用的函数执行到某个位置之后暂时保留自己的临时信息并挂起。在后面的某个时间点可以再回到当时执行的位置和状态继续执行。所以从某种意义上可以说协程是普通函数的泛化(Generalisation)。
20231226
ef simple_gen(a):
print('-> Started: a =', a)
b = yield a
print('-> Received: b =', b)
c = yield a + b
print('-> Received: c =', c)
gen = simple_gen(14)
next(gen) # -> Started: a = 14
next(gen) # ?
next(gen) # ?
运行结果如图:
发生了什么??从第一次 next(gen) 调用开始,它在 yield a 处停止,然后当您再次调用 next(gen) 时,b 实际上是 None 值,这导致了异常。
b 为什么是 None 值?因为我们在 yield a 处没有接收到任何值,所以 b 就是 None 值。要想接收值,
要继续,您需要使用 send() 函数:生成器发送(值)恢复执行并将值“发送”到生成器函数中。value 参数成为当前 yield 表达式的结果。send() 方法返回生成器生成的下一个值,或者如果生成器退出而没有生成另一个值则引发 StopIteration。
怎么理解send() 函数?一个带参数的 next(),接收参数,执行yield,然后返回值。
复制
def simple_gen(a):
print('-> Started: a =', a)
b = yield a
print('-> Received: b =', b)
c = yield a + b
print('-> Received: c =', c)
gen = simple_gen(14)
next(gen) # -> Started: a = 14
gen.send(15) # Received: b = 15 # send 15 to generator,并执行下一步 send包含next的yield
20231225
application.properties 文件中设置一个属性:
spring.threads.virtual.enabled:true
20231219
listen 127.0.0.1:3306;
listen *:3306;
# 效果与listen *:3306一样
listen 3306;
listen localhost:3306;
allow ,deny 指令设置指定的IP允许访问。可以和deny指令配合使用
作用域:stream, server
语法:allow address | CIDR | unix: | all
# 允许192.168.110.1访问
allow 192.168.110.1;
# 允许192.168.110.1到192.168.255.254
allow 192.168.110.0/16;
# 允许192.168.110.1到192.168.110.254
allow 192.168.110.0/24;
# 允许所有的IP访问
allow all;
# 禁止192.168.110.1访问
deny 192.168.110.1;
# 禁止192.168.110.1到192.168.255.254
deny 192.168.110.0/16;
# 禁止192.168.110.1到192.168.110.254
deny 192.168.110.0/24;
# 禁止所有的IP访问
deny all;
stream {
allow 192.168.110.100;
deny all;
server {
listen 3306;
proxy_pass 192.168.110.101:3306;
}
}
20231211
为什么这个算法叫 SoftMax 呢?
Soft 是软的意思,与之对应肯定有 HardMax。
而 HardMax,可以理解为我们平时认知的Max。比如两个数(3, 4), 那么这两个数的 HardMax(3,4) 结果就是4。
指数增长的特性就是,横轴变化很小的量,纵轴就会有很大的变化。
所以,从1.9变化到2.1,经过指数的运算,两者的差距立马被的拉大了。从而,我们可以更加明确的知道,图片的分类应该属于最大的那个。
指数让得分大的分类最终的概率更大,得分小的分类最终的概率更小,而得分为负数的分类,几乎可以忽略。
多类分类下为什么用softmax而不是用其他归一化方法? - 知乎很多同学在做深度学习时,都会遇到难以理解的算法,SoftMax 肯定是其中一个。初学时大都对它一知半解,只…https://www.zhihu.com/question/40403377/answer/3320053643?utm_id=0transformer架构的核心公式其实类似于数学期望,理解起来也不复杂,但为什么这个模型这么强呢? - 知乎神经网络的一个基础假设是:通过堆叠一些基础的计算单元,我们能够构建强大的智能体。所以不仅仅是Transf…https://www.zhihu.com/question/580810624/answer/2979260071
目前来看主流解决方案有两个思路,都是潜在的发展方向。
一是接受Transformer理论上本身就无法处理无限token的现实,并依靠一些机制来解决需要long-term memory的情况。比如通过额外的向量数据库来作为long-term memory。这其实挺像人的模式(虽然我不太喜欢拿人类比AI)。人类理论上是有处理无限token的能力,但现实是会忘记某些信息。这时人的方法是靠外部存储(如书籍)来辅助回忆。人类使用的外部存储就对应于大模型使用的向量数据库。
二是继续理论上可以处理无限token的RNN系列。这又有两方面问题可以研究。一是诸如线性Transformer一类,用Transformer的思想往RNN上套。二是解决RNN的并行化和优化问题。
RNN是强大工具。但无法并行化的问题使它很难把模型搞到目前的千亿级规模。此外,基于梯度的优化方法对RNN特别不友好。
20231208
主流os内核通常是C语言写成,系统函数库通常以一个或多个链接库文件的形式提供,其中最重要的是C标准库
,其他的链接库往往调用C标准库而实现,当然也可能直接调用系统内核函数,甚至混合。不同系统平台有多种主流的C标准库共存:
- BSD libc,由BSD系统发布;
- GNU C Library (glibc),由GNU项目发布,可在Linux、多种UNIX系统上运行;
- Microsoft C run-time library(MSVCRT.DLL),由微软随Windows发布,给Visual C++编辑器链接使用的;
- Newlib,由Cygnus Solution公司开发,Cygwin环境中的libc.a正是此版本,目前广泛用在嵌入式系统中;
- dietlibc、μClibc等,功能经过适度裁剪的C标准库,主要用在嵌入式系统。
Cygwin就是在Windows中增加了一个中间层——兼容POSIX的模拟层,并在此基础上构建了大量Linux-like的软件工具。再来解释本文开头的回答,如下图,POSXI兼容环境包括以下两部分:
- cygwin1.dll,作为实现POSIX系统调用的模拟层,可原生运行在Windows中;
- 在cygwin1.dll之上构建的大量函数库、应用程序,如
libc
、zlib
、bash
、gcc
、vim
、awk
、sed
、git
等等,与UNIX/Linux几乎等同*。
*注:Cygwin的libc是Newlib,Linux的libc是GNU libc,UNIX有的是BSD libc。
20231204
LLM VisualizationA 3D animated visualization of an LLM with a walkthrough.https://bbycroft.net/llm
可以使用参数指定最终镜像的名称,如下所示:
mvn spring-boot:build-image \
-Dspring-boot.build-image.imageName=my-spring-boot-image
或者可以在配置中指定,如下所示:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<imageName>my-spring-boot-image</imageName>
</configuration>
</plugin>
现在,可以在这里进行一些级别的自定义。如果想真正自定义镜像的构建过程,需要创建自己的构建器镜像来定义构建过程。
20231201
20231130
llamafile 允许您使用单个文件分发和运行 LLM
llamafile 可让您将大型语言模型 (LLM) 权重转换为可执行文件。
假设您有一组 4GB 文件形式的 LLM 权重(采用常用的 GGUF 格式)。使用 llamafile,您可以将该 4GB 文件转换为可在六种操作系统上运行的二进制文件,而无需安装。
我们通过结合我们喜欢的两个项目来实现这一切:llama.cpp(一个领先的开源 LLM 聊天机器人框架)和 Cosmopolitan Libc(一个开源项目,使 C 程序能够在大量平台和架构上编译和运行) 。它还需要解决一些有趣且有趣的问题,例如向 Cosmopolitan 添加 GPU 和 dlopen() 支持;您可以在项目的自述文件中阅读更多相关信息。
由于Pytesseract和easyOCR可以处理图像,因此在执行内容提取之前需要将PDF文件转换为图像。可以使用pypdfium2进行转换,这是一个用于处理PDF文件的强大库
20231129
在mysql中 int占4个字节,那么对于无符号的int,最大值是2^32-1 = 4294967295
,将近40亿,难道用了int(1)
,就不能达到这个最大值吗?
CREATE TABLE `user` (
`id` int(1) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
id字段为无符号的int(1)
,我来插入一个最大值看看。
mysql> INSERT INTO `user` (`id`) VALUES (4294967295);
Query OK, 1 row affected (0.00 sec)
可以看到成功了,说明int后面的数字,不影响int本身支持的大小,int(1)、int(2)...int(10)没什么区别。
而且对于0001这种,底层存储的还是1,只是在展示的会补0。
int后面的数字不能表示字段的长度,int(num)
一般加上zerofill,才有效果。zerofill的作用一般可以用在一些编号相关的数字中,比如学生的编号 001 002 ... 999这种,如果mysql没有零填充的功能,但是你又要格式化输出等长的数字编号时,那么你只能自己处理了。
很多资深开发竟然都不清楚 int(1) 和 int(10) 的区别!https://mp.weixin.qq.com/s/iAADveQk1JEtE4pGf3rcYQ
20231127
如何切换window11 右键菜单:
解决方法如下,我们目标是恢复到win10的菜单。
以管理员身份运行 Power Shell
恢复到win10
reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve
恢复到win11
reg delete "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32"
Agent 将是 AI 最大的赛道!未来五年,这一切将彻底改变。https://mp.weixin.qq.com/s/PxZJqkAUnzGNXdcXEvGbRQ
Understanding Deep Learning
by Simon J.D. Prince
To be published by MIT Press Dec 5th 2023.
-
大模型在特定场景下的专业性暂时没有得到足够提升;
-
大模型时代的“魔咒”——好用的不通用,通用的不好用;
只需要在前端接一个语音转文本,后端再接一个语音合成,基本上就可以基于大模型完成营销任务。
大模型背后是神经网络,类似于人脑的直觉系统,能够很好地理解语言。但这种神经网络结构不擅长处理大百科类的低频长尾实时性知识。这时候,可以把这类低频长尾的知识,放到“外挂知识库”里进行存储,也就是向量数据库,在需要时再到其中进行资料查找。
数据需要积累,容易解决的是预训练数据部分,但指令数据部分是比较难的,对数据质量要求更高。因为大模型时代仍然面临一个法则——好用的不通用,通用的不好用。
20231120
StyleTTS 2:通过大型语音语言模型的风格扩散和对抗性训练实现人类水平的文本转语音
20231116
wasm 的线性内存
20231114
基于已有流行数据库以插件形式提供的则有 pgvector 与 Redis Stack
参考 Redis as a vector database quick start guide | Redis
pgvector 提供了 ivfflat 算法以近似搜索,它的工作原理是将相似的向量聚类为区域,并建立一个倒排索引,将每个区域映射到其向量。这使得查询可以集中在数据的一个子集上,从而实现快速搜索。通过调整列表和探针参数,ivfflat 可以平衡数据集的速度和准确性,使 PostgreSQL 有能力对复杂数据进行快速的语义相似性搜索。通过简单的查询,应用程序可以在数百万个高维向量中找到与查询向量最近的邻居。对于自然语言处理、信息检索等,ivfflat 是一个比较好的解决方案。
让我们以 ivfflat 方法为例。在建立 ivfflat 索引时,你需要决定索引中包含多少个 list。每个 list 代表一个 "中心";这些中心通过 k-means 算法计算而来。一旦确定了所有中心,ivfflat 就会确定每个向量最靠近哪个中心,并将其添加到索引中。当需要查询向量数据时,你可以决定要检查多少个中心,这由 ivfflat.probes 参数决定。这就是 ANN 性能/召回率的结果:访问的中心越多,结果就越精确,但这是以牺牲性能为代价的。
由于在 "向量数据库 "和 pgvector 中存储 AI/ML 输出的做法很流行
关于redisstack的向量数据库
Redis as a vector database quick start guide | Redis
redis/redis-stack-服务器
要使用 redis-stack-server 映像启动 Redis Stack 服务器,请在终端中运行以下命令:
docker run -d --name redis-stack-server -p 6379:6379 redis/redis-stack-server:latest
`
要使用 redis-stack 映像启动 Redis Stack 容器,请在终端中运行以下命令:
docker run -d --name redis-stack -p 6379:6379 -p 8001:8001 redis/redis-stack:latest
`
上面的 docker run 命令还在端口 8001 上公开 RedisInsight。您可以通过将浏览器指向 localhost:8001 来使用 RedisInsight。
RedisInsight | RedisVisualize and optimize Redis datahttps://redis.io/docs/connect/insight/
SentenceTransformers 是一个用于最先进的句子、文本和图像嵌入的 Python 框架。我们的论文 Sentence-BERT:Sentence Embeddings using Siamese BERT-Networks 描述了最初的工作。
可以使用此框架来计算 100 多种语言的句子/文本嵌入。然后可以比较这些嵌入,例如使用余弦相似度来查找具有相似含义的句子。这对于语义文本相似、语义搜索或释义挖掘非常有用。
SentenceTransformers Documentation — Sentence-Transformers documentationhttps://www.sbert.net/