联邦学习与RAG融合:构建隐私保护的跨机构智能检索系统

news2026/5/13 3:26:45
1. 项目概述与核心价值最近在折腾一个跨机构文档智能检索的原型核心需求是在不共享原始数据的前提下让多个参与方比如几家医院、几个研究实验室能够联合起来构建一个强大的、统一的文档知识库并实现高效的语义检索。这听起来有点像“既要马儿跑又要马儿不吃草”——既要享受集中化大模型带来的精准语义理解能力又要严格遵守数据隐私法规不能把各家的敏感文档上传到中心服务器。正是在这个背景下我深度研究并实践了由Vector Institute开源的fed-rag项目。这个项目精准地切中了当前企业级AI落地的一个核心痛点如何在保护数据隐私的前提下实现知识的有效聚合与利用。fed-rag这个名字就很有意思它是“Federated”联邦学习和“RAG”检索增强生成两个热门技术方向的结合体。简单来说它的目标不是训练一个通用的模型而是构建一个“联邦化”的检索系统。每个参与方在本地用自己的私有数据训练一个轻量级的“适配器”比如一个文本嵌入模型然后将这个适配器的参数而不是原始数据安全地聚合到一个中心服务器。最终中心服务器拥有一个融合了所有参与方知识分布的、更强的嵌入模型用于对所有参与方的文档进行统一的向量化索引和检索。这解决了什么问题呢想象一下几家金融机构想联合反欺诈但谁也不能把自己的客户交易记录给别人看。或者几家医院想共建一个医疗问答系统但患者的电子病历是绝对隐私。fed-rag提供了一条可行的技术路径数据不动模型动。每个机构的数据永远留在自己的防火墙内只有模型的“经验”参数更新被加密、聚合从而在全局层面提升检索能力。对于我这样的技术实践者而言它的价值在于提供了一个从理论到实践的完整参考框架涵盖了联邦学习框架集成、异构数据处理、安全聚合协议实现以及最终RAG服务部署的全链路。2. 核心架构与设计思路拆解2.1 联邦学习与RAG的融合逻辑传统的RAG系统流程很清晰收集文档 - 切分文本块 - 用嵌入模型转为向量 - 存入向量数据库 - 用户提问时用同样的嵌入模型将问题转为向量在数据库中检索最相似的文本块 - 将检索结果和问题一起交给大语言模型生成答案。这里的核心是那个嵌入模型它的质量直接决定了检索的准确性。fed-rag的创新点在于它认为这个嵌入模型不应该由一个中心机构用有限的公开数据训练而应该由所有数据持有方共同“培育”。其融合逻辑可以拆解为以下几步本地训练每个客户端数据持有方使用自己本地的私有文档数据对一个基础的预训练嵌入模型如BGE、E5等进行微调。这个微调过程是标准的监督学习或对比学习目的是让模型更“懂”自己领域数据的语义分布。例如医院的数据微调后模型会对“心肌梗死”、“冠状动脉造影”等医疗术语的语义关系更敏感。参数上传训练完成后客户端不发送任何原始数据只将微调后的模型参数通常是模型最后一两层或特定适配层的参数进行加密然后上传到中央服务器。安全聚合中央服务器收集到所有客户端的参数更新后使用联邦学习中的经典算法如FedAvg进行加权平均得到一个新的、融合了所有客户端知识的全局模型参数。为了增强安全性项目通常会集成如差分隐私或安全多方计算技术确保服务器也无法从聚合后的参数中反推出任何单个客户端的原始数据信息。模型下发与同步聚合后的新全局参数被下发给所有客户端。客户端用这个新参数更新自己本地的模型然后可以开始新一轮的本地训练。如此迭代全局嵌入模型的能力在每一轮通信中不断增强。联邦检索在检索阶段一种方案是中心服务器持有最终的全局嵌入模型。当用户发起查询时查询被发送到中心用全局模型向量化然后这个查询向量被广播到所有客户端。各客户端用本地的嵌入模型将自己的文档向量化或使用预先用全局模型生成的向量索引并在本地进行相似度计算只将最相关的几个文档块或它们的ID和分数返回给中心服务器汇总。另一种更彻底的联邦方案是检索过程也完全分布式中心服务器只做查询路由和结果融合。注意fed-rag项目通常更侧重于前4步即“联邦训练出一个更好的嵌入模型”。第5步的联邦检索实现复杂度较高在初期原型中更常见的做法是训练完成后各方向中心服务器提交用最终全局模型生成的文档向量由中心统一构建索引并提供检索服务。这虽然要求上传向量但向量本身是模型的输出相比原始文本其包含的隐私信息已通过模型和差分隐私得到了极大保护。2.2 技术栈选型与考量fed-rag不是一个从零造轮子的项目它更像一个“胶水”项目巧妙地整合了多个成熟的开源生态。理解它的技术栈选型就能理解其设计哲学。联邦学习框架Flower。这是项目的默认选择也是我认为非常明智的一点。Flower的设计非常优雅它将联邦学习中的服务器和客户端抽象为独立的、可配置的组件通信基于gRPC支持多种机器学习框架PyTorch, TensorFlow等。相比于FATE等更重型的框架Flower更轻量、更灵活非常适合快速构建研究原型和中等规模的实验。它允许你非常精细地控制联邦学习的每一轮Round中服务器和客户端的行为策略例如如何选择客户端、如何聚合参数、如何处理客户端掉线等。嵌入模型Sentence Transformers。这是目前构建文本嵌入事实上的标准库。它基于Hugging Face Transformers提供了大量预训练好的高质量双塔编码模型如all-MiniLM-L6-v2,BGE系列E5系列并且封装了方便的微调和推理接口。fed-rag直接利用这个生态使得用户能够轻松替换不同的基础模型以适应不同的语言和领域。向量数据库Chroma / FAISS。项目示例中常使用Chroma因为它简单易用纯Python实现适合原型开发。在实际生产部署中可能会根据数据规模、性能要求和运维复杂度切换到FAISSFacebook开源的相似性搜索库性能极高、Weaviate或Qdrant等专业向量数据库。这里的选择是解耦的fed-rag的核心产出是那个训练好的嵌入模型至于用哪个向量数据库存向量、做检索是下游应用的决定。大语言模型通过API集成。fed-rag主要解决“检索”部分对于“生成”部分它通常设计为与OpenAI GPT、Anthropic Claude或开源LLM如Llama系列、ChatGLM的API进行对接。这意味着当你获得了最相关的文档片段后可以将其作为上下文连同用户问题发送给LLM生成最终答案。这种设计保持了系统的模块化和灵活性。为什么这么选核心思路是“站在巨人的肩膀上”。Flower解决了联邦的通信和协调难题Sentence Transformers解决了嵌入模型的基础能力向量数据库和LLM API都是成熟的外部服务。fed-rag的独创性在于定义了这些组件在隐私保护场景下的协同工作流和数据流并实现了关键的安全聚合与训练逻辑。3. 环境搭建与核心配置详解3.1 基础环境准备开始动手前我们需要模拟一个最简单的联邦环境一个服务器Server和两个客户端Client。为了简化我们可以在同一台机器上用不同的端口和进程来模拟。这是学习和调试的最佳方式。首先创建一个干净的Python虚拟环境并安装核心依赖。我强烈建议使用conda或venv来管理环境避免包冲突。# 创建并激活虚拟环境 (以conda为例) conda create -n fed-rag python3.9 conda activate fed-rag # 安装核心库 pip install flwr1.8.0 # Flower联邦学习框架 pip install sentence-transformers2.2.2 # 嵌入模型库 pip install datasets # 用于加载示例数据如果需要 pip install chromadb # 向量数据库用于示例 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 根据你的CUDA版本选择fed-rag项目本身可能还依赖其他工具如transformers,numpy,pandas等上述安装基本已覆盖。务必注意版本兼容性尤其是flwr和sentence-transformers的版本最好参照项目requirements.txt如果有的话。3.2 项目结构与关键文件解析克隆fed-rag仓库后其目录结构通常如下我根据典型开源项目结构进行了归纳fed-rag/ ├── server.py # 联邦学习服务器主逻辑 ├── client.py # 联邦学习客户端主逻辑 ├── utils/ │ ├── data_loader.py # 数据加载与预处理工具 │ ├── model_utils.py # 模型定义、保存、加载工具 │ └── aggregation.py # 安全聚合算法实现如FedAvg, DP-FedAvg ├── config/ │ └── config.yaml # 配置文件定义模型、数据、训练参数 ├── data/ # 示例数据或数据加载脚本 ├── scripts/ │ ├── run_server.sh # 启动服务器脚本 │ └── run_client.sh # 启动客户端脚本 └── requirements.txt # 项目依赖server.py这是大脑。它使用Flower的ServerApp或start_server函数启动。核心是定义一个FedAvg或自定义策略指定评估函数、参与方选择策略等。它会等待客户端连接分发全局模型收集参数更新进行聚合然后下发新的全局模型。client.py这是手脚。每个客户端实例运行一份。它需要加载本地私有数据从data/目录或本地数据库。定义本地模型通常继承sentence_transformers.SentenceTransformer。实现Flower要求的Client接口包括fit本地训练、evaluate本地评估等方法。在fit方法中它会用本地数据对模型进行几个epoch的训练然后返回模型参数的更新量。config.yaml项目的控制中心。好的配置管理能极大提升实验效率。一个典型的配置如下# config/config.yaml fed: num_rounds: 10 # 联邦训练总轮数 fraction_fit: 1.0 # 每轮参与训练的客户端比例 min_fit_clients: 2 # 每轮最少需要的客户端数 fraction_evaluate: 0.5 # 每轮参与评估的客户端比例 min_evaluate_clients: 1 model: base_model: BAAI/bge-small-en-v1.5 # 基础预训练模型 trainable_layers: [‘pooler’, ‘encoder.layer.11’] # 指定微调哪些层 output_dim: 384 # 嵌入向量维度 data: local_data_path: ./data/client_{cid} # 客户端数据路径模板 chunk_size: 512 # 文本切分大小 chunk_overlap: 50 # 文本切分重叠 train: local_epochs: 2 # 客户端本地训练epoch数 batch_size: 16 learning_rate: 2e-5 use_dp: false # 是否启用差分隐私 dp_noise_multiplier: 1.0 # 差分隐私噪声乘子 dp_l2_norm_clip: 1.0 # 梯度裁剪阈值通过配置文件我们可以轻松切换模型、调整联邦学习参数、控制隐私预算而无需修改代码。4. 联邦训练流程的实操实现4.1 客户端本地训练的实现细节客户端的核心任务是进行有效的本地微调。这里有几个关键点需要注意1. 数据准备与负采样 对于嵌入模型训练尤其是对比学习高质量的负样本至关重要。在RAG场景下正样本是查询相关文档。负样本可以是随机负样本从同一批次的其它查询的文档中随机选取。困难负样本与查询语义相似但不相关的文档这需要额外的挖掘如使用一个弱模型进行初步检索取排名靠前但不正确的文档。 在fed-rag的初期使用随机负样本是简单有效的起点。数据应被组织成(anchor, positive, negative)的三元组形式或者(query, positive_doc)的配对形式由损失函数自动构造负样本。2. 模型定义与参数冻结 我们不是从头训练而是微调。通常的做法是冻结基础模型的大部分层只解锁最后几层或添加一个适配层Adapter。这既能加快训练、减少通信量也能在一定程度上防止灾难性遗忘保留模型的基础语言能力。# 在 client.py 或 model_utils.py 中 from sentence_transformers import SentenceTransformer, models def get_model(model_name, trainable_layers): # 加载预训练模型 word_embedding_model models.Transformer(model_name) pooling_model models.Pooling(word_embedding_model.get_word_embedding_dimension()) model SentenceTransformer(modules[word_embedding_model, pooling_model]) # 冻结所有参数 for param in model.parameters(): param.requires_grad False # 只解冻指定层 for layer_name in trainable_layers: # 这里需要根据模型结构具体解析layer_name例如‘encoder.layer.11’ # 假设我们有一个工具函数来获取指定层 layer get_layer_by_name(model, layer_name) if layer: for param in layer.parameters(): param.requires_grad True return model3. 损失函数选择 对于句子对任务MultipleNegativesRankingLoss是一个常用且效果不错的选择它假设一个批次内对于每个查询只有一个正样本其他都是负样本。CosineSimilarityLoss直接优化余弦相似度也很直接。在fed-rag中可以根据数据情况选择。4. 本地训练循环 在Flower客户端的fit方法中我们实现标准的训练循环但要注意我们训练的是从服务器接收到的全局模型副本。# client.py 中 fit 方法的部分伪代码 def fit(self, parameters, config): # 1. 用服务器下发的参数更新本地模型 set_model_params(self.model, parameters) # 2. 准备本地数据加载器 train_loader get_local_dataloader(self.client_id) # 3. 配置优化器只更新可训练参数 optimizer torch.optim.AdamW( filter(lambda p: p.requires_grad, self.model.parameters()), lrconfig[“learning_rate”] ) # 4. 训练循环 self.model.train() for epoch in range(config[“local_epochs”]): for batch in train_loader: optimizer.zero_grad() # 假设batch是 (anchors, positives) 对 embeddings_a self.model.encode(batch[‘anchors’], convert_to_tensorTrue) embeddings_p self.model.encode(batch[‘positives’], convert_to_tensorTrue) # 计算损失例如使用余弦相似度损失 loss 1 - F.cosine_similarity(embeddings_a, embeddings_p).mean() loss.backward() # 如果启用差分隐私在这里进行梯度裁剪和加噪 if config[“use_dp”]: clip_grad_norm_(self.model.parameters(), max_normconfig[“dp_l2_norm_clip”]) add_noise_to_gradients(self.model, config[“dp_noise_multiplier”]) optimizer.step() # 5. 返回更新后的参数、训练样本数等信息 updated_params get_model_params(self.model) return updated_params, len(train_loader.dataset), {}4.2 服务器端聚合策略与安全增强服务器端的核心是聚合策略。Flower内置了FedAvg但我们需要理解其细节并考虑安全增强。标准FedAvg 聚合公式很简单w_global Σ (n_k / n) * w_k。其中w_k是第k个客户端的模型参数n_k是该客户端本地数据量n是所有参与客户端的总数据量。这给了数据量大的客户端更大的权重。在Flower中这通过aggregate_fit函数实现。差分隐私FedAvg 这是fed-rag项目可能实现的关键隐私保护技术。其核心思想是在客户端上传参数更新前对更新量梯度或参数差值进行两步操作裁剪将每个客户端的更新向量的L2范数裁剪到一个阈值C。这限制了单个客户端对全局模型的潜在影响是满足DP定义的前提。加噪在裁剪后的更新上添加满足高斯分布或拉普拉斯分布的随机噪声。噪声的尺度由隐私预算epsilon和噪声乘子sigma控制。# utils/aggregation.py 中的简化示例 def dp_fedavg(updates, weights, noise_multiplier, l2_norm_clip): updates: 客户端参数更新列表 [update1, update2, ...] weights: 客户端权重列表如数据量比例 aggregated_update [] # 假设updates是列表每个元素是一个参数张量的列表 num_clients len(updates) sensitivity 2 * l2_norm_clip # 对于梯度经过裁剪后敏感度 for i in range(len(updates[0])): # 遍历每一层参数 layer_updates [update[i] for update in updates] # 加权平均 avg_update sum(w * u for w, u in zip(weights, layer_updates)) # 添加高斯噪声 noise_stddev noise_multiplier * sensitivity noise torch.randn_like(avg_update) * noise_stddev dp_avg_update avg_update noise / num_clients # 噪声随客户端数增加而稀释 aggregated_update.append(dp_avg_update) return aggregated_update在服务器策略中我们需要在收集到客户端更新后调用这个安全的聚合函数而不是简单的平均。Flower允许我们通过自定义Strategy类来轻松实现这一点。实操心得差分隐私的引入是一把双刃剑。噪声越大隐私保护越强但模型性能下降也越严重噪声会淹没有用的信号。l2_norm_clip和noise_multiplier是两个关键超参数需要仔细调优。通常从一个较小的裁剪阈值如1.0和中等噪声如0.5-1.0开始在验证集上观察性能损失。隐私预算epsilon是一个累积量需要跟踪每一轮训练消耗的预算确保总预算不超标。5. 从联邦模型到RAG服务的部署链路联邦训练结束后我们得到了一个增强的全局嵌入模型。但这还不是终点我们需要将它集成到一个可用的RAG服务中。5.1 文档索引的构建假设我们采用“中心化索引”的方案各客户端上传向量到中心。部署流程如下模型分发将最终训练好的全局嵌入模型model_final.safetensors或pytorch_model.bin分发给所有客户端或部署在中心服务器。分布式向量化每个客户端使用这个相同的全局模型对自己的私有文档进行预处理切块和向量化。这一步完全在本地完成不涉及原始数据外泄。向量上传客户端将生成的向量以及对应的文本块ID和可能的元数据加密后上传到中心服务器的向量数据库。这里上传的是向量不是原文。虽然向量理论上可能泄露一些信息但结合了联邦训练和可能的差分隐私风险已大大降低。对于极度敏感的场景可以考虑同态加密向量后再上传但这会极大增加计算和存储开销。中心索引中心服务器接收所有向量将其插入到统一的向量数据库如Chroma、Qdrant中构建一个全局的、融合了所有参与方知识的索引。5.2 检索与生成服务搭建索引构建完成后就可以提供标准的RAG服务了查询处理用户发起查询。查询请求到达中心服务器的API网关。查询向量化API服务使用同一个全局嵌入模型将用户查询转换为查询向量。语义检索将查询向量发送到向量数据库执行近似最近邻搜索召回Top-K个最相关的文档片段向量。上下文组装将召回到的文档片段文本存储在向量数据库或关联的外部存储中组装成提示词的上下文。LLM生成将“上下文 用户问题”构成的完整提示发送给后端的大语言模型如通过OpenAI API或本地部署的Llama生成最终答案。返回结果将LLM生成的答案返回给用户。整个流程中只有第3步的检索和第5步的生成涉及中心化服务。原始数据文档块文本可以存储在客户端只将向量和文本块的ID传到中心。当检索到相关ID后中心服务器可以向对应的客户端请求获取具体的文本内容如果需要的话这可以实现更细粒度的控制但延迟会增加。更常见的做法是将文本块也存储在中心的数据库因为经过切分和向量化后的文本块其隐私风险已经过评估和缓解。5.3 性能优化与扩展考量当参与方和数据量增长时需要考虑以下问题通信效率模型参数可能很大。可以采用模型压缩如量化、剪枝和通信压缩如梯度稀疏化、低精度传输技术来减少每轮通信的数据量。客户端异构性不同客户端的计算能力、网络状况、数据分布非独立同分布Non-IID差异很大。需要设计自适应策略例如为弱客户端分配更少的本地训练轮数或使用联邦优化算法如FedProx来缓解Non-IID带来的性能下降。异步联邦标准的同步联邦等所有客户端完成再聚合容易受到慢客户端Straggler的影响。可以考虑异步联邦学习服务器一旦收到部分客户端的更新就进行聚合提高整体效率。索引更新当各客户端有新增文档时需要重新训练模型和更新索引吗完全重训练成本高。可以采用增量学习或持续学习的思路定期如每周进行一轮联邦微调然后增量更新向量索引。对于实时性要求不高的场景定期全量更新也是可接受的方案。6. 常见问题、调试技巧与避坑指南在实际部署和调试fed-rag这类系统时我踩过不少坑这里总结一些典型问题和解决思路。6.1 训练过程不稳定或发散现象全局模型准确率震荡剧烈甚至随着训练轮次下降。排查思路检查本地数据质量确保每个客户端本地的(query, positive)配对是正确的。错误的数据标注是导致模型学偏的首要原因。可以抽样检查每个客户端的数据。调整学习率联邦学习中的最优学习率通常比集中式训练要小。因为每个客户端只看到局部数据大的更新步长容易导致“漂移”。尝试将学习率降低一个数量级例如从2e-5降到5e-6。增加本地训练轮数如果本地epoch太少比如1客户端可能还没学到自己数据的有效特征就上传了噪音很大的更新。尝试增加到2-5个epoch。引入梯度裁剪即使不用差分隐私也对本地训练的梯度进行裁剪clip_grad_norm_可以防止个别异常样本导致更新爆炸稳定训练过程。验证客户端更新在服务器端记录并可视化每个客户端上传的参数更新的范数。如果某个客户端的更新范数异常大可能是该客户端数据异常或训练出了问题可以考虑在聚合时降低其权重或将其剔除。6.2 隐私与效用难以权衡现象启用差分隐私后模型性能检索精度大幅下降。解决策略从宽松开始初期调试时先将差分隐私参数设置得非常宽松noise_multiplier很大如10.0l2_norm_clip也较大如5.0确保模型能正常训练。然后逐步收紧隐私约束观察性能曲线找到可接受的平衡点。调整模型架构差分隐私对深层、大参数量的模型影响更大。考虑使用更小的基础模型或者冻结更多的底层只微调顶部的少量参数。减少可训练参数数量能有效降低添加噪声带来的影响。增加客户端数量和轮次差分隐私的噪声影响可以被更多的客户端和更多的训练轮次平均掉。在固定总隐私预算下增加客户端数量可以降低每轮每个客户端分配的噪声。更多的训练轮次也让模型有机会从噪声中慢慢学习到有效信号。使用高级DP算法探索更先进的差分隐私算法如DP-SGD的变种或者结合隐私放大技术如通过采样。6.3 客户端掉线与通信故障现象服务器日志显示客户端连接中断训练轮次无法完成。Flower的应对机制Flower的Server和Strategy已经内置了容错处理。在配置中min_fit_clients和min_evaluate_clients是关键参数。例如你设置了min_fit_clients3但有5个客户端注册。如果某一轮只有2个客户端完成了训练并返回结果服务器会一直等待直到超时。你可以设置一个合理的round_timeout。实操建议设置合理的超时在server.py的start_server中配置round_timeout参数例如round_timeout60秒。超时后服务器将聚合已收到的更新继续下一轮。客户端重连逻辑在客户端脚本中实现简单的重连和断点续训机制。如果连接失败等待一段时间后重试。客户端本地应定期保存检查点以便在重启后能从上一轮结束的状态继续训练。日志与监控为服务器和客户端添加详细的日志记录包括连接状态、训练进度、通信数据大小等。这有助于快速定位网络或资源问题。6.4 检索效果提升缓慢现象联邦训练后的模型在全局测试集上的检索效果提升不如预期甚至不如直接用原始预训练模型。深度分析数据异构性Non-IID这是联邦学习最大的挑战。如果医院A的数据全是心血管疾病医院B的数据全是骨科那么它们本地训练出的模型更新方向可能差异很大简单平均FedAvg可能会产生一个“四不像”的全局模型。可以尝试使用FedProx等算法在本地损失函数中加入一个正则项惩罚本地模型与全局模型的偏离强制客户端更新不要偏离太远。个性化联邦学习不追求一个统一的全局模型而是允许每个客户端在全局模型的基础上发展出自己的个性化模型。fed-rag可以扩展为每个客户端拥有一个“全局模型个性化适配器”的结构。评估方式问题确保你的评估数据集是真正“全局”的覆盖所有参与方的数据分布。如果评估集只偏向某一方那么性能指标可能不具代表性。构建一个平衡的、跨领域的测试集至关重要。任务定义是否清晰RAG的检索目标是什么是直接回答事实性问题还是需要理解复杂意图不同的目标可能需要不同的微调数据构造方式。例如对于事实性问答(问题答案所在段落)是好的正样本。对于对话式检索可能需要(多轮对话历史下一句合适的回复依据)作为正样本。重新审视你的数据标注和损失函数是否与最终任务对齐。经过多轮迭代和调试当联邦训练稳定收敛并且检索效果在保护隐私的前提下达到或接近集中式训练的基线时这个fed-rag系统就真正具备了实用价值。它不仅仅是一个技术Demo而是为跨组织知识协作提供了一种新的、合规的技术范式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2608080.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…