天机智能体实战:3 步微调一个中文祝福语生成模型
【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调(全参数/Lora)、部署国内外开源大模型(LLM)/多模态大模型(MLLM)教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm
想给模型加上"人情味"吗?Tianji-天机智能体专攻中文社交场景:敬酒词、节日祝福、尴尬化解,它把"送祝福"做成了一个可以完整复刻的微调案例。读完这篇,你能在 24G 显存的机器上,走通数据生成、LoRA 微调、上线验证的完整链路。
先看它解决什么
想象三个场景。年底公司聚餐,轮到敬酒你卡壳了——输一句"祝领导新年顺利,严肃风格",它就给你一段不卑不亢的祝词;姐姐生日快到了,你想要点"网感"——切到小红书风格,带 emoji 的俏皮文案直接到手;领导生日不能太活泼——严肃风格输出得端庄克制,字数也更长。
祝福之外,examples/Tianji-天机/readme.md 里还覆盖了敬酒、请客、送礼、化解矛盾等方向。对我们更有价值的是:这条流水线(提示词工程 → 造数据 → QLoRA 微调 → 部署)可以原样搬到任何垂直场景。
环境速查:一张清单备齐
这一步只为避免"装到最后发现跑不起来"。所有版本都按 python 3.10 环境验证过,直接照抄:
- GPU:24G 显存起步,3090 单卡即可跑 QLoRA
- 框架:PyTorch 2.0.x + Xtuner v0.1.18
- 基础模型:
internlm2-chat-7b(用 ModelScope 拉取)
python -m pip install --upgrade pip pip install modelscope==1.9.5 transformers==4.36.2 streamlit==1.39.0 pip install sentencepiece==0.1.99 accelerate==0.24.1 pip install transformers_stream_generator==0.0.4 einops ujson protobuf git clone -b v0.1.18 https://gitcode.com/GitHub_Trending/se/self-llm cd xtuner && pip install -e '.[all]'装完跑一句xtuner version,能打印版本号就算就绪。仓库内 models/InternLM2/ 目录有同框架的环境配置参考截图:
核心第一步:造数据
目的:用"聪明大模型"批量生产高质量祝福语样本,这是最终效果的最大变量。
做法:把三个维度做笛卡尔积——28 种角色(大舅、李总、导师……)× 18 个场景(生日、春节、乔迁……)× 3 种风格(正常、小红书、严肃),每个组合喂给一个大模型(DeepSeek、GLM 或本地部署的 Qwen),产出 system/input/output 三元组,存成 json。风格靠 few-shot 例句控制,比如小红书风格会附上几条参考文案让它"只看造句风格"。
避坑:input 字段要写成人会输入的短句(如"祝姐姐生日快乐,小红书风格"),而不是造数据时的长提示词,否则训练和推理对不上。
多轮生成的 json 用一个小脚本合并、统一成训练格式:
extracted = { 'system': conversation['system'], 'input': conversation['input'], 'output': conversation['output'] } all_conversations.append({'conversation': [extracted]})不想自己跑造数据流程,也可以直接下载项目提供的现成数据集tianji-wishes-chinese-v0.1.json。
核心第二步:QLoRA 微调
目的:用 4bit 量化 + LoRA 把祝福能力"焊"进模型,24G 显存就能训。
做法:先复制一份 xtuner 的配置模板,再改四处:模型路径、数据集路径、数据集加载方式(改为path='json')、评估输入(换成祝福语样例并把评估频率调到 50)。模板长这样:
然后启动训练,权重每 50 步存一次:
cd /home/finetune && xtuner copy-cfg internlm2_chat_7b_qlora_oasst1_e3 ./ # 改完配置后 xtuner train ./internlm2_chat_7b_qlora_oasst1_e3_copy.py --deepspeed deepspeed_zero2训练轮数 1-3 轮即可,LLM 对少量数据极易过拟合;loss 平稳下降、验证样本的回复质量没明显退化就可以停。显存不够就把 zero2 换成 zero3。
(建议插图:训练 loss 下降曲线)
核心第三步:转换合并上线
目的:把训练出的 LoRA 权重变成能直接加载的完整模型。
最小命令链是"转 HF 格式 → 与基座合并",路径变量别抄错:
xtuner convert pth_to_hf "${SCRIPT_PATH}" "${WEIGHTS_PATH}" "./hf" xtuner convert merge "${SRC_MODEL_PATH}" "./hf" "./merge" \ --max-shard-size "2GB"WEIGHTS_PATH指向训练目录work_dirs下的iter_XXX.pth,SRC_MODEL_PATH指向原 internlm2-chat-7b 模型。合并完就是一个可直接部署的目录。
一条命令跑通效果验证
启动交互式对话,带上和训练时一致的 system 提示词:
xtuner chat ./merge --prompt-template internlm2_chat \ --system "你现在是一个送祝福大师,帮我针对不同人和事情、节日送对应的祝福" \ --temperature 0.7回车两下结束输入,测两组:
- 输入:
我想送哥哥中秋节祝福,小红书风格→ 输出:🌕🎉 哥,中秋月圆人团圆,愿你事业如月圆,家庭幸福似团圆,快乐满怀,幸福满满!🌟 - 输入:
祝赵老师生日祝福,严肃风格→ 输出:尊敬的赵老师,值此佳辰,恭祝您福寿安康,事业蒸蒸日上……
风格切换是否生效,就是这次微调成没成的判据。想反复测试时记得输RESET清上下文。也可以接 Streamlit 的web_demo.py,把模型路径换成./merge后启动一个网页版:
进阶玩法
- 加新场景:往角色表和场景表里追加词项(如"面试话术"),重跑造数据脚本再训练一轮即可,改动都在 readme 的数据制造代码里。
- 加新风格:在风格字典里新增一项,配 3-5 条 few-shot 例句,注意例句的句式和长度要与你期望的输出一致。
- 接知识库:按仓库里 LangChain 知识库助手的套路,把礼仪、民俗资料灌进 RAG,让模型在"人情常识"上不再瞎编。
- 换模型复刻:同一套流程在 Chat-嬛嬛 里被搬到了角色模仿场景,证明它是通用的。
常见坑
- 显存溢出:换
--deepspeed deepspeed_zero3,或降低accumulative_counts。 - 过拟合:表现是回复开始复读训练句;把
max_epochs降到 1-2,尽早停。 - convert 报错找不到权重:检查
WEIGHTS_PATH是否指向work_dirs里最新的那个iter_XXX.pth。 - 中文乱码:json 读写记得
ensure_ascii=False+ utf-8 编码,终端乱码先查系统 locale。
下一步清单
- 用现成数据集跑通一次 7B 的 QLoRA 全流程
- 给自己造 100 条数据,加一个新风格并验证效果差异
- 把 merge 后的模型接上 Streamlit WebDemo
- 给模型挂一个 RAG 知识库
- 把流水线迁移到 Qwen 系列再对比一次
【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调(全参数/Lora)、部署国内外开源大模型(LLM)/多模态大模型(MLLM)教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考