WeClone 完整指南:用微信聊天记录微调大语言模型,做出你的微信数字分身
【免费下载链接】WeClone🚀 One-stop solution for creating your AI twin from chat history 💡 Fine-tune LLMs with your chat logs to capture your unique style, then bind to a chatbot to bring your digital self to life.项目地址: https://gitcode.com/GitHub_Trending/we/WeClone
WeClone 用你真实的微信聊天记录微调一个大语言模型,再把它接进微信机器人,生成一个会用你口吻回话的数字分身,私聊、群聊都自动应答。全流程拆成三幕:第一幕讲清原理与硬件,第二幕把聊天记录变成数据,第三幕训练与上线。显存门槛 16GB,核心命令都在文内。
🧠 第一幕:数字分身原理——16GB 显存微调 6B 模型
16GB 显存足够完成 6B 模型的 SFT 微调,这是整个项目唯一的硬性门槛。
原因在于微调方式。7B 模型全参数微调,16 位精度要大约 160GB 显存,消费级显卡无解;WeClone 走 LoRA 路线——冻结基座模型权重,只训练注入注意力层的一小组低秩矩阵(本项目把目标锁定在 query_key_value 上,默认秩为 4)。同样 16 位精度下,LoRA 微调 7B 模型约 16GB,QLoRA 8 位约 10GB,4 位约 6GB。显卡低于 16GB,直接切 QLoRA。
模型又是怎么学会你的说话方式的?答案在训练样本的构造里:每一条样本都是"别人问 → 你原话回"的配对,模型反复见过你的措辞、标点习惯和回复长度,语气就是这么被带出来的。
硬件过关,环境跟上。克隆仓库后建独立 conda 环境装依赖:
git clone https://gitcode.com/GitHub_Trending/we/WeClone conda create -n weclone python=3.10 conda activate weclone cd WeClone pip install -r requirements.txtPython 3.10 是推荐版本;deepspeed、bitsandbytes、flash-attn 都是可选项,只在多卡或量化时用才装。
📦 第二幕:微信记录导出与敏感信息过滤——把聊天记录变成微调数据集
用 PyWxDump 导出微信聊天数据库,把所有联系人和群聊的 csv 文件夹统一放进 ./data/csv 目录,一个聊天对象一个文件夹。
PyWxDump 的流程:安装工具、解密数据库,然后选"聊天备份",导出类型选 CSV,支持一次导出多个联系人或群聊。
随后跑预处理脚本:
python make_dataset/csv_to_json.py脚本干三件事。第一,只保留你自己发出的消息:微调目标是模仿"你"的回复,你发的(is_sender=1)作为答案,对方的消息作为问题。第二,剔除含手机号、身份证号、邮箱、http 链接的消息——模型不该记住你的隐私。第三,禁用词过滤:往 make_dataset/blocked_words.json 里加词,含禁用词的整句直接丢掉。
合并策略也值得看一眼。默认脚本把同一人连发的多句用逗号接成一句话,间隔超过 1 小时就切分,图片、链接类消息充当分隔点。想保留多轮上下文而不是合并,换用 make_dataset/csv_to_json-单句多轮.py,连续的回答会放进提示词的 history 字段参与训练。
最终产物是 data/res_csv/sft/ 下 instruction/output 格式的问题-回答对 json,有效配对越多,语气越稳。
🚀 第三幕:训练、验证、上线——6B 模型微调教程到微信机器人落地
一条训练命令、一个本地页面、两条终端命令,第三幕照顺序执行即可。
一条命令完成微信记录 LoRA 微调
训练前把 chatglm3-6b 权重放进 ./chatglm3-6b 目录,准备工作就全完成了。首选从 Hugging Face 下载 ChatGLM3-6B 权重;网络不稳就用魔搭社区:训练与推理前设置环境变量 USE_MODELSCOPE_HUB=1,再用 git lfs 拉取 ZhipuAI/chatglm3-6b 权重。
全部超参数集中在 settings.json,克隆到本地后只改这一个文件,代码不动:
| 用途 | 键 | 默认值 |
|---|---|---|
| 显存占用 | per_device_train_batch_size、gradient_accumulation_steps | 4 / 8 |
| 训练轮数 | num_train_epochs | 3 |
| 适配强度 | lora_rank、lora_dropout | 4 / 0.5 |
| 学习率 | learning_rate | 1e-4 |
显存紧张就调小前两个键,数据量大就适当加轮数。
python src/train_sft.py多卡训练:先装 deepspeed,再用deepspeed --num_gpus=2 src/train_sft.py启动(按实际卡数填),多卡分摊负载。训练好坏有参考数字:loss 降到 3.5 上下属正常,降得明显更低反而是过拟合信号。
本地页面验证口吻
运行python src/web_demo.py起本地页面,先和模型聊几轮再决定要不要上线。
看措辞、标点习惯、回复长短是否和你平时聊天一致。口吻不对,先回头调轮数和 lora_rank,别急着接微信。
两条命令上线微信数字分身
API 服务在前、机器人在后,两个终端顺序不能反:
python src/api_service.py python src/wechat_bot/main.py第二个终端打印登录二维码,微信扫码即登录。私聊它自动回复,群聊里 @ 它也生效。对话历史由 src/wechat_bot/main.py 维护(保留 15 轮),长回复会拆成短句、每条间隔约 2 秒发出,模拟打字节奏。下图是训好的数字分身的对话实录:
⚠️ 避坑与调优清单
上线前把这份清单过一遍,每条都能省一次返工。
- 微信机器人有封号风险。用小号跑,账号需绑定银行卡,别用日常重度聊天的主号。
- 想让机器人换角色说话。修改 src/template.py 里的 default_prompt 系统提示词,默认是"扮演人类、不要承认自己是人工智能"。
- 数据扩充是提升效果最直接的路。先用一两个密友的数据跑通全流程验证口吻,再逐步加人、重新训练。
- 显存不够时。调小 per_device_train_batch_size 和 gradient_accumulation_steps;仍不够就切 QLoRA(8 位约 10GB,4 位约 6GB)。
- 训练质量参考线。loss 3.5 上下是健康区间;网页验证口吻不对,先调轮数与 lora_rank,再考虑动数据。
现在就动手:把一个密友的聊天记录导出成 CSV 放进 data/csv,按预处理、训练、本地页面验证的顺序跑完一整圈——"像不像你",一晚上就有答案。
【免费下载链接】WeClone🚀 One-stop solution for creating your AI twin from chat history 💡 Fine-tune LLMs with your chat logs to capture your unique style, then bind to a chatbot to bring your digital self to life.项目地址: https://gitcode.com/GitHub_Trending/we/WeClone
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考