微信聊天记录微调 ChatGLM 打造数字克隆: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
让微信里的 AI 助手真正像真人一样接话,核心思路就是拿自己的聊天记录去微调一个大模型。WeClone 做的是这件事:用 ChatGLM 3-6B 做底座,LoRA 方式做 SFT,把"你的说话风格"灌进模型里,再挂到微信机器人上。效果上限基本由聊天数据的数量和质量决定,这一点在动手前要先有预期。
环境准备:不装好就跑不起来
软件层面,README 给出了最低与推荐版本,实际使用建议按推荐档配置:
| 依赖 | 最低 | 推荐 |
|---|---|---|
| Python | 3.8 | 3.10 |
| torch | 1.13.1 | 2.2.1 |
| transformers | 4.37.2 | 4.38.1 |
可选加速项:CUDA 11.6+、deepspeed、bitsandbytes、flash-attn。硬件上,LoRA 微调 6B 模型约需 16GB 显存;如果只有 10GB 左右,QLoRA 可以压到 6~10GB,但要改模板配置,先按默认方案走。
conda create -n weclone python=3.10 conda activate weclone pip install -r requirements.txt聊天记录用 PyWxDump 导出为 CSV,按"每个联系人一个文件夹"的结构放进 data/ 下。注意 make_dataset/csv_to_json.py 读的是固定路径./data/csv,目录不对脚本会直接空转。
模型首选 Hugging Face 上的 ChatGLM 3-6B;国内网络不稳可以走 ModelScope,但后续所有训练推理命令前都要带上export USE_MODELSCOPE_HUB=1,漏了会报找不到模型。
最小可运行闭环:从克隆仓库到弹出第一句回复
整条最短路径只有四步,每步一条核心命令。
第一步,克隆仓库:
git clone https://gitcode.com/GitHub_Trending/we/WeClone第二步,配置并转换数据。把 settings.json 里的model_name_or_path指向模型目录,然后运行数据预处理:
python make_dataset/csv_to_json.py脚本会自动过滤手机号、身份证、邮箱等敏感内容,再按"一问一答"配对生成 data/res_csv/sft/sft-my.json。同一人连发多条消息时,make_dataset/ 下有三个脚本对应三种处理方式:逗号拼接、只取最长回答、或放进多轮 history,默认用csv_to_json.py即可。
第三步,SFT 微调:
python src/train_sft.py作者训练后的 loss 停在 3.5 左右,继续往下降往往就开始过拟合,曲线掉得太猛可以提前停。
第四步,浏览器验证:
python src/web_demo.py页面打开后输入"哈喽",模型能接上话、自称名字、接住"你是 95 年的?"这种语境,就说明整条链路通了。
功能与能力展示
日常对话拟人化。训练后的模型会保持角色一致性,对话不跳戏,能记住前文上下文,回复长度和语气贴近真人聊天习惯,而不是"作为 AI 助手"那种腔调。
口语风格还原。网络流行语和表情记号都能接住,比如"我瘦成狗了"配[doge]这种场景,模型会顺着梗往下聊:
微信原生接入。先用python src/api_service.py起一个本地 API 服务(默认 8000 端口),再跑 src/wechat_bot/main.py 扫码登录,就能私聊或在群里 @ 机器人。机器人侧保留最近 15 轮上下文,回复会按逗号拆成多条消息、间隔 2.2 秒发出,模拟真人打字节奏,避免一眼看穿是机器。
进阶定制:数据、参数与模板按需展开
以下三项都不影响最小闭环,用到哪个再改哪个。
数据清洗。预处理脚本默认剔除隐私字段,还提供了一个禁用词词库 make_dataset/blocked_words.json,命中禁用词的整句会被丢弃。聊天记录里不想让模型学的内容,加进去就行。
训练与推理调参。都在 settings.json:显存吃紧就调小per_device_train_batch_size,或减小lora_rank(默认 4);数据量不大时num_train_epochs别拉太高。推理侧的temperature、top_p、repetition_penalty控制回复的随机程度,重复啰嗦就调高 repetition_penalty,回复太木就适当调高 temperature。
对话模板。风格人设在 src/template.py 的default_prompt里,默认是"请你扮演一名人类,不要说自己是人工智能"。想让它自称某个名字、带点方言口癖,直接改这句话,重新训练生效。
常见坑与自查
模型路径配错了会怎样?训练或 demo 启动阶段就报找不到 checkpoint。核对 settings.json 中model_name_or_path指向的目录是否真的存在模型权重文件。
显存不够 OOM 怎么办?优先调小per_device_train_batch_size,其次降低lora_rank;仍不够再考虑 QLoRA 量化方案。
loss 降得特别快、回复开始复读?大概率过拟合,提前停训,并适当降低num_train_epochs。
数据太少,回复风格不明显?正常现象,最终效果强依赖数据量,优先补同一联系人、跨度更长的聊天记录再重训。
微信号相关。微信机器人有封号风险,作者建议用小号且账号需绑定银行卡,别拿主号试。
跑通之后,建议先用 10 条左右的聊天记录试跑一轮微调,观察回复风格是否接近预期,再决定要不要扩大数据集和加大训练轮数。
【免费下载链接】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),仅供参考