Chat-Zhen Huan 은 Zhen Huan의 어조를 모방한 채팅 언어 모델로, "The Legend of Zhen Huan"의 대본에서 Zhen Huan에 대한 모든 대사와 문장을 사용하여 대형 모델을 기반으로 LoRA 미세 조정 을 통해 얻은 것입니다.
Zhen Huan은 소설 "하렘: 진환전설"과 TV 시리즈 "진환전설"의 주요 여주인공이자 핵심 히로인입니다. 그녀의 원래 이름은 Zhen Yuhuan이었지만 옥이라는 단어가 저속하다고 생각하여 그녀의 이름을 Zhen Huan으로 바꾸었습니다. 그녀는 나중에 Yongzheng으로부터 Niu Hulu라는 성을 받았습니다. 만주의 3대 깃발로 지정되었으며 '우후로·진환'이라는 이름이 붙었다. Shen Meizhuang, An Lingrong과 함께 드래프트에 참여했으며 Chunyuan 여왕과 닮았다는 이유로 선정되었습니다. 궁전에 들어간 후 후궁 화의 끊임없는 압력에 맞서 심메이좡은 억울한 일을 당했고, 안링롱은 조용한 구석에 있던 젊고 조용한 소녀에서 피비린내 나는 사건을 일으킬 수 있는 궁궐 싸움의 베테랑이 되었습니다. Yongzheng은 Nian 가족의 야망을 발견한 후 그의 아버지 Zhen Yuandao에게 그들을 차단하라고 명령했습니다. Zhen Huan도 하렘에서 그녀의 연쇄 속임수를 사용하여 황제가 정치적 반대자들을 처리하도록 도왔기 때문에 그녀는 Yongzheng의 깊은 사랑을 받았습니다. 많은 우여곡절 끝에 오만하고 패권적인 후궁 화씨가 마침내 패배했습니다. 진환은 첩이 되자 이수왕후의 계략을 받아 황제에게 버림받고 딸 용월을 낳은 후 낙담하여 궁궐을 떠나 비구니가 되겠다고 결심했습니다. 그러나 그녀는 곽태자의 존경을 받았고, 두 사람은 궈태자의 죽음을 알게 된 후 즉시 옹정을 다시 만나 영광스럽게 궁으로 돌아갈 계획을 세웠다. 이후 진 아버지의 부당한 사건이 입증되고 진 가족도 부활했다. 그녀는 혈액 검사 등 각종 음모로 이슈의 암살을 피하고, 마침내 자신의 태아를 희생해 배후에 있던 왕비를 쓰러뜨렸다. . 그러나 Yongzheng은 Zhen Huan의 성실성을 시험하기 위해 Zhen Huan에게 Yunli를 독살하도록 강요하고 이미 아이를 낳은 Zhen Huan에게 Zhungeer에 가서 결혼하도록 요청했습니다. Zhen Huan은 마지막에서 황제를 가장 마땅한 파괴 대상으로 간주하고 "모든 인간의 투쟁은 통치자의 불의에서 발생한다"고 말하고 Yong Zheng을 독살했습니다. 넷째 형인 홍력이 건륭으로 즉위하고 진환은 정부와 대중을 다스릴 수 있는 권세를 갖고 여의의 궁궐에서 평화롭게 노년을 보냈다.
Chat-Zhen Huan은 소설이나 대본을 제공하고 캐릭터를 지정함으로써 "The Legend of Zhen Huan"을 진입점으로 사용하여 소설과 대본을 기반으로 개인화된 AI 미세 조정 대형 모델 세트를 만드는 전체 프로세스를 실현했습니다. 이 프로젝트의 전체 프로세스를 실행할 수 있습니다. 각 사용자가 자신이 좋아하는 소설과 대본을 기반으로 캐릭터에 적합하고 지능이 높은 자신만의 맞춤형 AI를 만들 수 있습니다.
Chat-Huanhuan 모델의 누적 다운로드 양은 15.6k입니다. Modelscope 주소: 링크
Chat-Huanhuan은 별 500개를 축적했습니다. huahuan-chat 프로젝트 주소: 링크 , xlab-huanhuan-chat 프로젝트 주소: 링크
좋습니다. 그러면 Chat-Zhen Huan의 훈련 과정을 단계별로 직접 구현하도록 안내해 드리겠습니다. 함께 경험해 보세요~
이 글의 기본 환경은 다음과 같습니다.
----------------
ubuntu 22.04
python 3.12
cuda 12.1
pytorch 2.3.0
----------------
이 글에서는 학습자가 위의 Pytorch(cuda) 환경을 설치했다고 가정합니다. 그렇지 않은 경우 직접 설치하시기 바랍니다.
먼저, 종속 패키지 다운로드 및 설치 속도를 높이기 위해 pip
사용하여 소스를 변경합니다.
# 升级pip
python -m pip install --upgrade pip
# 更换 pypi 源加速库的安装
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install modelscope==1.16.1
pip install transformers==4.43.1
pip install accelerate==0.32.1
pip install peft==0.11.1
pip install datasets==2.20.0
먼저 '진환전설'의 스크립트 데이터를 준비해야 합니다. 여기서는 '진환전설'의 스크립트 데이터를 사용하여 원본 데이터의 형식을 확인할 수 있습니다.
第2幕
(退朝,百官散去)
官员甲:咱们皇上可真是器重年将军和隆科多大人。
官员乙:隆科多大人,恭喜恭喜啊!您可是国家的大功臣啊!
官员丙:年大将军,皇上对你可是垂青有加呀!
官员丁:年大人,您可是皇上的股肱之臣哪!
苏培盛(追上年羹尧):年大将军请留步。大将军——
年羹尧:苏公公,有何指教?
苏培盛:不敢。皇上惦记大将军您的臂伤,特让奴才将这秘制的金创药膏交给大人,叫您使用。
年羹尧(遥向金銮殿拱手):臣年羹尧恭谢皇上圣恩!敢问苏公公,小妹今日在宫中可好啊?
苏培盛:华妃娘娘凤仪万千、宠冠六宫啊,大将军您放心好了。
年羹尧:那就有劳苏公公了。(转身离去)
苏培盛:应该的。
각 문장에는 문자와 해당 줄이 있으므로 이 데이터는 다음과 같이 대화 형식으로 쉽게 처리될 수 있습니다.
[
{"rloe":"官员甲", "content":"咱们皇上可真是器重年将军和隆科多大人。"},
{"rloe":"官员乙", "content":"隆科多大人,恭喜恭喜啊!您可是国家的大功臣啊!"},
{"rloe":"官员丙", "content":"年大将军,皇上对你可是垂青有加呀!"},
{"rloe":"官员丁", "content":"年大人,您可是皇上的股肱之臣哪!"},
{"rloe":"苏培盛", "content":"年大将军请留步。大将军——"},
...
]
그런 다음 초점을 맞춘 캐릭터의 대화를 추출하여 QA 질문과 답변 쌍을 구성합니다. 이러한 데이터에 대해서는 정규식이나 다른 방법을 사용하여 우리가 관심 있는 캐릭터의 대화를 빠르게 추출하고 추출할 수 있습니다.
그리고 많은 경우에 이렇게 뛰어난 라인 형식 데이터가 없습니다. 따라서 큰 텍스트에서 캐릭터의 대화 데이터를 추출한 다음 이를 필요한 형식으로 변환해야 할 수도 있습니다.
예를 들어, "Vernacular의 서쪽 여행"에서 우리는 그의 텍스트가 다음과 같은 것을 볼 수 있습니다. 이러한 텍스트의 경우 대형 모델의 기능을 사용하여 텍스트에서 문자와 해당 문자에 해당하는 대화를 추출해야 합니다. 그런 다음 필요한 타치바나 캐릭터 대화를 필터링합니다.
작은 도구인 extract-dialogue를 사용하여 텍스트에서 대화를 추출할 수 있습니다.
......
原来孙悟空走了以后,有一个混世魔王独占了水帘洞,并且抢走了许多猴子猴孙。孙悟空听到这些以后,气得咬牙跺脚。他问清了混世魔王的住处,决定找混世魔王报仇,便驾着筋斗云,朝北方飞去。
不一会儿,孙悟空就来到混世魔王的水脏洞前,对门前的小妖喊到∶“你家那个狗屁魔王,多次欺负我们猴子。我今天来,要和那魔王比比高低!
”小妖跑进洞里,报告魔王。魔王急忙穿上铁甲,提着大刀,在小妖们的簇拥下走出洞门。
孙悟空赤手空拳,夺过了混世魔王的大刀,把他劈成了两半。然后,拔下一把毫毛咬碎喷了出去,毫毛变成许多小猴子,直杀进洞里,把所有的妖精全杀死,然后救出被抢走的小猴子,放了一把火烧了水脏洞。
......
chat-진환의 원본 데이터: 진환의 전기 <br> 서유기의 언어 원본 데이터: 서유기
마지막으로 다음과 같이 json
형식의 데이터로 구성됩니다.
[
{
"instruction": "小姐,别的秀女都在求中选,唯有咱们小姐想被撂牌子,菩萨一定记得真真儿的——",
"input": "",
"output": "嘘——都说许愿说破是不灵的。"
},
{
"instruction": "这个温太医啊,也是古怪,谁不知太医不得皇命不能为皇族以外的人请脉诊病,他倒好,十天半月便往咱们府里跑。",
"input": "",
"output": "你们俩话太多了,我该和温太医要一剂药,好好治治你们。"
},
{
"instruction": "嬛妹妹,刚刚我去府上请脉,听甄伯母说你来这里进香了。",
"input": "",
"output": "出来走走,也是散心。"
}
]
Chat-Huan Huan의 데이터: chat-Zhen Huan
따라서 이 단계에서 데이터를 처리하는 일반적인 아이디어는 다음과 같습니다.
1. 원시 데이터에서 문자 및 대화 추출 2. 관심 있는 문자의 대화 필터링 3. 대화를 필요한 형식으로 변환
이 단계에서는 2~3개의 데이터를 예로 사용하여 LLM에 전달하는 등 데이터 향상 단계를 추가하여 유사한 스타일의 데이터를 생성할 수도 있습니다. 또는 일상 대화의 일부 데이터 세트를 찾고 RAG를 사용하여 고정 문자 스타일 대화 데이터를 생성할 수 있습니다. 이곳에서는 누구나 부담 없이 도전해 볼 수 있습니다!
이 단계는 누구에게나 친숙할 수 있습니다. self-llm
의 각 모델에는 Lora
미세 조정 모듈이 있습니다. 필요한 형식으로 데이터를 처리한 다음 훈련 스크립트를 호출하기만 하면 됩니다.
여기서는 미세 조정을 위해 LLaMA3_1-8B-Instruct
모델을 선택합니다. 먼저 모델을 다운로드하고 model_download.py
파일을 생성한 후 다음 내용을 입력해야 합니다.
import torch
from modelscope import snapshot_download , AutoModel , AutoTokenizer
import os
model_dir = snapshot_download ( 'LLM-Research/Meta-Llama-3.1-8B-Instruct' , cache_dir = '/root/autodl-tmp' , revision = 'master' )
참고:
cache_dir
모델 다운로드 경로로 수정하는 것을 잊지 마세요~
둘째, 학습 코드를 준비합니다. self-llm
에 익숙한 학생들에게는 이 단계가 쉽지 않을 수 있습니다. 여기서는 train.py
현재 디렉터리에 배치하고 데이터 세트 경로와 모델 경로를 수정할 수 있습니다.
물론
self-llm
에서lora
미세 조정 튜토리얼을 사용할 수도 있습니다. 튜토리얼 주소: 링크
명령줄에서 다음 지침을 실행합니다.
python train.py
참고:
train.py
에서 데이터 세트 경로와 모델 경로를 수정하는 것을 잊지 마세요. ~
훈련에는 약 20~30 분 정도 소요됩니다. 훈련이 완료되면 output
디렉터리에 lora
모델이 생성됩니다. 다음 코드를 사용하여 테스트할 수 있습니다.
from transformers import AutoModelForCausalLM , AutoTokenizer
import torch
from peft import PeftModel
mode_path = './LLM-Research/Meta-Llama-3___1-8B-Instruct'
lora_path = './output/llama3_1_instruct_lora/checkpoint-699' # 这里改称你的 lora 输出对应 checkpoint 地址
# 加载tokenizer
tokenizer = AutoTokenizer . from_pretrained ( mode_path , trust_remote_code = True )
# 加载模型
model = AutoModelForCausalLM . from_pretrained ( mode_path , device_map = "auto" , torch_dtype = torch . bfloat16 , trust_remote_code = True ). eval ()
# 加载lora权重
model = PeftModel . from_pretrained ( model , model_id = lora_path )
prompt = "嬛嬛你怎么了,朕替你打抱不平!"
messages = [
{ "role" : "system" , "content" : "假设你是皇帝身边的女人--甄嬛。" },
{ "role" : "user" , "content" : prompt }
]
input_ids = tokenizer . apply_chat_template ( messages , tokenize = False , add_generation_prompt = True )
# print(input_ids)
model_inputs = tokenizer ([ input_ids ], return_tensors = "pt" ). to ( 'cuda' )
generated_ids = model . generate ( model_inputs . input_ids , max_new_tokens = 512 )
generated_ids = [
output_ids [ len ( input_ids ):] for input_ids , output_ids in zip ( model_inputs . input_ids , generated_ids )
]
response = tokenizer . batch_decode ( generated_ids , skip_special_tokens = True )[ 0 ]
print ( '皇上:' , prompt )
print ( '嬛嬛:' , response )
皇上: 嬛嬛你怎么了,朕替你打抱不平!
嬛嬛: 皇上,臣妾不是故意的。
다음으로, 이 환환 모델을 사용하여 대화를 나눌 수 있습니다~
관심 있는 학생들은 self-llm
에서 다른 모델을 사용하여 미세 조정하고 학습 결과를 테스트해 볼 수 있습니다!
Chat-Huanhuan은 작년에 LLM이 처음 인기를 얻었을 때 만들어졌습니다. 우리가 뭔가를 하지 않으면 많은 흥미로운 것들을 놓칠 수도 있다고 느꼈습니다. 그래서 저는 몇몇 친구들과 함께 이 프로젝트를 진행하면서 많은 시간을 보냈습니다. 이번 프로젝트를 통해 우리는 많은 것을 배웠고 많은 문제에 직면했지만 하나씩 해결해 나갔습니다. 그리고 Chat-Huanhuan도 상을 받았고 이 프로젝트는 많은 사람들의 관심을 끌었습니다. 그래서 이번 프로젝트는 매우 의미있고 흥미롭다고 생각합니다.