用微信聊天記錄訓練一個你專屬的聊天機器人。
微信聊天記錄會加密儲存在sqlite 資料庫中,首先需要取得資料庫金鑰,你需要一台macOS 筆記本,手機使用Android/iPhone 均可,執行以下步驟:
git clone https://github.com/nalzok/wechat-decipher-macos
sudo ./wechat-decipher-macos/macos/dbcracker.d -p $( pgrep WeChat ) | tee dbtrace.log
dbtrace.log
內,樣例如下。 sqlcipher '/Users/<user>/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/2.0b4.0.9/5976edc4b2ac64741cacc525f229c5fe/Message/msg_0.db'
--------------------------------------------------------------------------------
PRAGMA key = "x'<384_bit_key>'";
PRAGMA cipher_compatibility = 3;
PRAGMA kdf_iter = 64000;
PRAGMA cipher_page_size = 1024;
........................................
其他作業系統使用者可以嘗試以下方式,僅調查未驗證過,供參考:
EnMicroMsg.db
:https://github.com/ppwwyyxx/wechat-dumpEnMicroMsg.db
密鑰: https://github.com/chg-hou/EnMicroMsg.db-Password-Cracker在我的macOS 筆記本上,微信聊天記錄儲存在msg_0.db
- msg_9.db
內,只解密這幾個資料庫即可。
需要安裝sqlcipher 進行解密,macOS 系統使用者直接執行:
brew install sqlcipher
執行下列腳本,自動解析dbtrace.log
,解密msg_x.db
並匯出至plain_msg_x.db
。
python3 decrypt.py
可以透過https://sqliteviewer.app/ 開啟解密後的資料庫plain_msg_x.db
,找到你所需聊天記錄所在的表,將資料庫和表名填寫到prepare_data.py
內,執行下面腳本產生訓練資料train.json
,目前策略比較簡單,僅處理了單輪對話,會將5 分鐘內連續的對話合併。
python3 prepare_data.py
訓練資料樣例如下:
[
{ "instruction" : "你好" , "output" : "你好" }
{ "instruction" : "你是谁" , "output" : "你猜猜" }
]
準備一台有GPU 的linux 機器,將train.json
scp 到GPU 機器上。
我使用的是stanford_alpaca 全圖微調LLaMA-7B,在8 卡V100-SXM2-32GB 上訓練90k 資料3 個epoch,只需1 小時。
# clone the alpaca repo
git clone https://github.com/tatsu-lab/stanford_alpaca.git && cd stanford_alpaca
# adjust deepspeed config ... such as disabling offloading
vim ./configs/default_offload_opt_param.json
# train with deepspeed zero3
torchrun --nproc_per_node=8 --master_port=23456 train.py
--model_name_or_path huggyllama/llama-7b
--data_path ../train.json
--model_max_length 128
--fp16 True
--output_dir ../llama-wechat
--num_train_epochs 3
--per_device_train_batch_size 8
--per_device_eval_batch_size 8
--gradient_accumulation_steps 1
--evaluation_strategy " no "
--save_strategy " epoch "
--save_total_limit 1
--learning_rate 2e-5
--weight_decay 0.
--warmup_ratio 0.03
--lr_scheduler_type " cosine "
--logging_steps 10
--deepspeed " ./configs/default_offload_opt_param.json "
--tf32 False
DeepSpeed zero3 會分片保存權重,需要將它們合併成一個pytorch checkpoint 檔案:
cd llama-wechat
python3 zero_to_fp32.py . pytorch_model.bin
消費級顯示卡上可以嘗試alpaca-lora 僅微調lora 權重,可以顯著降低顯存和訓練成本。
可以使用alpaca-lora 部署gradio 前端,以供調試使用。如果是全圖微調,需要把peft 相關程式碼註解掉,只載入基礎模型。
git clone https://github.com/tloen/alpaca-lora.git && cd alpaca-lora
CUDA_VISIBLE_DEVICES=0 python3 generate.py --base_model ../llama-wechat
運行效果:
需要部署一個相容OpenAI API 的模型服務,這裡基於llama4openai-api.py 簡單適配下,請參閱本倉庫裡的llama4openai-api.py,啟動服務:
CUDA_VISIBLE_DEVICES=0 python3 llama4openai-api.py
測試介面是否可用:
curl http://127.0.0.1:5000/chat/completions -v -H " Content-Type: application/json " -H " Authorization: Bearer $OPENAI_API_KEY " --data ' {"model":"llama-wechat","max_tokens":128,"temperature":0.95,"messages":[{"role":"user","content":"你好"}]} '
使用wechat-chatgpt 接取微信,API 位址填自己本地的模型服務位址:
docker run -it --rm --name wechat-chatgpt
-e API=http://127.0.0.1:5000
-e OPENAI_API_KEY= $OPENAI_API_KEY
-e MODEL= " gpt-3.5-turbo "
-e CHAT_PRIVATE_TRIGGER_KEYWORD= " "
-v $( pwd ) /data:/app/data/wechat-assistant.memory-card.json
holegots/wechat-chatgpt:latest
運行效果:
"剛接入" 是機器人說的第一句話,對方到最後也沒猜到。
整體來看,用聊天記錄訓練的機器人必然會有一些常識性錯誤,但在聊天風格上已經模仿的比較好了。