尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

领域自适应预训练实战:让大语言模型掌握专业领域推理能力

领域自适应预训练实战:让大语言模型掌握专业领域推理能力 在实际项目中我们常常遇到这样的困境一个通用的大型语言模型LLM在特定领域如医疗、法律、金融或企业内部知识库上表现不佳回答要么过于宽泛要么缺乏专业深度甚至出现“幻觉”。微调Fine-tuning虽然能调整模型的行为但其本质更像是在模型已有的知识基础上进行“指令对齐”或“风格调整”对于模型“知识结构”本身的改变有限。当我们需要模型从根本上理解一个全新的、包含大量专业术语和逻辑关系的领域时继续预训练Continued Pretraining或领域自适应预训练Domain-Adaptive Pretraining, DAPT便成为一项关键技术。本文旨在为开发者提供一个完整的实践指南讲解如何通过继续预训练让一个本地部署的LLM例如Llama 2、Qwen、ChatGLM等开源模型学会对一个全新领域进行“推理”。这里的“推理”不仅指回答问题更指模型能够像领域专家一样理解该领域的实体关系、逻辑链条和隐含规则。我们将从核心概念讲起逐步完成环境准备、数据构建、训练配置、模型训练、效果评估以及生产部署的全流程并重点剖析其中的关键参数、常见陷阱和排查路径。无论你是希望构建一个专业的法律咨询助手还是一个深度的技术文档分析工具本文提供的思路和步骤都将为你打下坚实的基础。1. 理解继续预训练为何以及何时需要它在深入实操之前我们必须厘清继续预训练与微调Fine-tuning的本质区别这是选择正确技术路径的前提。1.1 预训练、继续预训练与微调概念辨析预训练Pretraining是模型从零开始学习的阶段。模型在海量、无标注的通用文本如网页、书籍、代码上通过自回归如GPT系列或掩码语言建模如BERT系列等任务学习语言的统计规律、世界知识和基础推理能力。这个过程计算成本极高通常由大型机构完成。继续预训练Continued Pretraining有时也称为领域自适应预训练是在一个已经预训练好的通用模型基础上使用特定领域的大量无标注文本继续进行预训练任务。其核心目标是让模型“吸收”新领域的知识、术语和表达方式更新其参数以适应新的数据分布。这相当于让一个通才在某个专业领域进行“深造”扩充其知识库。指令微调Instruction Tuning或监督微调Supervised Fine-Tuning, SFT则是在预训练或继续预训练之后使用高质量的指令-回答对有标注数据来调整模型使其学会遵循人类指令、以特定格式如对话进行回应。这更像是“行为训练”教会模型如何使用其已有的知识。下表清晰地对比了三者的关键差异阶段数据形式训练目标主要作用类比预训练海量无标注通用文本语言建模预测下一个词/掩码词构建基础语言能力和世界知识通识教育继续预训练大量无标注领域文本语言建模同上吸收领域知识调整模型参数分布专业深造指令微调高质量指令-回答对序列到序列生成最小化回答损失对齐人类偏好学会任务格式岗前培训1.2 何时选择继续预训练继续预训练并非万能钥匙它适用于以下典型场景领域知识高度专业化且稀缺目标领域如特定行业的专利文档、内部技术规范的术语、概念和逻辑关系在通用语料中极少出现。需要模型进行深度推理任务不仅要求模型检索知识更要求其能基于领域内的复杂规则进行逻辑链推导如根据法律条文推断案件结果。基础模型表现“知识匮乏”在对领域相关问题的零样本Zero-shot或小样本Few-shot测试中模型频繁出现事实性错误或无法理解核心概念。拥有大量领域无标注文本这是进行有效继续预训练的前提通常需要GB甚至TB级别的领域文本。相反如果你的目标只是让模型以某种风格如客服口吻回答问题或者执行格式固定的任务如情感分类、实体识别那么指令微调或提示工程Prompt Engineering可能是更高效的选择。2. 环境准备与项目结构规划进行继续预训练需要较强的算力支持通常需要多卡GPU和相应的软件栈。我们将基于 Hugging Facetransformers和accelerate库进行这是目前最主流和灵活的方案。2.1 硬件与软件环境要求硬件建议GPU: 至少一张显存 24GB 的 GPU如 RTX 4090, A100 40G。显存越大能训练的模型越大批次Batch Size也可以设置得更大训练更稳定高效。多卡并行可以显著加速训练。内存: 系统内存建议 64GB用于高效处理训练数据。存储: 准备足够的SSD空间存放原始语料、处理后的数据集、模型检查点和日志。软件环境我们使用 Conda 创建一个独立的 Python 环境。# 创建并激活环境 conda create -n llm_cpt python3.10 conda activate llm_cpt # 安装核心深度学习库 (请根据你的CUDA版本选择对应的pytorch安装命令) # 例如对于 CUDA 11.8 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 安装 Hugging Face 生态系统核心库 pip install transformers datasets accelerate peft bitsandbytes pip install tensorboard # 用于可视化训练过程 pip install scikit-learn # 用于后续评估 # 安装训练效率工具 (可选但推荐) pip install deepspeed # 用于多卡和超大模型的高效训练2.2 项目目录结构规划一个清晰的项目结构有助于管理复杂的训练流程。建议按如下方式组织llm_domain_pretrain/ ├── configs/ # 存放训练配置文件 │ ├── train_config.yaml # 主要训练超参数 │ └── model_config.json # 模型结构配置如从预训练模型加载 ├── data/ # 数据目录 │ ├── raw/ # 原始领域文本.txt, .pdf, .md等 │ ├── processed/ # 清洗、格式化后的纯文本文件 │ └── dataset/ # Hugging Face Dataset 格式的数据集 ├── scripts/ # 各类脚本 │ ├── preprocess.py # 数据预处理脚本 │ ├── train.py # 主训练脚本 │ ├── evaluate.py # 评估脚本 │ └── merge_lora.py # 如果使用LoRA合并权重脚本 ├── outputs/ # 训练输出 │ ├── checkpoint-1000/ # 模型检查点 │ ├── logs/ # 训练日志 │ └── final_model/ # 最终模型 ├── requirements.txt # 项目依赖 └── README.md # 项目说明3. 领域数据构建从原始资料到训练集数据质量直接决定继续预训练的效果。目标是构建一个大规模、高质量、格式统一的领域文本数据集。3.1 数据收集与清洗收集源数据将你的领域资料PDF、Word、HTML、Markdown、数据库导出文本放入data/raw/目录。文本提取与清洗编写scripts/preprocess.py核心任务包括格式转换使用pdfplumber、pypandoc等库提取纯文本。噪音去除移除页眉页脚、无关链接、乱码、特殊字符保留必要的标点。文本规范化统一换行符、空格将全角字符转为半角。语言过滤如需要确保文本为目标语言。长文本分割LLM有上下文长度限制如4096 tokens。需要将长文档按语义如章节、段落或固定长度如2048字符进行分割并保留少量重叠以避免切断完整语义。# scripts/preprocess.py 示例片段 import os import re from pathlib import Path def clean_text(text: str) - str: 基础文本清洗函数 # 移除多余的空格和换行 text re.sub(r\s, , text) # 移除不可见控制字符保留换行符\n和制表符\t text re.sub(r[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\x9f], , text) # 其他自定义清洗规则... return text.strip() def split_long_text(text: str, max_len: int 2000, overlap: int 100) - list: 按固定长度分割文本带重叠 chunks [] start 0 text_length len(text) while start text_length: end start max_len chunk text[start:end] # 尝试在句子边界处截断可选优化 if end text_length: last_period chunk.rfind(. ) if last_period ! -1 and last_period max_len * 0.5: # 避免在太短处截断 end start last_period 1 chunk text[start:end] chunks.append(chunk) start end - overlap # 设置重叠避免切分点破坏语义 return chunks # 遍历 raw 目录处理所有文件 raw_dir Path(./data/raw) processed_dir Path(./data/processed) processed_dir.mkdir(parentsTrue, exist_okTrue) for file_path in raw_dir.glob(**/*.txt): # 示例处理txt with open(file_path, r, encodingutf-8) as f: raw_text f.read() cleaned_text clean_text(raw_text) chunks split_long_text(cleaned_text) for i, chunk in enumerate(chunks): output_file processed_dir / f{file_path.stem}_chunk{i:04d}.txt with open(output_file, w, encodingutf-8) as f_out: f_out.write(chunk)3.2 构建 Hugging Face Dataset将清洗分割后的文本文件转换为datasets库能高效加载的格式。# 继续 scripts/preprocess.py from datasets import Dataset, DatasetDict import glob def create_dataset_from_text_files(text_dir: str): 从文本文件创建dataset text_files glob.glob(f{text_dir}/*.txt) data [] for file in text_files: with open(file, r, encodingutf-8) as f: text f.read().strip() if text: # 忽略空文件 data.append({text: text}) dataset Dataset.from_list(data) return dataset processed_dataset create_dataset_from_text_files(./data/processed) # 可以按比例划分训练集和验证集验证集用于监控训练过程中的语言模型困惑度 split_dataset processed_dataset.train_test_split(test_size0.02, seed42) # 2% 作为验证集 split_dataset.save_to_disk(./data/dataset)4. 配置与启动继续预训练我们将使用transformers的TrainerAPI 配合accelerate进行训练。为了在有限资源下训练大模型参数高效微调技术如 LoRA 是常见选择但在继续预训练场景下如果目标是让模型充分学习领域知识全参数训练Full-parameter Training通常是更有效的尽管成本更高。以下我们将展示全参数训练和结合LoRA的两种配置思路。4.1 训练配置详解首先创建一个配置文件configs/train_config.yaml# configs/train_config.yaml model_name_or_path: meta-llama/Llama-2-7b-hf # 基础模型需提前在Hugging Face上同意协议并获取访问令牌 dataset_path: ./data/dataset output_dir: ./outputs/final_model logging_dir: ./outputs/logs # 训练超参数 num_train_epochs: 3 per_device_train_batch_size: 4 # 根据GPU显存调整 per_device_eval_batch_size: 4 gradient_accumulation_steps: 8 # 模拟更大的全局批次大小 batch_size * steps * num_gpus warmup_steps: 500 learning_rate: 1e-4 # 继续预训练的学习率通常比微调更小 weight_decay: 0.01 lr_scheduler_type: cosine optim: adamw_8bit # 使用8-bit Adam优化器节省显存 # 模型与Tokenizer配置 use_fast_tokenizer: true model_max_length: 4096 # 与模型上下文窗口及数据长度匹配 padding: false # 对于因果语言模型通常使用动态padding在collator中处理 # 训练策略 save_strategy: steps save_steps: 1000 evaluation_strategy: steps eval_steps: 500 logging_steps: 100 load_best_model_at_end: true metric_for_best_model: eval_loss # 选择验证集损失最低的模型 # 精度与性能 fp16: true # 或 bf16true (如果GPU支持) gradient_checkpointing: true # 用时间换空间节省显存4.2 编写主训练脚本创建scripts/train.py。关键步骤包括加载模型和分词器、准备数据整理器、配置训练参数。# scripts/train.py import os import yaml from transformers import ( AutoModelForCausalLM, AutoTokenizer, Trainer, TrainingArguments, DataCollatorForLanguageModeling ) from datasets import load_from_disk import torch def load_config(config_path): with open(config_path, r) as f: config yaml.safe_load(f) return config def main(): config load_config(./configs/train_config.yaml) # 1. 加载模型和分词器 print(Loading model and tokenizer...) tokenizer AutoTokenizer.from_pretrained(config[model_name_or_path], use_fastconfig.get(use_fast_tokenizer, True)) # 设置pad_token如果模型没有的话如LLaMA if tokenizer.pad_token is None: tokenizer.pad_token tokenizer.eos_token model AutoModelForCausalLM.from_pretrained( config[model_name_or_path], torch_dtypetorch.float16 if config.get(fp16, False) else torch.float32, use_cacheFalse if config.get(gradient_checkpointing, False) else True, # gradient_checkpointing与use_cache冲突 trust_remote_codeTrue # 对于一些自定义模型可能需要 ) model.resize_token_embeddings(len(tokenizer)) # 通常不需要除非修改了词表 # 2. 加载数据集 print(Loading dataset...) dataset load_from_disk(config[dataset_path]) train_dataset dataset[train] eval_dataset dataset[test] if test in dataset else None # 3. 定义Tokenization函数 def tokenize_function(examples): # 因果语言模型预训练直接对文本进行tokenize return tokenizer(examples[text], truncationTrue, max_lengthconfig[model_max_length]) print(Tokenizing dataset...) tokenized_train_dataset train_dataset.map(tokenize_function, batchedTrue, remove_columns[text]) if eval_dataset is not None: tokenized_eval_dataset eval_dataset.map(tokenize_function, batchedTrue, remove_columns[text]) else: tokenized_eval_dataset None # 4. 创建数据整理器 (DataCollator) # 对于因果LM使用DataCollatorForLanguageModeling并设置mlmFalse data_collator DataCollatorForLanguageModeling( tokenizertokenizer, mlmFalse, # 使用因果语言建模而非掩码语言建模 pad_to_multiple_of8 # 有助于某些硬件上的性能 ) # 5. 配置TrainingArguments training_args TrainingArguments( output_dirconfig[output_dir], overwrite_output_dirTrue, num_train_epochsconfig[num_train_epochs], per_device_train_batch_sizeconfig[per_device_train_batch_size], per_device_eval_batch_sizeconfig[per_device_eval_batch_size], gradient_accumulation_stepsconfig[gradient_accumulation_steps], warmup_stepsconfig[warmup_steps], learning_rateconfig[learning_rate], weight_decayconfig[weight_decay], lr_scheduler_typeconfig[lr_scheduler_type], optimconfig[optim], logging_dirconfig[logging_dir], logging_stepsconfig[logging_steps], save_strategyconfig[save_strategy], save_stepsconfig[save_steps], evaluation_strategyconfig[evaluation_strategy], eval_stepsconfig[eval_steps], load_best_model_at_endconfig.get(load_best_model_at_end, False), metric_for_best_modelconfig.get(metric_for_best_model, None), fp16config.get(fp16, False), bf16config.get(bf16, False), gradient_checkpointingconfig.get(gradient_checkpointing, False), report_totensorboard, ) # 6. 初始化Trainer并开始训练 trainer Trainer( modelmodel, argstraining_args, data_collatordata_collator, train_datasettokenized_train_dataset, eval_datasettokenized_eval_dataset, tokenizertokenizer, ) print(Starting training...) trainer.train() # 7. 保存最终模型 print(Saving final model...) trainer.save_model() tokenizer.save_pretrained(config[output_dir]) print(fModel saved to {config[output_dir]}) if __name__ __main__: main()4.3 使用LoRA进行参数高效继续预训练如果计算资源非常有限可以考虑使用LoRA。但请注意LoRA主要优化适配器Adapter参数对底层模型知识的更新能力可能弱于全参数训练。以下是如何集成peft库进行LoRA训练的关键修改# 在 scripts/train.py 中修改模型加载部分 from peft import LoraConfig, get_peft_model, TaskType # ... 加载基础模型 ... model AutoModelForCausalLM.from_pretrained(...) # 定义LoRA配置 lora_config LoraConfig( task_typeTaskType.CAUSAL_LM, # 因果语言模型任务 r8, # LoRA秩 lora_alpha32, # Alpha参数影响缩放 lora_dropout0.1, target_modules[q_proj, v_proj], # 针对LLaMA结构对query和value投影层应用LoRA biasnone, ) # 将基础模型转换为Peft模型 model get_peft_model(model, lora_config) model.print_trainable_parameters() # 打印可训练参数量应该远小于总参数量 # ... 后续训练步骤不变Trainer会只更新LoRA参数 ... # 训练结束后保存的模型是适配器权重需要与基础模型合并才能独立使用4.4 启动训练与监控使用accelerate启动多GPU训练如果可用# 首先配置accelerate首次运行 accelerate config # 根据提示选择配置多GPU、混合精度等 # 使用accelerate启动训练脚本 accelerate launch --num_processes4 scripts/train.py对于单卡训练可以直接运行python scripts/train.py监控训练过程控制台日志关注loss训练损失和eval_loss验证损失的下降趋势。eval_loss开始上升可能意味着过拟合。TensorBoard在另一个终端启动 TensorBoard 可视化日志。tensorboard --logdir ./outputs/logs然后在浏览器打开http://localhost:6006查看损失曲线、学习率变化等。5. 模型评估与效果验证训练完成后不能仅凭损失下降就判断模型学会了领域推理。需要设计系统的评估方法。5.1 内部评估困惑度Perplexity, PPL困惑度是衡量语言模型对给定序列预测好坏的标准指标值越低越好。可以在一个保留的领域测试集未参与训练上计算。# scripts/evaluate.py 片段 - 计算困惑度 import torch from transformers import AutoModelForCausalLM, AutoTokenizer from datasets import load_from_disk import math def calculate_perplexity(model, tokenizer, test_texts, max_length512): model.eval() total_loss 0 total_tokens 0 with torch.no_grad(): for text in test_texts: inputs tokenizer(text, return_tensorspt, truncationTrue, max_lengthmax_length).to(model.device) input_ids inputs[input_ids] target_ids input_ids.clone() outputs model(input_ids, labelstarget_ids) loss outputs.loss total_loss loss.item() * input_ids.size(1) # loss是平均每token的损失 total_tokens input_ids.size(1) avg_loss total_loss / total_tokens perplexity math.exp(avg_loss) return perplexity # 使用 model_path ./outputs/final_model model AutoModelForCausalLM.from_pretrained(model_path).to(cuda) tokenizer AutoTokenizer.from_pretrained(model_path) dataset load_from_disk(./data/dataset) test_texts dataset[test][text][:100] # 取100条测试 ppl calculate_perplexity(model, tokenizer, test_texts) print(fTest Perplexity: {ppl:.2f})5.2 外部评估领域特定的问答与推理任务这是更重要的评估方式。构建一个小的评估集包含领域内需要推理的问题。构建评估集创建一个JSON文件包含问题、标准答案或答案关键点。// eval_qa.json [ { question: 根据[领域文档A]第3.2节在发生X条件时系统Y应该执行什么操作, context: 相关文档片段..., reference_answer: 系统Y应首先执行Z操作并在5秒内上报状态。 }, ... ]设计提示词Prompt让模型基于给定的上下文Context回答问题。def generate_answer(model, tokenizer, question, context, max_new_tokens200): prompt f基于以下背景信息回答问题。背景信息{context} 问题{question} 答案 inputs tokenizer(prompt, return_tensorspt).to(model.device) outputs model.generate(**inputs, max_new_tokensmax_new_tokens, do_sampleTrue, temperature0.7) answer tokenizer.decode(outputs[0][inputs[input_ids].shape[1]:], skip_special_tokensTrue) return answer人工或自动评估人工评估最可靠。评估者根据答案的事实准确性、逻辑连贯性和对专业术语的使用进行打分。自动评估辅助可以使用另一个强大的LLM如GPT-4作为裁判通过设计详细的评分规则来对比模型输出和参考答案。也可以使用ROUGE、BLEU等文本相似度指标但它们在衡量事实和推理上不够精确。对比实验务必用相同的问题集测试原始基础模型和继续预训练后的模型。观察后者在事实准确性和推理深度上是否有显著提升。6. 常见问题、陷阱与排查路径继续预训练是一个复杂过程极易遇到各种问题。下表列出了常见问题及其排查思路。问题现象可能原因检查与排查步骤解决方案与建议训练损失不下降或震荡剧烈学习率过高/过低批次大小太小数据质量差噪音多、重复多。1. 检查TensorBoard中的学习率曲线和损失曲线。2. 检查数据预处理脚本抽样查看清洗后的文本。3. 尝试更小的学习率如5e-5。1. 使用学习率预热Warmup和余弦衰减。2. 增加梯度累积步数以增大有效批次大小。3. 加强数据清洗去除无关内容和重复段落。验证损失远高于训练损失且持续上升严重的过拟合。模型记住了训练数据但无法泛化。1. 检查训练集和验证集是否来自同一分布且无交集。2. 检查模型参数量是否远大于数据量。1. 增加验证集比例或确保其代表性。2. 使用更早的检查点Early Stopping。3. 增加权重衰减Weight Decay或使用Dropout如果模型支持。4.获取更多领域数据是最根本的解决方式。训练时GPU显存溢出OOM批次大小、模型大小、序列长度超出GPU容量。1. 使用nvidia-smi监控显存使用。2. 检查model_max_length是否设置过大。1. 减小per_device_train_batch_size。2. 启用梯度检查点 (gradient_checkpointingTrue)。3. 使用混合精度训练 (fp16True或bf16True)。4. 使用accelerate或deepspeed进行零冗余优化器ZeRO分片。模型输出乱码或重复Tokenizer配置错误训练数据格式有问题训练不充分或过拟合。1. 检查tokenizer的pad_token是否设置通常设为eos_token。2. 检查训练文本是否包含大量特殊标记或未识别的字符。3. 在验证集上计算困惑度是否异常高。1. 确保tokenizer与模型匹配并正确设置pad_token。2. 回顾数据清洗步骤确保输入是干净文本。3. 尝试在训练时使用更低的温度Temperature进行抽样评估。领域知识提升不明显领域数据量不足训练轮数不够模型容量不足学习率策略不当。1. 对比训练前后模型在领域评估集上的表现。2. 检查训练数据总量和模型参数量级。3. 分析损失曲线看是否已收敛。1.增加高质量领域数据是首要任务。2. 适当增加训练轮数 (num_train_epochs)。3. 考虑使用更大的基础模型如从7B到13B。4. 尝试全参数训练而非LoRA。训练速度极慢没有使用GPU没有启用混合精度数据加载是瓶颈。1. 使用torch.cuda.is_available()确认GPU可用。2. 使用nvtop或gpustat查看GPU利用率。3. 检查数据预处理是否已提前完成并缓存。1. 确保安装了CUDA版本的PyTorch。2. 启用fp16/bf16。3. 使用datasets库的.map函数时设置load_from_cache_fileTrue。4. 使用DataLoader的num_workers参数并行加载数据。7. 生产部署与持续迭代的最佳实践训练出一个好模型只是第一步将其稳定、高效地应用于生产环境需要更多考量。7.1 模型优化与导出模型量化为了降低部署资源消耗可以对训练好的模型进行量化如使用bitsandbytes进行8-bit或4-bit量化这能大幅减少内存占用对推理速度也有一定提升但可能会带来轻微的性能损失。模型合并如果使用了LoRA等PEFT方法需要将适配器权重与基础模型合并导出为一个完整的、可独立加载的模型文件。# 示例使用 peft 合并 LoRA 权重 python -c from peft import PeftModel from transformers import AutoModelForCausalLM, AutoTokenizer base_model meta-llama/Llama-2-7b-hf lora_weights ./outputs/final_model merged_model PeftModel.from_pretrained(AutoModelForCausalLM.from_pretrained(base_model), lora_weights) merged_model merged_model.merge_and_unload() merged_model.save_pretrained(./outputs/merged_model) AutoTokenizer.from_pretrained(base_model).save_pretrained(./outputs/merged_model) 格式转换根据推理框架的需要可能需将模型转换为其他格式如ONNX、TensorRT或vLLM、TGIText Generation Inference支持的格式。7.2 部署与服务化选择推理框架vLLM高吞吐量、低延迟支持PagedAttention非常适合高并发API服务。TGIHugging Face官方推理容器功能丰富支持张量并行、连续批处理等。原生Transformers灵活性最高便于调试但需要自行实现批处理和并发。设计API提供清晰的HTTP或gRPC接口通常包括/generate(文本生成) 和/embed(文本向量化) 端点。监控与日志记录请求量、响应延迟、Token消耗、错误率。设置针对模型输出内容的安全性过滤和异常检测。7.3 持续学习与迭代领域知识会更新模型也需要迭代。数据管道自动化建立从新数据源如内部Wiki、文档更新到清洗、去重、并入训练集的自动化流程。增量训练定期如每季度使用新数据对现有模型进行增量式的继续预训练而不是从头开始。注意控制灾难性遗忘。A/B测试将新版本模型与旧版本进行线上A/B测试用真实的用户反馈如回答采纳率、满意度评分来衡量效果提升。评估体系固化将第5章中的内部和外部评估方法脚本化、自动化作为模型发布前的必经关卡。7.4 安全与责任内容过滤在模型输入输出端部署内容过滤层防止生成有害、偏见或敏感信息。可解释性对于关键决策场景探索使用检索增强生成RAG等技术让模型的回答能够引用来源增强可信度。资源管理监控GPU使用成本设置自动伸缩策略在低峰期缩减实例以节省成本。通过以上步骤你不仅能够完成一次针对特定领域的LLM继续预训练更能建立起一个可持续迭代的领域智能应用 pipeline。记住数据是核心评估是关键而将技术成果转化为稳定可靠的服务才是工程实践的最终目标。
返回列表