尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

LoRA合并新突破:Pico算法校准输出空间共享方向,提升多任务性能

LoRA合并新突破:Pico算法校准输出空间共享方向,提升多任务性能
📅 发布时间:2026/6/23 7:20:19

1. 项目概述:当LoRA合并遇上“校准”难题

最近在折腾大模型微调的朋友,估计对LoRA(Low-Rank Adaptation)都不陌生。这玩意儿确实是个神器,用极小的参数量就能让一个通用大模型学会新技能,无论是让它写代码、画特定风格的画,还是回答某个垂直领域的问题,都离不开LoRA。但玩得深了,一个头疼的问题就冒出来了:怎么把多个LoRA模型合并到一起?

想象一下,你训练了一个擅长写古风诗词的LoRA,又训练了一个精通历史典故的LoRA。你当然希望你的模型既能“七步成诗”,又能“引经据典”。最简单的办法就是把两个LoRA的权重矩阵直接加起来。但这么干过的人都知道,效果往往很玄学,模型可能会精神分裂,输出一些不伦不类的东西,或者干脆把之前学好的技能给“忘”了。这背后的核心矛盾在于,每个LoRA都是在原始模型庞大的参数空间里,学习了一个微小的、特定的“方向”来调整模型行为。直接相加,相当于把两个不同方向矢量硬凑在一起,很可能指向一个毫无意义的空间角落,导致模型输出空间的混乱。

而我最近关注到的一个新思路,来自一篇题为“LoRA合并新突破:Pico算法校准输出空间共享方向,提升多任务性能”的论文。这个“Pico算法”的提出,正是为了解决上述合并的乱象。它不再粗暴地做加法,而是引入了一个“校准”步骤。其核心思想非常巧妙:它认为,多个任务LoRA之间,应该存在一个“共享”的、对最终输出影响最大的调整方向。Pico算法的工作,就是像一个精密的导航仪,在合并前先找到这个共享方向,并对各个LoRA的调整量进行校准,让它们朝着这个共同的最优方向对齐,然后再进行融合。这样合并后的模型,在多任务上的表现就能更稳定、更出色。

这不仅仅是多模型合并的技术优化,更是对“模型参数高效利用”这一命题的深入思考。对于任何需要让一个大模型同时胜任多个相近任务的场景——比如一个客服机器人既要懂产品咨询又要会处理售后,或者一个创作助手既要能写文案又要能润色——这种能提升多任务性能的合并技术,都有着实实在在的价值。

2. 核心思路拆解:从“矢量相加”到“方向校准”

要理解Pico算法的妙处,我们得先回到问题的起点:为什么简单的LoRA权重相加会出问题?

2.1 传统LoRA合并的“失准”困境

LoRA的本质,是在预训练大模型(我们称之为“基座模型”)的某个全连接层旁,增加一个低秩的旁路矩阵。假设基座模型的某个权重矩阵是W0,LoRA的更新量是ΔW = B * A,其中B和A是低秩矩阵。微调后,该层的实际计算变为W0 + ΔW。

当我们有两个针对不同任务训练的LoRA,ΔW_a和ΔW_b,传统的合并方法就是W0 + ΔW_a + ΔW_b。这里隐藏了两个假设:

  1. 独立性假设:认为两个任务对模型的调整是相互独立的。
  2. 线性可加性假设:认为两个调整量可以直接在线性空间叠加。

但现实很骨感。大模型的输出空间是高维且高度非线性的。ΔW_a和ΔW_b虽然本身是低秩的,但它们对最终输出(比如下一个token的概率分布)的影响路径是复杂的。直接相加,相当于强迫模型同时响应两个可能互相冲突的“指令”,导致输出概率分布出现畸变,表现为任务性能下降或混淆。

2.2 Pico算法的“校准”哲学

Pico算法跳出了“如何加”的框架,转而思考“加什么”。它提出了一个核心观点:多个相关任务的LoRA,其有效的调整方向,在输出空间上应该存在一个共享的子空间。这个“共享方向”是对最终任务性能影响最关键的部分。

