RakutenAI-7B-chat を使用したチャットアプリケーションを5分で作る

RakutenAI-7B-chat を使用したチャットアプリケーションを5分で作る

こんにちは、株式会社 Qualiteg プロダクト開発部です。

今日は、 RakutenAI-7B-chat と ChatStream 0.7.0 を使用して本格的なチャットアプリケーションを作っていきましょう。

RakutenAI-7B-chat は Mistral 7B を日本語継続学習させたモデルで、チャットチューニングが行われており、 日本語LLM リーダーボード https://wandb.ai/wandb-japan/llm-leaderboard/reports/Nejumi-LLM-Neo--Vmlldzo2MTkyMTU0でも上位にランクされている期待大のモデルです。

ソースコード

早速ですが、以下がソースコードとなります。

4bit 量子化をしているため、使用する GPU は A4000 (16GB) 程度で快適に動作します。

import logging

import torch
import uvicorn
from fastapi import FastAPI
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig

from chatstream import ChatStream, ChatPromptRakutenMistral as ChatPrompt, LoadTime, TokenSamplerIsok
from chatstream.fastersession.faster_session_rdb_store import FasterSessionRdbStore
from chatstream.util.session.chat_stream_session_on_set_value_listener import chat_stream_session_on_set_value_listener

"""
'Rakuten/RakutenAI-7B-chat' の ChatStream Server のサンプルプログラム

- 開発用構成です(本番では、ChatStreamPool によるスケールアウトや、Qualiteg SunsetServer など、セキュアで堅牢なロードバランサー、リバースプロキシ導入を推奨しています)
- 単体起動用(スケールアウトモードのノードではなく、シングルインスタンスでWebアプリケーション、WebAPIサーバーとして振る舞います)
- モデルは 4bit 量子化 として扱います
"""

num_gpus = 1  # このノードで使用する GPU数
device = torch.device("cuda")
model_path = 'Rakuten/RakutenAI-7B-chat'
use_fast = True

# 4bit 量子化で使用するときの config
quantization_config = BitsAndBytesConfig(load_in_4bit=True)

# モデル読み込み(LoadTime を使用することで、進捗表示をしながら読み込みする)
model = LoadTime(name=model_path, hf=True,
                 fn=lambda: AutoModelForCausalLM.from_pretrained(model_path,
                                                                 quantization_config=quantization_config,
                                                                 device_map="auto"))()

model.eval()
tokenizer = AutoTokenizer.from_pretrained(model_path)

# ChatStream で使用するデータベース情報を設定する
database_def = {
    "type": "rdbms",  # "memory","rdbms","mongo","redis"
    "rdbms": {
        "db_url": "[your_db_url]"  # DBを指定してください
    },
    "db": None  # DBオブジェクトを直接する場合はこちらを記述してください
}

server_host_info = {'protocol': 'http', 'host': 'localhost', 'port': 9999}

num_of_concurrent_executions = 10  # 最大同時文章生成数
max_new_tokens = 512  # 最大トークン生成数
tokens_per_sec = 6  # num_of_concurrent_executions 件の同時接続があったときトークン生成速度(tokens/sec)
text_generation_timeout_sec = (max_new_tokens / tokens_per_sec) + 10  # 1回あたりの文章生成タイムアウト時間。+10 は余裕時間。

