首页 / 资讯中心 / 文章详情

影刀RPA深度实战:大模型Fine-tuning定制RPA专用Prompt与指令生成

影刀RPA深度实战:大模型Fine-tuning定制RPA专用Prompt与指令生成 ★ FEATURED ARTICLE
影刀RPA深度实战大模型Fine-tuning定制RPA专用Prompt与指令生成一、技术背景大模型LLM在通用场景下表现强大但当我们将 GPT-4 或 Qwen 直接用于生成影刀RPA操作指令和 XPath 定位时准确率通常只有 40%-60%。原因有三影刀RPA有独有的指令体系与其他 RPA 工具如 UiPath、影刀的指令选型逻辑不同模型没有见过足够的影刀格式样本。XPath 生成依赖页面 DOM 上下文通用模型不了解国内企业常用系统金蝶、用友、钉钉后台等的 DOM 结构特征。操作序列规划是领域特定任务先点击新建按钮再填写表单最后提交审核这种结构化输出需要模型理解 RPA 执行流程的约束。我的解决方案用LoRA 微调让开源大模型Qwen2.5-7B成为影刀RPA专用模型。二、为什么与RPA结合RPA 开发中最耗时的环节是什么不是流程设计而是反复调整元素选择器和操作步骤。一个登录流程可能需要试 3-5 次 XPath 才能稳定定位到按钮。当流程数量从几十个扩展到几百个这个时间成本是指数级的。微调后的模型可以直接输入打开金蝶ERP的采购订单页面找到今日待审核列表→ 输出准确的影刀指令序列 稳定的 XPath将 RPA 开发效率提升 3-5 倍新人无需记忆几百个指令的差异用自然语言描述即可三、具体落地方法第一步数据收集200 条高质量样本我在项目中收集了三类数据数据类型数量来源影刀指令映射对80 条手动标注已有流程XPath 生成样本70 条各系统页面 DOM 分析操作序列规划50 条真实业务流程拆解每条数据的格式{instruction:在金蝶云星空ERP系统中打开采购管理模块点击新增采购订单,input:当前页面URL: https://erp.example.com/home, 系统类型: 金蝶云星空,output:【步骤1】使用指令: 点击元素, XPath: //a[contains(class,menu-item) and contains(text(),采购管理)]\n【步骤2】使用指令: 点击元素, XPath: //button[idnew-purchase-order or contains(text(),新增)]\n【步骤3】使用指令: 等待页面加载, 等待条件: 元素可见 //form[idpo-form]}第二步数据预处理脚本# data_preprocess.py - 数据预处理与格式转换# 依赖安装: pip install datasets transformers pyarrowimportjsonimportosfromdatasetsimportDataset,DatasetDict# 1. 读取原始标注数据defload_raw_data(data_dir:str)-list: 从目录中加载所有 JSON 标注文件 每个文件是一个对话对 {instruction: ..., input: ..., output: ...} samples[]forfnameinos.listdir(data_dir):iffname.endswith(.json):withopen(os.path.join(data_dir,fname),r,encodingutf-8)asf:datajson.load(f)# 合并 instruction 和 input 作为模型输入samples.append({instruction:data[instruction],input:data[input],output:data[output]})print(f共加载{len(samples)}条样本)returnsamples# 2. 构建 Alpaca 格式的 Prompt 模板defformat_alpaca_prompt(instruction:str,input_text:str,output:strNone)-str: 使用 Alpaca 指令模板格式化数据 这是微调 Qwen/ChatGLM 等模型的标准格式 ifinput_text:promptf|im_start|system 你是一个影刀RPA指令生成专家。根据用户描述的自然语言需求生成准确的影刀RPA操作指令序列和XPath定位表达式。 |im_end| |im_start|user{instruction}上下文信息:{input_text}|im_end| |im_start|assistant{outputifoutputelse}else:promptf|im_start|system 你是一个影刀RPA指令生成专家。根据用户描述的自然语言需求生成准确的影刀RPA操作指令序列和XPath定位表达式。 |im_end| |im_start|user{instruction}|im_end| |im_start|assistant{outputifoutputelse}returnprompt# 3. 转换为 HuggingFace Dataset 格式defcreate_dataset(samples:list)-DatasetDict:将样本列表转换为训练/验证集 (8:2 分割)formatted[]forsinsamples:textformat_alpaca_prompt(s[instruction],s[input],s[output])formatted.append({text:text})# 创建 Dataset 对象datasetDataset.from_list(formatted)# 按 8:2 分割训练集和验证集splitdataset.train_test_split(test_size0.2,seed42)returnDatasetDict({train:split[train],validation:split[test]})# 4. 执行预处理if__name____main__:# 修改为你的数据目录路径data_dir./rpa_training_datasamplesload_raw_data(data_dir)# 数据质量检查确保每条数据都有必要字段valid_samples[]forsinsamples:iflen(s[output])20:# 排除过短的无效输出valid_samples.append(s)print(f有效样本数:{len(valid_samples)}/{len(samples)})dataset_dictcreate_dataset(valid_samples)# 保存为 Arrow 格式供训练脚本读取dataset_dict.save_to_disk(./rpa_finetune_dataset)print(数据集已保存到 ./rpa_finetune_dataset)第三步LoRA 微调训练脚本# train_lora.py - Qwen2.5-7B LoRA微调脚本# 依赖安装:# pip install transformers datasets peft accelerate bitsandbytes torch# 硬件要求: 单卡 A100-40G 或 RTX 4090-24G (使用 4bit 量化后仅需 ~12G 显存)importtorchfromtransformersimport(AutoModelForCausalLM,AutoTokenizer,TrainingArguments,Trainer,BitsAndBytesConfig,DataCollatorForLanguageModeling)frompeftimportLoraConfig,get_peft_model,TaskType,prepare_model_for_kbit_trainingfromdatasetsimportload_from_disk# 超参数配置 MODEL_NAMEQwen/Qwen2.5-7B-Instruct# 基座模型OUTPUT_DIR./rpa-lora-qwenLORA_R8# LoRA秩越大模型容量越大但更容易过拟合LORA_ALPHA16# LoRA缩放因子通常设为 r 的 2 倍LORA_DROPOUT0.05# Dropout 防止过拟合BATCH_SIZE4GRAD_ACCUM4# 梯度累积步数等效于 batch_size16LEARNING_RATE2e-4NUM_EPOCHS3MAX_LENGTH2048# 1. 加载数据集 datasetload_from_disk(./rpa_finetune_dataset)# 使用预处理脚本的输出print(f训练集:{len(dataset[train])}条, 验证集:{len(dataset[validation])}条)# 2. 加载 Tokenizer tokenizerAutoTokenizer.from_pretrained(MODEL_NAME,trust_remote_codeTrue)# Qwen 的 tokenizer 需要设置 pad_tokentokenizer.pad_tokentokenizer.eos_token tokenizer.padding_siderightdeftokenize_function(examples):将文本分词并填充到固定长度resulttokenizer(examples[text],truncationTrue,max_lengthMAX_LENGTH,paddingmax_length,)# labels 设为 input_ids模型会自回归学习result[labels]result[input_ids].copy()returnresult# 对数据集进行分词tokenized_datasetdataset.map(tokenize_function,batchedTrue,remove_columns[text])print(f分词完成每条样本长度:{MAX_LENGTH})# 3. 配置 4bit 量化 (降低显存占用) # 这是关键步骤7B 模型全量微调需要 ~60G 显存4bit 量化后仅需 ~12Gbnb_configBitsAndBytesConfig(load_in_4bitTrue,# 启用 4bit 量化bnb_4bit_compute_dtypetorch.float16,# 计算时使用 float16bnb_4bit_use_double_quantTrue,# 双重量化进一步节省显存bnb_4bit_quant_typenf4# 使用 NF4 量化类型)# 4. 加载模型 modelAutoModelForCausalLM.from_pretrained(MODEL_NAME,quantization_configbnb_config,# 传入量化配置device_mapauto,# 自动分配设备trust_remote_codeTrue,torch_dtypetorch.float16)# 准备模型进行 k-bit 训练冻结量化参数modelprepare_model_for_kbit_training(model)# 5. 配置 LoRA # LoRA 的核心思想只训练少量低秩矩阵不更新原始权重# 参数量约为原始模型的 0.1%-1%但效果接近全量微调lora_configLoraConfig(rLORA_R,# LoRA 秩lora_alphaLORA_ALPHA,# 缩放因子target_modules[q_proj,k_proj,v_proj,o_proj,gate_proj,up_proj,down_proj],# Qwen 的注意力层 FFN 层lora_dropoutLORA_DROPOUT,# Dropout 比率biasnone,# 不训练 biastask_typeTaskType.CAUSAL_LM# 因果语言模型任务)modelget_peft_model(model,lora_config)# 打印可训练参数占比trainable_paramssum(p.numel()forpinmodel.parameters()ifp.requires_grad)total_paramssum(p.numel()forpinmodel.parameters())print(f可训练参数:{trainable_params:,}/{total_params:,}{100*trainable_params/total_params:.2f}%)# 6. 配置训练参数 training_argsTrainingArguments(output_dirOUTPUT_DIR,per_device_train_batch_sizeBATCH_SIZE,gradient_accumulation_stepsGRAD_ACCUM,learning_rateLEARNING_RATE,num_train_epochsNUM_EPOCHS,logging_steps10,# 每 10 步输出日志save_steps50,# 每 50 步保存检查点evaluation_strategysteps,eval_steps50,save_total_limit3,# 只保留最近 3 个检查点fp16True,# 混合精度训练加速warmup_ratio0.03,# 预热步数比例lr_scheduler_typecosine,# 余弦学习率衰减report_totensorboard,# TensorBoard 可视化load_best_model_at_endTrue,# 训练结束加载最优模型metric_for_best_modeleval_loss,)# 7. 数据整理器 data_collatorDataCollatorForLanguageModeling(tokenizertokenizer,mlmFalse# 不使用 Masked Language Modeling使用因果语言建模)# 8. 启动训练 trainerTrainer(modelmodel,argstraining_args,train_datasettokenized_dataset[train],eval_datasettokenized_dataset[validation],data_collatordata_collator,)print(开始训练...)trainer.train()# 9. 保存模型 # 保存 LoRA 适配器权重 (不大通常只有几十MB)model.save_pretrained(OUTPUT_DIR/final)tokenizer.save_pretrained(OUTPUT_DIR/final)print(fLoRA 模型已保存至{OUTPUT_DIR}/final)# 10. 推理测试 defgenerate_rpa_instruction(model,tokenizer,prompt:str,max_new_tokens:int512):使用微调后的模型生成 RPA 指令formattedf|im_start|system\n你是一个影刀RPA指令生成专家。|im_end|\n|im_start|user\n{prompt}|im_end|\n|im_start|assistant\ninputstokenizer(formatted,return_tensorspt).to(model.device)outputsmodel.generate(**inputs,max_new_tokensmax_new_tokens,temperature0.3,# 低温度保证生成稳定性do_sampleFalse,# 贪心解码确保输出确定pad_token_idtokenizer.eos_token_id)responsetokenizer.decode(outputs[0],skip_special_tokensTrue)# 提取 assistant 部分ifassistantinresponse:responseresponse.split(assistant)[-1].strip()returnresponse# 测试示例test_prompt在钉钉管理后台的考勤管理页面导出本月所有员工的考勤明细报表resultgenerate_rpa_instruction(model,tokenizer,test_prompt)print(f\n 生成结果 \n{result})第四步准确率对比微调前后在 50 条未见过的测试样本上的表现指标微调前 (Qwen2.5-7B 原版)微调后 (LoRA)提升指令选型准确率47.3%86.2%38.9%XPath 有效性35.8%79.5%43.7%操作序列合理性52.1%88.6%36.5%综合可用率41.2%82.4%41.2%数据来源我在项目中实际测试的 50 个真实业务流程场景。四、我在实践中的思考探索这个方向时我的一个深刻体会是数据质量远大于数据数量。前两轮微调我用的是自动生成的数据从文档中提取指令描述准确率只提了 15% 左右。第三轮换成人工标注的 200 条真实案例后效果直接跃升。还有一个容易被忽略的点System Prompt 的设计。在 Alpaca 格式中system 部分一定要明确描述输出格式约束。我最初写的是你是RPA专家换成你是影刀RPA指令生成专家输出格式为【步骤N】使用指令xxx, XPathxxx后输出稳定了很多。五、常见问题速查Q1: 显存不足 (CUDA Out of Memory)现象: 训练开始后抛出 OOM 错误原因: 7B 全量微调需要约 60G 显存解决:确认load_in_4bitTrue已启用 4bit 量化减小BATCH_SIZE到 1-2增大GRAD_ACCUM到 8-16等效批次不变设置MAX_LENGTH1024缩短序列长度Q2: 训练 Loss 不下降现象: 训练 100 步后 loss 仍在 2.0 以上原因: 学习率设置不当或数据格式错误解决:检查 tokenizer 的pad_token是否设置Qwen 需要手动设置尝试增大LEARNING_RATE到 5e-4检查数据中output字段是否为空Q3: 生成结果胡言乱语现象: 模型输出与 RPA 完全无关的内容原因: 训练数据中混入了通用对话数据解决: 清洗数据集确保所有样本的 output 都包含 RPA 相关术语指令/XPath/元素/页面等关键词Q4: 模型对未见过系统的 XPath 生成不准现象: 训练数据是金蝶系统测试用友系统时 XPath 全错原因: LoRA 学习的是 DOM 结构模式跨系统的泛化需要多样性数据解决: 训练数据中至少包含 3-5 种不同系统的样本增加input字段中的 DOM 上下文多样性Q5: 推理速度太慢现象: 生成一条指令需要 10 秒原因: 7B 模型推理需求较大解决:使用 vLLM 或 llama.cpp 加速推理对于简单任务如仅生成XPath换用 Qwen2.5-1.5B 微调启用 FlashAttention-2pip install flash-attnQ6: LoRA 权重无法加载到原模型现象:from_pretrained报错 key mismatch原因:target_modules配置与实际模型层名不匹配解决: 打印model.state_dict().keys()确认实际的层名称不同基座模型的 attention 层名不同如 ChatGLM 用query_key_valueQwen 用q_proj/k_proj/v_proj六、推荐资源Qwen 官方微调文档: https://github.com/QwenLM/Qwen查最新的模型版本和微调示例PEFT 库文档: https://huggingface.co/docs/peftLoRA/QLoRA 的详细参数说明BitsAndBytes 量化指南: https://huggingface.co/docs/bitsandbytes4bit/8bit 量化的最新用法影刀RPA开放平台: 用于获取最终指令格式的官方参考七、内容标签#影刀RPA#大模型微调#LoRA#Qwen#XPath生成#指令微调#RPAAI#自动化开发作者林焱
阅读完成 · 觉得有帮助?
咨询建站