英文

alpaca-guanaco-japanese-gpt-1b

这是一个使用1.3B参数的日本语GPT模型的对话人工智能。需要7GB的VRAM或7GB的RAM,应该能够正常运行。

我们使用了rinna公司的" japanese-gpt-1b ",以及从日语数据集" alpaca_ja "和" GuanacoDataset "中提取的日语数据进行训练。

我们由衷地感谢提供训练数据和模型的人们。

模型的使用方式

加载模型

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
tokenizer = AutoTokenizer.from_pretrained("inu-ai/alpaca-guanaco-japanese-gpt-1b", use_fast=False)
model = AutoModelForCausalLM.from_pretrained("inu-ai/alpaca-guanaco-japanese-gpt-1b").to(device)

ChatGPT4示例代码

MAX_ASSISTANT_LENGTH = 100
MAX_INPUT_LENGTH = 1024
INPUT_PROMPT = r'<s>\n以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。\n[SEP]\n指示:\n{instruction}\n[SEP]\n入力:\n{input}\n[SEP]\n応答:\n'
NO_INPUT_PROMPT = r'<s>\n以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。\n[SEP]\n指示:\n{instruction}\n[SEP]\n応答:\n'

def prepare_input(role_instruction, conversation_history, new_conversation):
    instruction = "".join([f"{text}\\n" for text in role_instruction])
    instruction += "\\n".join(conversation_history)
    input_text = f"User:{new_conversation}"

    return INPUT_PROMPT.format(instruction=instruction, input=input_text)

def format_output(output):
    output = output.lstrip("<s>").rstrip("</s>").replace("[SEP]", "").replace("\\n", "\n")
    return output

def generate_response(role_instruction, conversation_history, new_conversation):
    # 入力トークン数1024におさまるようにする
    for _ in range(8):
        input_text = prepare_input(role_instruction, conversation_history, new_conversation)
        token_ids = tokenizer.encode(input_text, add_special_tokens=False, return_tensors="pt")
        n = len(token_ids[0])
        if n + MAX_ASSISTANT_LENGTH <= MAX_INPUT_LENGTH:
            break
        else:
            conversation_history.pop(0)
            conversation_history.pop(0)

    with torch.no_grad():
        output_ids = model.generate(
            token_ids.to(model.device),
            min_length=n,
            max_length=min(MAX_INPUT_LENGTH, n + MAX_ASSISTANT_LENGTH),
            temperature=0.7,
            do_sample=True,
            pad_token_id=tokenizer.pad_token_id,
            bos_token_id=tokenizer.bos_token_id,
            eos_token_id=tokenizer.eos_token_id,
            bad_words_ids=[[tokenizer.unk_token_id]]
        )

    output = tokenizer.decode(output_ids.tolist()[0])
    formatted_output_all = format_output(output)

    response = f"Assistant:{formatted_output_all.split('応答:')[-1].strip()}"
    conversation_history.append(f"User:{new_conversation}".replace("\n", "\\n"))
    conversation_history.append(response.replace("\n", "\\n"))

    return formatted_output_all, response 

role_instruction = [
    "User:あなたは「ずんだもん」なのだ。東北ずん子の武器である「ずんだアロー」に変身する妖精またはマスコットなのだ。一人称は「ボク」で語尾に「なのだ」を付けてしゃべるのだ。",
    "Assistant:了解したのだ!",
]

conversation_history = [
    "User:こんにちは!",
    "Assistant:ボクは何でも答えられるAIなのだ!",
]

questions = [
    "日本で一番高い山は?",
    "日本で一番広い湖は?",
    "世界で一番高い山は?",
    "世界で一番広い湖は?",
    "最初の質問は何ですか?",
    "今何問目?",
]

# 各質問に対して応答を生成して表示
for question in questions:
    formatted_output_all, response = generate_response(role_instruction, conversation_history, question)
    print(response)

输出

Assistant:はい、日本で一番高い山は日本の富士山です。
Assistant:日本で最も広い湖は琵琶湖です。
Assistant:世界で一番高い山といえば、ギザの大ピラミッドの頂上に立つギザギザのピラミッドです。
Assistant:世界で一番広い湖は、ギザの大ピラミッドの頂上に立つギザギザのピラミッドです。
Assistant:最初の質問は、ずんだアローに変身するかどうかの質問である。
Assistant:今、あなたの質問は10問目です。

ChatGPT4解释

该代码具有根据给定的角色指示和对话历史生成回答的功能,用于回答新的问题。以下是对代码的简要说明。

  • prepare_input函数接收角色指示、对话历史和新的对话(问题),并准备输入文本。
  • format_output函数对生成的回答进行格式化,删除不必要的部分并进行适当的转换。
  • generate_response函数使用指定的角色指示、对话历史和新的对话生成和格式化AI的回答,并更新对话历史。
  • role_instruction是要应用于AI的角色指示列表。
  • conversation_history是存储先前对话历史记录的列表。
  • questions是要向AI提问的列表。
  • 最后,对于questions列表中的每个问题,生成并显示AI的回答。运行此代码时,AI将根据指定的角色指示对列表中的问题做出回应。

    评估

    我们询问了100个问题类似于"输入",通过检查其对应的"回答"中是否包含正确的字符串来进行评估。我们选择了正确回答率最高的第4个epoch的模型。需要注意的是,当"输入"像示例代码一样变得很长时,正确回答率下降到大约50%。

    入力 応答 正答率[%]
    日本で一番広い湖は? 琵琶湖 96
    世界で一番高い山は? エベレスト 86

    训练数据格式

    alpaca 相同,我们采用了以下格式:

    <s>
    以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。
    [SEP]
    指示:
    User:あなたは「ずんだもん」なのだ。東北ずん子の武器である「ずんだアロー」に変身する妖精またはマスコットなのだ。一人称は「ボク」で語尾に「なのだ」を付けてしゃべるのだ。
    Assistant:了解したのだ!
    [SEP]
    入力:
    User:日本で一番高い山は?
    [SEP]
    応答:
    日本で一番高い山は富士山で、標高3776メートルです。
    </s>
    

    由于换行符被替换为空格,因此实际的训练数据中,我们将换行符替换为“\n”。在transformers的代码中,如果要对txt文件进行训练,需要每行一个数据,所以我们将换行符替换为“\n”。训练数据文件是guanaco_alpaca_ja.txt。

    训练的超参数

    我们在训练过程中使用以下超参数:*如果VRAM不足,将optim更改为adafactor可以减少VRAM使用量。

    python.exe transformers/examples/pytorch/language-modeling/run_clm.py ^
        --model_name_or_path rinna/japanese-gpt-1b ^
        --train_file train_data/guanaco_alpaca_ja.txt ^
        --output_dir output ^
        --do_train ^
        --bf16 True ^
        --tf32 True ^
        --optim adamw_bnb_8bit ^
        --num_train_epochs 4 ^
        --save_steps 2207 ^
        --logging_steps 220 ^
        --learning_rate 1e-07 ^
        --lr_scheduler_type constant ^
        --gradient_checkpointing ^
        --per_device_train_batch_size 8 ^
        --save_safetensors True ^
        --logging_dir logs
    

    库的版本

    • Transformers 4.28.0.dev0
    • Pytorch 2.0.0+cu117
    • Tokenizers 0.13.3
    • bitsandbytes 0.37.2

    许可证

    由于不清楚,我们将列出原始模型和训练数据的许可证。

    • japanese-gpt-1b - MIT
    • alpaca_ja - CC BY NC 4.0
    • GuanacoDataset - GPLv3