# ChatStream インスタンスを生成する
chat_stream = ChatStream(
    num_of_concurrent_executions=num_of_concurrent_executions,  # 最大同時文章生成数
    max_queue_size=5,  # 最大文章生成数に達したときの待ち行列の大きさ。この大きさを超えるリクエストがあるとき Too many request エラーとなる。
    model_id='rakuten__rakuten_ai_7b_chat',  # モデルID

    model_support_languages=['ja', 'en'],  # モデルがサポートしている言語。
    model_desc={
        'disp_name': {'en': 'RakutenAI-7B-chat', 'ja': 'RakutenAI-7B-chat', },  # UI表示用モデル名
        'about': {
            'ja': '2024/3/21 にリリースされた Mistral-7B-v0.1 ベースの日本語LLM',  # UI 表示用説明文(日本語)
            'en': 'Japanese LLM based on Mistral-7B-v0.1 released on 3/21/2024',  # UI 表示用説明文(English)
        },
        'default_utterance_hints': [
            {'utterance': {'ja': "Who starred in the movie 'Titanic' released in 1997?",  # UI 表示サンプル発話(日本語)
                           'en': "Who starred in the movie 'Titanic' released in 1997?",  # UI 表示サンプル発話(English)
                           },
             'desc': {'ja': '映画タイタニックの主演は?',  # UI 表示サンプル発話の説明文(日本語)
                      'en': '',  # UI 表示サンプル発話の説明文(English)
                      }
             },
        ]
    },
    server_host_info=server_host_info,
    model=model,
    tokenizer=tokenizer,
    num_gpus=num_gpus,
    device=device,
    chat_prompt_clazz=ChatPrompt,  # このモデル用の ChatPrompt をセットする
    add_special_tokens=False,  # 特殊トークン追加の有無
    text_generation_timeout_sec=text_generation_timeout_sec,  # タイムアウトは同時ユーザー数が最大のときのトークン生成速度xmax_new_tokens から計算する
    max_new_tokens=max_new_tokens,  # 1回あたりの最大トークン生成数
    context_len=1024,  # コンテクスト長をセットする
    temperature=0.7,  # サンプリングパラメータ temperature をセットする
    top_k=10,  # サンプリングパラメータ top K
    # top_p=0.9,  # サンプリングパラメータ top P をセットする
    repetition_penalty=1.05,  # サンプリングパラメータ 繰り返しペナルティ をセットする
    database=database_def,  # データベース情報をセットする
    client_roles={
        "user": {
            "apis": {
                "allow": "all",  # [DefaultApiNames.CHAT_STREAM, ],
                "auth_method": "nothing",  # 本 ChatStream は単体起動するため 認証無し とする(スケールアウトモードの場合は適切なサーバー認証をセットします)
                "use_session": True,  # 本 ChatStream は単体起動するため use_session:True とする。(スケールアウトモードで起動するときは use_session:False とします)
            }
        },
    },  # ロールをセットする。
    locale='ja',
    token_sampler=TokenSamplerIsok(),  # TokenSamplerHft() # TokenSamplerIsok() #
    seed=42,
)

chat_stream.logger.setLevel(logging.DEBUG)

# セッションデータを RDBMS に保存する ストア
rdb_store = FasterSessionRdbStore(database_def=database_def,
                                  on_set_value_listener=chat_stream_session_on_set_value_listener,  # シリアライズできないオブジェクトをセッションの永続化時にスキップするヘルパー
                                  )
# memory_store = get_chat_stream_session_memory_store() # セッションデータをメモリに保存する
# file_store = get_chat_stream_session_file_store() # セッションデータをファイルに保存する

# ChatStreamに追加するミドルウェアの設定用dict
mw_opts = {
    "faster_session": {
        "secret_key": "chatstream-default-session-secret-key",
        "store": rdb_store,  # session をファイルに保存するファイルストアを取得する
        # "same_site":"Strict", # set-cookie の same_site 属性、デフォルトは Strict
        # "is_http_only":True,# set-cookie の http_only 属性、デフォルトは True
        # "is_secure":True,# set-cookie の secure 属性、デフォルトは True
        # "max_age":0 # set-cookie の max_age 属性、デフォルトは True
    },
}

# FastAPI インスタンスを作る
app = FastAPI()

# 必要なミドルウェアを自動的に追加する(手動で設定することも可能です)
chat_stream.append_middlewares(app, opts=mw_opts)

# 必要なAPIを自動的に追加する(生やす)
# ここではすべての API を追加していますが、用途に応じてAPIを選択することも可能です
# 各 URLパスの具体的な内容は default_api_paths.py を参照してください
chat_stream.append_apis(app, {"all": True})


@app.on_event("startup")
async def startup():
    # Web サーバーの起動後
    # ChatStreamのキューイングシステムを開始する
    await chat_stream.start_queue_worker()


def start_server():
    # Web サーバーを起動する
    uvicorn.run(app, host=server_host_info.get('host'), port=server_host_info.get('port'))


def main():
    start_server()


if __name__ == "__main__":
    main()

モデルへの入出力に使用する ChatPrompt クラスは、最新版の ChatStream に同梱されている ChatPromptRakutenMistral を使用します。

または、以下の記事を参考に自ら作成することも可能です。

https://blog.qualiteg.com/chatprompt_rakuten_ai_7b_chat/

さて、さっそくこのコードを実行して、チャットを試してみましょう

無事起動し、Web ブラウザからチャットを試すことができました!

Qualitegプロダクト開発部では、HuggingFaceに最新のモデルが発表された都度、迅速にChatStream へのポーティングを行っています。

そのため、最新のモデルでもほぼコードを書かずに、すぐにお試しいただけます。今回も、ほぼボイラープレートのみで本格 LLM チャットを実装することができました。

それでは、また次回のLLMでお会いしましょう!

Read more

ディープラーニングにおけるEMA(Exponential Moving Average)

ディープラーニングにおけるEMA(Exponential Moving Average)

