ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

基于LlamaFactory的Qwen2.5法律医疗领域LoRA微调实战指南

基于LlamaFactory的Qwen2.5法律医疗领域LoRA微调实战指南 简介这份资源面向具备深度学习基础、熟悉Python的AI研发与NLP技术人员聚焦如何借助LlamaFactory对Qwen2.5进行高效微调使其适配法律与医疗等垂直领域。内容围绕多模型兼容、LoRA与QLoRA参数高效微调、可视化界面及全流程监控展开覆盖环境搭建、数据收集与预处理、配置文件编写、模型训练、效果评估到服务部署的完整链路并通过法律判断与医疗诊断案例对比微调前后的性能提升。资源包为1个docx文档约39KB以图文形式系统梳理微调思路与配置示例便于读者对照实践。目前已有94人学习。读者可从中掌握低成本、少资源条件下的大模型定制方法理解数据质量与微调参数对效果的影响并获取面向法律咨询、合同审查、医疗辅助诊断等场景的落地参考与评估合规思路。1. 法律与医疗专家模型为什么通用 Qwen2.5 直接上场会翻车很多团队第一次做垂直领域大模型路径都差不多拿一个 Qwen2.5 的通用权重写个系统提示词告诉它“你是一名资深律师”或“你是一名三甲医院主治医师”然后直接上线。前几轮演示看着还行一旦进入真实业务问题就集中爆发——法条引用张冠李戴、医疗建议含糊其辞、专业术语中英混杂、该保守的地方它开始自由发挥。这不是提示词没写好而是通用模型的知识分布和表达习惯跟法律、医疗这两个领域的实际要求差得太远。法律和医疗是典型的“高门槛、强规范、低容错”场景。法律文本讲究条文编号、效力层级、构成要件医疗文本讲究诊断依据、用药禁忌、剂量单位。这些内容在通用语料里占比极低模型没有足够信号去学会。想让 Qwen2.5 真正变成能用的专家模型就得走微调这条路。而 LlamaFactory 把微调的工程复杂度压到了很低——它统一了数据格式、训练流程和适配器管理让一线工程师不用从零写训练循环就能把 LoRA 微调跑起来。这篇笔记面向的是想用 LlamaFactory 对 Qwen2.5 做领域微调的从业者你可能手头有一批法律问答或医疗病历数据想把它变成可复现的训练流程也可能刚接触大模型微调需要一条能照着走通的最小路径。下面从环境、数据、参数到排错按实际落地顺序拆开讲。2. 用 LlamaFactory 跑通 Qwen2.5 微调环境、数据与最小命令2.1 环境准备与 Qwen2.5 权重获取LlamaFactory 对硬件的要求取决于模型规模和微调方式。Qwen2.5 有 0.5B、1.5B、3B、7B、14B、32B、72B 等多个尺寸。做法律或医疗领域微调7B 是性价比比较高的起点单张 24GB 显存的卡用 LoRA 就能跑14B 以上建议多卡或量化。先确认你的 CUDA 版本和 PyTorch 匹配然后装 LlamaFactory。# 建议在独立 conda 环境中操作避免依赖冲突 conda create -n llama_factory python3.10 -y conda activate llama_factory # 安装 LlamaFactory从源码装方便后续改配置 git clone https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip install -e .[torch,metrics] # 验证安装 llamafactory-cli version装完之后Qwen2.5 的权重可以从 Hugging Face 或 ModelScope 拉取。国内网络环境建议用 ModelScope速度更稳。权重目录结构要记清楚后面配置里要填绝对路径。# 以 ModelScope 为例下载 Qwen2.5-7B-Instruct pip install modelscope python -c from modelscope import snapshot_download model_dir snapshot_download(Qwen/Qwen2.5-7B-Instruct) print(model_dir) 这里的关键参数是model_dir它会输出权重落盘的实际路径比如/root/.cache/modelscope/hub/Qwen/Qwen2.5-7B-Instruct。后面在 LlamaFactory 的配置里model_name_or_path就填这个路径。不要填成模型名否则训练启动时会去联网拉取容易卡住。2.2 法律与医疗数据的组织格式LlamaFactory 支持 alpaca 和 sharegpt 两种主流数据格式。法律和医疗场景我一般用 alpaca 格式因为它的instruction / input / output三段结构刚好对应“问题描述 补充背景 标准回答”。比如一条法律数据可以这样组织[ { instruction: 根据《中华人民共和国民法典》相关规定分析下列合同纠纷中违约责任应如何认定。, input: 甲公司与乙公司签订买卖合同约定乙公司于2024年3月1日前交付货物。乙公司因自身原因延迟至3月20日交付导致甲公司生产线停工5天。合同中未约定违约金条款。, output: 本案涉及合同违约责任认定分析如下\n1. 违约事实乙公司未按约定期限交付货物构成迟延履行属于违约行为。\n2. 法律依据《民法典》第五百七十七条规定当事人一方不履行合同义务或者履行合同义务不符合约定的应当承担继续履行、采取补救措施或者赔偿损失等违约责任。\n3. 损失赔偿范围根据第五百八十四条损失赔偿额应当相当于因违约所造成的损失包括合同履行后可以获得的利益但不得超过违约方订立合同时预见到或者应当预见到的因违约可能造成的损失。甲公司生产线停工5天的实际损失属于可预见范围。\n4. 结论乙公司应赔偿甲公司因停工产生的直接经济损失。由于合同未约定违约金甲公司需举证实际损失金额。 } ]医疗数据同理instruction写临床问题input放患者基本信息与检查结果output写结构化的分析意见。数据量方面法律领域我建议至少 2000 到 5000 条高质量样本医疗领域因为容错更低建议 5000 条以上并且要经过执业医师审核。数据质量比数量重要得多一条错误的法律条文或医疗建议可能让模型学会错误的模式。把整理好的数据放到 LlamaFactory 的data目录下然后在dataset_info.json里注册数据集名称。这一步不能省否则训练时找不到数据。{ legal_qa: { file_name: legal_qa.json, columns: { prompt: instruction, query: input, response: output } }, medical_qa: { file_name: medical_qa.json, columns: { prompt: instruction, query: input, response: output } } }columns里的映射关系要跟你的 JSON 字段名完全一致。如果字段名对不上训练会直接报KeyError这是新手最常见的翻车点之一。2.3 LoRA 微调的最小可跑配置LlamaFactory 支持命令行和 WebUI 两种方式。生产环境我推荐用 YAML 配置文件方便版本管理和复现。下面是一份针对 Qwen2.5-7B 做法律领域 LoRA 微调的最小配置# legal_lora_sft.yaml model_name_or_path: /root/.cache/modelscope/hub/Qwen/Qwen2.5-7B-Instruct stage: sft do_train: true finetuning_type: lora lora_target: all dataset: legal_qa template: qwen cutoff_len: 2048 max_samples: 3000 overwrite_cache: true preprocessing_num_workers: 8 output_dir: saves/qwen2.5-7b-legal-lora logging_steps: 10 save_steps: 200 plot_loss: true overwrite_output_dir: true per_device_train_batch_size: 2 gradient_accumulation_steps: 8 learning_rate: 1.0e-4 num_train_epochs: 3.0 lr_scheduler_type: cosine warmup_ratio: 0.1 bf16: true ddp_timeout: 180000000启动训练llamafactory-cli train legal_lora_sft.yaml这份配置里几个参数需要重点解释。lora_target: all表示对所有线性层挂 LoRA 适配器法律和医疗这种知识密集型任务目标层覆盖越全模型吸收领域知识的能力越强代价是显存占用略高。cutoff_len: 2048是单条样本的最大 token 长度法律条文和医疗分析往往较长设太小会截断关键内容设太大则显存吃紧2048 是 7B 模型在 24GB 卡上的平衡点。learning_rate: 1.0e-4是 LoRA 微调的常用起点比全量微调高一个数量级因为 LoRA 只更新低秩矩阵需要更大的步长。gradient_accumulation_steps: 8配合per_device_train_batch_size: 2等效 batch size 是 16显存不够时优先调大累积步数而不是减小 batch size。训练过程中重点看 loss 曲线。如果 loss 在前 100 步就降到 0.5 以下大概率是数据太单一或重复模型在死记硬背如果 loss 震荡剧烈不下降检查学习率是否过大或者数据里有没有大量空 output。正常情况 loss 应该从 2.0 左右平滑下降到 0.8 到 1.2 区间。3. 法律与医疗微调的数据工程从原始卷宗到训练样本3.1 法律数据的清洗与结构化法律领域的原始数据来源通常是裁判文书、法律法规库、律所问答记录。这些数据不能直接拿来训练必须先做结构化。裁判文书里大量内容是当事人信息、审判程序等与法律推理无关的字段需要剥离出来只保留“案情摘要 争议焦点 裁判理由 法律依据”这条主线。我一般用 Python 做一轮预处理把非结构化文本转成 alpaca 格式。下面是一个针对裁判文书的简化清洗脚本import re import json def clean_legal_text(raw_text): 清洗裁判文书提取核心法律推理段落 # 去掉当事人身份证号、详细住址等隐私信息 raw_text re.sub(r\d{17}[\dXx], [身份证号], raw_text) raw_text re.sub(r住址[:].*?。, 住址[已脱敏]。, raw_text) # 按段落切分保留包含法律推理关键词的段落 paragraphs raw_text.split(\n) key_markers [本院认为, 争议焦点, 依照, 判决如下, 法律依据] core_paragraphs [] for para in paragraphs: if any(marker in para for marker in key_markers): core_paragraphs.append(para.strip()) return \n.join(core_paragraphs) def build_legal_sample(case_text, question, answer): 组装单条训练样本 return { instruction: question, input: clean_legal_text(case_text), output: answer } # 示例批量处理 samples [] with open(raw_judgments.jsonl, r, encodingutf-8) as f: for line in f: item json.loads(line) sample build_legal_sample( case_textitem[content], question请分析本案的争议焦点及裁判依据。, answeritem[reasoning] ) samples.append(sample) with open(legal_qa.json, w, encodingutf-8) as f: json.dump(samples, f, ensure_asciiFalse, indent2)这段脚本的核心逻辑是“脱敏 关键段落抽取 格式组装”。脱敏是法律数据的硬性要求身份证号、住址、联系方式必须处理掉否则训练出的模型可能泄露隐私。关键段落抽取依赖key_markers列表不同来源的文书标记词可能不同需要根据实际数据调整。build_legal_sample里的question和answer最好由法律专业人员撰写或审核不要用模型自动生成否则会引入幻觉。3.2 医疗数据的脱敏与术语标准化医疗数据的敏感度比法律更高除了患者身份信息还包括病历号、就诊时间、医院名称等。脱敏之后还要做术语标准化因为同一疾病在不同病历里可能有多种写法比如“2型糖尿病”“II型糖尿病”“T2DM”指的是同一个东西。术语不统一模型学到的知识就是碎片化的。import re # 医学术语标准化映射表实际项目中应覆盖更多条目 TERM_MAP { II型糖尿病: 2型糖尿病, T2DM: 2型糖尿病, 高血压病: 高血压, 原发性高血压: 高血压, 心梗: 心肌梗死, 脑梗: 脑梗死 } def desensitize_medical_text(text): 医疗文本脱敏 # 去除病历号、床号、电话 text re.sub(r病历号[:]\s*\S, 病历号[已脱敏], text) text re.sub(r床号[:]\s*\S, 床号[已脱敏], text) text re.sub(r1[3-9]\d{9}, [手机号], text) # 去除具体日期保留相对时间描述 text re.sub(r\d{4}年\d{1,2}月\d{1,2}日, [日期], text) return text def normalize_terms(text): 术语标准化 for raw, std in TERM_MAP.items(): text text.replace(raw, std) return text def build_medical_sample(record): 组装医疗训练样本 cleaned desensitize_medical_text(record[text]) normalized normalize_terms(cleaned) return { instruction: record[question], input: normalized, output: record[answer] }脱敏用正则表达式处理固定格式的信息术语标准化用映射表替换。TERM_MAP需要根据你的数据来源持续补充建议在项目初期就建立术语表由医学背景的同事维护。build_medical_sample里的answer必须是经过审核的临床意见不能直接拿病历里的初步诊断当标准答案因为初步诊断可能被后续检查推翻。3.3 训练集与验证集的划分策略法律和医疗数据都有一个特点同类样本之间高度相似。比如一百条买卖合同纠纷案情结构几乎一样只是金额和日期不同。如果随机划分训练集和验证集验证集里会出现大量跟训练集雷同的样本导致验证 loss 虚低模型看起来学得很好实际泛化能力很差。我的做法是按“案件类型”或“疾病科室”做分层划分。法律数据按案由分医疗数据按科室分确保验证集里的案件类型或疾病类型在训练集里也有覆盖但具体案情不重复。LlamaFactory 本身不提供分层划分功能需要在数据准备阶段就分好文件。import json from sklearn.model_selection import train_test_split # 假设每条样本带有 case_type 或 department 字段 with open(legal_qa_with_type.json, r, encodingutf-8) as f: data json.load(f) # 按案件类型分层划分验证集占 15% train_data, eval_data train_test_split( data, test_size0.15, stratify[item[case_type] for item in data], random_state42 ) # 去掉辅助字段只保留 alpaca 三列 def strip_meta(item): return { instruction: item[instruction], input: item[input], output: item[output] } with open(legal_train.json, w, encodingutf-8) as f: json.dump([strip_meta(x) for x in train_data], f, ensure_asciiFalse, indent2) with open(legal_eval.json, w, encodingutf-8) as f: json.dump([strip_meta(x) for x in eval_data], f, ensure_asciiFalse, indent2)stratify参数保证每个案件类型在训练集和验证集里的比例一致。random_state42固定随机种子保证每次划分结果可复现。划分完成后在dataset_info.json里注册两个数据集训练配置里dataset填legal_train验证时用eval_dataset: legal_eval。验证集的作用是观察模型是否过拟合如果训练 loss 持续下降但验证 loss 开始上升说明模型在背训练集需要减少 epoch 或增加数据多样性。4. 微调参数怎么调LoRA 秩、学习率与 batch size 的取舍4.1 LoRA 秩和 alpha 的设置逻辑LoRA 的核心思想是在原模型权重旁挂一对低秩矩阵训练时只更新这对矩阵推理时把它们的乘积加回原权重。秩r决定这对矩阵的容量r越大能表达的变化越复杂但参数量和显存占用也越大。法律和医疗领域需要模型吸收大量专业术语和推理模式r不能太小。我的经验值法律领域r16到32医疗领域r32到64。医疗术语更密集、表达更精细需要更大的秩。lora_alpha一般设为r的两倍比如r32时alpha64。lora_dropout设 0.05 到 0.1防止过拟合。在 LlamaFactory 的 YAML 里加上这些参数lora_rank: 32 lora_alpha: 64 lora_dropout: 0.05 lora_target: alllora_target: all表示对所有线性层挂适配器。有些教程建议只挂q_proj和v_proj那是为了省显存。法律和医疗任务我建议挂全因为领域知识不只影响注意力也影响前馈网络。如果显存实在不够优先保留q_proj、k_proj、v_proj、o_proj和gate_proj、up_proj、down_proj。4.2 学习率与调度器的选择LoRA 微调的学习率比全量微调高因为低秩矩阵的梯度尺度不同。Qwen2.5-7B 做 LoRA SFT学习率从1e-4起步如果 loss 下降太慢可以提到2e-4如果 loss 震荡就降到5e-5。调度器用 cosine 比较稳warmup 比例设 0.1让模型在前 10% 的步数里慢慢进入状态。learning_rate: 1.0e-4 lr_scheduler_type: cosine warmup_ratio: 0.1 num_train_epochs: 3.0num_train_epochs设 3 是法律和医疗数据的常见值。数据量少于 2000 条时epoch 可以加到 5但要盯着验证 loss。数据量超过 10000 条时2 个 epoch 可能就够了。不要盲目追求低训练 loss法律和医疗模型宁可保守一点也不要过拟合到编造条文或诊断。4.3 batch size 与梯度累积的显存平衡显存是微调时最现实的约束。Qwen2.5-7B 用 LoRA 微调cutoff_len2048时单卡 24GB 大约能跑per_device_train_batch_size2。想增大等效 batch size就用梯度累积。per_device_train_batch_size: 2 gradient_accumulation_steps: 8等效 batch size per_device_train_batch_size × gradient_accumulation_steps × GPU数量。单卡时是 16。等效 batch size 影响梯度稳定性太小会导致 loss 震荡太大则收敛慢。16 到 32 是比较合适的区间。如果显存报 OOM先降cutoff_len到 1536 或 1024再降 batch size。cutoff_len对显存的影响是平方级的降它比降 batch size 更有效。另外记得开bf16: trueAmpere 架构以上的卡都支持能省显存且训练更稳。如果卡不支持 bf16用fp16: true但要注意 fp16 容易梯度溢出需要配合fp16_opt_level之类的设置。5. 微调后的验证与部署怎么判断模型真的能用5.1 用领域测试集做人工评估训练 loss 和验证 loss 只能说明模型在拟合数据不能说明它在真实业务里能用。法律和医疗模型必须过人工评估这一关。我的做法是准备一个 100 到 200 条的领域测试集覆盖高频场景和边界情况让领域专家逐条打分。评估维度包括事实准确性法条引用是否正确、诊断依据是否成立、推理完整性是否覆盖关键构成要件、表达规范性术语是否标准、格式是否合规、安全性是否有不当建议或幻觉。每条按 1 到 5 分打分平均分低于 4 分的模型不建议上线。LlamaFactory 提供了批量推理功能可以把测试集喂进去生成回答再导出给专家评审llamafactory-cli chat \ --model_name_or_path /root/.cache/modelscope/hub/Qwen/Qwen2.5-7B-Instruct \ --adapter_name_or_path saves/qwen2.5-7b-legal-lora \ --template qwen \ --finetuning_type lora这是交互式对话模式适合抽查。批量评估可以写个脚本调用推理接口把测试集的instruction和input拼成 prompt收集output后跟标准答案对比。5.2 适配器合并与推理部署LoRA 训练出来的是适配器权重推理时需要跟基础模型一起加载。LlamaFactory 支持把适配器合并回基础模型生成一个完整的权重目录方便用 vLLM 或其他推理框架部署。llamafactory-cli export \ --model_name_or_path /root/.cache/modelscope/hub/Qwen/Qwen2.5-7B-Instruct \ --adapter_name_or_path saves/qwen2.5-7b-legal-lora \ --template qwen \ --finetuning_type lora \ --export_dir saves/qwen2.5-7b-legal-merged \ --export_size 2 \ --export_legacy_format falseexport_dir是合并后的权重输出目录。export_size是分片大小2 表示每片 2GB方便传输和加载。合并后的模型可以直接用 transformers 加载也可以用 vLLM 做高并发推理。注意合并后的模型体积跟基础模型一样大7B 的 bf16 权重大约 15GB部署时要算好显存。如果不想合并也可以在推理时动态加载适配器LlamaFactory 和 vLLM 都支持。动态加载的好处是基础模型共享多个领域的适配器可以热切换坏处是推理时多一层计算延迟略高。生产环境我一般选合并稳定优先。6. 避坑与排查法律医疗微调里最容易翻车的五件事6.1 数据里混入模型生成的伪标签现象训练 loss 降得很快但模型回答开始出现固定句式遇到没见过的案情也套用同一套话术。原因数据准备阶段为了省事用通用模型批量生成了部分output这些伪标签带有通用模型的表达习惯和幻觉被微调模型学去了。解决法律和医疗数据的output必须由人工撰写或审核。如果确实要用模型辅助只能用来做初稿且必须经过领域专家逐条修改。检查方法很简单从训练集里随机抽 50 条看output里有没有“根据我的了解”“一般来说”这类通用模型的模糊表达。6.2 cutoff_len 设太小导致关键信息被截断现象模型在训练集上表现正常但推理时遇到长条文或长病历就答非所问。原因cutoff_len设成了 512 或 1024而法律条文和医疗分析经常超过这个长度训练时后半段被截掉模型没学到完整推理链。解决统计训练数据里instruction input output的 token 长度分布取 95 分位数作为cutoff_len。法律和医疗数据我一般设 2048如果显存不够就设 1536但不要低于 1024。截断发生在 tokenizer 阶段可以在预处理时打印长度直方图确认。6.3 验证集跟训练集同源导致评估虚高现象验证 loss 很低但人工评估时模型在真实问题上表现很差。原因训练集和验证集是从同一批相似数据里随机切的验证集样本跟训练集高度雷同模型相当于在“背答案”。解决按案件类型或疾病科室做分层划分确保验证集里的具体案情在训练集里没出现过。更严格的做法是留出一个完整的时间段或来源的数据做验证比如用 2024 年的裁判文书做验证2023 年及以前的做训练。6.4 LoRA 秩设太小导致领域知识学不进去现象训练 loss 降到一定程度就下不去了模型回答仍然带有通用模型的泛化风格专业术语使用不准确。原因lora_rank设成了 4 或 8低秩矩阵容量不够无法表达法律和医疗领域的复杂知识。解决法律领域r至少 16医疗领域至少 32。如果显存允许直接上 64。调大r后记得同步调大lora_alpha保持alpha 2r的比例。调大后重新训练观察 loss 是否能降到更低水平。6.5 推理时 template 跟训练时不一致现象合并后的模型推理时输出格式混乱或者回答里出现奇怪的标记符号。原因训练时用了template: qwen推理时忘了指定或者用了默认模板导致 prompt 格式跟训练时不一致。Qwen2.5 有特定的对话模板训练和推理必须严格对齐。解决训练配置和推理命令里的template必须一致。LlamaFactory 的chat和export命令都要显式指定--template qwen。如果用的是合并后的模型在 transformers 里加载时也要用对应的 chat template不要手动拼 prompt。7. 让法律医疗模型更稳的一个技巧用拒绝采样筛训练数据微调做到后面你会发现模型能不能用八成取决于数据质量两成取决于参数。法律和医疗领域尤其如此一条错误的法条引用或医疗建议足以让整个模型的可信度崩塌。我现在的习惯是在正式训练之前先做一轮拒绝采样把训练数据里质量不达标的样本筛掉。具体做法是用基础 Qwen2.5 模型对每条训练样本的instruction input生成一个回答然后跟人工撰写的output做对比。如果基础模型的回答跟标准答案在关键事实上一致说明这条样本的难度不够模型已经会了可以降低权重或剔除如果基础模型的回答错得离谱说明这条样本包含模型完全没掌握的知识是训练的重点保留并适当增加同类样本如果基础模型的回答跟标准答案部分重合、部分偏离这种样本最有价值因为模型处在“半懂不懂”的状态微调能把它拉过来。from transformers import AutoModelForCausalLM, AutoTokenizer import json model_path /root/.cache/modelscope/hub/Qwen/Qwen2.5-7B-Instruct tokenizer AutoTokenizer.from_pretrained(model_path, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained( model_path, device_mapauto, trust_remote_codeTrue ) def generate_answer(instruction, input_text): prompt f### 指令\n{instruction}\n\n### 输入\n{input_text}\n\n### 回答\n inputs tokenizer(prompt, return_tensorspt).to(model.device) outputs model.generate(**inputs, max_new_tokens512, do_sampleFalse) return tokenizer.decode(outputs[0], skip_special_tokensTrue) def score_sample(sample): 用基础模型生成回答跟标准答案做粗略对比 base_answer generate_answer(sample[instruction], sample[input]) # 实际项目中应该用领域专家或更精细的指标来打分 # 这里用关键词重合度做示意 gold_keywords set(sample[output][:200].split()) base_keywords set(base_answer.split()) overlap len(gold_keywords base_keywords) / max(len(gold_keywords), 1) return overlap with open(legal_train.json, r, encodingutf-8) as f: data json.load(f) scored [(item, score_sample(item)) for item in data] # 保留重合度在 0.3 到 0.7 之间的样本这些是模型最需要学的 filtered [item for item, score in scored if 0.3 score 0.7] with open(legal_train_filtered.json, w, encodingutf-8) as f: json.dump(filtered, f, ensure_asciiFalse, indent2)这段脚本里score_sample用关键词重合度做示意实际项目中应该用更可靠的指标比如让领域专家对基础模型的回答打分或者用专门的评估模型。0.3到0.7这个区间是经验值重合度太低说明样本太难模型可能学不会太高说明样本太简单训练收益低。筛完之后数据量会减少但训练效率会明显提升。我踩过的一个血泪教训是早期做医疗微调时为了凑数据量把大量基础模型已经能答对的简单问答也塞进训练集结果模型在简单问题上过拟合遇到复杂病例反而退化了。后来坚持做拒绝采样数据量砍掉一半但人工评估的准确率反而上去了。这个习惯我一直保留到现在每次微调前都会先跑一轮筛选宁可数据少一点也要保证每条样本都在模型的“学习区”里。希望帮到你。本文还有配套的精品资源点击获取
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表