【Streamlit】RakutenAI 2.0でチャットする

Streamlit
この記事は約15分で読めます。

こんにちは、JS2IIUです。
先日、RakutenのRakuten AI 2.0が公開されました。HuggingFaceから利用可能になりましたので早速Streamlit上でのチャットを試してみます。今回もよろしくお願いします。

楽天、商用利用可能な高性能日本語LLM「Rakuten AI 2.0」
楽天グループは、Mixture of Experts(MoE)アーキテクチャを採用した新しい日本語大規模言語モデル(LLM)「Rakuten AI 2.0」と、楽天初の小規模言語モデル(SLM)「Rakuten AI 2.0 mini」の、2つのAIモデルの提供を開始した。

RakutenAI 2.0 のモデルについて

RakutenAIは、日本語に特化した大規模言語モデル「Rakuten AI 2.0」と小規模言語モデル「Rakuten AI 2.0 mini」を提供しています。これらのモデルには、基盤モデルとインストラクションチューニング済みモデルが含まれます。以下に、各モデルの特徴を詳しく説明します。

1. Rakuten AI 2.0(8x7B)

「Rakuten AI 2.0」は、8つの70億パラメータ(7B)で構成された「エキスパート」と呼ばれるサブモデルからなる、Mixture of Experts(MoE)アーキテクチャを採用した大規模言語モデルです。各トークンは、ルーターによって最適な2つのエキスパートに割り当てられ、処理されます。この設計により、8倍の規模を持つ高密度モデルと同等の性能を、計算量を約1/4に抑えつつ実現しています。

2. Rakuten AI 2.0 mini(mini-instruct)

「Rakuten AI 2.0 mini」は、15億パラメータ(1.5B)を持つ小規模言語モデルで、モバイル端末での利用を想定して設計されています。このモデルは、内製の多段階データフィルタリングとアノテーションプロセスを経た高品質な日本語および英語のデータセットで学習されています。その結果、テキスト生成において高性能かつ高精度な処理を実現しています。また、データをリモートサーバーに送信せずに自社運用が可能であり、プライバシー保護やセキュリティ要件の厳しい業務にも適しています。

3. Rakuten AI 2.0 8x7B-instruct

「Rakuten AI 2.0 8x7B-instruct」は、上記の「Rakuten AI 2.0」基盤モデルをベースに、インストラクションチューニングを施したモデルです。インストラクションチューニングとは、モデルに特定の指示や質問に対する適切な応答を生成する能力を付与するための微調整手法です。これにより、ユーザーからの多様な指示や質問に対して、より適切で人間らしい応答を提供することが可能となります。具体的なチューニング手法やデータセットに関する詳細は公開されていませんが、一般的に、インストラクションチューニングはモデルの応答品質を向上させるために行われます。

これらのモデルは、Apache 2.0ライセンスの下で公開されており、商用利用も可能です。Hugging Faceのリポジトリからダウンロードして利用することができます。

なお、これらのモデルは高性能である一方、すべての大規模言語モデルと同様に、バイアスや不正確な情報、あるいは安全でない出力を生成する可能性があります。そのため、利用の際には注意と判断が必要です。

これらのモデルは、Hugging Face の Transformers ライブラリを使用して簡単に利用できます。本記事では、最も軽量な RakutenAI-2.0-mini-instruct を利用して、Streamlit 上でチャットアプリを構築します。

Rakuten (Rakuten)
Language, Vision, Speech, Distributed Deep Learning

Hugging Face での RakutenAI の利用方法

Hugging Face の transformers ライブラリを利用すると、RakutenAI 2.0 のモデルを簡単にロードして利用できます。以下の手順で利用できます。

  1. 必要なライブラリをインストール
Bash
   pip install transformers torch
  1. モデルとトークナイザーのロード
Python
   from transformers import AutoModelForCausalLM, AutoTokenizer

   model_path = "Rakuten/RakutenAI-2.0-mini-instruct"
   tokenizer = AutoTokenizer.from_pretrained(model_path)
   model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype="auto", device_map="auto")
   model.eval()
  1. テキストをトークン化して、モデルに入力