こんにちは! 本日は、画像生成、動画生成モデルなどで重要な役割を果たしている EMA ※について解説してみたいとおもいます! 当社のAIアバター動画生成サービス「MotionVox™」でも役立っています! といっても、画像生成のための専用技術というわけではなく、学習と推論(生成系も含む)というディープラーニングの運用の中で昨今かなり重宝されるテクニックとなっておりますので、基礎から実装までみていきたいとおもいます。 ※EMAの読み方は私はエマと呼んでますが、イーエムエーって言ってる人もいます。どっちでもいいでしょう。 EMA の基礎知識 EMA(Exponential Moving Average=指数移動平均)は、ざっくりいえばモデルの重みを平均化する手法です。 実は株価分析などでも使われている古くからある概念なのですが、ディープラーニングでは比較的最近になって「あ、これ結構使えるんじゃね?」と重要性が認識されるようになりました。 (”EMA”に限らず、理論の積み上げではなく「やってみたら、使えんじゃん」っていうのがかなり多いのがディープラーニング界隈のもはや常識でし

By Qualiteg 研究部
TOKYO DIGICONX 「MotionVox™」出展レポート

TOKYO DIGICONX 「MotionVox™」出展レポート

こんにちは! 2025年1月9日~11日に東京ビッグサイトにて開催された TOKYO DIGICONX に出展してまいりました。 開催中3日間の様子を簡単にレポートいたします! TOKYO DIGICONX TOKYO DIGICONX は東京ビッグサイト南3・4ホールにて開催で、正式名称は『TOKYO XR・メタバース&コンテンツ ビジネスワールド』ということで、xR・メタバース・コンテンツ・AIと先端テクノロジーが集まる展示会です 「Motion Vox™」のお披露目を行いました 当社からは、新サービス「Motion Vox™」を中心とした展示をさせていただきました MotionVox™は動画内の顔と声を簡単にAIアバター動画に変換できるAIアバター動画生成サービスです。 自分で撮影した動画をアップロードし、変換したい顔と声を選ぶだけの3ステップで完了。特別な機材は不要で、自然な表情とリップシンクを実現。 社内研修やYouTube配信、ドキュメンタリー制作など、幅広い用途で活用できます。 当社ブースの様子 「MotionVox™」の初出展とい

By Qualiteg ビジネス開発本部 | マーケティング部
【本日開催】TOKYO DIGICONX で「MotionVox」を出展~リアルを纏う、AIアバター~

【本日開催】TOKYO DIGICONX で「MotionVox」を出展~リアルを纏う、AIアバター~

こんにちは! 本日(2025年1月9日)より東京ビックサイトにて開催されている「TOKYO DIGICONX」に、フォトリアリスティック(Photorealistic Avater)な次世代アバター生成AI「MotionVox」を出展しています! XR・メタバース・AIと先端テクノロジーが集まる本展示会で、ビジネス向け次世代AI動画生成ツールとしてMotionVox™をご紹介させていただきます。 MotionVox™とは MotionVox™は、あなたの表情や発話を魅力的なアバターが完全再現する動画生成AIです。まるで本物の人間がそこにいるかのような自然な表情と圧倒的な存在感で、新しい表現の可能性を切り開きます。 主な特徴 * フォトリアリスティックな高品質アバター * 高再現度の表情同期 * プロフェッショナルなリップシンク * カスタマイズ可能なボイスチェンジ機能 * 簡単な操作性 * プライバシーの完全保護 多様な用途に対応 MotionVoxは、以下のようなさまざまなビジネスシーンで活用いただけます! * 動画配信やVTuber活動 * S

By Qualiteg ビジネス開発本部 | マーケティング部
[AI新規事業創出]Qualitegセレクション:ビジネスモデル設計①ビジネスモデル図

[AI新規事業創出]Qualitegセレクション:ビジネスモデル設計①ビジネスモデル図

Qualiteg blogを訪問してくださった皆様、こんにちは。Micheleです。AIを活用した新規事業やマーケティングを手がけている私には、クライアントからよく寄せられる質問があります。AIを用いた事業展開を検討されている方々が共通して直面するであろう課題に対して、このブログを通じて私なりの解答をご提供したいと思います。 「新規事業のビジネスモデル図の描き方 〜実践で活かせる具体的なコツ〜」 新規事業開発のコンサルティングをさせていただいておりますとクライアント企業様の現場で、「ビジネスモデル図をどう描けばいいの?」という質問をよく頂きます。 実は私も最初は悩んだのですが、数々の失敗と成功を経て、効果的なビジネスモデル図の描き方が分かってきました。今回は、その実践的なコツをお伝えしていきます。 なぜビジネスモデル図が重要なのか ビジネスモデル図は、単なる図解ではありません。これは、自分のビジネスアイデアを「検証可能な形」に落とし込むための重要なツールです。 上申の際にステークホルダーの説明をするのに使うこともできます。また、アイディア創出後のマネタイズ検討の場合も情報

By Join us, Michele on Qualiteg's adventure to innovation