我们可以用一个不太严谨但直观的类比来理解:假设基座模型是一个面向正北的指南针。任务A(写诗)需要它向东偏转10度,任务B(用典)需要它向东偏转5度但再向上仰角2度。直接相加,指针可能指向一个奇怪的角度。而Pico算法先分析发现,两个任务最主要的共同需求是“向东转”,这个“东”就是共享方向。它会先校准两个LoRA,强调它们“向东”的成分,弱化其他方向的成分(比如B的“仰角”),然后再合并。这样合并后的指南针,会稳定地指向东偏某个角度,同时兼顾两个任务的核心诉求。

具体到数学上,Pico算法大致包含以下几个关键步骤(基于论文思想演绎):

  1. 表征提取:对于每一个待合并的LoRA模型,使用一组校准数据(通常来自各个任务的混合或一个通用数据集)前向传播,收集模型在关键层(通常是添加了LoRA的层)的激活值或梯度信息。这些信息表征了该LoRA对模型内部状态的“扰动模式”。
  2. 共享方向发现:对所有LoRA的表征进行分析(例如通过主成分分析PCA或奇异值分解SVD),寻找一个低维子空间,使得所有LoRA的表征在该子空间上的投影都足够大。这个子空间就被认为是“输出空间共享方向”。它捕捉了所有任务共通的、对改变模型行为最关键的模式。
  3. 权重校准:针对每个LoRA的增量权重ΔW_i,计算其在共享方向上的分量和正交分量。算法会增强共享方向上的分量,同时按一定比例衰减正交方向上的分量。这个比例是一个超参数,控制着“任务共性”与“任务特性”的权衡。
  4. 校准后合并:将校准后的各个LoRA增量权重进行合并(可以是加权平均、求和等)。此时,由于各权重已向共享方向对齐,合并后的冲突大大减少。

注意:这里的“输出空间”并非指最终的文本或图像,而是模型内部、能够显著影响最终输出的高层特征表示空间。Pico校准的是这个中间空间的调整方向。

2.3 与其它合并方法的对比

为了更清楚Pico的定位,我们把它放在现有方法中做个比较:

方法核心思想优点缺点适用场景
简单相加直接ΣΔW_i实现极其简单,零计算开销。任务冲突严重,性能下降风险高,结果不可预测。快速原型验证,或确信任务高度兼容时的粗略尝试。
任务算术假设存在“任务向量”,可线性运算。概念直观,在某些特定任务(如风格迁移)上有效。依赖强假设,泛化能力有限,对任务定义模糊的场景效果差。概念性实验,风格、情感等具有明确“方向性”的任务。
模型汤合并多个完整模型的权重(非仅LoRA)。有时能提升泛化性能。参数量巨大,计算和存储成本高,合并的是整个参数空间,噪声多。资源充足,基座模型相同且微调幅度不大的多个完整模型合并。
Pico算法校准输出空间的共享方向后合并。针对性强,能提升多任务性能,理论上有更好的解释性。需要校准步骤,计算量比简单相加大;需要调节校准强度超参数。多个相关任务的LoRA合并,追求稳定可靠的多任务性能提升。

从对比可以看出,Pico算法在“多任务LoRA合并”这个细分问题上,提供了更精细、更具理论指导性的解决方案。它不是最省事的,但很可能是最“靠谱”的之一。

3. 实操演练:动手实现Pico风格LoRA合并

理解了原理,我们来看看如何在实际项目中应用这种思想。虽然原论文的Pico算法可能有其具体的实现细节,但我们可以抓住其“校准共享方向”的核心,设计一个简化版的实践流程。这里以合并两个文本生成LoRA为例。

3.1 环境与数据准备

首先,你需要一个已经训练好的基座模型(例如Qwen2.5-7B)和两个针对不同任务微调好的LoRA适配器(比如lora_poetry和lora_history)。

关键的一步是准备校准数据集。这个数据集不需要大,但要有代表性。理想情况是包含两个任务域样本的混合。例如:

  • 任务A(古风诗):100-200条古诗、对联或仿写要求。
  • 任务B(历史典故):100-200条历史事件描述、人物生平或典故问答。 将它们混合成一个文件calibration_data.jsonl。如果没有现成的混合数据,用每个任务的一小部分数据(各50条)简单混合也勉强可行,但效果可能打折扣。

