- 博客(66)
- 收藏
- 关注
原创 三、C++ 的 python 绑定 pybind11
pybind11实战:将C++类封装为Python模块 本文展示了使用pybind11和CMake将C++类封装为Python模块的完整流程。首先介绍了pybind11的特点,然后通过一个计算器类示例详细演示了实现步骤:1) 创建C++核心代码;2)编写pybind11绑定代码;3)配置CMake构建系统;4)编译测试。最终成功将C++的Calculator类封装为Python模块,实现了Python直接调用C++代码的功能。整个过程代码简洁高效,充分体现了pybind11在现代C++与Python交互中的
2025-07-10 16:59:45
447
原创 二、面向对象编程
面向对象编程(OOP)是一种将程序视为相互协作对象的软件设计思想。在C++中,类(Class)作为抽象蓝图定义了对象的属性和行为,而对象(Object)则是类的具体实例。OOP的核心特性包括抽象(隐藏实现细节)和封装(捆绑数据与操作)。类由成员变量(状态)、成员函数(行为)、构造函数(初始化)、析构函数(清理)等构成,并通过访问修饰符(public/private/protected)控制可见性。静态成员(static)属于类而非单个对象。C++17还引入了inline static简化静态成员初始化。OO
2025-07-10 16:07:01
31
原创 一、编译环境
本文介绍了Linux下C++开发的编译和构建工具。在编译器部分,讲解了GCC和Clang的基本作用,详细解析了编译过程的四个阶段(预处理、编译、汇编、链接),并对比了静态链接库(.a)和动态链接库(.so)的特点及适用场景。在构建系统部分,重点介绍了CMake作为构建系统生成器的核心功能,它能通过编写CMakeLists.txt文件来管理复杂项目的编译过程,解决多源文件编译的难题。文章还提供了g++基本编译命令示例和常用编译选项说明,帮助开发者快速上手Linux平台的C++开发环境配置。
2025-07-10 13:52:41
44
原创 二、encoders
摘要 本文介绍了SEAL库中Batch Encoder的原理与应用。Batch Encoder通过中国剩余定理将明文多项式分解为多个独立槽位,实现SIMD并行计算。关键技术点包括: 设置特殊明文模数(满足t≡1 mod 2N的素数) 将数据向量编码为单个明文多项式,加密后形成单一密文 同态运算自动作用于所有槽位,显著提升计算效率 该方法解决了传统BFV方案中单个系数利用率低和模运算限制的问题,支持向量化并行计算。示例代码展示了如何配置参数、编码/解码数据矩阵,以及执行批处理加密运算。Batch Encode
2025-07-09 21:02:43
35
原创 一、bfv_basics
摘要: 本文介绍了SEAL同态加密库的核心组件与参数设置,主要包括: 加密参数:定义多项式模数度(n)、密文模数(q)和明文模数(t),影响噪声预算和计算性能; 上下文与密钥:通过SEALContext验证参数,KeyGenerator生成公私钥; 加密/解密流程:Encryptor使用公钥加密,Decryptor用私钥解密; 同态计算优化:Evaluator执行密文运算,引入重线性化(需RelinKeys)降低密文尺寸与噪声增长,提升计算效率。实例演示了重线性化在多项式计算中的关键作用。
2025-07-04 20:00:08
43
原创 三、TenSEAL 库的使用 —— 在 MNIST 上进行加密卷积
首先讲讲卷积是干什么的。卷积是一种用于提取局部特征的运算操作,它通过滑动一个小的“滤波器”或“卷积核 kernel“在输入数据 (如图像)上,对每个局部区域进行加权求和,从而生成新的特征图。线性层就是一个⌊矩阵乘法偏置项加法⌉\lfloor 矩阵乘法 + 偏置项加法 \rceil⌊矩阵乘法偏置项加法⌉,它是神经网络中最基本的结构单元,用来实现特征的线性变换。线性层的作用就是把输入特征映射 (转换) 成另一个空间的特征,也叫线性变换或全连接层。输出输入向量⋅权重矩阵偏置or。
2025-03-31 19:58:13
136
原创 三、TenSEAL 库的使用 —— 在加密数据上训练与评估逻辑回归模型
需要记住的是,高准确率并不是我们的最终目标。我们只是希望看到,即使在加密数据上进行训练,也不会影响最终结果。因此,我们将后续在加密数据上的准确率,与这里得到的。我们可以看到,在加密测试集上进行评估时,与明文数据的准确率差距并不大。在一些例子中甚至会发现,加密数据上的表现更好(可能是由于“噪声”在某种意义上有帮助)。你可以用这个数据代替 Kaggle 数据集来练习代码结构,对于只是想看看流程如何工作的人来说很有帮助。但我们后续将会看到,在加密数据上进行训练时,我们需要更大的参数来满足计算需求。
2025-03-31 16:03:51
60
原创 三、TenSEAL 库的使用 —— 基本语法和特性
TenSEAL 是一个用于在张量上 执行同态加密操作的库。它构建在 Microsoft SEAL 之上,Microsoft SEAL 是一个用 C++ 实现了 BFV 和 CKKS 同态加密方案的库。TenSEAL 通过 Python API 提供了便捷的使用方式,同时采用 C++ 实现大部分操作以保持高效性能,所以本质上它是一个带有 Python 接口的 C++ 库。是一个特殊对象,它为你管理了不同的加密密钥和参数,因此你只需要使用一个对象,就可以进行加密计算,而不必手动管理所有的密钥和同态加密的细节。
2025-03-31 14:26:11
102
原创 四、Shamir Secret Sharing (Shamir 秘密共享)
我们的目标是将 s 切分称 N 份,使得任意 k 份的组合可以重构出 s,而任意 k-1 份或更少的份则不能泄露任何关于 s 的信息。具有上述性质的算法称为。下面展示了 Shamir Secret Sharing 在构造时所具有的。也可以由这些 Shares 构造出来。,如果它们是按照上述结构生成的,那么可以。下面这个众所周知的结果说明:只要有。是 k-1 个与秘密 s 同阶的。&emsp首先,定义一个。的份额 (Share)。是一组固定的不重复的。也就是,存在一组系数。
2025-03-28 21:54:38
154
原创 三、SEAL 库的使用 —— 导入本地和链接方法
除此之外,还可以根据 github 中 SEAL 主页的 Basic CMake Options 和 Advanced CMake Options 两个部分的内容,指定和传递各种配置选项给 CMake 构建系统。然后是 Installing 的过程,如果你有 root 访问权限,可以按照以下步骤将 Microsoft SEAL 安装到。如果你希望将 Microsoft SEAL 安装到。如果你使用 CMake,可以很容易地将。安装到全局和安装到本地目录的区别在于。这里我使用的是安装到本地目录。
2025-03-26 13:38:30
195
原创 一、基础知识 —— CMake 基本语法
CMake是开源、跨平台的构建工具,可以让我们通过去生成,这个配置文件是的,这样就不用亲自去编写 Makefile 了,而且配置文件可以直接拿到其它平台上使用,无需修改,非常方便。这里主要讲述在 Linux 下如何使用 CMake 来编译我们的程序。
2025-03-24 17:23:00
201
原创 一、基础知识 —— CMake 基础
都说 CMake 是一个跨平台的编译工具,首先需要更深入地理解什么是跨平台的编译工具?这个和使用 visual studio 直接运行有什么区别?在类的定义中就直接写上了函数实现内容类内定义函数 (Inline Member Functions)。在 C++ 中,如果函数是在类内写出函数体的,那么它默认是 inline 的。一般来说,将短小、频繁调用、性能敏感的函数放在.h中,作为Inline实现。而对于复杂函数、调用较少、逻辑长函数,放在.cpp中实现,.h中只做声明。而模板类则必须全写在.h。
2025-03-24 16:54:36
177
原创 一、基础知识 —— Linux (WSL) 环境搭建
调度键盘进行文字输入调度显示器显示内容内存调度调度网卡发送接收等WSL 是用于 Windows 系统之上的 Linux 子系统。作用很简单,可以在 Windows 系统中获得 Linux 系统环境,并完全直连计算机硬件,而不是通过虚拟机的虚拟硬件。
2025-03-18 20:16:23
757
原创 二、同态加密 —— 《Somewhat Practical Fully Homomorphic Encryption》笔记 (BFV 源于这篇文章)
所有现有的方案的共同特点,在加密过程中添加一个 小的“噪声”组件。 在密文上进行 同态计算将导致这些噪声增长,特别是 同态乘法,待到噪声增长到一定程度时,解密算法将失败。 Gentry的 bootstrapping 方法可以用来将密文中的噪声降低到 由解密电路的复杂性决定的固定级别。 但是,这该是不足以支撑工业级使用。本文的其余部分组织如下: 详细内容看专栏一些散乱的数学基础。 先来简单概括一下 LWE 问题的基本思路:给定一个线性方程 A⋅s+eA \cdot s + eA⋅s+e,其中: 目标是通过已
2025-02-27 22:50:07
659
1
原创 四、分圆多项式
单位根”(又叫单位根元素或根的单位)是复数领域中的一个重要概念,广泛应用于代数、数论、群论和环论等数学分支。它是指满足某个特定方程的复数解。其定义是,单位根是指满足一下方程的复数 zzn1z^n=1zn1其中 n 是正整数,z 称为n-次单位根,而这个方程的所有解称为n-次单位根的集合。分圆多项式一般表示为ϕx\phi(x)ϕx,它的根正是单位根,也就是方程xn1x^n=1xn1的解。简单来说,分圆多项式是n 次单位根的最小多项式。n 次单位根是复数解e2π。
2025-02-26 15:53:23
393
原创 三、多项式环
多项式环是抽象代数中一种重要的代数结构,基于一个环 R(通常是交换环)构造出关于一个或多个未知元(如 x,y,z)的“多项式” 集合,并在其上定义加法和乘法运算,使其形成一个新的环。设 R 是一个环(通常是交换环,可能带有单位元 1),x 是一个形式上的未知元(变量)。R[x]是 R 上关于 x的所有多项式构成的集合。一个多项式fx∈Rxfx∈Rxfxa0a1xa2x2anxnfxa0a1xa2x2...an。
2025-02-25 21:52:08
478
原创 二、环 Ring
对于加法满足:闭合性:对于任意ab∈Ra,b \in Rab∈R,有ab∈Ra+b \in Rab∈Rabbaa+b=b+aabbaabcabcabcabc零元(加法单位元):存在0∈R0 \in R0∈R,使得0aa0a0+a=a+0=a0aa0a,对于任意a∈Ra \in Ra∈R逆元:对于每个a∈Ra \in Ra∈R,存在−a∈R-a \in R−a∈R,存在a−。
2025-02-25 21:02:08
157
原创 一、群 Group
封闭性对于任意的ab∈Ga,b \in Gab∈G,它们的运算结果a⋅ba \cdot ba⋅b也属于 G。结合律对于任意的abc∈Gabc∈G,有a⋅b⋅ca⋅b⋅ca⋅b⋅ca⋅b⋅c。运算需要满足结合性,但不一定需要满足交换性(除非是交换群单位元存在一个元素e∈Ge \in Ge∈G,称为单位元,使得对于任意a∈Ga \in Ga∈G,有e⋅aa⋅eae⋅aa⋅e。
2025-02-25 18:34:45
125
原创 密码学期末考试笔记
不可预测性一个密码(E, D)提供满足 CPA 下的语义安全具有密文完整性many-time security (也就是 CPA)在对称密码中:在公钥密码一个陷门函数X→YX→YGG()G:输出一个密钥对(pk, sk)。Fpk⋅Fpk⋅:定义了一个函数X→YX→Y。F−1sk⋅F−1sk⋅:上面那个函数的逆函数Y→XY→X。
2024-12-21 23:32:38
876
2
原创 在循环群模运算中计算逆元
这是最常用的方法,用于找到整数 a 和 b 的最大公约数,并找到整数 x 和 ya⋅xb⋅ygcdaba⋅xb⋅ygcdab如果gcdab1gcdab1,则x 是 a 模 b 的逆元。输入是 a, b (a 要小于 b),输出是 x。
2024-12-16 00:56:54
1144
原创 二、同态加密 —— TFHE 第一部分 密文类型
TFHE指的是全同态加密策略。意思是,允许对密文进行运算,等价于对明文进行运算。TFHE最初是作为FHEW方案的改进而提出的,然后开始向更广泛的方向发展。该方案的安全性基于一个称为带错误学习 (LWE)的困难格问题,及其变体,如。事实上,目前使用的大多数FHE 方案都是基于LWE的,并且使用有噪声的 密文。然而,TFHE与其他方法的区别在于,它提出了一种特殊的自举 (bootstrapping),这种自举速度非常快,能够在降低噪声的同时评估函数。在我们详细讨论。
2024-12-04 22:13:38
1384
原创 八、Python —— 类、异常处理、模块、包的管理、虚拟环境
每个函数中第一个参数都是selfself这个单词本身是可以随意改变的,但是一般就用self。self可以理解为指向这个类的空间,用来调用这个类本身的变量和函数。调用变量的时候,不需要手动传递self参数从下面的代码中可以看出,在创建类中的函数时,是一定要将形参self写出来的。但是在调用时,不用手动写self对应的实参,这是 python 自动实现的。python 中定义了很多以 下划线 开头的函数这里介绍两个最常用的:函数名功能__init__和其他语言中的构造函数是一样的,初始化。
2024-12-04 14:11:11
738
原创 七、Python —— 元组、集合和字典
集合是 Python 中最常用的数据结构之一,用来。是 Python 中最常用的数据结构之一,用来。类似于列表,集合也可以用。类似于列表,字典也可以用。,会在下一小节里介绍字典。元组跟列表类似,只是。括起来,中间的元素用。注意,集合中的元素是。注意,字典中的元素是。
2024-12-01 20:45:08
1224
原创 六、Python —— 函数
函数内部也可以定义函数。函数内部定义的函数,作用域为外层函数。def f():def g(x): # 定义函数g()x += 1print(x)g(5) # 调用函数g()f() # 输出6。
2024-12-01 20:04:43
897
原创 五、Python —— 字符串
可以通过下标读取字符串中的每个字符,下标从 0 开始, 也。注意:虽然字符可以跟整数相互转化,但在 Python 中,当需要用到更复杂的格式化输出时,现查即可。跟列表不同,字符串的每次复制操作,都会得到一个。,这一点跟 C++、Java 等语言是不同的。字符串的切片操作会返回一个新字符串。在 Python 中,字符串既可以用。如果字符串长度为 n,那么下标只能取。的数字,二者之间可以相互转化。时,一般可以在字符前加反斜杠。的初始化方式,字符串中将。之间的整数,超出范围则是。来表示,二者完全相同。
2024-11-27 16:47:33
918
原创 四、Python —— 列表
列表是一种常见的变量类型,可以存储一列元素。元素的类型可以不同,不过大多数情况下类型是相同的。这个概念的,但是切片没有 (也就是说 begin 和 end 的取值范围可以无穷大)。注意:切片这里的 begin 和 end 与 上面列表的下表不同,列表的下标是有。但是 python 中同样有越界的含义,如果列表长度是 n,那么。加法和乘法的所生成的新列表 c,并不会改变原来都两个列表 a 和 b。***append()***函数的作用是,列表的切片操作会返回一个新列表。可以通过下标读/写列表中的元素,
2024-11-26 16:38:42
1599
原创 三、Python —— 循环语句
while 是每次判断,如果条件成立,则执行循环体中的语句,否则停止。注意:本节重在学习 for 循环,而非学习列表、元组、集合、字典等复杂数据类型,所以 for 语句与这些数据类型。可以跳过当前这次迭代后面的语句,并继续下一次迭代。while 和 for 循环内的代码块中也可以包含循环语句。时,可以写上 pass 语句,这个语句不执行任何动作。for 语句可以遍历字符串中的每个字符。例题:判断一个大于 1 的整数是否是质数。例题:求 1∼100 中所有偶数的和。例题:判断一个大于1的整数是否是质数。
2024-11-26 10:43:20
626
原创 二、Python —— 判断语句
当 statement 只有一个语句的时候,可以和判断语句在同一行。语法上需要一个语句,但程序无需执行任何动作时,可以使用该语句。当 statement2 为空的时候,else 语句可以省略。if-else 语句内也可以是 if-else 语句。条件成立时,执行某些语句;否则执行另一些语句。类似于 C++ 中的问号表达式。python3.10 开始新增了。
2024-11-25 21:38:42
356
原创 一、Python —— 顺序语句
[Python 官网](https://www.python.org/) 上免费提供了 Python 解释器和扩展的标准库,包括源码和适用于各操作系统的机器码形式,并可自由地分发。Python 官网还包含许多免费的第三方 Python 模块、程序和工具发布包及文档链接。 Python 解释器易于扩展,使用 C 或 C++(或其他
2024-11-25 20:36:07
739
2
原创 初探全同态加密1 —— FHE的定义与历史回顾
在开始之前,我们先温习一下最最传统的加密体系。构建一个加密系统,往往都需要一个密钥 Key。通过这个密钥,我们可以一头把明文的信息加密成密文,然后在另一头通过密钥再把密文变回原来的样子。如果没有这个 Key 的话,其他的人很难知道我们到底传递了什么信息。上文的图例基本展示了所有常见加密体系的全貌。通过一个生成算法KeyGen1λKeyGen1λ来随机生成一对用于加密和解密的密钥EncKeyDecKeyEncKeyDecKey。
2024-09-12 21:37:00
646
原创 6、LangChain —— 使用 Huggingface 中的开源模型
大语言模型,不止 ChatGPT 一种。调用 OpenAI 的 API,当然方便且高效,不过,如果我就是想用其他的模型 (比如说开源的 Llama2 或者 ChatGLM),该怎么做?再进一步,如果我就是想在本机上从头训练出来一个新模型,然后在 LangChain 中使用自己的模型,又该怎么做?关于大模型的微调 (或称精调)、预训练、重新训练、乃至从头训练,这是一个相当大的话题,不仅仅需要足够的知识和经验,还需要大量的语料数据、GPU 硬件和强大的工程能力。
2024-07-29 11:05:40
1620
原创 5、LangChain —— 提示工程 (下) 思维链和思维树
上面我们讨论了 Chain of Thought 和 Tree of Thought 这两个概念,并探讨了如何利用它们引导大型语言模型进行更深入的推理。CoT核心思想是通过生成一系列中间推理步骤来增强模型的推理能力。在 Few-Shot CoT 和 Zero-Shot CoT 两种应用方法中,前者通过提供链式思考示例传递给模型,后者则直接告诉模型进行要按部就班的推理。ToT进一步扩展了 CoT 的思想,通过搜索由连贯的语言序列组成的思维树来解决复杂问题。具体过程可以通过学习。
2024-07-26 14:16:48
1752
原创 4、LangChain —— 提示工程 (上) fewshottemplate 和 exampleselector
其实,在上一章中就提到了提示词工程,输出解析器的原理实际上就是通过提示词明确地告诉 llm 应该做什么。之前有说过吴恩达老师说过的提示词两大原则:清晰具体的指令、给模型思考的时间。实际上,在 Open AI 的官方文档 GPT 最佳实践中,也给出了和上面这两大原则一脉相承的6大策略写清晰的指示给模型提供参考,也就是示例将复杂任务拆分成子任务给 GPT 时间思考使用外部工具反复迭代问题。
2024-07-25 17:10:48
867
原创 3、LangChain —— 模型I/O,输入提示、模型调用、解析输出
从这节课开始,我们将对 LangChain 中的六大核心组件一一进行详细的剖析。Model 模型,位于 LangChain 框架的最底层,它是基于语言模型构建的应用的核心元素,因为所谓 LangChain 应用开发,就是以 LangChain 作为框架,通过 API 调用大模型来解决具体问题的过程。
2024-07-23 11:34:05
976
原创 2、LangChain —— RAG基本架构
LLM 支持的最强大的应用程序之一是复杂的问答 (Q&A) 聊天机器人。这些应用程序可以回答有关特定源信息的问题。这些应用程序使用一种称为检索增强生成 (RAG)的技术。这里将展示如何基于文本数据源构建一个简单的问答应用程序。在此过程中,我们将介绍典型的问答架构,并重点介绍更多高级问答技术的资源。我们还将了解LangSmith如何帮助我们跟踪和理解我们的应用程序。随着我们的应用程序变得越来越复杂,LangSmith 将变得越来越有用。RAG 是一种利用附加数据增强 LLM 知识的技术。
2024-07-22 09:29:03
1237
原创 1、LangChain —— 基础知识储备
大语言模型是一种人工智能模型,通常使用深度学习技术,比如神经网络,来理解和生成人类语言。这些模型的“大”在于它们的参数数量非常多。你可以将大语言模型想象成一个巨大的预测机器,其训练过程主要基于“猜词”:给定一段文本的开头,它的任务就是预测下一个词是什么。LangChain 是一个全方位的、基于大语言模型这种预测能力的应用开发工具,它的灵活性和模块化特性使得处理语言模型变得极其简便。LangChain 的预构建链功能,就像乐高积木。
2024-07-22 08:33:07
855
原创 LangChain —— Chat Model
使用消息序列作为输入并返回 chat message 作为输出的语言模型 (与使用纯文本相反)。这些是传统上较新的模型 (旧模型通常是 LLM,见下文)。Chat Model 支持为对话消息分配不同的角色,有助于将 messages 与 AI、user 和 system message 等指令区分开来。尽管底层模型是消息输入、消息输出,但 LangChain 包装器也允许这些模型将字符串作为输入。这意味着您可以轻松地使用 Chat Model 来代替 LLM。
2024-07-13 20:03:12
524
原创 LangChain —— Prompt Templates —— How to use few shot examples in chat models
本指南介绍了如何使用示例输入和输出提示 char model。为模型提供几个这样的例子被称为 few-shotting,这是一种简单而强大的方法来指导生成,在某些情况下可以大大提高模型性能。对于如何最好地进行 few-shot 提示,似乎没有达成一致意见,最佳提示编译可能会因模型而异。因此,langchain 提供 few-shot 提示模板,如 FewShotChatMessagePromptTemplate,作为一个灵活的起点,我们可以根据需要修改或替换它们。
2024-07-13 15:35:26
863
原创 LangChain —— Prompt Templates —— How to use few shot examples
在本指南中,我们将学习如何创建一个简单的提示模板,在生成时为模型提供示例输入和输出。为 LLM 提供一些这样的例子被称为 “few-shotting”,这是一种简单而强大的方法来指导生成,在某些情况下可以大大提高模型性能。一个 few-shot 提示模板可以从一组示例中构建,也可以从负责从定义的集合中选择示例子集的 Example Selector 类中构建。本指南将介绍一些使用字符串提示模板的 few-shot。有关 Chat Message 进行 few-shot 的指南,请参阅下一篇文章。
2024-07-13 15:10:22
615
原创 LangChain —— Message —— How to merge consecutive messages of the same type
某些模型不支持传递相同类型的连续消息(即相同消息类型的“运行”)。merge_message_runs 使合并相同类型的连续消息变得容易。
2024-07-13 14:48:03
300
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人