真打登場。RedPajama-INCITE をつかったチャットを作ってみたら眠気も吹き飛びんだ


# 概要


[前回](https://qiita.com/riversun/items/c45d942497e9408ac198) 投稿してから１日足らずで、またビッグニュース。ついに RedPajama 本家 Together から学習済モデル **RedPajama-INCITE** がリリースされました。

https://huggingface.co/togethercomputer/RedPajama-INCITE-Chat-3B-v1

さっそく、このオープンな RedPajama データセットをつかって学習した **RedPajama-INCITE-Chat-3B-v1** をチャットボット化してみました。

コンテキストをキープするようにしているので、ちゃんとマルチターンの会話が成立します
↓

<iframe width="793" height="446" src="https://www.youtube.com/embed/4TIHkIWmbHI" title="RedPajama-INCITE-Chat-3B-v1 First Look. I happily implemented the chat." frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

### チャット内容 日本語訳つき

```
YOU: Do you know the movie "Titanic"?
     「タイタニック」という映画を知っていますか？

AI : Yes, I know the movie "Titanic".
     はい、「タイタニック」という映画を知っています。

YOU: Who is starred?
     主演は誰ですか？

AI : Leonardo DiCaprio and Kate Winslet
     レオナルド・ディカプリオとケイト・ウィンスレットです。

YOU: Who is the director?
     監督は誰ですか？

AI : James Cameron is the director.
      ジェームズ・キャメロンが監督です。

YOU: Tell me about other movies he made.
     彼が作った他の映画について教えてください。

AI : James Cameron is also the writer and producer of many movies,
     including Aliens, Terminator 2: Judgment Day, True Lies, and Titanic. He also directed movies such as The Abyss, and Avatar.
     ジェームズ・キャメロンは、『エイリアン』『ターミネーター2：審判の日』『トゥルーライズ』
    『タイタニック』など、多くの映画の脚本とプロデューサーも務めていますよ。また、『アビス』や『アバター』などの映画も監督しています。

YOU: What happens at the end of Terminator 2?
     『ターミネーター2』のラストはどうなるんですか？

AI : After Skynet has destroyed Skynet headquarters, Sarah Connor,
     the mother of John Connor, sacrifices herself by driving a car into the 
     CPU of Skynet's mainframe, effectively destroying the system and saving humanity.
     スカイネットがスカイネット本部を破壊した後、ジョン・コナーの母親である
     サラ・コナーが自分を犠牲にして、スカイネットのメインフレームのCPUに車を突っ込み、システムを事実上破壊し、人類を救う。

```



# 実験環境

- OS: Ubuntu 20.04
- CUDA: 11.7
- GPU: RTX 3090

**Windows + CPU でも遅いですが、動作します。**

# ソースコード

本稿で作ったチャットボットのソースコードはこちらです

https://github.com/riversun/RedPajama-INCITE-hands-on

# 環境構築

上のソースコードをつかうときの環境構築です。

```
conda update -n base -c defaults conda --yes
conda create --yes -n env-rp-3b-chat
conda activate env-rp-3b-chat
conda install python=3.10.10 --yes
python -m pip install --upgrade pip
```

上は conda をつかっているが、pyenvでも docker でも問題なし

# パッケージのインストール

```
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117
pip install accelerate transformers
```

# 実行

```
python chat.py
```



# ポイント

- [open_llama_7b_preview_300bt](https://huggingface.co/openlm-research/open_llama_7b_preview_300bt) に比べると、かなりとっつきやすい
    - プロンプトについては[公式ページ](https://huggingface.co/togethercomputer/RedPajama-INCITE-Chat-3B-v1) にちゃんとヒントがあり、とても親切。以下の形式のプロンプトでチャットがうまく動く。
```
<human>: [Instruction]
<bot>:
```

- 文章の停止位置検出
    - 文章生成で EOS トークンを検出して生成停止するアプローチは、生成中のトークンを監視していても EOS トークンを出してこないようなので、ダラダラと生成しつづけてしまう。そこで、[人間パートの生成を検出](https://github.com/riversun/RedPajama-INCITE-hands-on/blob/main/chat_prompt.py#L89) して停止させている。ここは、もっとロバストなやり方があるのかもしれない。
    - トークナイザーのconfを見る限り、EOS は `
` となっておりデフォルトのままのよう。

```
{
  "add_prefix_space": false,
  "bos_token": "
",
  "clean_up_tokenization_spaces": true,
  "eos_token": "
",
  "model_max_length": 2048,
  "tokenizer_class": "GPTNeoXTokenizer",
  "unk_token": "
"
}
```

# まとめ

- RedPajama-INCITE の 3B モデルのチャット向け版をつかってチャットボットをつくってみました
- オープンなLLMをいろいろさわってきたけど、ほぼ手をかけず、かなりまともな受け答えができる印象です。
- とはいえ、 [Limitation](https://huggingface.co/togethercomputer/RedPajama-INCITE-Chat-3B-v1#limitations) に書いてあることが心にささりました
    - その制約を十分に理解し、適切な期待を持って使用する
    - 複雑で曖昧な質問や、モデルの学習データに含まれていない範囲の質問に対しては、必ずしも正確で関連性のある回答が得られるわけではないのでこの点を念頭に置き、適切な判断を行いながらモデルを活用する