实操心得:校准数据的质量直接影响“共享方向”的发现。如果数据完全偏向某一个任务,校准就会失效。尽量确保混合数据能均匀触发两个LoRA各自学到的模式。一个技巧是,可以先用基座模型生成一些与任务相关的文本,作为补充数据。

3.2 实现共享方向发现与校准

我们无法直接访问模型“输出空间”的抽象概念,但可以通过收集模型中间层的激活值(Activation)来近似表征LoRA的影响。一个常用的层是添加了LoRA模块的那个Transformer层的输出。

以下是使用Hugging Facetransformers和peft库进行简化版校准合并的伪代码思路:

import torch from transformers import AutoModelForCausalLM, AutoTokenizer from peft import PeftModel import numpy as np from sklearn.decomposition import PCA # 1. 加载基座模型和Tokenizer model_name = "Qwen/Qwen2.5-7B-Instruct" base_model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16, device_map="auto") tokenizer = AutoTokenizer.from_pretrained(model_name) # 假设LoRA适配器路径 lora_paths = ["./lora_poetry", "./lora_history"] # 2. 定义钩子函数,用于收集指定层的激活值 activations = {f"lora_{i}": [] for i in range(len(lora_paths))} # 存储每个LoRA的激活 def get_activation_hook(name): def hook(module, input, output): # 收集前向传播中该层的输出激活值 # 通常取[批次, 序列长度, 隐藏维度]中某个位置(如最后一个token)的向量,或做平均 # 这里取最后一个token的向量作为简化 activations[name].append(output[0][:, -1, :].detach().cpu().float()) return hook # 假设我们知道LoRA被添加到了模型的第20层(具体层数需根据你的微调配置确定) target_layer = base_model.model.layers[19].self_attn.v_proj # 3. 为每个LoRA,加载并前向传播,收集激活 for i, lora_path in enumerate(lora_paths): # 加载当前LoRA到基座模型 model = PeftModel.from_pretrained(base_model, lora_path, adapter_name=f"adapter_{i}") model.eval() # 注册钩子 hook_handle = target_layer.register_forward_hook(get_activation_hook(f"lora_{i}")) # 使用校准数据前向传播 with torch.no_grad(): for data in calibration_dataloader: # 你需要实现数据加载 inputs = tokenizer(data["text"], return_tensors="pt", padding=True, truncation=True).to(model.device) _ = model(**inputs) # 移除钩子 hook_handle.remove() # 清空模型上的适配器,准备加载下一个 model.delete_adapter(f"adapter_{i}") # 重要:清除缓存,防止显存泄漏 torch.cuda.empty_cache() # 4. 分析激活,寻找共享方向(例如使用PCA) # 将所有LoRA收集的激活值堆叠起来 [总样本数, 隐藏层维度] all_activations = [] for key in activations: all_activations.append(torch.cat(activations[key], dim=0)) all_activations = torch.cat(all_activations, dim=0).numpy() # 转为numpy数组 # 使用PCA找到主成分 pca = PCA(n_components=50) # 假设取前50个主成分作为共享方向子空间 pca.fit(all_activations) shared_subspace = pca.components_ # 形状 [50, 隐藏维度],即共享方向基 # 5. 校准每个LoRA的增量权重 # 我们需要获取每个LoRA的增量权重 delta_W calibrated_deltas = [] for i, lora_path in enumerate(lora_paths): # 再次加载LoRA,这次是为了获取其状态字典 model = PeftModel.from_pretrained(base_model, lora_path) lora_state_dict = model.state_dict() # 假设我们只校准其中一个关键矩阵(如lora_A或lora_B,或它们的乘积) # 这里以 lora_B 和 lora_A 的乘积作为 delta_W 的近似(注意:实际LoRA是BA,但这里为简化) # 你需要根据你的LoRA实现找到对应的键名 key_A = f"base_model.model.layers.19.self_attn.v_proj.lora_A.adapter_{i}.weight" key_B = f"base_model.model.layers.19.self_attn.v_proj.lora_B.adapter_{i}.weight" weight_A = lora_state_dict[key_A].float().cpu() # [r, hidden] weight_B = lora_state_dict[key_B].float().cpu() # [hidden, r] delta_W_approx = weight_B @ weight_A # [hidden, hidden]? 不对,维度不匹配。 # 注意:实际LoRA的增量是 B*A,其中A是[r, hidden],B是[hidden, r],结果是[hidden, hidden]。 # 但低秩矩阵相乘得到的是满秩矩阵的低秩近似。我们通常直接处理低秩矩阵。 # 更实际的校准:分别对A和B矩阵在共享子空间上进行投影和调整。 # **简化版校准思路(概念性)**: # 1. 将权重矩阵(如 weight_B)投影到共享子空间和其正交补空间。 # 2. 增强共享子空间上的分量(乘以因子 alpha > 1),减弱正交分量(乘以因子 beta < 1)。 # 3. 重构校准后的权重。 # 由于涉及具体矩阵运算,此处省略详细代码。核心是: # proj_shared = weight @ shared_subspace.T @ shared_subspace # ortho = weight - proj_shared # calibrated_weight = alpha * proj_shared + beta * ortho # 假设我们得到了校准后的 delta_W_i_cal calibrated_delta = calibrate_weight(delta_W_approx, shared_subspace, alpha=1.2, beta=0.8) calibrated_deltas.append(calibrated_delta) model.delete_adapter(f"adapter_{i}") # 6. 合并校准后的权重 # 简单加权平均 merged_delta = sum(calibrated_deltas) / len(calibrated_deltas) # 7. 将合并后的增量赋给一个新的LoRA适配器,或直接与基座模型权重相加(谨慎操作) # 通常建议创建新的LoRA配置并赋值,以便保存和加载。

