第四章:大模型(LLM)

第十部分:微调方法与实战

第九节:项目实战3:使用Llama3进行现代文与古文翻译的大模型微调

1️⃣ 项目背景

  • 痛点:现有大模型对中文现代文的处理较好,但在 古文理解古文→现代文翻译 上准确性不足。

  • 目标:通过 LoRA / QLoRA 微调 Llama3,增强模型在 现代文 ↔ 古文互译 任务中的能力。

  • 应用场景

    • 文言文学习助手

    • 古籍数字化与智能翻译

    • 文化教育平台


2️⃣ 环境准备

pip install transformers==4.41.2
pip install peft==0.10.0
pip install bitsandbytes==0.43.1
pip install datasets==2.20.0
pip install accelerate==0.30.1

推荐硬件:

  • 单卡 24GB GPU 可跑 Llama3-8B LoRA/QLoRA 微调。

  • 更大规模(13B、70B)建议多卡或 A100/H100 集群。


3️⃣ 数据准备

构建一个 现代文 ↔ 古文 平行语料 数据集:

{"instruction": "将下面的古文翻译成现代汉语", "input": "学而时习之,不亦说乎?", "output": "学习并经常复习,不也是很愉快的事吗?"}
{"instruction": "将下面的现代文翻译成文言文", "input": "我们要珍惜时间,勤奋学习。", "output": "吾辈当惜时勤学。"}

加载数据:

from datasets import load_dataset

dataset = load_dataset("json", data_files="modern_classical_translation.jsonl")

4️⃣ 模型加载与微调配置

这里以 QLoRA 方案为例:

from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model
import torch

model_name = "meta-llama/Meta-Llama-3-8B"

# 量化配置
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_use_double_quant=True,
    bnb_4bit_compute_dtype=torch.bfloat16
)

# 加载模型
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    quantization_config=bnb_config,
    device_map="auto"
)

tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.pad_token = tokenizer.eos_token

# LoRA 配置
lora_config = LoraConfig(
    r=64,
    lora_alpha=16,
    target_modules=["q_proj","v_proj"],
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM"
)
model = get_peft_model(model, lora_config)

5️⃣ 数据预处理

def format_instruction(example):
    prompt = f"任务:{example['instruction']}\n文本:{example['input']}\n翻译:"
    return {"prompt": prompt, "label": example["output"]}

dataset = dataset.map(format_instruction)

def tokenize(example):
    inputs = tokenizer(example["prompt"], truncation=True, max_length=512)
    outputs = tokenizer(example["label"], truncation=True, max_length=512)
    inputs["labels"] = outputs["input_ids"]
    return inputs

tokenized = dataset["train"].map(tokenize, batched=True)

6️⃣ 训练

from transformers import TrainingArguments, Trainer, DataCollatorForLanguageModeling

training_args = TrainingArguments(
    output_dir="./llama3-translation-qlora",
    per_device_train_batch_size=4,
    gradient_accumulation_steps=8,
    learning_rate=2e-4,
    max_steps=2000,
    warmup_steps=100,
    save_steps=500,
    save_total_limit=2,
    logging_steps=10,
    fp16=True,
    optim="paged_adamw_32bit",
    lr_scheduler_type="cosine",
    evaluation_strategy="no",
    report_to="none"
)

trainer = Trainer(
    model=model,
    train_dataset=tokenized,
    args=training_args,
    tokenizer=tokenizer,
    data_collator=DataCollatorForLanguageModeling(tokenizer, mlm=False)
)

trainer.train()

7️⃣ 推理测试

from transformers import pipeline

pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, device=0)

# 古文 → 现代文
res1 = pipe("任务:将下面的古文翻译成现代汉语\n文本:大风起兮云飞扬。\n翻译:", max_new_tokens=100)
print(res1[0]['generated_text'])

# 现代文 → 古文
res2 = pipe("任务:将下面的现代文翻译成文言文\n文本:人生自古谁无死,留取丹心照汗青。\n翻译:", max_new_tokens=100)
print(res2[0]['generated_text'])

8️⃣ 总结

  • 本项目展示了 Llama3 + QLoRA现代文 ↔ 古文互译 任务上的实战方案。

  • 优势:
    微调成本低(单卡即可运行)。
    翻译效果较通用模型显著提升。
    可扩展至古籍数字化、智能教育等应用。

  • 挑战:
    古文语义多义,可能需要 人工校对 + 知识库增强
    需构建高质量平行语料,避免“直译化”。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