【Streamlit】「Sarashina2.2」でローカルLLMチャットアプリを作成する

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

こんにちは、JS2IIUです。
本記事では、大規模言語モデル(LLM)の一つであるSarashina2.2を使用し、Streamlitを使って簡単なチャットアプリを構築する方法を解説します。今回もよろしくお願いします。

Sarashina2.2モデルとは?

Sarashina2.2-3b-instruct-v0.1は、SB Intuitionsが開発した小規模模言語モデル(SLM)に相当するモデルです。以下はこのモデルの主な特徴です。

  • パラメータ数:3B(30億パラメータ)
  • 用途:指示に基づいた対話形式の応答生成(Instruct型)
  • 対応タスク:質問応答、要約、コード生成、クリエイティブな文章生成など
  • 精度:Instruct形式でチューニングされており、多様なユーザー入力に対して自然で的確な応答を提供
  • デバイス:GPU環境での実行が推奨(torch_dtype=torch.bfloat16 を使用することで高速化とメモリ節約が可能)

このモデルはHugging Face Hubで公開されており、誰でも無料で利用可能です。

Streamlitチャットアプリの概要

以下のプログラムでは、Sarashina2.2モデルを利用してユーザー入力に応答するシンプルなチャットボットを作成します。

サンプルコード

Python
import streamlit as st
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline, set_seed
import re

# モデルのロード
@st.cache_resource
def load_model():
    model_name = "sbintuitions/sarashina2.2-3b-instruct-v0.1"
    model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.bfloat16, device_map="auto")
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    chat_pipeline = pipeline("text-generation", model=model, tokenizer=tokenizer)
    return chat_pipeline

chat_pipeline = load_model()
set_seed(123)

# StreamlitアプリのUI
st.title("Sarashina2 チャットボット")

user_input = st.text_input("入力欄", "こんにちは。あなたの名前を教えて")

if st.button("送信"):
    with st.spinner("応答を生成中..."):
        # モデルによる応答生成
        responses = chat_pipeline(
            [{"role": "user", "content": user_input}],
            max_length=200,
            do_sample=True,
            num_return_sequences=3,
        )

        # 応答を表示
        st.subheader("モデルの応答")
        for i, response in enumerate(responses, 1):
            try:
                # デバッグ出力(確認用)
                st.write("デバッグ: 応答内容", response)

                # generated_text を文字列化
                generated_text = str(response['generated_text'])

                # 'assistant' の content を抽出
                match = re.search(r"'role': 'assistant', 'content': '(.*?)'", generated_text)
                if match:
                    assistant_response = match.group(1)
                    assistant_response = assistant_response.encode('utf-8').decode('unicode_escape')
                    st.write(f"### 応答 {i}")
                    st.write(assistant_response.replace("\n", "\n"))
                else:
                    st.error("assistant の応答を解析できませんでした。")
            except Exception as e:
                st.error(f"応答の解析に失敗しました: {e}")

st.info("Sarashina2モデルを使用しています。複数の応答を生成できます。")

コード解説

1. モデルのロード

Python
@st.cache_resource
def load_model():

st.cache_resource を使用して、モデルのロードを一度だけ実行し、アプリケーションのパフォーマンスを向上させます。

  • AutoModelForCausalLM:因果言語モデル(Causal Language Model)をロード
  • torch_dtype=torch.bfloat16:モデルの型を bfloat16 に設定し、GPUメモリ使用量を削減
  • device_map=”auto”:適切なデバイス(GPU/CPU)に自動割り当て

2. 入力と応答生成

Python
user_input = st.text_input("入力欄", "こんにちは。あなたの名前を教えて")
if st.button("送信"):

ユーザー入力を受け取り、送信ボタンが押されたら処理を開始します。

  • do_sample=True:サンプリングを有効にし、多様な応答を生成
  • num_return_sequences=3:3つの応答候補を生成

3. 応答の解析と表示

Python
match = re.search(r"'role': 'assistant', 'content': '(.*?)'", generated_text)

生成されたテキストからアシスタントの応答を正規表現で抽出し、ユーザーに表示します。

  • デバッグ出力:生成された生データを st.write() で確認
  • エラー処理:解析に失敗した場合は st.error() で通知

実行方法

  1. 必要なライブラリをインストール
Bash
pip install streamlit torch transformers
  1. アプリを起動
Bash
streamlit run app.py

まとめ

この記事では、Streamlitを使用してLLMモデル「Sarashina2.2」を活用したチャットアプリを作成しました。

  • モデルの特徴
  • コードの詳細な解説
  • デバッグとエラー処理

を含め、実践的なアプリ構築の流れを解説しました。

参考リンク

最後に、書籍のPRです。

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

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

コメント

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