【论文阅读】On the Security of “VOSA“
On the Security of Verifiable and Oblivious Secure Aggregation for Privacy-Preserving Federated Learning -- 关于隐私保护联邦中可验证与遗忘的安全聚合的安全性
- 论文来源
- 摘要
- Introduction
- 回顾 VOSA 方案
- 对VOSA不可伪造性的攻击
- 对于类型 I 的攻击
- 对于类型 II 的攻击
论文来源
名称 | On the Security of Verifiable and Oblivious Secure Aggregation for Privacy-Preserving Federated Learning |
---|---|
期刊 | TDSC 2024 |
作者 | Jiahui Wu; Weizhe Zhang |
摘要
Recently, to resist privacy leakage and aggregation result forgery in federated learning (FL), Wang et al. proposed a verifiable and oblivious secure aggregation protocol for FL, called VOSA. They claimed that VOSA was aggregate unforgeable and verifiable under a malicious aggregation server and gave detailed security proof. In this article, we show that VOSA is insecure, in which local gradients/aggregation results and their corresponding authentication tags/proofs can be tampered with without being detected by the verifiers. After presenting specific attacks, we analyze the reason for this security issue and give a suggestion to prevent it.
最近,为了抵御联邦学习(FL)中的隐私泄露和聚合结果伪造,Wang等人提出了一种可验证且不经意的联邦学习安全聚合协议,称为VOSA。他们声称,在VOSA协议中,恶意聚合服务器是无法伪造和可验证的,并给出了详细的安全证明。本文中,我们展示了VOSA是不安全的,其中 本地梯度/聚合结果 及其对应的 认证标签/证明 可以被篡改而不被验证者检测到。在展示具体攻击之后,我们分析了此安全问题的原因,并提出了防止该问题的建议。
Introduction
- 联邦学习(FL)是一种流行的分布式机器学习范式,它使多个用户能够在不共享其私有数据集的情况下共同训练模型。在FL中,每个用户只需提交其训练后的本地梯度到中央聚合服务器(AS)进行全局模型聚合。这样可以在利用分布式数据集的同时缓解这些数据集的隐私泄露,从而获得更准确的全局模型。然而,提交的本地梯度也泄露了数据隐私。此外,未经信任的AS可能会修改或伪造聚合结果以欺骗用户。
- 为减轻上述两个安全问题,Wang等人最近提出了 VOSA 方案,该方案设计了一种用于联邦学习(FL)的可验证和不经意的安全聚合协议。在协议中,构建了加密方法和认证标签生成方法,以保护数据隐私并验证聚合结果的正确性。Wang等人声称,VOSA下恶意聚合服务器(AS)是不可伪造和可验证的,并给出了详细的安全性证明。不幸的是,在本文中,通过分析VOSA的安全性,我们表明它是不安全的。特别是,VOSA无法抵抗来自恶意AS的伪造攻击,我们发现AS可以伪造密文及其对应的标签,也可以伪造聚合结果及其证明,欺骗验证者(即用户)接受伪造的聚合结果。我们提出了针对VOSA的两个具体伪造攻击。在分析该安全问题的原因后,我们提供了一个建议以克服此问题。
回顾 VOSA 方案
在本节中,我们简要回顾VOSA方案。系统模型包含四个实体:密钥生成中心(KGC)、用户、收集器和聚合服务器(AS)。在威胁模型中,恶意的AS可能会篡改或伪造聚合结果和证明,以欺骗用户接受不正确的结果。下面,我们描述包含五个阶段的 VOSA 详细协议。
- 阶段 0:建立阶段:KGC 生成并发布公共系统参数 p m = { N , w 0 , g 1 , g 2 , h 1 , h 2 , G 1 , G 2 , G T , H 0 , H 1 } pm = \{N, w_0, g_1, g_2, h_1, h_2, G_1, G_2, G_T, H_0, H_1\} pm={N,w0,g1,g2,h1,h2,G1,G2,GT,H0,H1},其中 N = p q N = pq N=pq, p p p 和 q q q 是两个安全的大素数; w 0 w_0 w0 是初始模型参数; G 1 G_1 G1, G 2 G_2 G2 是两个素数阶为 p p p 的乘法循环群; g 1 g_1 g1, g 2 g_2 g2 分别是 G 1 G_1 G1, G 2 G_2 G2 的两个随机生成元; h 1 = g 1 a , h 2 = g 2 a , a ∈ Z p ∗ h_1 = g_1^a, h_2 = g_2^a, a \in Z_p^∗ h1=g1a,h2=g2a,a∈Zp∗; e : G 1 × G 2 → G T e : G_1 × G_2 \to G_T e:G1×G2→GT 是一个可计算的双线性对; H 0 : { 0 , 1 } ∗ → Z N 2 ∗ H_0 : \{0, 1\}^∗ \to Z_{N^2}^∗ H0:{0,1}∗→ZN2∗ 和 H 1 : { 0 , 1 } ∗ → G 1 H_1 : \{0, 1\}^∗ \to G_1 H1:{0,1}∗→G1 是两个哈希函数。AS 生成其秘密钥匙 s k A ∈ Z N 2 ∗ sk_A \in Z_{N^2}^∗ skA∈ZN2∗ 。每个用户 U i \mathcal{U}_i Ui 生成其加密钥匙 s k i ∈ [ 0 , N 2 ] sk_i ∈ [0, N^2] ski∈[0,N2] 和标签钥匙 t k i ∈ Z N 2 ∗ tk_i \in Z_{N^2}^∗ tki∈ZN2∗ 。
- 阶段 1:掩码和标签阶段:在第 t t t 次训练周期, U i \mathcal{U}_i Ui 将其本地梯度 w i , t w_{i,t} wi,t 加密为密文 C i , t = ( 1 + w i , t N ) H 0 ( t ) s k i m o d N 2 C_{i,t} = (1 + w_{i,t} N )H_0(t)^{sk_i} \ mod \ N^2 Ci,t=(1+wi,tN)H0(t)ski mod N2,并生成认证标签 T i , t = H 1 ( t ) t k i h 1 w i , t T_{i,t} = H_1(t)^{tk_i} h_1^{w_{i,t}} Ti,t=H1(t)tkih1wi,t 。然后 U i \mathcal{U}_i Ui 将 ( C i , t , T i , t ) (C_{i,t}, T_{i,t}) (Ci,t,Ti,t) 发送到 AS 。
- 阶段2:收集阶段:AS生成其公钥 p k A , t = ( p k A , t 1 , p k A , t 2 ) pk_{A,t} = (pk_{A,t}^1, pk_{A,t}^2) pkA,t=(pkA,t1,pkA,t2) 并将其分发给所有用户 U i ∈ U 1 \mathcal{U}_i \in \mathcal{U}_1 Ui∈U1,其中 p k A , t 1 = H 0 ( t ) s k A pk_{A,t}^1 = H_0(t)^{sk_A} pkA,t1=H0(t)skA, p k A , t 2 = h 2 s k A pk_{A,t}^2 = h_2^{sk_A} pkA,t2=h2skA, U 1 \mathcal{U}_1 U1 包含所有将密文和标签发送给 AS 的用户。然后, U i \mathcal{U}_i Ui 生成其辅助信息 A u i , t = ( p k A , t 1 ) s k i , V k i , t = ( p k A , t 2 ) t k i Au_{i,t} = (pk_{A,t}^1)^{sk_i},Vk_{i,t} = (pk_{A,t}^2)^{tk_i} Aui,t=(pkA,t1)ski,Vki,t=(pkA,t2)tki 并将其发送给收集器。收集器构建用户列表 U 3 = U 1 ∩ U 2 \mathcal{U}_3 = \mathcal{U}_1 \cap \ \mathcal{U}_2 U3=U1∩ U2( U 2 \mathcal{U}_2 U2 包含所有将辅助信息发送给收集器的用户)并计算解密密钥 A u t = ∏ U i ∈ U 3 A u i , t Au_t = \prod_{\mathcal{U}_i \in \mathcal{U}_3} Au_{i,t} Aut=∏Ui∈U3Aui,t 和验证密钥 V k t = ∏ U i ∈ U 3 V k i , t Vk_t = \prod_{\mathcal{U}_i \in \mathcal{U}_3} Vk_{i,t} Vkt=∏Ui∈U3Vki,t 。最后,收集器将 A u t , U 3 Au_t, \mathcal{U}_3 Aut,U3 发送给AS,并将 V k t Vk_t Vkt 发送给 U 3 \mathcal{U}_3 U3 中的所有用户。
- 第3阶段:解密和聚合阶段:AS将 U 3 \mathcal{U}_3 U3 中所有用户的密文聚合为聚合密文 C t = ( ∏ U i ∈ U 3 C i , t ) s k A m o d N 2 C_t = (\prod_{\mathcal{U}_i \in \mathcal{U}_3} Ci,t)^{sk_A} \ mod \ N^2 Ct=(∏Ui∈U3Ci,t)skA mod N2,然后将其解密为聚合明文 W t = s k A − 1 C t A u t − 1 N m o d N W_t = sk_A^{−1 } \frac{\frac{C_t}{Au_t}-1}{N} \ mod \ N Wt=skA−1NAutCt−1 mod N 。AS 将所有认证标签聚合为证明 T t = ( ∏ U i ∈ U 3 T i , t ) s k A Tt = (\prod_{\mathcal{U}_i \in \mathcal{U}_3} T_{i,t})^{sk_A} Tt=(∏Ui∈U3Ti,t)skA,并将 ( W t , T t ) (W_t, T_t) (Wt,Tt) 发送给 U 3 \mathcal{U}_3 U3 中的所有用户。
- 第4阶段:验证阶段:每个用户通过检查 e ( T t , h 2 ) = ? e ( H 1 ( t ) , V k t ) ⋅ e ( h 1 W t , p k A , t 2 ) e(T_t, h_2) \stackrel{\text{\tiny ?}}{=} e(H_1(t), Vk_t) \cdot e(h_1^{W_t} , pk_{A,t}^2) e(Tt,h2)=?e(H1(t),Vkt)⋅e(h1Wt,pkA,t2) 来验证聚合明文的正确性。如果等式成立,那么 W t W_t Wt 是正确的聚合明文;否则,它是不正确的。
对VOSA不可伪造性的攻击
在VOSA中,Wang等人声称VOSA实现了聚合的不可伪造性和可验证性,以抵御恶意的AS发起 篡改 / 伪造攻击 ,欺骗用户接受错误的聚合结果。
然而,我们发现它不能抵抗两种类型的伪造攻击:
- 类型 I:AS 篡改任意用户的密文 / 标签对,并欺骗所有用户接受聚合结果。
- 类型 II:AS 篡改聚合结果及其证明,以欺骗所有用户接受篡改后的聚合结果。
我们在下面提供详细的攻击情况。
对于类型 I 的攻击
AS 首先篡改了任意用户 U i ∈ U 3 \mathcal{U}_i \in \mathcal{U}_3 Ui∈U3 的密文/标签对,如下所示:
- AS 计算 ( 1 + w i , t ′ N , h 1 w i , t ′ ) (1+w_{i,t}'N , h_1^{w_{i,t}'}) (1+wi,t′N,h1wi,t′) ,其中 w i , t ′ w_{i,t}' wi,t′ 是 AS 任意伪造的梯度。
- AS篡改了 U i \mathcal{U}_i Ui 的密文/标签对 ( C i , t , T i , t ) (C_{i,t}, T_{i,t}) (Ci,t,Ti,t) 为篡改后的密文/标签对。
其中 w i , t ∗ = w i , t + w i , t ′ w_{i,t}^* = w_{i,t} + w_{i,t}' wi,t∗=wi,t+wi,t′ 是被篡改的梯度。记 U ∗ ( U ∗ ⊆ U 3 ) \mathcal{U}^∗ (\mathcal{U}^∗ ⊆ \mathcal{U}_3) U∗(U∗⊆U3) 为其密文/标签对被 AS 篡改的用户列表。为了便于后续的呈现,我们将 U j ∈ U 3 ∖ U ∗ \mathcal{U}_j \in \mathcal{U}_3 \setminus \mathcal{U}^∗ Uj∈U3∖U∗ 的梯度表示为 w j , t ∗ = w j , t w_{j,t}^* = w_{j,t} wj,t∗=wj,t。
然后,AS 将所有 U 3 \mathcal{U}_3 U3 用户的密文聚合为伪造的聚合密文 C t ∗ C_t^∗ Ct∗ 如(1),并使用去伪装密钥 A u t Au_t Aut 和其私钥 s k A sk_A skA 解密 C t ∗ C_t^∗ Ct∗ 以获得伪造的聚合明文 W t ∗ W_t^∗ Wt∗ 如(2)。AS 计算伪造的聚合标签 T t ∗ T_t^∗ Tt∗ 如(3)。然后 AS 将 ( W t ∗ , T t ∗ ) (W_t^∗, T_t^∗) (Wt∗,Tt∗) 发送给 U 3 \mathcal{U}_3 U3 中的所有用户以进行验证。
在接收到伪造的聚合值 ( W t ∗ , T t ∗ ) (W_t^∗, T_t^∗) (Wt∗,Tt∗) 时,每个用户通过检查验证 W t ∗ W_t^∗ Wt∗ 的正确性:
根据双线性配对性质,(4) 的左侧等于(4)的右侧。然后, W t ∗ W_t^∗ Wt∗ 被验证为正确,因此 VOSA 无法抵抗 I 型伪造攻击。
对于类型 II 的攻击
AS 先在 W t W_t Wt 的基础上伪造一个聚合明文 W t ∗ = W t + w ∗ W_t^∗ = W_t + w^∗ Wt∗=Wt+w∗,其中 w ∗ w^∗ w∗ 是一个随机选择的梯度。 然后,AS 修改 W t W_t Wt 的证明 T t T_t Tt 为证明 T t ∗ = T t ⋅ h 1 w ∗ s k A T_t^∗ = T_t \cdot \ h_1^{w^∗sk_A} Tt∗=Tt⋅ h1w∗skA 。 最后,AS 将 ( W t ∗ , T t ∗ ) (W_t^∗, T_t^∗) (Wt∗,Tt∗) 发送给用户进行验证。 在验证阶段,每个用户验证:
因此,VOSA 无法抵抗 II 型伪造攻击。
讨论:我们攻击的主要原因是VOSA的加密 / 认证标签生成方法使得密文 / 标签可以轻易地被恶意对手篡改,而不需要用户的加密 / 标签密钥。更明确地说,在密文和标签时,用户密钥不会直接影响明文。具体,一个密文 C i , t = ( 1 + w i , t N ) H 0 ( t ) s k i m o d N 2 C_{i,t} = (1 + w_{i,t}N )H_0(t)^{sk_i} \ mod \ N^2 Ci,t=(1+wi,tN)H0(t)ski mod N2 / 标签 T i , t = H 1 ( t ) t k i h 1 w i , t T_{i,t} = H_1(t)^{tk_i} h_1^{w_{i,t}} Ti,t=H1(t)tkih1wi,t 可以被视为由两个独立部分组成: { C i , t ( 1 ) , C i , t ( 2 ) = { ( 1 + w i , t N ) , H 0 ( t ) s k i } / { T i , t ( 1 ) , T i , t ( 2 ) } = { h 1 w i , t , H 1 ( t ) t k i } \{C_{i,t}^{(1)} , C_{i,t}^{(2)} = \{(1 + w_{i,t}N ), H_0(t)^{sk_i} \} / \{T_{i,t}^{(1)} , T_{i,t}^{(2)} \} = \{h_1^{w_{i,t}} ,H_1(t)^{tk_i}\} {Ci,t(1),Ci,t(2)={(1+wi,tN),H0(t)ski}/{Ti,t(1),Ti,t(2)}={h1wi,t,H1(t)tki},密文 / 标签的两个部分分别包含明文 w i , t w_{i,t} wi,t 和密钥 s k i / t k i sk_i/tk_i ski/tki ,从而使我们可以在篡改包含明文的部分(即 C i , t ( 1 ) / T i , t ( 1 ) C_{i,t}^{(1)} / T_{i,t}^{(1)} Ci,t(1)/Ti,t(1))时进行攻击。
虽然我们的攻击可以通过将用户密钥放在部分 C i , t ( 1 ) C_{i,t}^{(1)} Ci,t(1) 和 T i , t ( 1 ) T_{i,t}^{(1)} Ti,t(1) 上来防止,但我们强调此方法对于VOSA来说难以维持解密的正确性。例如,我们将加密方法修改为 C i , t ~ = ( 1 + w i , t N ) s k i H 0 ( t ) s k i m o d N 2 \tilde{C_{i,t}} = (1 + w_{i,t}N )^{sk_i} H_0(t)^{sk_i} \ mod \ N^2 Ci,t~=(1+wi,tN)skiH0(t)ski mod N2,那么聚合密文是 C t ~ = ( ∏ U i ∈ U 3 C i , t ~ ) s k A m o d N 2 = ( 1 + s k A ∑ U i ∈ U 3 s k i w i , t N ) H 0 ( t ) s k A ∑ U i ∈ U 3 s k i m o d N 2 \tilde{C_t} = (\prod_{\mathcal{U}_i \in \mathcal{U}_3}\tilde{C_{i,t}})^{sk_A} \ mod \ N^2 = (1+sk_A\sum_{\mathcal{U}_i \in \mathcal{U}_3}sk_i w_{i,t}N)H_0(t)^{sk_A\sum_{\mathcal{U}_i \in \mathcal{U}_3}sk_i} \ mod \ N^2 Ct~=(∏Ui∈U3Ci,t~)skA mod N2=(1+skA∑Ui∈U3skiwi,tN)H0(t)skA∑Ui∈U3ski mod N2 ,并且其解密结果为 W t ~ = s k A − 1 C ~ A u t − 1 N m o d N = ∑ U i ∈ U 3 s k i w i , t m o d N ≠ ∑ U i ∈ U 3 w i , t m o d N \tilde{W_t} = sk_A^{-1} \frac{\frac{\tilde{C}}{Au_t}-1}{N}\ mod \ N =\sum_{\mathcal{U}_i \in \mathcal{U}_3}sk_i w_{i,t} \ mod \ N \neq \sum_{\mathcal{U}_i \in \mathcal{U}_3}w_{i,t} \ mod \ N Wt~=skA−1NAutC~−1 mod N=∑Ui∈U3skiwi,t mod N=∑Ui∈U3wi,t mod N。也就是说,解密结果不正确。
上述方法不可行,主要是因为用户自己生成的密钥彼此不同,因此这些密钥在解密时无法去除。因此,我们建议 可信的KGC生成一个相同的共享密钥 s s s ,并将其分享给所有用户。然后, U i \mathcal{U}_i Ui 进行加密、标签生成和解密操作,分别为: C i , t = ( 1 + w i , t N ) s H 0 ( t ) s k i m o d N 2 C_{i,t} = (1 + w_{i,t}N)^sH_0(t)^{sk_i} \ mod \ N^2 Ci,t=(1+wi,tN)sH0(t)ski mod N2 , T i , t = H 1 ( t ) t k i h 1 w i , t s T_{i,t} = H_1(t)^{tk_i} h_1^{w_{i,t}s} Ti,t=H1(t)tkih1wi,ts , 和 W t ~ = s k A − 1 C ~ A u t − 1 N s m o d N \tilde{W_t} = sk_A^{-1} \frac{\frac{\tilde{C}}{Au_t}-1}{Ns}\ mod \ N Wt~=skA−1NsAutC~−1 mod N。我们提醒,这种方法要求AS不与任何用户串通;否则,AS知道 s s s 后仍可发起我们的伪造攻击。
相关文章:

【论文阅读】On the Security of “VOSA“
On the Security of Verifiable and Oblivious Secure Aggregation for Privacy-Preserving Federated Learning -- 关于隐私保护联邦中可验证与遗忘的安全聚合的安全性 论文来源摘要Introduction回顾 VOSA 方案对VOSA不可伪造性的攻击对于类型 I 的攻击对于类型 II 的攻击 论文…...
Docker 国内最新可用镜像源20250205
2年没用dockerhub了结果今天发现镜像无法拉取了,找了很多镜像都无效,连阿里云镜像都不行了,最后找到下面可以用的。 Docker镜像仓库备注hub.urlsa.us.kg可用http://hub.haod.eu.org可用http://hub.chxza.eu.org可用http://ccoc.eu.org部分地…...

(2025|ICLR,音频 LLM,蒸馏/ALLD,跨模态学习,语音质量评估,MOS)音频 LLM 可作为描述性语音质量评估器
Audio Large Language Models Can Be Descriptive Speech Quality Evaluators 目录 1. 概述 2. 研究背景与动机 3. 方法 3.1 语音质量评估数据集 3.2 ALLD 对齐策略 4. 实验结果分析 4.1 MOS 评分预测(数值评估) 4.2 迁移能力(在不同…...

使用 CSS 实现透明效果
在 CSS 中,实现透明效果有几种方法,具体使用哪种方法取决于具体需求。以下是一些常见的方法: 使用 opacity 属性: opacity 属性可以设置整个元素的透明度,包括其所有的子元素。 .transparent { opacity: 0.5; /* 0 表…...

4G核心网的演变与创新:从传统到虚拟化的跨越
4G核心网 随着移动通信技术的不断发展,4G核心网已经经历了从传统的硬件密集型架构到现代化、虚拟化网络架构的重大转型。这一演变不仅提升了网络的灵活性和可扩展性,也为未来的5G、物联网(LOT)和边缘计算等技术的发展奠定了基础。…...

数据库系统概论的第六版与第五版的区别,附pdf
我用夸克网盘分享了「数据库系统概论第五六版资源」,点击链接即可保存。 链接:https://pan.quark.cn/s/21a278378dee 第6版教材修订的主要内容 为了保持科学性、先进性和实用性,在第5版教材基础上对全书内容进行了修改、更新和充实。 在科…...

uniapp小程序自定义中间凸起样式底部tabbar
我自己写的自定义的tabbar效果图 废话少说咱们直接上代码,一步一步来 第一步: 找到根目录下的 pages.json 文件,在 tabBar 中把 custom 设置为 true,默认值是 false。list 中设置自定义的相关信息, pagePath&#x…...
自己实现的一个缓存数据库(搞着玩) .net Core/6/8/9
自己实现的一个缓存数据库(搞着玩) 想法来源特点说明 上代码主体基类测试类 注 想法来源 做过一个小型项目,客户要求易移植,不能使用收费的数据库,最好是一个包搞定,尝试过用sqlite,在部分linux…...
在Qt中,slots 关键字有什么用?
有下面的Qt代码: #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr…...
如何查看linux机器有几个cpu
在 Linux 机器上,你可以使用以下几种方法来查看 CPU 的数量(物理 CPU 和逻辑 CPU): 方法 1:使用 lscpu 命令 lscpu输出示例: CPU(s): 8 Thread(s) per core: 2 Core(s) per socket: 4 Soc…...
Swoole如何处理内存泄漏
Swoole处理内存泄漏的方式主要包括以下几个方面: 一、内存管理机制 Swoole的内存管理机制与普通PHP-CLI程序一致,但它在事件回调函数返回后会自动回收所有局部对象和变量,不需要手动unset。如果变量是一个资源类型,那么对应的资…...

Llama最新开源大模型Llama3.1
Meta公司于2024年7月23日发布了最新的开源大模型Llama 3.1,这是其在大语言模型领域的重要进展。以下是关于Llama 3.1的详细介绍: 参数规模与训练数据 Llama 3.1拥有4050亿(405B)参数,是目前开源领域中参数规模最大的…...

Pixflow - CL-DJI Drone LUTs 120个大疆Drone无人机相机航拍电影级镜头LUT调色预设
120组电影质感DJI大疆无人机航拍视频LOG&Rec 709还原颜色分级调色LUTs预设包Pixflow – CL-DJI Drone LUTs 使用基于城市外观和 DJI 无人机镜头的最佳 Drone Luts 颜色预设来提升您的视频。 120 个出色的颜色分级 LUTS,您可以将其与任何无人机视频素材一起使用…...

了解AI绘图,Stable Diffusion的使用
AI绘图对GPU算力要求较高。 个人电脑配置可参考: CPU:14600kf 盒装 显卡:RTX 4080金属大师 OC,16G显存 主板:z790吹雪d4 内存:芝奇皇家戟4000c18,162G 硬盘:宏基gm7000 1T 散热:追风…...

idea整合deepseek实现AI辅助编程
1.File->Settings 2.安装插件codegpt 3.注册deepseek开发者账号,DeepSeek开放平台 4.按下图指示创建API KEY 5.回到idea配置api信息,File->Settings->Tools->CodeGPT->Providers->Custom OpenAI API key填写deepseek的api key Chat…...
llama_index
目录 安装 llama_index 搜索引擎 用 DeepSeek API 替换本地 Ollama 模型 源代码: 安装 pip install llama_index llama_index 搜索引擎 llama_index框架构建搜索引擎_llamaindex使用正则表达式拆分文档-CSDN博客 用 DeepSeek API 替换本地 Ollama 模型 https…...
Spring Boot统一异常拦截实践指南
Spring Boot统一异常拦截实践指南 一、为什么需要统一异常处理 在Web应用开发中,异常处理是保证系统健壮性和用户体验的重要环节。传统开发模式中常见的痛点包括: 异常处理逻辑分散在各个Controller中错误响应格式不统一敏感异常信息直接暴露给客户端…...

Games104——游戏引擎Gameplay玩法系统:基础AI
这里写目录标题 寻路/导航系统NavigationWalkable AreaWaypoint NetworkGridNavigation Mesh(寻路网格)Sparse Voxel Octree Path FindingDijkstra Algorithm迪杰斯特拉算法A Star(A*算法) Path Smoothing Steering系统Crowd Simu…...

stm32生成hex文件详解
1.产生的map文件干啥的? 2.组成情况??? 废话少说,直接上代码具体内容况: Component: ARM Compiler 5.06 update 7 (build 960) Tool: armlink [4d3601]Section Cross Referencesstartup_stm32f103xe.o(S…...

【Windows 开发NVIDIA相关组件】CUDA、cuDNN、TensorRT
目录 1. 安装 CUDA Toolkit 2. 安装 cuDNN 3. 安装 Zlib 4. 安装 TensorRT 5. 安装 TensorRT Python 包[c++项目不需要] 6. 安装 ONNX GraphSurgeon 包[c++项目不需要] 1. 安装 CUDA Toolkit 从 CUDA ToolkitArchive 下载对应版本的离线安装包,以 11.7 版本为例。 打开安…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...