- 博客(112)
- 收藏
- 关注
原创 【C++项目】高并发内存池
当前项目是实现一个高并发的内存池,他的原型是google的一个开源项目tcmalloc,tcmalloc全称Thread-Caching Malloc,即线程缓存的malloc,实现了高效的多线程内存管理,用于替代系统的内存分配相关的函数(malloc、free)。所谓“池化技术”,就是程序先向系统申请过量的资源,然后自己管理,以备不时之需。之所以要申请过量的资源,是因为每次申请该资源都有较大的开销,不如提前申请好了,这样使用时就会变得非常快捷,大大提高程序运行效率。
2024-01-25 15:55:29
1418
3
原创 【AI学习从零至壹】langchain1.0中间件
在 LangChain 1.0 中,中间件(Middleware)是一种革命性的架构模式,它彻底改变了我们处理 AI Agent 生命周期的方式。想象中间件就像给 Agent 穿上了一件"钢铁侠战衣"——这套战衣能够自动感知并拦截每一次肌肉收缩(Tool Call)和每一次脑电波爆发(Model Call),而 Agent 本身甚至不需要知道战衣的存在。
2026-01-20 21:58:58
1081
原创 【AI学习从零至壹】code-graph-rag代码embeddind优化
是一个针对大型代码库的下一代检索增强生成 (RAG) 系统。与传统的基于文本切片 (Chunk-based) 的 RAG 不同,它通过构建知识图谱 (Knowledge Graph)来理解代码的结构、关系和全局上下文。通过引入Singleton 模式LRU 缓存以及批量推理 (Batch Inference),我们在索引速度上实现了数量级的飞跃。指标优化前 (Before)优化后 (After)提升幅度模型加载策略每次调用重新加载 (重 IO/GPU 开销)
2026-01-20 17:16:03
638
原创 【AI学习从零至壹】代码专用Embedding模型调研报告
它在 CPU 环境下依然能提供接近实时的响应(<500ms),并保证了极高的检索质量,完全满足 RAG 系统的需求。代码专用Embedding模型通过将代码片段映射到低维语义向量空间,实现代码语义的可计算化,是代码搜索、漏洞检测、智能补全、跨语言迁移等场景的核心技术,其性能直接影响下游任务效果,因此科学评估其召回率、效率等指标具有关键意义。针对代码Embedding模型的核心需求(召回率、效率、资源占用),需设计标准化评估流程。注:数据基于 CPU 运行,单位 ms/query。
2026-01-13 19:52:21
889
原创 【AI学习从零至壹】Fastapi应用
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于基于标准 Python 类型提示构建 API。核心特性与优势高性能:基于 Starlette(负责路由/Web)和 Pydantic(负责数据验证),性能与 NodeJS 和 Go 相当。开发效率:利用 Python 类型提示(Type Hints),显著减少代码量(约 40%)并减少人为错误。自动化文档:开箱即用,自动生成交互式 API 文档:数据验证:自动进行请求参数(路径、查询、Body)的类型转换和验证。
2026-01-05 17:05:54
823
原创 【AI学习从零至壹】AI调用MCP抓包分析pcap原始报文
通过 API 令牌建立 Cherry Studio 和 ModelScope 的通信,在ModelScope 网站选择和创建 MCP-Server,然后在 Cherry Studio点同步服务器,就可以自动添加该 MCP-Server 到 Cherry Studio 中,但只仅限于host类型的。新的AI能力共享生态:通过MCP Server的共享,新的LLM应用可以快速获得各种工具,形成了一种新的合作体系,提高整体效用。LLM应用的快速扩展:随时“插拔”新的MCP Server即可,一个不够就再来一个。
2025-08-10 18:34:42
1570
原创 【AI学习从零至壹】langchain实现特定主题聊天系统
通过 LangChain 框架调用大语言模型(这里配置的是 GLM-4-Flash 模型),支持多轮对话(上下文关联),并将不同会话的历史记录保存到本地 JSON 文件中,通过session_id区分不同用户 / 会话。
2025-08-05 01:38:56
880
原创 【AI学习从零至壹】命名实体识别及Trainer微调预训练模型
NER 是 Named Entity Recognition(命名实体识别)的缩写。它属于⾃然语⾔处理(NLP)领域中的⼀个重要任务.我们往往会根据具体⼯作业务的需要,⽽去识别不同的实体。例如:医⽣在⽇常⼯作中,会对‘发烧ʼ,‘红肿ʼ,‘过敏ʼ等这类病理症状的名词实体关注较多;⽽学⽣在学习中,会对‘成绩ʼ,‘知识点ʼ,‘测试ʼ,‘科⽬ʼ等这类学习相关的实体关注度⾼。由此,命名实体识别的⽬的也就反映出,我们对于不同⼈群,在⾃然语⾔中分析并抽取与他们关联业务名词的过程。
2025-07-28 01:42:37
1108
原创 【AI学习从零至壹】Transformer
Transformer架构已经成为许多应⽤中的主导架构,它堆叠了许多层“self-attentionˮ模块。同⼀层中对每个模块使⽤标量积来计算其查询向量与该层中其他模块的关键向量之间的匹配。匹配被归⼀化为总和1,然后使⽤产⽣的标量系数来形成前⼀层中其他模块产⽣的值向量的凸组合。结果向量形成下⼀计算阶段的模块的输⼊。
2025-07-22 23:44:12
1167
1
原创 【AI学习从零至壹】LangChain及RAG原理
什么是检索增强⽣成?检索增强⽣成(retrieval Augmented Generation)就是在应⽤⼤语⾔模型过程中,使⽤从其它途径 检索⽽得到 的额外信息作为模型的补充输⼊。把这些内容输⼊到⼤型语⾔模型 (LLM)(例如ChatGPT)的过程。之后,LLM可以使⽤该信息来增强其⽣成的 响应内容。我们将⽤⼾和LLM交互的整个过程看作是⼀个链(chain)。⾸先从⽤⼾发出提问开始: “我该如何完成<某件事情>?ˮ。
2025-07-02 00:28:22
717
原创 【AI学习从零至壹】LLM模型prompt开发及⼤模型应⽤
原因有两个:⼀是因为电脑创造之初,就是数学和⼯程的天才作品,其结构和⼯作原理不是普通⼈能够轻松理解的。它会维护对话的上下⽂信息,能够根据之前的对话历史⽣成相关的回复,就像⼈与⼈之间的聊天⼀样,适⽤于连续对话和需要上下⽂理解的任务。generate:通常是⼀次性⽣成⽂本,在单个请求中根据给定的输⼊和条件⽣成指定的⽂本输出,不保留对话状态,每次⽣成都是独⽴的,适合于没有对话上下⽂依赖的任务。所以模型的训练就是:监督者负责将对话系统预测的内容与⽂本中的实际内容进⾏对⽐,不断训练模型正确地预测⽂本后⾯的内容。
2025-06-27 00:32:53
1184
原创 【AI学习从零至壹】基于深度学习的⽂本分类任务
通常情况下,基于神经⽹络的机器翻译模型使⽤的都是固定词汇表。不像绝⼤多数假设⽆限词汇量的⽆监督分词算法SentencePiece训练分词模型是要确保最终词汇量是固定的,例如 8k、16k 或 32k。请注意,SentencePiece 指定了训练的最终词汇量⼤⼩,这与使⽤合并操作次数的 subword-nmt 不同。合并操作的次数是 BPE 特定的参数,不适⽤于其他分割算法,包括 unigram、word 和 character。
2025-06-03 23:05:00
1227
5
原创 【AI学习从零至壹】RNN循环神经⽹络
循环神经⽹络(Recurrent Neural Network, RNN)是⼀类以序列(sequence)数据为输⼊,在序列的演进⽅向进⾏递归(recursion)且所有节点(循环单元)按链式连接的递归神经⽹络(recursive neural network)LSTM 中引⼊了3个⻔,即输⼊⻔(input gate)、遗忘⻔(forget gate)和输出⻔(output gate),以及与隐藏状态形状相同的记忆细胞(某些⽂献把记忆细胞当成⼀种特殊的隐藏状态),从⽽记录额外的信息。
2025-04-28 01:18:46
903
原创 【AI学习从零至壹】语⾔模型及词向量相关知识
⾃然语⾔(NaturalLanguage)其实就是⼈类语⾔对⽐于程序设计语⾔,⾃然语⾔处理(NLP)就是利⽤计算机对⼈类语⾔进⾏处理。在NLP领域中,针对⾃然语⾔处理核⼼任务的分类,⼀直存在着如下两种划分:⾃然语⾔理解(Natural Language Understanding,NLU)⾃然语⾔⽣成(Natural Language Generation,NLG)
2025-04-11 01:29:03
1225
原创 【AI学习从零至壹】PyTorch模型训练相关要素
在 PyTorch 中,优化器(optimizer)是⽤于更新神经⽹络参数的⼯具,它会根据计算得到的损失函数的梯度来调整模型的参数,通常是以最⼩化损失函数来改进模型的性能。批量梯度下降法是最原始的形式,就是指在每⼀次训练迭代时使⽤所有样本来进⾏梯度的更新。归⼀化也是⼀种带有参数的归⼀化计算公式。但主要⽬的是为了稳定训练过程,加速模型收敛并减少过拟合。神经⽹络模型的输出层,通常会根据训练任务的不同,⽽分为两种情况:单⼀节点的输出和多节点输出。正则化是⼀种数据筛选⽅法,作⽤是抑制过拟合,提升模型泛化能⼒。
2025-03-24 22:22:55
659
原创 【AI学习从零至壹】Pytorch神经⽹络
在深度学习中,必须要说的就是神经⽹络,或者说是⼈⼯神经⽹络(artificial neural network)。神经⽹络是⼀种⼈类受到⽣物神经细胞结构启发⽽研究出的算法体系。神经⽹络这个名字容易让⼈觉得特别神秘,不像我们接触过的程序算法那样直观,在编程的时候我们常⽤到的都是⼀些加减乘除、循环、分⽀、⽐⼤⼩、读写等等,使⽤这些基本步骤就能够完成⼀个明确的⽬标任务,然⽽神经⽹络和这种直观的⽅式还真有些不同。
2025-03-17 22:42:15
1677
3
原创 【AI学习从零至壹】Pytorch逻辑回归
数中,梯度是⼀个向量,向量有⽅向,梯度的⽅向就指出了函数在给定点的上升最快的⽅向。梯度的⽅向是函数在给定点上升最快的⽅向,那么反⽅向就是函数在给定点下降最快的⽅向,所以我们只要沿着梯度的反⽅向⼀直⾛,就能⾛到局部的最低点!由于神经⽹络模型中有众多的参数,也称为权重参数(weight parameter)所以我们常常需要处理的是多元复合函数,要想知道某⼀个权重参数对损失函数的影响,那么就要求它的偏导数。函数在某⼀点的梯度是这样⼀个向量,它的⽅向与取得最⼤⽅向导数的⽅向⼀致,⽽它的模为⽅向导数的最⼤值。
2025-03-06 01:40:49
1388
2
原创 【AI学习从零至壹】pytorch基础
在进⼀步学习pytorch之前,先要了解⼀个概念 —— 计算图( Computation graph)所有的深度学习框架都依赖于计算图来完成梯度下降、优化梯度值等计算。它能够将多个张量沿某个轴拼接成一个新的张量。PyTorch 是⼀个开源的深度学习框架,由 Facebook 的⼈⼯智能研究团队开发和维护,在学术界和⼯业界都得到了⼴泛应⽤。张量的属性描述了张量的形状、数据类型和存储它们的设备。tensorflow1.x 使⽤的是静态计算图,tensorflow2.x和pytorch使⽤的是动态计算图。
2025-03-02 22:30:33
1071
1
原创 【AI学习从零至壹】Numpy基础知识
⼴播 (Broadcast) 是 numpy 对不同形状 (shape) 的数组进⾏数值计算的⽅式,对数组的算术运算通常在相应的元素上进⾏。对于多维数组,它的通⽤计算公式如下,即结果数组中的每个元素都是:数组 a 的最后⼀维上的所有元素与数组 b 的倒数第⼆位上的所有元素的乘积和:dot(a, b)[i,j,k,m]= sum(a[i,j,:] * b[k,:,m])dot : 矩阵乘法,对于两个⼀维的数组,计算的是这两个数组对应下标元素的乘积和 (数学上称之为内积);两种方式输出的内容都是一样的。
2025-02-27 22:30:35
992
原创 Linux高级IO
IO主要分为两步:第一步是等,即等待IO条件就绪。第二步是拷贝,也就是当IO条件就绪后将数据拷贝到内存或外设。任何IO的过程,都包含“等”和“拷贝”这两个步骤,但在实际的应用场景中“等”消耗的时间往往比“拷贝”消耗的时间多,因此要让IO变得高效,最核心的办法就是尽量减少“等”的时间。
2024-03-16 22:03:58
1220
原创 C++的类型转换
由于编译器认为const修饰的变量是不会被修改的,因此会将const修饰的变量存放到寄存器当中,当需要读取const变量时就会直接从寄存器中进行读取,而我们修改的实际上是内存中的a的值,因此最终打印出a的值是未修改之前的值。上述代码中,如果传入func函数的是子类对象的地址,那么在转换后pb1和pb2都会有对应的地址,但如果传入func函数的是父类对象的地址,那么转换后pb1会有对应的地址,而pb2则是一个空指针。如果父类的指针(或引用)指向的是一个子类对象,那么将其转换为子类的指针(或引用)则是安全的。
2024-03-16 20:30:17
1348
原创 C/C++内存管理详解
class Testpublic:Test() //构造函数:_a(0)cout << "构造函数" << endl;~Test() //析构函数cout << "析构函数" << endl;一、动态申请单个类的空间//申请delete p1;//销毁//申请free(p2);//销毁二、动态申请多个类的空间//申请//销毁//申请free(p4);//销毁。
2024-02-24 22:34:55
1277
原创 C++模板进阶操作 —— 非类型模板参数、模板的特化
优点:1.模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生。2.增强了代码的灵活性。缺陷:1.模板会导致代码膨胀问题,也会导致编译时间变长。2.出现模板编译错误时,错误信息非常凌乱,不易定位错误。
2024-02-17 22:40:43
1264
原创 C++模板详解 —— 函数模板与类模板
class 类模板名//类内成员声明public:cout << "数学:" << _Math << endl;cout << "语文:" << _Chinese << endl;cout << "英语:" << _English << endl;T _Chinese;T _English;注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。T _Chinese;T _English。
2024-02-17 22:13:09
1056
原创 C++11---lambda表达式
说明一下: 实际当我们以[&]或[=]的方式捕获变量时,编译器也不一定会把父作用域中所有的变量捕获进来,编译器可能只会对lambda表达式中用到的变量进行捕获,没有必要把用不到的变量也捕获进来,这个主要看编译器的具体实现。因此每个lambda表达式的类型都是不同的,这也就是lambda表达式之间不能相互赋值的原因,我们可以通过typeid(变量名).name()的方式来获取lambda表达式的类型。实际编译器在底层对于lambda表达式的处理方式,完全就是按照函数对象的方式处理的。
2024-02-17 21:41:19
676
原创 C++11 ——— 右值引用和移动语义
左值是一个表示数据的表达式,如变量名或解引用的指针。左值可以被取地址,也可以被修改(const修饰的左值除外)。左值可以出现在赋值符号的左边,也可以出现在赋值符号的右边。
2024-02-08 23:23:39
860
原创 传输层协议 ——— TCP协议
在进行网络通信时,一方发出的数据后,它不能保证该数据能够成功被对端收到,因为数据在传输过程中可能会出现各种各样的错误,只有当收到对端主机发来的响应消息后,该主机才能保证上一次发送的数据被对端可靠的收到了,这就叫做真正的可靠。但TCP要保证的是双方通信的可靠性,虽然此时主机A能够保证自己上一次发送的数据被主机B可靠的收到了,但主机B也需要保证自己发送给主机A的响应数据被主机A可靠的收到了。
2024-02-08 22:16:10
1406
原创 C++11智能指针
而如果连接结点时只进行一个连接操作,那么当node1和node2的生命周期结束时,就会有一个资源对应的引用计数被减为0,此时这个资源就会被释放,这个释放后另一个资源的引用计数也会被减为0,最终两个资源就都被释放了,这就是为什么只进行一个连接操作时这两个结点就都能够正确释放的原因。其次,shared_ptr中的引用计数count也不能定义成一个静态的成员变量,因为静态成员变量是所有类型对象共享的,这会导致管理相同资源的对象和管理不同资源的对象用到的都是同一个引用计数。
2024-02-06 10:59:00
1028
原创 应用层协议 ——— HTTP协议
HTTP(Hyper Text Transfer Protocol)协议又叫做超文本传输协议,是一个简单的请求-响应协议,HTTP通常运行在TCP之上。在编写网络通信代码时,我们可以自己进行协议的定制,但实际有很多优秀的工程师早就已经写出了许多非常成熟的应用层协议,其中最典型的就是HTTP协议。
2024-02-02 21:25:10
975
原创 认识“协议”
客户端可以按某种方式将这些结构化的数据组合成一个字符串,然后将这个字符串发送到网络当中,此时服务端每次从网络当中获取到的就是这样一个字符串,然后服务端再以相同的方式对这个字符串进行解析,此时服务端就能够从这个字符串当中提取出这些结构化的数据。客户端可以定制一个结构体,将需要交互的信息定义到这个结构体当中。比如现在要实现一个网络版的计算器,那么客户端每次给服务端发送的请求数据当中,就需要包括左操作数、右操作数以及对应需要进行的操作,此时客户端要发送的就不是一个简单的字符串,而是一组结构化的数据。
2024-02-02 12:25:01
1395
原创 网络编程套接字(3)
之前我们是以回调的方式处理任务的,当线程池当中的线程从任务队列中拿出一个任务后,会调用该任务对应的Run方法处理该任务,而实际在这个Run方法当中会以仿函数的方式调用handler方法,因此我们只需更改Handler类当中对()的重载函数即可,而其他与通信相关的代码我们一律不用更改。(这里我们只是做测试的,就不做过多的设计了)建立连接后,TCP协议提供全双工的通信服务,所谓全双工的意思是,在同一条连接中,同一时刻,通信双方可以同时写数据,相对的概念叫做半双工,同一条连接在同一时刻,只能由一方来写数据。
2024-02-02 12:11:06
685
原创 网络编程套接字(2)
由于调用pthread_create函数创建线程时,新线程的执行例程是一个参数为void*,返回值为void*的函数。如果我们要将这个执行例程定义到类内,就需要将其定义为静态成员函数,否则这个执行例程的第一个参数是隐藏的this指针。在线程的执行例程当中会调用Service函数,由于执行例程是静态成员函数,静态成员函数无法调用非静态成员函数,因此我们需要将Service函数定义为静态成员函数。
2024-02-01 23:59:32
930
原创 网络编程套接字
因为服务器就是为了给别人提供服务的,因此服务器必须要让别人知道自己的IP地址和端口号,IP地址一般对应的就是域名,而端口号一般没有显示指明过,因此服务端的端口号一定要是一个众所周知的端口号,并且选定后不能轻易改变,否则客户端是无法知道服务端的端口号的,这就是服务端要进行绑定的原因,只有绑定之后这个端口号才真正属于自己,因为一个端口只能被一个进程所绑定,服务器绑定一个端口就是为了独占这个端口。因为身份证号是国家用于行政管理时用的编号,而学号是学校用于管理学生时用的编号,工号是公司用于管理员工时用的编号。
2024-02-01 22:22:02
1166
原创 Linux线程安全
站在操作系统的角度,进程等待某种资源,就是将当前进程的task_struct放入对应的等待队列,这种情况可以称之为当前进程被挂起等待了。站在用户角度,当进程等待某种资源时,用户看到的就是自己的进程卡住不动了,我们一般称之为应用阻塞了。这里所说的资源可以是硬件资源也可以是软件资源,锁本质就是一种软件资源,当我们申请锁时,锁当前可能并没有就绪,可能正在被其他线程所占用,此时当其他线程再来申请锁时,就会被放到这个锁的资源等待队列当中。
2024-01-30 12:15:37
1608
原创 Linux多线程详解
在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”。1.一切进程至少都有一个执行线程。2.线程在进程内部运行,本质是在进程地址空间内运行。3.在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更轻量化。4.透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。
2024-01-30 08:00:00
1073
原创 Linux进程信号
1.执行该信号的默认处理动作。2.提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函数,这种方式称为捕捉(Catch)一个信号。3.忽略该信号。在Linux当中,我们可以通过man手册查看各个信号默认的处理动作。
2024-01-29 12:28:46
1035
原创 Linux进程间通信
之前我们说过,当管道的读端进程退出后,写端进程再向管道写入数据就没有意义了,此时写端进程会被操作系统杀掉,在这里就可以很好的得到验证:当我们终止掉读端进程后,因为写端执行的循环脚本是由命令行解释器bash执行的,所以此时bash就会被操作系统杀掉,我们的云服务器也就退出了。进程间通信的本质就是,让不同的进程看到同一份资源,使用匿名管道实现父子进程间通信的原理就是,让两个父子进程先看到同一份被打开的文件资源,然后父子进程就可以对该文件进行写入或是读取操作,进而实现父子进程间通信。
2024-01-28 23:26:06
1171
原创 【Qt无门槛入门】信号以及信号机制及其常用控件(1)
Qt框架默认提供的标准信号和槽不足以完成我们日常应用开发的需求,比如说点击某个按钮让另一个按钮的文字改变,这时候标准信号和槽就没有提供这样的函数。但是Qt信号和槽机制提供了允许我们自己设计自己的信号和槽。第一种自定义槽函数的方法此处的slots是Qt自己扩展的关键字,Qt里广泛使用了元编程技术(基于代码,生成代码)qmake构建Qt项目的时候,就会调用专门的扫描器,扫描代码中特定的关键字。第二种自定义槽函数的方法在Qt中,除了通过connect来连接信号槽之外,还可以通过函数名字的方式来自动连接。
2024-01-27 21:22:33
1470
原创 QT入门篇---无门槛学习
Qt Creator 是⼀个轻量级的跨平台集成开发环境(IDE),专为使⽤ Qt 框架进⾏应⽤程序开发⽽设计。它是⼀个功能强⼤、易于使⽤、快速且⾼效的⼯具,被⼴泛⽤于编写各种类型的应⽤程序,如桌⾯应用程序、移动应⽤程序和嵌⼊式系统等。Qt Creator 提供了⼀个可视化的界⾯设计器和代码编辑器,可以帮助开发者更快捷地创建复杂的用户界面和处理各种事件。它还包含了调试⼯具、版本控制⼯具、⾃动完成和智能提⽰等功能,以及⽀持多语⾔和跨平台的开发环境。
2024-01-25 21:38:51
2359
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