Python
   input_text = "こんにちは!今日はどんなお手伝いができますか?"
   input_ids = tokenizer(input_text, return_tensors="pt").input_ids.to(model.device)

   output = model.generate(input_ids, max_length=100)
   response = tokenizer.decode(output[0], skip_special_tokens=True)
   print(response)

これで、RakutenAI 2.0 のモデルを使用してテキストの生成が可能になります。

Streamlit を使った RakutenAI チャットアプリの構築

次に、RakutenAI-2.0-mini-instruct を使用した Streamlit のチャットアプリを実装します。

ソースコード

Python
import streamlit as st
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

# モデルとトークナイザーの読み込み
model_path = "Rakuten/RakutenAI-2.0-mini-instruct"
tokenizer = AutoTokenizer.from_pretrained(model_path)

# GPUが利用可能ならGPUを使用、なければCPUを使用
device = "cuda" if torch.cuda.is_available() else "cpu"

model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.float32, device_map={"": device})
model.eval()

# Streamlitアプリの設定
st.title("RakutenAI-2.0 Chatbot")
st.write("RakutenAI-2.0-mini-instructモデルを使用したチャットボットです。")

# チャット履歴の初期化
if "messages" not in st.session_state:
    st.session_state.messages = [
        {"role": "system", "content": "あなたは親切で丁寧なAIアシスタントです。"}
    ]

# ユーザー入力欄
user_input = st.text_input("あなたのメッセージを入力してください:", key="user_input")

# 送信ボタン
send_clicked = st.button("送信")

if send_clicked and user_input:
    # ユーザーのメッセージをチャット履歴に追加
    st.session_state.messages.append({"role": "user", "content": user_input})

    # モデルへの入力を準備
    input_ids = tokenizer.apply_chat_template(
        st.session_state.messages, tokenize=True, add_generation_prompt=True, return_tensors="pt"
    ).to(device=model.device)
    attention_mask = input_ids.ne(tokenizer.pad_token_id).long()

    # モデルによる応答生成
    with st.spinner("AIが応答を生成しています..."):
        tokens = model.generate(
            input_ids,
            max_length=2048,
            do_sample=False,
            num_beams=1,
            pad_token_id=tokenizer.eos_token_id,
            attention_mask=attention_mask,
        )
    assistant_message = tokenizer.decode(tokens[0][len(input_ids[0]):], skip_special_tokens=True)

    # AIの応答をチャット履歴に追加
    st.session_state.messages.append({"role": "assistant", "content": assistant_message})

    # **ユーザー入力をリセット**
    del st.session_state["user_input"]

# チャット履歴の表示
if st.session_state.messages:
    for message in st.session_state.messages:
        if message["role"] == "user":
            st.write(f"**ユーザー**: {message['content']}")
        elif message["role"] == "assistant":
            st.write(f"**AIアシスタント**: {message['content']}")

実際に動いている様子を1倍速で。

プログラムの詳細解説

このプログラムは、StreamlitとHugging FaceのTransformersライブラリを用いて、RakutenAI-2.0-mini-instructモデルを基盤としたチャットボットを構築するものです。以下に、ステップバイステップで詳細な解説を行います。

1. 必要なライブラリのインポート

Python
import streamlit as st
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
  • streamlit: Streamlitは、PythonでインタラクティブなWebアプリケーションを簡単に作成するためのフレームワークです。
  • torch: PyTorchは、機械学習や深層学習で広く使用されるオープンソースのプラットフォームです。
  • transformers: Hugging FaceのTransformersライブラリは、自然言語処理(NLP)のタスクに特化した様々な事前学習済みモデルやツールを提供します。

2. モデルとトークナイザーの読み込み

Python
model_path = "Rakuten/RakutenAI-2.0-mini-instruct"
tokenizer = AutoTokenizer.from_pretrained(model_path)
  • model_path: モデルのパスを指定します。ここでは、Hugging Face Hubに公開されているRakutenAI-2.0-mini-instructモデルを指定しています。
  • tokenizer: トークナイザーは、テキストデータをモデルが理解できる形式に変換する役割を果たします。AutoTokenizer.from_pretrained()で、指定されたモデルに対応するトークナイザーを自動的に読み込みます。

3. GPU/CPUの設定

Python
device = "cuda" if torch.cuda.is_available() else "cpu"
  • GPUが利用可能な場合はGPUを使用し、そうでない場合はCPUを使用します。GPUを使用することで、推論処理を高速化できます。

