- 博客(105)
- 收藏
- 关注
原创 一个简单的医疗问答RAG
这里虽然写的是vectorizer ,但是实际上是文本召回,也就是bm25。构建bm25需要的处理函数,jieba分词即可。RRF实现融合排序,公式很简单,出现次数 +下面格式是ipynb,具体参考原链接吧。加载知识库,按照换行符切分。根据query得到检索结果。得到融合后的检索结果。
2024-08-23 12:20:52
133
原创 tokenizer一些理解
计算机要处理语言,首先需要将文本转换成数字形式。这个过程由一个称为标记化 Tokenization。标记化分为2个过程1、将输入文本划分为token标记器首先获取文本并将其分成更小的部分,可以是单词、单词的部分或单个字符。这些较小的文本片段被称为标记。Stanford NLP Group[2]将标记更严格地定义为:在某些特定的文档中,作为一个有用的语义处理单元组合在一起的字符序列实例。2、为每个标记分配一个ID标记器将文本划分为标记后,可以为每个标记分配一个称为标记ID的整数。
2024-08-20 23:48:07
936
原创 Tiny-Universe的一些解读
datawhale这块程序写的有一点问题,就总结一下大概思路吧。,顶多再微调一下,而后者着重向量的构建,检索速度的优化?首先对输入文本加一个"question"前缀,然后送入。具体操作细节可以看官网文档的readme.md。就是事先人为构造好的prompt格式。就调用插件(tool)将结果拼接到。这两部分,前者貌似一般都有开源的。最后再送入model拿到结果。
2024-08-13 20:27:37
231
原创 minbpe解读
内部会调用bpe函数,bpe的目的就是将每个合并后的字节序列,进行复原。,它对基础的256个词汇进行了shuffle,因为mergeable_ranks就是一个字典,我打印了前300个,可以和正常的vocab对比一下输出。通俗点说,就是mergeable_ranks给出了合并以后的字节序列,而这两个函数做的就是复原,让你看清楚是哪两个字节序列合并的。这部分的代码没啥好说的,都是继承自base.py里面的Tokenizer基类,自己调试一下就很清晰了。但是这里为什么要乱序,不是很理解,给的注释是,
2024-08-13 10:22:20
515
原创 自动驾驶的一些大白话讲解
当前的所谓自动驾驶系统,本质上就是一个规则执行器,它的基本工作原理是拿路上遇到的实际情况与人工提前写好的规则去比对,匹配上就按规则执行,匹配不上的话系统就提示接管自动退出。自动驾驶的端到端系统也是一样的,从摄像头收集到的海量数据中,去学习人在面对各种路况时候的行为和决策,找到其中的规律并以此来决策。对于很多极端场景来说,只要我们的训练数据足够,是可以更好的应对的。打个比方,有的车企起步早,在感知和决策规则的代码数量都要远远多于后面加入的车企,后面的要赶上必须加大人力、财力、时间的投入才有机会。
2024-08-09 15:18:31
1299
原创 python装饰器
装饰器本质上是一个 Python 函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。Leader说上面的解决方案以及非常接近装饰器的思想了,小A查了一下装饰器的用法,加入装饰器后代码果然变得很优雅。带参数和不带参数的类装饰器有很大的不同。:不再接收被装饰函数,而是接收传入参数。:接收被装饰函数,实现装饰逻辑。基于类装饰器的实现,必须实现。
2024-07-29 17:49:04
317
原创 CMake入门
CMake一般用来构建大型项目,为了弄清整个项目的结构,源码在哪里,生成的产物在哪里等等,了解CMake以后以上问题都会迎刃而解。# SET 指令的语法是:# VAR表示变量名称,VALUE表示变量的值,可以为多个,后面一些可选项,用到的时候查文档即可# 方式1: 各个源文件之间使用空格间隔# 方式2: 各个源文件之间使用分号;间隔div.c;main.c;mult.c;sub.c)
2024-07-22 17:59:21
622
原创 协程——uthread学习
调度器包括主函数的上下文main,包含当前调度器拥有的所有协程的vector类型的threads,以及指向当前正在执行的协程的编号running_thread.如果当前没有正在执行的协程时,running_thread=-1.ctx保存协程的上下文,stack为协程的栈,栈大小默认为DEFAULT_STACK_SZIE=128Kb.你可以根据自己的需求更改栈的大小。最重要的点:我感觉恢复上下文的时候,是恢复到下一行!func为协程执行的用户函数,arg为func的参数。更详细的介绍,请查看我的中文博客。
2024-07-19 23:38:28
525
原创 transformer初探
这里有一个很关键的点是,在encoder中只有self-attention,因为是一次性输入所有的token,计算每个token之间的关联性,得到一个编码后的输出。但是decoder是一个一个输入,每输入一个产生一个输出,虽然说这一步也可以用矩阵并行计算,其原理就是masked-attention。值得注意的是,在decoder中mask-attention后的输出,还会和encoder的输出再作一次attention,这被称为cross-attention。,这三个矩阵就是需要训练的参数。
2024-07-06 11:17:28
943
原创 qml之DropArea和Drag
Drag.active不是Rectangle的属性,但是实际使用的时候,都是这样使用的,官方例子也是这样,貌似任何项目都可以使用Drag来实现拖放。借鉴这个思想,后面考虑如何拖动添加卡片。
2024-05-09 20:37:24
278
原创 qml拖动交换之Gridview
移动的时候,会不断触发onPositionChanged,将btnIcon对象的左上角坐标,转换成gridview下的坐标,根据这个坐标计算是在gridview中的哪一格,以此来判断是否需要交换。如果需要交换,就将之前记录的那个索引dragIndex对应的元素,移动到新的idx对应的元素那里。我们拖动的是那个元素里面的一个子元素!这是btnIcon在btnIconArea中的相对位置,然后将btnIcon的parent换成btnIconArea,这一步很重要!
2024-05-09 15:39:08
529
原创 I/O模型的一些理解
异步:把事情推到以后去做阻塞:专心做一件事情同步阻塞:马上专心做一件事情同步非阻塞:一边做一件事情,一边做另一件事情(一心二用)异步阻塞:把问题推到以后专心处理异步非阻塞:把问题推到以后时不时处理一下。
2024-03-28 16:29:49
1242
原创 Bert的一些理解
BERT 模型的训练数据集通常是以预训练任务的形式来构建的,其中包括两个主要任务:Masked Language Model (MLM) 和 Next Sentence Prediction (NSP)。下面简要介绍这两个任务在数据集中的格式:举个例子举个例子:对于每一个训练样例,我们在语料库中挑选出句子A和句子B来组成,50%的时候句子B就是句子A的下一句(标注为IsNext),剩下50%的时候句子B是语料库中的随机句子(标注为NotNext)。接下来把训练样例输入到BERT模型中,用[CLS]对应的
2024-03-19 17:17:16
626
原创 记忆化搜索
的矩阵 ,要求选择一个起点,然后选择上下左右四个相邻方向之一开始行走,并且要保证行走的点的值比当前点小,即找一条单调递减的路径,要求这条路径最长。偏序关系其实就是代表了状态转移的方向,例如上面只允许值大的往值小的方向走,这就是一种偏序关系;今天每日一题可以用dp做,但是看答案有人用记忆化搜索,以前也经常听到这个名词,so今天好好来学一下,什么是记忆化搜索。因为在递归计算的时候,我们必须保证传入参数的合法性,所以这一步是必要的,比如坐标为负数之类的判断;的值,而不需要使用额外的变量。时,我们可以直接修改。
2024-03-15 17:35:25
781
原创 关于c++右值的一些理解
在测试程序中getObj()的返回值就是一个将亡值,也就是说是一个右值,在进行赋值操作的时候如果=右边是一个右值,那么移动构造函数就会被调用。移动构造中使用了右值引用,会将临时对象中的堆内存地址的所有权转移给对象t,这块内存被成功续命,因此在t对象中还可以继续使用这块内存。将亡值:与右值引用相关的表达式,比如,T&&类型函数的返回值、 std::move 的返回值等。,其生命周期与右值引用类型变量的生命周期一样,只要该变量还活着,该右值临时量将会一直存活下去。右值引用就是对一个右值进行引用的类型。
2024-03-04 14:20:39
958
原创 最小生成树Prim + Kruskal
通过这个例子可以看到,t.join(1, 3);还是t.join(3, 1);最后判断t.isSame(1, 3)都会是true。这里不能直接将isSame抽象出来,在join里面调用,必须寻根以后再。通过模板,我们可以知道,并查集主要有三个功能。这里直接用carl给的模板。
2024-02-28 18:33:50
375
原创 LFU算法
大致就是说LFUCache类维护一个存放node的map,同时维护两个双向链表,注意这个双向链表里面又包含了两个双向链表,访问的频率是first最大,last最小。其余的就是正常的双向链表的操作了(插入,删除)Leetcode有原题,之前手写过LRU,数据结构还是习惯于用java实现,实现是copy的评论题解。Least Frequently Used(最不频繁使用)
2024-01-24 17:07:33
402
原创 正向代理和反向代理
事实上,正向代理和反向代理的作用都是进行请求和转发,但是为了区别正向代理,所以后出现的就成为反向代理。生活中最常见的例子:1、正向代理: 卖票的黄牛2、反向代理: 出租房的二手东。
2024-01-16 17:39:31
854
原创 Linux高性能服务器编程——学习笔记①
当发送端使用send或write向一个TCP连接写入数据的时候,内核中的TCP模块首先把这些数据复制到与该连接对应的TCP内核发送缓冲区中,然后TCP模块调用IP模块提供的服务,传递的参数包括TCP头部信息和TCP发送缓冲区中的数据,即TCP报文段。 第二,ARP请求和应答是从以太网驱动程序发出的,而并非像图中描述的那样从ARP模块直接发送到以太网上,所以我们将它们用虚线表示,这主要是为了体现携带ARP数据的以太网帧和其他以太网帧(比如携带IP数据报的以太网帧)的区别。如何将机器的域名转换成IP?
2024-01-13 16:33:58
1087
原创 virtualbox共享文件夹
home/zyt/win_workspace/ : 虚拟机的文件夹。shared_file : 共享文件夹的昵称。对应于D:\Workspace。
2023-12-27 16:21:55
573
原创 C++线程同步之条件变量
看这块的时候,可以结合c里面的条件变量一起看,机制都一样,函数不一样罢了。条件变量是C++11提供的另外一种用于等待的同步机制,它能阻塞一个或多个线程,直到收到另外一个线程发出的通知或者超时时,才会唤醒当前阻塞的线程。条件变量需要和互斥量配合起来使用,C++11提供了两种条件变量:std::mutexnotify_one()或者唤醒一个或者所有被阻塞的线程。
2023-12-22 11:19:52
195
原创 python删除空文件夹
这种方式只能删除树上,最底层的空文件夹,如果某个文件夹内部只有一个空文件夹,那么上述代码执行以后,该文件夹最后也会变成一个空文件夹,但是不会被删除掉。
2023-12-17 04:17:07
113
原创 UDP特性之广播
发送的ip统一填广播地址,比如10.82.254.255接收方的bind的ip要么INADDR_ANY要么具体的ip(这个好像不行,留个疑问)直接不填也行。
2023-12-14 14:33:49
227
原创 (important)关于socket的一些理解
因为之前都是统一指定的ip为127.0.0.1 一直只是尝试本机通信,明白上述三点以后,seraddr.sin_addr.s_addr到底应该填多少,相信大家心里都会清楚。然后再调用bind函数,表示服务端程序,允许任何本地IP地址接受连接,(因为可能有多个网卡,多个ip地址),同时绑定本地的9999端口。客户端的端口号应该是操作系统自动分配的。至于其他的通信函数,可以看之前写的文章。
2023-12-13 18:32:42
391
原创 基于UDP的套接字通信
udp是一个面向无连接的,不安全的,报式传输层协议,udp的通信过程默认也是阻塞的。UDP通信不需要建立连接,因此不需要进行connect()操作UDP通信过程中,每次都需要指定数据接收端的IP和端口,和发快递差不多UDP不对收到的数据进行排序,在UDP报文的首部中并没有关于数据顺序的信息UDP对接收到的数据报不回复确认信息,发送端不知道数据是否被正确接收,也不会重发数据。如果发生了数据丢失,不存在丢一半的情况,如果丢当前这个数据包就全部丢失了。
2023-12-13 14:37:19
124
原创 IO多路转接之epoll
epoll 全称 eventpoll,是 linux 内核实现IO多路转接/复用(IO multiplexing)的一个实现。IO多路转接的意思是在一个操作里同时监听多个输入输出源,在其中一个或多个输入输出源可用的时候返回,然后对其的进行读写操作。epoll是select和poll的升级版,相较于这两个前辈,epoll改进了工作方式,因此它更加高效。对于待检测集合select和poll是基于线性方式处理的,epoll是基于红黑树来管理待检测集合的。
2023-12-11 16:37:48
66
原创 IO多路转接之poll
从上面的测试代码可以得知,使用poll和select进行IO多路转接的处理思路是完全相同的,但是使用poll编写的代码看起来会更直观一些,select使用的位图的方式来标记要委托内核检测的文件描述符(每个比特位对应一个唯一的文件描述符),并且对这个。一点自己的思考:现在写的一些通信方式,都是基于固定大小的数组,是理想的情况,如果数组比较小,多次write或者多次read怎么解决?内核会根据第二个参数传递的值对参数1数组中的文件描述符进行线性遍历,这一点和select也是类似的。指定poll函数的阻塞时长。
2023-12-11 10:28:30
52
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人