这段代码提供了一个概念性的框架。请注意,这是一个高度简化的示意。真实的Pico算法实现会更加复杂和严谨,包括:

  • 对多个层而不仅是一层进行校准。
  • 使用更稳健的统计方法(如CCA典型相关分析)来寻找共享方向。
  • 设计精细的校准函数,可能不是简单的线性缩放。
  • 处理LoRA中多个矩阵(A和B)的校准关系。

3.3 关键参数与调优经验

在实践这个思路时,有几个关键旋钮需要调试:

  1. 校准层选择:不是所有层都同等重要。通常,模型靠后的层(更接近输出的层)学习到的特征更偏向任务特定,在这些层进行校准可能效果更直接。你可以尝试对不同层的激活进行分析,选择方差变化最大的层。
  2. 共享子空间维度:PCA中的n_components。维度太低可能丢失重要信息,太高则可能引入噪声。可以绘制方差解释率曲线,选择拐点处的维度,或者通过下游任务性能来验证。
  3. 校准强度(alpha, beta):这是平衡“任务共性”与“任务特性”的关键。alpha > 1增强共享成分,beta < 1削弱独有成分。
    • 如果两个任务非常相似(如写七言诗和五言诗),可以设置较大的alpha(如1.5)和较小的beta(如0.5),强制模型聚焦共性。
    • 如果任务有一定区别但希望融合(如写诗和用典),可能需要更温和的校准,如alpha=1.1, beta=0.9。
    • 必须通过验证集上的多任务性能来网格搜索这些参数。

踩坑记录:初期我尝试对所有层使用相同的校准参数,结果模型失去了所有任务的特性,输出变得平庸。后来改为只对最后3层进行较强校准,对中间层进行微弱校准,效果才好起来。这印证了“不同网络层负责不同抽象级别信息”的认知。

4. 效果验证与多任务性能评估

合并完成之后,不能光靠“感觉”,必须有科学的评估。对于多任务LoRA合并,评估需要兼顾各个方面。

4.1 设计评估基准

你需要为每个原始任务设计一个测试集。例如:

  • 任务A测试集:100条未在训练和校准中出现的古风诗创作指令。
  • 任务B测试集:100条未出现的历史典故问答或解析指令。

