文心一言大模型本地部署与微调应用实战
介绍百度文心一言(ERNIE 4.5)大模型的本地部署与微调流程。内容涵盖环境准备、模型下载、基于公开 QA 数据集的微调训练及效果评估。通过 Gradio 搭建本地交互服务,展示 LoRA 或原生微调方法,并分析 Perplexity、BLEU 等指标,为开发者提供中文大模型私有化落地的参考方案。

介绍百度文心一言(ERNIE 4.5)大模型的本地部署与微调流程。内容涵盖环境准备、模型下载、基于公开 QA 数据集的微调训练及效果评估。通过 Gradio 搭建本地交互服务,展示 LoRA 或原生微调方法,并分析 Perplexity、BLEU 等指标,为开发者提供中文大模型私有化落地的参考方案。

2025 年,百度文心大模型(ERNIE 4.5)正式开源,标志着中国 AI 基础模型生态迈入新阶段。回顾近年 AI 发展,OpenAI、Google、Meta 等国际巨头通过大模型开源推动了全球 AI 创新浪潮,但国内长期受限于算力、数据、算法壁垒,缺乏具备国际竞争力的自主大模型。百度此次全面开放文心一言,不仅降低了开发门槛,更为中国 AI 产业自主可控、生态共建提供了坚实基础。
开源的意义远不止'免费可用'。它代表着知识共享、社区协作和技术透明,能够加速模型优化、促进多样化应用创新,并推动学术与产业的深度融合。更重要的是,开源大模型为中小企业、科研机构、个人开发者提供了与国际前沿技术'同台竞技'的机会,有望打破技术垄断,推动中国 AI 生态的繁荣与自主创新。
近年来,大语言模型(LLM, Large Language Models)快速崛起,已经成为 AI 领域最炙手可热的技术核心。国内外涌现出一系列代表性产品,如 GPT-4、Claude、Gemini,以及国内的百川、清言、月之暗、天工等。
在这一浪潮中,百度研发的 文心一言(ERNIE Bot) 系列模型,以其强大的中文理解与生成能力、广泛的行业适配性以及持续的技术演进,成为国产大模型的代表之一。
文心一言不是单一的模型,而是百度深度学习研究多年的成果结晶,集成了 ERNIE(知识增强预训练模型)、PaddlePaddle(国产深度学习框架)等一整套技术体系。
技术亮点简要概括如下:
文心一言大模型的逐步开源,标志着百度迈出了'普惠智能'的关键一步,为开发者、科研人员、本地部署爱好者提供了极具实用价值的 AI 工具。
随着百度正式开源文心一言系列大模型,越来越多开发者希望在本地搭建并微调这些模型,以适配具体业务场景。然而,对于普通用户来说,如何快速部署、如何选择模型、如何评估微调效果,仍是一大难题。
本次测评的目标就是:用最小的成本、最清晰的流程、最直观的反馈,完成一次完整的 ERNIE 大模型本地部署 + 精简微调实验。
我们希望通过实战操作,回答以下几个关键问题:
测评流程如下:
| 流程阶段 | 操作目标 | 工具/资源 |
|---|---|---|
| 环境准备 | 创建 Python 虚拟环境,安装依赖 | Conda / pip |
| 模型部署 | 加载 ERNIE 预训练模型,实现基础问答 | GitCode+ Transformers + Gradio |
| 数据准备 | 构建小样本中文问答数据 | 自制或开源精简 JSON 数据集 |
| 微调训练 | 使用 LoRA 或原生微调方式 | PyTorch + Transformers |
| 部署测试 | 将微调后的模型部署到网页端 | Gradio 本地服务 |
| 效果对比 | 原始 vs 微调模型效果对比 | 人工分析 / 案例测评 |
通过这一流程,我们希望验证 ERNIE 4.5 系列模型在本地部署与轻量化场景下的实用性与灵活性。
本文以 ERNIE-4.5-0.3B 为测试对象,完整呈现部署到调优的每一步细节,适合开发者快速上手复现。
大语言模型(LLM)已成为 AI 领域的核心基础设施。ERNIE 系列自 2019 年发布以来,持续迭代,融合了知识增强预训练、跨模态学习、指令微调等多项前沿技术。ERNIE 4.5 不仅在中文理解与生成任务上表现优异,还在多模态、插件化、产业落地等方面实现了突破。
技术亮点包括:
百度于 2025 年 6 月 30 日将 ERNIE 4.5 系列模型全面开源,覆盖基础、对话、轻量化、插件化等多种版本,全部托管于代码托管平台。这一举措不仅是技术开放,更是生态战略的体现。通过与国际主流平台接轨,百度推动了国产大模型与全球社区的深度融合,有助于吸引更多开发者参与模型优化与应用创新。
百度在 2025 年 6 月 30 日正式开源了 23 个文心大模型,其中包括:
所有模型均发布在官方账号下,用户可以直接通过 transformers 库或 API 接口加载使用。模型命名统一以 baidu/ERNIE-... 开头,便于查找和集成。
主要模型一览:
| 模型名称 | 参数规模 | 模型风格 | 说明 |
|---|---|---|---|
| ERNIE-4.5-0.3B-Base-PT | 0.3B | 基础模型 | 支持 CausalLM 微调 |
| ERNIE-4.5-0.3B-LLaMA-PT | 0.3B | LLaMA 格式 | 兼容 LLaMA 微调脚本 |
| ERNIE-4.5-0.3B-Chat-PT | 0.3B | 对话风格 | 自带 instruction 数据训练 |
| ERNIE-Speed / ERNIE-Tiny 系列 | 数百万级至亿级 | 推理/轻量模型 | 适合移动端与边缘设备部署 |
本次开源同时提供了模型配置文件(config.json)、权重(pytorch_model.bin)、分词器(tokenizer.json)、预训练 vocab、部分样例数据及使用说明,极大降低了微调和二次开发的技术门槛。
与国际主流大模型(如 GPT-4、LLaMA-3)相比,ERNIE 4.5 在以下方面具有独特优势:
使用须知
ERNIE 4.5 所有开源模型均基于 百度商业友好许可协议(Baidu Commerical Friendly License, BCFL) 发布,主要特点如下:
百度鼓励开发者在项目引用中注明模型名称与来源(如'本项目基于 baidu/ERNIE-4.5-0.3B-Base-PT 微调'),以便模型生态规范发展。
文心一言 ERNIE 4.5 的开源不仅仅意味着'可以下载模型',更意味着我们可以直接在本地部署、调用、微调并形成一个属于自己的中文智能问答系统。本章将结合实际操作步骤,带你完整复现从模型下载到 Gradio 页面部署的全过程。
本次部署采用如下配置:
| 项目 | 配置 |
|---|---|
| 操作系统 | Windows 10 / 11 |
| Python 版本 | Python 3.9 |
| 构建方式 | Conda 虚拟环境 + Transformers |
| 显卡支持 | 可选 GPU,推荐 RTX 30/40 系列 |
| 接口平台 | Gradio(网页交互) |
| 运行平台 | Pycharm |
建议你使用 Anaconda 创建隔离的环境,并激活:
注意:关于运行环境建议使用 PyTorch + CUDA 匹配版本安装,若无 GPU 也可不指定 CUDA,这里大家可以根据自身情况去配置深度学习环境,网上都有,我们这次以测评为准就不多赘述了。
第一步:安装必要依赖
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install transformers datasets gradio accelerate
第二步:下载模型文件(ERINE 4.5)
选择你需要的模型(我们选择的是 ERNIE-4.5-0.3B-Base-PT):
将下载后的文件保存到本地路径:
./models/ERNIE-4.5-0.3B-Base-PT/
第三步:准备微调模型文件
将你训练好的模型 checkpoint 文件放入:
./ernie4.5-finetuned/checkpoint-750/
import gradio as gr
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
# 加载 tokenizer 和模型
tokenizer = AutoTokenizer.from_pretrained("./models/ERNIE-4.5-0.3B-Base-PT", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("./ernie4.5-finetuned/checkpoint-750", trust_remote_code=True)
model.eval()
model.to("cuda" if torch.cuda.is_available() else "cpu")
# 推理函数
def generate_response(prompt):
inputs = tokenizer(prompt, return_tensors="pt", truncation=True, max_length=256)
input_ids = inputs["input_ids"].to(model.device)
attention_mask = inputs["attention_mask"].to(model.device)
with torch.no_grad():
output = model.generate(
input_ids=input_ids,
attention_mask=attention_mask,
max_new_tokens=128,
do_sample=True,
top_p=0.95,
temperature=0.9,
repetition_penalty=1.2,
eos_token_id=tokenizer.eos_token_id or tokenizer.pad_token_id,
pad_token_id=tokenizer.pad_token_id or tokenizer.eos_token_id
)
return tokenizer.decode(output[0][input_ids.shape[1]:], skip_special_tokens=True)
# Gradio 页面
iface = gr.Interface(
fn=generate_response,
inputs=gr.Textbox(lines=2, label="输入问题"),
outputs=gr.Textbox(lines=4, label=),
title=
)
iface.launch(server_name=, server_port=)
正常启动后,你将看到如下信息:
此时你就可以打开浏览器,输入本地地址访问部署界面,并输入你的测试问题,观察模型输出结果。
数据集描述:
进入到 GitHub 地址页面后,我们选择其中一个进行下载即可。
下图是下载后的数据集部分示例。
因为我们想要将其转化为 json 格式,所以我们需要进行一下数据预处理,同时为了节省时间,我们截取数据集的部分,并将其划分为训练集,测试集,验证集
import json
import random
def split_dataset(json_file, train_ratio=0.8, val_ratio=0.1, test_ratio=0.1, seed=42):
with open(json_file, 'r', encoding='utf-8') as f:
data = [json.loads(line) for line in f]
random.seed(seed)
random.shuffle(data)
n = len(data)
train_end = int(n * train_ratio)
val_end = int(n * (train_ratio + val_ratio))
train_data = data[:train_end]
val_data = data[train_end:val_end]
test_data = data[val_end:]
return train_data, val_data, test_data
def save_jsonl(filename, data):
with open(filename, 'w', encoding='utf-8') as f:
for item in data:
f.write(json.dumps(item, ensure_ascii=False)+'\n')
train_data, val_data, test_data = split_dataset("train_100percent_sample.json")
save_jsonl("train.json", train_data)
save_jsonl("val.json", val_data)
save_jsonl("test.json", test_data)
本章的数据量较大,对显卡要求比较高,我们选择采用服务器环境。这里可以选择云 GPU 服务,没有的小伙伴可以自行注册,这里我选择的配置如下,注意我扩容了一下数据盘(具体原因请接着看)。
将服务器开机后,我们选择自带的 jupyter 或者其他的工具都行,这里我选择 WindTerm;当然无论使用什么,我们第一步都是上传数据,这里可以选择无卡模型开机上传这样省钱一点,上传完毕后我们需要下载依赖,大概是这四种,至于版本直接默认就好
datasets
transformers
sentencepiece
accelerate
# 加载模型和分词器
model_name = "./models/ERNIE-4.5-0.3B-Base-PT"
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_name, trust_remote_code=True)
dataset = load_dataset("json", data_files={"train":"train.json","validation":"val.json","test":"test.json"})
def preprocess(example):
prompt = example["input"]
response = example["output"]
prompt_ids = tokenizer(prompt, truncation=True, max_length=256, add_special_tokens=False)
response_ids = tokenizer(response, truncation=True, max_length=256, add_special_tokens=False)
input_ids = prompt_ids["input_ids"]+ response_ids["input_ids"]
attention_mask =[1]*len(input_ids)
labels =[-100]*len(prompt_ids["input_ids"])+ response_ids["input_ids"]
pad_len =512-len(input_ids)
if pad_len >0:
input_ids +=[tokenizer.pad_token_id]* pad_len
attention_mask +=[0]* pad_len
labels +=[-100]* pad_len
else:
input_ids = input_ids[:512]
attention_mask = attention_mask[:512]
labels = labels[:512]
return{"input_ids": input_ids,"attention_mask": attention_mask,"labels": labels }
tokenized_datasets = dataset.map(
preprocess, batched=False, remove_columns=dataset["train"].column_names
)
training_args = TrainingArguments(
output_dir="/root/autodl-tmp/ernie4.5-QA3",
per_device_train_batch_size=2,
num_train_epochs=3,
save_steps=100,
logging_steps=10,
learning_rate=2e-5,
fp16=True,
save_total_limit=1,
#evaluation_strategy="epoch", # 每个 epoch 评估一次
logging_dir="./logs",
report_to="none",# 不用 wandb
)
如果默认在系统盘就会,报错如下图。
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_datasets["train"],
eval_dataset=tokenized_datasets["validation"],
data_collator=DataCollatorForLanguageModeling(tokenizer, mlm=False),
callbacks=[loss_recorder],
)
trainer.train()
我们在终端输入 python train.py 后,若出现下面的效果,则说明,模型已经开始训练了,只要静静的等待即可(训练时间和 ephoc 还有数据量成正比)。
训练完,我们检查一下权重文件,若缺失什么文件,我们需要将 base 里面的文件复制过去,下面我进行了列举
接下来我们需要评估测试一下,看看效果如何,这里我们准备测试代码
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
model_path = "/root/autodl-tmp/ernie4.5-QA/checkpoint-14750"
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_path, trust_remote_code=True)
model.eval()
model.to("cuda" if torch.cuda.is_available() else "cpu")
def generate_response(prompt):
inputs = tokenizer(prompt, return_tensors="pt", truncation=True, max_length=256)
input_ids = inputs["input_ids"]
attention_mask = inputs["attention_mask"]
# Ensure input_ids are 2D
if input_ids.dim()==1:
input_ids = input_ids.unsqueeze(0)
# Modify attention_mask to be 2D
if attention_mask.dim()!=2:
attention_mask = attention_mask.view(input_ids.shape[0],-1)
input_ids = input_ids.to(model.device)
attention_mask = attention_mask.to(model.device)
with torch.no_grad():
output = model.generate(
input_ids=input_ids,
attention_mask=attention_mask,
max_new_tokens=128,
do_sample=True,
top_p=0.95,
temperature=0.9,
repetition_penalty=1.2,
eos_token_id=tokenizer.eos_token_id if tokenizer.eos_token_id is not None else tokenizer.pad_token_id,
pad_token_id=tokenizer.pad_token_id tokenizer.pad_token_id tokenizer.eos_token_id
)
generated_tokens = output[][input_ids.shape[]:]
response = tokenizer.decode(generated_tokens, skip_special_tokens=)
response.strip()
__name__ == :
()
:
prompt = ()
prompt.strip() prompt.strip().lower()==:
()
response = generate_response(prompt)
(+ response)
下图为终端测试案例,结果充分表明,如果有条件可以采用更大参数的模型和更大的数据集进行训练,这样效果会更好。
可以和数据集里面的数据对比一下,如果 ephoc 轮次增大一些,回答的准确率相信会更高。
本节为了更好的量化结果,我们使用常见的评估指标进行分析 Perplexity,BLEU,ROUGE-L,loss
这里我们需要修改一下代码,首先要将数据集划分一下,我们这里按照 8:1:1 划分为训练集,验证集,测试集
split_dataset = raw_dataset.train_test_split(test_size=0.1, seed=42)
train_val = split_dataset['train']
test = split_dataset['test']
创建一个预处理函数
def preprocess(example):
prompt = example["input"]
response = example["output"]
prompt_ids = tokenizer(prompt, truncation=True, max_length=256, add_special_tokens=False)
response_ids = tokenizer(response, truncation=True, max_length=256, add_special_tokens=False)
input_ids = prompt_ids["input_ids"] + response_ids["input_ids"]
attention_mask = [1] * len(input_ids)
labels = [-100] * len(prompt_ids["input_ids"]) + response_ids["input_ids"]
pad_len = 512 - len(input_ids)
if pad_len > 0:
input_ids += [tokenizer.pad_token_id] * pad_len
attention_mask += [0] * pad_len
labels += [-100] * pad_len
else:
input_ids = input_ids[:512]
attention_mask = attention_mask[:512]
labels = labels[:512]
return {
"input_ids": input_ids,
"attention_mask": attention_mask,
"labels": labels
}
绘制损失曲线
plt.figure(figsize=(8,5))
plt.plot(loss_history.train_loss, label="Train Loss")
plt.plot(loss_history.epochs, loss_history.eval_loss, label="Validation Loss")
plt.xlabel("Steps/Epochs")
plt.ylabel("Loss")
plt.legend()
plt.title("Training and Validation Loss")
plt.savefig("loss_curve.png")
plt.show()
设置评估指标
bleu = sacrebleu.corpus_bleu(preds,[refs])
bleu_score = bleu.score
print(f"BLEU: {bleu_score:.4f}")
scorer = rouge_scorer.RougeScorer(['rougeL'], use_stemmer=True)
rouge_l_scores =[scorer.score(ref, pred)['rougeL'].fmeasure for pred, ref in zip(preds, refs)]
rouge_l = np.mean(rouge_l_scores)
print(f"ROUGE-L: {rouge_l:.4f}")
print("\n评估指标:")
print(f"Perplexity: {perplexity:.2f}")
print(f"BLEU: {bleu_score:.4f}")
print(f"ROUGE-L: {rouge_l:.4f}")
接下来我们等待训练结束。
下图为最终的损失曲线和评估指标。
损失曲线整体走势健康,表明模型训练过程顺利,参数收敛良好
| 指标 | 分数 |
|---|---|
| Perplexity | 2.12 |
| BLEU | 26.7288 |
| ROUGE-L | 0.4076 |
损失曲线和评估指标共同表明,模型训练过程稳定,未出现明显过拟合,且在生成任务上取得了较好的效果。低困惑度和较高的 BLEU、ROUGE-L 分数,说明 ERNIE-4.5-0.3B 模型不仅能生成流畅的文本,还能较好地覆盖参考答案的内容。总体表现良好
文心一言作为大规模预训练语言模型的开源,为开发者和研究者提供了宝贵资源 💎,打破了以往商业化限制 🔓,极大推动了人工智能领域的创新 🧠,尤其在中文处理、多语言任务和各类 NLP 应用中展现出强大能力 💪,同时促进了产业界与学术界的合作 🤝。
然而,其开源也存在不足 😅,如训练和微调对计算资源要求高 💻🔥,数据隐私与安全性有待保障 🔐,且在医学、法律等专业领域的中文优化仍需进一步提升 📈。
建议企业和开发者根据实际需求对文心一言进行定制化微调 🛠️,特别是在金融💰、医疗🏥等特定领域,以提升应用效果 🚀,同时可探索其在跨语言和多语言任务中的潜力 🌍。
随着大模型的普及,需进一步强化安全性和隐私保护 🛡️,防止生成不当内容 ⚠️。后续研究可聚焦于优化训练算法以提升效率 ⚡、减少资源消耗 ♻️,并加强领域自适应能力 🔄。此外,还可拓展多模态方向,探索文心一言在文本📄、图像🖼️、音频🎵等多模态任务中的应用。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online