?型号•?数据集•?字符-LLM
这是我们EMNLP 2023论文的官方存储库。欢迎! ???
我们介绍了角色 -可以从实际的经验,特征和情感中学习的角色扮演代理。与提示的代理人相比,角色符号是可训练的代理人,专门训练了角色扮演,能够充当特定的人,例如贝多芬,埃及艳后,朱利叶斯·凯撒(Julius Caesar)等,具有与角色相关的知识和代表性的人物。无需其他提示或参考文档。为了实现这一目标,我们提出了经验重建,这是一个可以生成培训某些特征的详细且多样化的经验数据的数据生成过程。有关更多详细信息,请参阅论文。
概述字符-LLM的构建流。 
我们发布了论文中提到的九个字符的模型。
| 模型 | 检查点 | 特点 | 执照 |
|---|---|---|---|
| 角色-LLM-CLEOPATRA-7B | ?角色-llm-cleopatra-7b-wdiff | 克娄巴特拉七世 | 骆驼1 |
| 字符-llm-voldemort-7b | ?字符-Llm-voldemort-7b-wdiff | 伏地魔勋爵 | 骆驼1 |
| 字符-LLM-Spartacus-7b | ?角色-LLM-Spartacus-7b-Wdiff | 斯巴达克斯 | 骆驼1 |
| 字符-Llm-Hermione-7b | ?角色-llm-Hermione-7b-wdiff | 赫敏·格兰杰(Hermione Granger) | 骆驼1 |
| 角色-LLM-NEWTON-7B | ?角色-LLM-NEWTON-7B-WDIFF | 艾萨克·牛顿 | 骆驼1 |
| 角色-LLM-CAESAR-7B | ?角色-LLM-CAESAR-7B-WDIFF | 朱利叶斯·凯撒 | 骆驼1 |
| 角色-llm-beethoven-7b | ?角色-llm-beethoven-7b-wdiff | 路德维希·范·贝多芬 | 骆驼1 |
| 角色-llm-socrates-7b | ?角色-llm-socrates-7b-wdiff | 苏格拉底 | 骆驼1 |
| 角色-LLM-MARTIN-7B | ?角色-LLM-MARTIN-7B-WDIFF | 马丁·路德·金 | 骆驼1 |
由于Llama 1使用的许可证,我们发布了权重差,您需要通过运行以下命令来恢复权重。
cd FastChat
python3 -m fastchat.model.apply_delta
--base-model-path /path/to/hf-model/llama-7b
--target-model-path /path/to/hf-model/character-llm-beethoven-7b
--delta-path fnlp/character-llm-beethoven-7b-wdiff然后,您可以使用Meta提示符将模型用作聊天机器人。
from transformers import AutoTokenizer , AutoModelForCausalLM
tokenizer = AutoTokenizer . from_pretrained ( "/path/to/hf-model/character-llm-beethoven-7b" )
model = AutoModelForCausalLM . from_pretrained ( "/path/to/hf-model/character-llm-beethoven-7b" ). cuda ()
meta_prompt = """I want you to act like {character}. I want you to respond and answer like {character}, using the tone, manner and vocabulary {character} would use. You must know all of the knowledge of {character}.
The status of you is as follows:
Location: {loc_time}
Status: {status}
The interactions are as follows:"""
name = "Beethoven"
loc_time = "Coffee Shop - Afternoon"
status = f' { name } is casually chatting with a man from the 21st century.'
prompt = meta_prompt . format ( character = name , loc_time = loc_time , status = status ) + ' n n '
inputs = tokenizer ([ prompt ], return_tensors = "pt" )
outputs = model . generate ( ** inputs , do_sample = True , temperature = 0.5 , top_p = 0.95 , max_new_tokens = 50 )
response = tokenizer . decode ( outputs [ 0 ], skip_special_tokens = True )
print ( response )培训数据集可以下载?该链接包含九个字符体验用于训练字符llms的数据。要下载数据集,请使用Python运行以下代码,您可以在/path/to/local_dir中找到下载的数据。
from huggingface_hub import snapshot_download
snapshot_download (
local_dir_use_symlinks = True ,
repo_type = "dataset" ,
repo_id = "fnlp/character-llm-data" ,
local_dir = "/path/to/local_dir" ) prompted/包含可直接监督微调的数据集。并由GPT-3.5-Turbo生成的原始数据generated/组成,可以将其转换为prompted样式。这是培训数据的统计数据。
| #场景 | # 字 | #转 | |
|---|---|---|---|
| 克娄巴特拉七世 | 1.4k | 723k | 14.3 |
| 伏地魔勋爵 | 1.4k | 599k | 13.1 |
| 斯巴达克斯 | 1.4k | 646K | 12.3 |
| 赫敏·格兰杰(Hermione Granger) | 1.5k | 628K | 15.5 |
| 艾萨克·牛顿 | 1.6k | 772k | 12.6 |
| 朱利叶斯·凯撒 | 1.6k | 820k | 12.9 |
| 路德维希·范·贝多芬 | 1.6k | 663k | 12.2 |
| 苏格拉底 | 1.6k | 896k | 14.1 |
| 马丁·路德·金 | 2.2k | 1,038K | 12.0 |
| avg。 | 1.6k | 754k | 13.2 |
1)配置文件构造:选择一个字符(例如贝多芬),并获得该字符的配置文件,其中包含使用nn散布的段落。您可以参考数据data/seed_data/profiles/wiki_Beethoven.txt的数据格式
2)场景提取:将API密钥添加到apikeys.py ,然后使用LLM(GPT-3.5-Turbo)根据配置文件生成的场景。然后,您可以将生成的结果解析为Sence数据。
python run_api_gen_data.py --prompt_name gen_scene --character Beethoven
python parser/parse_data_scene.py result/2023-10-08/gen_scene/gpt-3.5-turbo-temp-0.2-char-Beethoven.jsonl注意:数据生成代码支持失败中的恢复。您可以多次重新运行它,以确保生成足够的样品。
3)经验完成:提示LLM(GPT-3.5-Turbo)在给定场景的情况下生成不同字符的交互。然后,您可以将结果解析为经验数据。
python run_api_gen_data.py --prompt_name gen_dialogue --character Beethoven --data_path processed/2023-10-08/
python parser/parse_data_dialogue.py result/2023-10-08/gen_dialogue/gpt-3.5-turbo-temp-0.2-char-Beethoven.jsonl
4)保护场景:提示LLM(GPT-3.5-Turbo)生成保护场景的互动,这有助于减少角色幻觉。
python run_api_gen_data.py --prompt_name gen_hallucination --character Beethoven --data_path processed/2023-10-08/
python parser/parse_data_hallucination.py result/2023-10-08/gen_hallucination/gpt-3.5-turbo-temp-0.2-char-Beethoven.jsonl5)转换为训练格式:运行以下脚本以获取SFT的培训数据。
python parser/convert_prompt_data.py processed/2023-10-08/generated_agent_dialogue_Hermione.json该培训基于FastChat ,其较小的错误修复了。您可能需要安装一些第三部分软件包才能运行此代码。
您需要准备基本模型(例如Llama-7b,Llama2-7B或您喜欢的其他型号),并运行以下训练脚本,并使用相应的超参数来培训角色-LLM。在8 A100 GPU上训练应该需要30〜45分钟。训练模型后,您可以通过from_pretrained加载并使用类似于上面的示例。
cd FastChat
export CHARACTER=Beethoven
torchrun --nproc_per_node=8 --master_port=20031 fastchat/train/train_mem.py
--model_name_or_path /path/hf_model/llama-7b
--data_path /path/to/prompted_agent_dialogue_ $CHARACTER .json
--already_preprocess True
--bf16 True
--output_dir /path/to/ckpt/ ${CHARACTER} _7b
--num_train_epochs 10
--per_device_train_batch_size 2
--per_device_eval_batch_size 16
--gradient_accumulation_steps 4
--evaluation_strategy epoch
--save_strategy epoch
--save_total_limit 10
--learning_rate 2e-5
--weight_decay 0.1
--warmup_ratio 0.04
--lr_scheduler_type cosine
--logging_steps 1
--fsdp ' full_shard auto_wrap '
--fsdp_transformer_layer_cls_to_wrap LlamaDecoderLayer
--tf32 True
--model_max_length 2048
--gradient_checkpointing True
推断还需要FastChat 。您可以通过以下命令来启动模型推理服务器:
cd FastChat
# start the controller
export IP= $( hostname -i )
python3 -m fastchat.serve.controller --host $IP &
# start the Openai Format API server
python3 -m fastchat.serve.openai_api_server --host 0.0.0.0 --port 28001 --controller-address http:// $IP :21001
# start the model worker
export MODEL_PATH=/path/to/ckpt/ ${CHARACTER} _7b/
export MODEL_NAME= ${CHARACTER} _7b
CUDA_VISIBLE_DEVICES=0 python3 -m fastchat.serve.model_worker --model-path $MODEL_PATH --model-names $MODEL_NAME --controller-address http:// $IP :21001 --host $IP --port 21009 --worker-address http:// $IP :21009您可以运行多个Model_worker来连接到控制器以加快推理。然后,使用以下代码运行Singe-Turn和Multi-Turn访谈。
python run_api_interview_single.pypython run_api_interview_turns.py sft对于生成的字符-LLM和其他基线的样本,请检查data/gen_results ,其中interview_single存储了不同模型的单转访谈,而interview_turns则存储了多转弯访谈的结果。
来自模拟贝多芬的不同方法的单转弯访谈输出。 
我们可训练的Cleopatra VII的多转弯访谈输出。 
我们可训练的苏格拉底训练代理人的多转弯访谈输出。 
如果您发现此存储库中的资源有用,请引用我们的工作:
@inproceedings { shao2023character ,
title = { Character-LLM: A Trainable Agent for Role-Playing } ,
author = { Yunfan Shao and Linyang Li and Junqi Dai and Xipeng Qiu } ,
booktitle = { EMNLP } ,
year = 2023
}与该项目相关的包括生成的数据,代码和模型在内的资源仅用于学术研究目的,不能用于商业目的。字符llms产生的内容受到不可控制的变量(例如随机性)的影响,因此,该项目无法保证输出的准确性和质量。该项目的作者对本项目中资源的使用造成的任何潜在后果概不负责。