评估指标可以包括:

  • 任务特定指标:对于诗歌,可以用韵律检查、意象丰富度(通过关键词提取评估);对于历史问答,可以用答案与标准答案的ROUGE-L或BLEU分数,以及事实准确性(通过LLM-as-a-Judge或检索验证)。
  • 通用文本质量指标:如困惑度(PPL),但需注意PPL低不一定代表内容好。
  • 混合任务测试:设计一些需要同时运用两个领域知识的指令,例如“用一首诗概括秦始皇的功过”。这是检验合并是否成功实现“1+1>2”的关键。

4.2 对比实验设置

为了证明Pico风格校准的有效性,你需要进行对比实验:

  1. 基线模型:原始基座模型。
  2. LoRA A:单独使用古风诗LoRA的模型。
  3. LoRA B:单独使用历史典故LoRA的模型。
  4. 简单合并模型:两个LoRA权重直接相加后的模型。
  5. Pico校准合并模型:使用上述方法校准后合并的模型。

在相同的测试集上,运行所有模型,记录各项指标。一个成功的Pico校准合并应该表现出:

  • 在任务A和任务B各自的测试集上,性能不低于甚至略高于简单合并模型,且尽量接近单一任务LoRA的峰值性能(这是理想情况,通常会有微小损失)。
  • 在混合任务测试集上,性能显著优于简单合并模型,并能展现出跨领域能力。
  • 与基线模型相比,在两个特定任务上都有巨大提升。

4.3 结果分析与问题排查

如果效果不理想,可以按照以下思路排查:

现象可能原因排查方向与解决思路
合并后所有任务性能都大幅下降校准过度,抹杀了所有任务特性;共享子空间维度太低;校准层选择错误。1. 调低alpha,调高beta。
2. 增加PCA的n_components。
3. 尝试在更靠近输入的中间层进行校准。
某个任务性能尚可,另一个任务完全丢失校准数据严重不平衡,导致共享方向被强势任务主导。检查并平衡校准数据集。为弱势任务增加校准数据权重。
混合任务表现无改善共享方向未能捕捉到任务间的关联;任务本身关联性太弱。1. 重新设计校准数据,确保包含能同时体现两个任务特征的样本。
2. 考虑这两个任务是否真的适合合并。有时,训练一个全新的多任务LoRA可能比合并两个单任务LoRA更有效。
模型输出变得奇怪或混乱校准过程中数值不稳定;合并后的权重与基座模型不兼容。1. 检查校准运算中是否有数值溢出或下溢,使用稳定的归一化方法。
2. 尝试较小的学习率缩放因子(如果合并后进行了额外微调)。
3. 考虑使用更稳健的合并方法,如TIES-Merging(先剪枝再合并)中的某些思想与Pico结合。

一个重要的心得:评估时一定要做人工评测。自动指标只能作为参考,尤其是对于创作性任务。让真人去判断生成的诗是否“有古风”,典故用得是否“贴切”,是最终的金标准。我曾遇到一个案例,自动评分很高,但人工一看发现模型只是在生搬硬套模板,缺乏真正的理解。这说明校准过程可能让模型过于偏向“安全”的共享模式,而丧失了创造性。这时就需要调整校准策略,为“特性”保留更多空间。

5. 进阶思考与应用场景延伸

Pico算法带来的启发,远不止于合并两个LoRA。它为我们管理、组合和复用大模型的“技能模块”提供了新视角。

5.1 从合并到“技能库”管理

我们可以想象构建一个“LoRA技能库”。里面存放着训练好的各种技能模块:写代码的、画二次元头像的、翻译法律文书的、讲冷笑话的……当用户提出一个复杂需求时(例如“写一个能生成冷笑话的Python脚本,代码要有注释”),系统可以快速检索并组合“编程”和“冷笑话”两个LoRA。

