基于 Qwen2.5 的佛经知识大模型 LoRA 微调项目。从 CBETA 电子佛典提取经典原文,使用 RAG + Qwen API 生成高质量问答数据,训练专业佛学知识问答模型「善知识」。
- 📚 18 部经典原文 — 佛经十三经 + 5 部重要论典,共 71 万字
- 🤖 12,285 条高质量训练数据 — RAG 增强 + Qwen-plus 生成,覆盖义理、修行、问答等多维度
- 🎭 专项数据增强 — 幻觉控制、边界拒答、身份强化、唯识学专项
- ⚡ LoRA 微调 — 支持 Jetson/GPU 训练,高效部署
- 🎯 「善知识」佛学问答 — 专业、如法、有边界
| 指标 | 数值 |
|---|---|
| 总训练数据 | 12,285 条 |
| v2 基础数据 | 10,785 条 |
| v3 专项数据 | 1,500 条 |
| 验证集 | 568 条 |
| 覆盖经典 | 18 部 (13经 + 5论) |
| 类别 | 数量 | 说明 |
|---|---|---|
| hallucination_defense | 300 | 幻觉控制 - 训练模型说"不确定" |
| boundary | 500 | 边界拒答 - 12类非佛学问题 |
| identity | 500 | 身份强化 - 善知识 + 开经偈 |
| weishi | 200 | 唯识学专项 - 八识/三性/转识成智 |
| 指标 | 数值 |
|---|---|
| QA 数量 | 4,374 条 |
| 覆盖经典 | 18 部 (13经 + 5论) |
| 原文总量 | 713,168 字 |
| 答案平均长度 | 387 字 |
| 经典 | QA 数量 | 经典 | QA 数量 |
|---|---|---|---|
| 成唯识论 | 654 | 大智度论 | 330 |
| 妙法莲华经 | 471 | 瑜伽师地论 | 318 |
| 楞严经 | 465 | 楞伽经 | 285 |
| 杂阿含经 | 393 | 解深密经 | 279 |
| 中论 | 369 | 维摩诘经 | 213 |
| 无量寿经 | 138 | 坛经 | 123 |
| 圆觉经 | 96 | 起信论 | 87 |
| 观经 | 78 | 金刚经 | 45 |
| 阿弥陀经 | 18 | 心经 | 12 |
git clone https://github.com/guyiicn/buddhist-llm-finetune.git
cd buddhist-llm-finetuneconda create -n buddhist-llm python=3.10 -y
conda activate buddhist-llm
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
pip install -r requirements.txt
pip install llamafactory数据集已经准备好,可以直接训练:
# LoRA 微调 Qwen2.5-7B-Instruct
python -m llamafactory.cli train train_config.yamlpython inference.py --question "什么是四圣谛?"buddhist-llm-finetune/
├── README.md # 项目说明
├── requirements.txt # Python 依赖
├── config.yaml # 项目配置
├── train_config.yaml # LLaMA-Factory 训练配置
│
├── v2_training/ # v2 训练数据 (10,785 条)
│ ├── buddhist_full_train.json # 训练集
│ ├── buddhist_full_val.json # 验证集
│ ├── train_buddhist_v2.py # 训练脚本
│ └── start_train_v2.sh # 启动脚本
│
├── v3_training/ # v3 专项数据 + 合并数据
│ ├── v3_training_data.json # 1,500 条专项数据
│ ├── buddhist_v3_train.json # 12,285 条合并训练集
│ ├── buddhist_v3_val.json # 验证集
│ ├── gen_boundary.py # 边界拒答数据生成
│ ├── gen_identity.py # 身份强化数据生成
│ ├── gen_weishi.py # 唯识学数据生成
│ ├── train_buddhist_v3.py # v3训练脚本
│ └── README.md # v3数据说明
│
├── benchmark/ # 模型评测
│ ├── buddhist_benchmark.py # 基准测试脚本
│ ├── benchmark_results.json # 测试结果
│ └── evaluate_model.py # 评估脚本
│
├── raw/ # 原始 CBETA 经文 (18 部)
│ ├── T0235_金刚经.txt
│ ├── T0262_法华经.txt
│ ├── T0945_楞严经.txt
│ ├── T1585_成唯识论.txt
│ └── ...
│
├── cleaned/ # 清洗后的分块数据
│ └── chunks.json # 1,569 个文本块
│
├── qa_pairs/ # 生成的 QA 数据
│ └── buddhist_qa.json # 4,374 条
│
├── output/ # Alpaca 格式数据
│ ├── buddhist_train_alpaca.json
│ └── buddhist_val_alpaca.json
│
├── scripts/ # 数据处理脚本
│ ├── 1_fetch_sutras.py
│ ├── 2_clean_text.py
│ ├── 3_generate_qa.py
│ └── 4_merge_dataset.py
│
└── saves/ # 训练输出 (LoRA 权重)
| 经名 | CBETA 编号 | 类别 | 字数 |
|---|---|---|---|
| 金刚般若波罗蜜经 | T0235 | 般若部 | 6,814 |
| 般若波罗蜜多心经 | T0251 | 般若部 | 1,351 |
| 妙法莲华经 | T0262 | 法华部 | 79,810 |
| 佛说无量寿经 | T0360 | 净土部 | 21,643 |
| 观无量寿佛经 | T0365 | 净土部 | 9,634 |
| 佛说阿弥陀经 | T0366 | 净土部 | 2,587 |
| 维摩诘所说经 | T0475 | 经集部 | 34,510 |
| 楞伽阿跋多罗宝经 | T0670 | 经集部 | 57,222 |
| 解深密经 | T0676 | 经集部 | 39,273 |
| 大方广圆觉修多罗了义经 | T0842 | 经集部 | 14,406 |
| 大佛顶首楞严经 | T0945 | 经集部 | 79,911 |
| 六祖大师法宝坛经 | T2008 | 禅宗 | 33,494 |
| 杂阿含经 | T0099 | 阿含部 | 59,935* |
| 论名 | CBETA 编号 | 作者 | 字数 |
|---|---|---|---|
| 大乘起信论 | T1666 | 马鸣菩萨 | 13,312 |
| 中论 | T1564 | 龙树菩萨 | 57,062 |
| 瑜伽师地论 | T1579 | 弥勒/无著 | 49,987* |
| 成唯识论 | T1585 | 护法等/玄奘译 | 102,246 |
| 大智度论 | T1509 | 龙树菩萨 | 49,971* |
*标注为节选,原典过长取前 N 万字。
# train_config.yaml
model_name_or_path: Qwen/Qwen2.5-7B-Instruct
finetuning_type: lora
lora_rank: 32
lora_alpha: 64
lora_dropout: 0.05
lora_target: all
per_device_train_batch_size: 2
gradient_accumulation_steps: 4
learning_rate: 2.0e-4
num_train_epochs: 3
bf16: true
gradient_checkpointing: true| 模型 | 方法 | 显存需求 | 训练时间 (3947 样本) |
|---|---|---|---|
| Qwen2.5-7B | LoRA BF16 | ~20 GB | ~3-5 小时 |
| Qwen2.5-7B | QLoRA 4-bit | ~12 GB | ~4-6 小时 |
| Qwen2.5-32B | QLoRA 4-bit | ~45 GB | ~12-20 小时 |
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
import torch
# 加载模型
base_model = "Qwen/Qwen2.5-7B-Instruct"
adapter_path = "./saves/qwen2.5-7b-buddhist-lora"
tokenizer = AutoTokenizer.from_pretrained(base_model)
model = AutoModelForCausalLM.from_pretrained(
base_model,
torch_dtype=torch.bfloat16,
device_map="auto"
)
model = PeftModel.from_pretrained(model, adapter_path)
# 对话
messages = [
{"role": "system", "content": "你是一位精通佛学的学者。"},
{"role": "user", "content": "什么是四圣谛?"}
]
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer([text], return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_new_tokens=512, temperature=0.7)
response = tokenizer.decode(outputs[0][inputs['input_ids'].shape[1]:], skip_special_tokens=True)
print(response)问:《中论》如何驳斥"生灭一时俱"的观点?
《中论》以归谬法层层破斥:先假设"灭时生"成立,则"灭时是一有,生时是一有",即同一刹那中必须同时安立两个实有的"有"——"灭时有"与"生时有",这违反"一法不二体"的基本理性原则;继而进一步逼问:若真"一时",则必是"于此阴死,即于此阴生",意味着同一组五蕴既在死亡又在受生,这显然与经验及教理相违。龙树借此揭示:所谓"灭时生"不过是凡夫将刹那生灭的相似相续错觉为"连续实体"的迷执。其方法论体现典型的中观"破而不立":不建立任何实有本体或时间模型,而是通过穷尽对方所有可能的逻辑设定,使其自相矛盾...
问:六祖批评"空心静坐"是邪见,这与传统禅修的"止息妄念"矛盾吗?
这并不矛盾,而是禅宗对修行根本方向的精准勘辨。六祖所破的"空心静坐",特指以压抑、断灭为手段,刻意追求"百无所思"的枯寂状态,并将此误认为究竟解脱,实则落入"无记空"——一种昏沉、无明、能所双泯却无觉照的死水境界,原文直斥"此一輩人,不可與語"...
-
提取经文 (
1_fetch_sutras.py)- 从本地 CBETA 文本库读取 18 部经典
- 去除文件头注释和校勘记
- 大经节选控制总量
-
清洗分块 (
2_clean_text.py)- 标准化空格换行
- 按 500 字切分,段落边界优先
- 生成 1,569 个文本块
-
生成 QA (
3_generate_qa.py)- 5 并发调用 Qwen-plus API
- 每块生成 3 个多角度 QA
- 增量保存,支持断点续传
-
合并数据集 (
4_merge_dataset.py)- 合并种子数据 + 生成数据
- 去重、90/10 分割
- 输出 Alpaca 格式
本项目仅供学习研究使用。佛经文本来源于 CBETA 中华电子佛典协会,遵循其开放授权协议。
- LLaMA-Factory - 高效 LLM 微调框架
- Qwen2.5 - 通义千问大模型
- PEFT - 参数高效微调
- CBETA 电子佛典 - 中华电子佛典协会