4. モデルの読み込みと設定

Python
model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.float32, device_map={"": device})
model.eval()
  • AutoModelForCausalLM.from_pretrained(): 事前学習済みモデルを読み込みます。torch_dtype=torch.float32でデータ型をfloat32に指定し、device_mapでモデルを配置するデバイスを指定します。
  • model.eval(): モデルを推論モードに設定します。

5. Streamlitアプリの設定

Python
st.title("RakutenAI-2.0 Chatbot")
st.write("RakutenAI-2.0-mini-instructモデルを使用したチャットボットです。")
  • st.title(): アプリケーションのタイトルを設定します。
  • st.write(): アプリケーションにテキストを表示します。

6. チャット履歴の初期化

Python
if "messages" not in st.session_state:
    st.session_state.messages = [
        {"role": "system", "content": "あなたは親切で丁寧なAIアシスタントです。"}
    ]
  • st.session_state: Streamlitのセッション情報を保存するためのオブジェクトです。
  • messages: チャットの履歴を保存するリストです。初期状態では、システムメッセージが設定されています。

7. ユーザー入力欄と送信ボタン

Python
user_input = st.text_input("あなたのメッセージを入力してください:", key="user_input")
send_clicked = st.button("送信")
  • st.text_input(): ユーザーがテキストを入力するための欄を表示します。
  • st.button(): 送信ボタンを表示します。

8. 送信ボタンがクリックされた時の処理

Python
if send_clicked and user_input:
    # ...
  • 送信ボタンがクリックされ、かつユーザー入力がある場合に以下の処理を実行します。

9. ユーザーメッセージの追加

Python
st.session_state.messages.append({"role": "user", "content": user_input})
  • ユーザーのメッセージをチャット履歴に追加します。

10. モデルへの入力準備

Python
input_ids = tokenizer.apply_chat_template(
    st.session_state.messages, tokenize=True, add_generation_prompt=True, return_tensors="pt"
).to(device=model.device)
attention_mask = input_ids.ne(tokenizer.pad_token_id).long()
  • tokenizer.apply_chat_template(): チャット履歴をモデルに入力できる形式に変換します。
  • attention_mask: モデルがどのトークンに注意を払うべきかを示すマスクです。

11. モデルによる応答生成

Python
with st.spinner("AIが応答を生成しています..."):
    tokens = model.generate(
        input_ids,
        max_length=2048,
        do_sample=False,
        num_beams=1,
        pad_token_id=tokenizer.eos_token_id,
        attention_mask=attention_mask,
    )
assistant_message = tokenizer.decode(tokens[0][len(input_ids[0]):], skip_special_tokens=True)
  • st.spinner(): 応答生成中にスピナーを表示します。
  • model.generate(): モデルに応答を生成させます。
  • tokenizer.decode(): モデルの出力をテキストに変換します。

12. AI応答の追加とユーザー入力のリセット

Python
st.session_state.messages.append({"role": "assistant", "content": assistant_message})
del st.session_state["user_input"]
  • AIの応答をチャット履歴に追加します。
  • ユーザー入力欄をリセットします。

13. チャット履歴の表示

Python
if st.session_state.messages:
    for message in st.session_state.messages:
        if message["role"] == "user":
            st.write(f"**ユーザー**: {message['content']}")
        elif message["role"] == "assistant":
            st.write(f"**AIアシスタント**: {message['content']}")
  • チャット履歴を全て表示します。

14. 実行方法

このプログラムをapp.pyなどの名前で保存し、ターミナルで以下のコマンドを実行することでStreamlitアプリを起動できます。

Bash
streamlit run app.py

これで、RakutenAI-2.0-mini-instructモデルを基盤としたチャットボットがWebブラウザで利用できるようになります。

参考リンク

この手順を参考にして、簡単に RakutenAI 2.0 を利用したチャットアプリを構築できます。

最後に、書籍のPRです。

最新のOpenAIのチャットAPIの使い方もしっかりと解説されている良書です。2024年11月初版発行、「LangChainとLangGraphによるRAG・AIエージェント[実践]入門」西見、吉田、大嶋著。

最後まで読んでいただきありがとうございます。73

コメント

タイトルとURLをコピーしました