传统的简单相加在这里会彻底失败。而Pico式的校准思路就至关重要。系统需要动态地分析当前任务请求,识别所需技能的组合,并从技能库中取出对应的LoRA,在“满足当前复合指令”这个共享目标的引导下进行实时校准与合并。这相当于为模型装配上了一个动态的、智能的“技能插拔”系统。

5.2 与模型融合前沿技术的结合

Pico的思想可以与其他先进的模型融合技术结合,产生更强大的效果:

  • 与TIES-Merging结合:TIES-Merging通过剪枝和符号对齐来解决模型合并中的冲突。我们可以先使用TIES方法处理掉权重中方向明显冲突的部分(符号不一致的冗余参数),然后再对剩余的主要权重进行Pico式的输出空间方向校准,实现“先解决矛盾,再优化协同”的两步走策略。
  • 与任务算术结合:任务算术擅长处理“风格”、“情感”等有明确对立方向的任务。对于这类任务,可以先进行任务算术运算(如“幽默感 = 幽默风格 - 严肃风格”),再将得到的“任务向量”视为一个待合并的LoRA,与其他功能性LoRA(如“写作”)用Pico方法进行校准合并,可能更容易控制输出风格。

5.3 在边缘计算与轻量化部署中的潜力

这是我认为非常值得探索的一点。在树莓派Pico、ESP32等资源极其受限的边缘设备上,部署完整的大模型是天方夜谭,但部署一个轻量级的、针对特定场景优化的小模型(或大模型的极简版)是可能的。Pico算法(巧合的是与树莓派Pico同名)的精髓——校准共享方向以高效复用参数——对于边缘设备上的多任务模型设计极具启发性。

例如,一个智能家居中控需要同时处理语音唤醒(任务A)、简单指令理解(任务B)和异常声音检测(任务C)。我们可能没有资源部署三个独立的模型。可以训练三个微小的适配器(类似LoRA),分别针对这三个任务,然后利用Pico的思想,在部署前将它们校准合并到一个极小的基座模型上。这样,一个模型就能以较高的效率同时处理三类任务,最大化利用有限的参数和算力。这里的“共享方向”可能就是“家居环境下的音频特征提取与模式识别”。

最后,我想说的是,Pico算法所代表的“校准输出空间共享方向”的思路,其价值在于它提供了一种原则性的、可解释的多模型组件整合方法。它让我们意识到,合并不仅仅是权重的数学操作,更是对模型所学“知识方向”的梳理与对齐。在实际操作中,完全复现论文可能复杂,但将其核心思想——即通过数据分析寻找任务间的共性结构,并据此指导合并——融入到你的工作流程中,就已经能帮助你避免很多盲目合并带来的坑,更稳健地构建多功能AI应用。

相关新闻

  • LLM 推理性能优化:从显存管理到推理加速的全链路方案
  • 实战!用Python爬取海关总署进出口贸易数据 —— 从反爬突破到数据可视化全流程指南
  • TRAE SOLO模式:模型无关的AI编程指令抽象层

最新新闻

  • 安义县黄金回收靠谱店铺实测排行:2026本地门店实测,规避隐形扣费套路及联系方式推荐 - 前途无量YY
  • 苏州证优达:解码ISO三体系认证专业路径,构建企业高质量发展新引擎,ISO三体系认证专业工作室口碑推荐 - 品牌推荐师
  • 2026高陵县黄金回收铂金回收彩金回收白银回收全攻略:五家实力靠谱门店横向评测附避坑指南及联系方式 - 亦辰小黄鸭
  • 安泽县黄金回收靠谱店铺实测排行:2026本地门店实测,规避隐形扣费套路及联系方式推荐 - 前途无量YY
  • Shellcode免杀实战:对抗360、火绒与Defender的三重防御体系
  • 2026年国内AI搜索优化源头厂商深度评测:谁是企业GEO最佳拍档? - 品牌报告

日新闻

  • Arduino-ESP32项目深度解析:解锁隐藏芯片支持与架构演进
  • 2026年 系统窗厂家/品牌推荐榜单:隔音系统窗+高端系统门窗的核心优势与选购指南 - 品牌发掘
  • NVBench:首个双语非言语发声语音合成评测基准详解与实践

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号