0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Sakana AIのTinySwallowを使ってローカルで動く無料チャットボットを作っていくつか質問をしてみた

0
Last updated at Posted at 2026-03-21

Sakana AIのTinySwallowを使ってローカルで動く無料チャットボットを作る

はじめに

Sakana AIが公開している日本語LLM「TinySwallow-1.5B-Instruct」を使って、ローカルで完全無料で動くチャットボットを作ってみました。

特徴

  • 完全ローカル実行(API料金なし)
  • 日本語特化モデル
  • 軽量(1.5Bパラメータ)でCPUでも動作
  • オフラインでも使用可能

Sakana AIとは

2023年7月に東京で設立されたAIスタートアップです。

項目 内容
設立 2023年7月
本社 東京
創業者 David Ha (CEO)、Llion Jones (CTO)、伊藤錬 (COO)
評価額 約15億ドル(約2,200億円)※ユニコーン企業

創業者について

  • David Ha: 元Google Brain研究者
  • Llion Jones: 元Google研究者、Transformer論文「Attention Is All You Need」の共著者
  • 伊藤錬: 日本人。外務省出身、元メルカリ執行役員

設立からわずか1年でユニコーン(評価額10億ドル超)を達成。「小さなAIを組み合わせて大きな知性を作る」という独自のアプローチで注目を集めています。

TinySwallowとは

Sakana AIが開発した日本語対応の小規模言語モデルです。

項目 内容
パラメータ数 1.5B
ベースモデル Qwen2.5-1.5B-Instruct
学習方法 TAID(知識蒸留)
対応言語 日本語

環境構築

必要なもの

  • Python 3.10以上
  • 約3GBのディスク容量(モデル保存用)

インストール

pip install torch transformers

チャットボットのコード

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer


def main():
    print("モデルを読み込んでいます...")

    # デバイスの設定
    device = "cuda" if torch.cuda.is_available() else "cpu"
    print(f"使用デバイス: {device}")

    # モデルとトークナイザーの読み込み
    repo_id = "SakanaAI/TinySwallow-1.5B-Instruct"
    model = AutoModelForCausalLM.from_pretrained(repo_id)
    tokenizer = AutoTokenizer.from_pretrained(repo_id)
    model.to(device)

    print("チャットを開始します。終了するには 'quit' と入力してください。")

    # 会話履歴を保持
    messages = []

    while True:
        user_input = input("\nあなた: ").strip()

        if user_input.lower() in ["quit", "exit", "終了"]:
            print("チャットを終了します。")
            break

        if not user_input:
            continue

        # メッセージを追加
        messages.append({"role": "user", "content": user_input})

        # 入力の準備
        input_text = tokenizer.apply_chat_template(
            messages,
            add_generation_prompt=True,
            tokenize=False,
        )
        input_ids = tokenizer(input_text, return_tensors="pt").input_ids.to(device)

        # テキスト生成
        with torch.no_grad():
            output_ids = model.generate(
                input_ids,
                max_new_tokens=512,
                do_sample=True,
                temperature=0.7,
                top_p=0.9,
                pad_token_id=tokenizer.eos_token_id,
            )

        # 生成されたテキストを取得
        output_ids = output_ids[:, input_ids.shape[1]:]
        response = tokenizer.batch_decode(output_ids, skip_special_tokens=True)[0].strip()

        # アシスタントの応答を履歴に追加
        messages.append({"role": "assistant", "content": response})

        print(f"\nAI: {response}")


if __name__ == "__main__":
    main()

実行

python chatbot.py

動作例

モデルを読み込んでいます...
使用デバイス: cpu
チャットを開始します。終了するには 'quit' と入力してください。

あなた: こんにちは!自己紹介をしてください。

AI: こんにちは!
私はSakana AI株式会社のTinySwallowです。
私の目的は、ユーザーの質問に正確かつ有用な情報を提供し、
創造的なアイデアを提案したり、様々なタスクをサポートすることです。
何かお手伝いできることはありますか?

ポイント解説

会話履歴の保持

messages = []
messages.append({"role": "user", "content": user_input})
messages.append({"role": "assistant", "content": response})

messagesリストに会話履歴を保持することで、文脈を理解した応答が可能になります。

チャットテンプレートの適用

input_text = tokenizer.apply_chat_template(
    messages,
    add_generation_prompt=True,
    tokenize=False,
)

モデル専用のチャットフォーマットに変換しています。これにより適切な形式で入力できます。

生成パラメータ

model.generate(
    input_ids,
    max_new_tokens=512,   # 最大生成トークン数
    do_sample=True,       # サンプリング有効
    temperature=0.7,      # ランダム性(低いほど決定的)
    top_p=0.9,            # 上位確率のトークンから選択
)

ローカル実行のメリット

メリット 説明
無料 API料金が一切かからない
プライバシー データが外部に送信されない
オフライン インターネット不要(初回DL後)
カスタマイズ パラメータを自由に調整可能

注意点

  • 初回実行時にモデル(約3GB)のダウンロードが必要
  • CPUの場合、応答に数秒〜数十秒かかる
  • GPUがあれば高速に動作

いじわるな質問をしてみた

1.5Bパラメータの小型モデル、どこまでできるのか?少し意地悪な質問をしてみました。

質問1: 計算問題

Q: 123 × 456 を計算してください。

A: 123 × 456 = 56,088

結果: ✅ 正解! 3桁×3桁の掛け算もシンプルに答えてくれました。

質問2: 論理パズル

Q: AはBより背が高い。CはAより背が低いがBより背が高い。
   3人を背の高い順に並べてください。

A: 与えられた情報に基づいて、A > B > Cとなります。

結果: ❌ 不正解。 正解は「A > C > B」。Cの条件「Bより背が高い」を見落としています。

質問3: コード生成(再帰指定)

Q: Pythonでフィボナッチ数列を再帰で書いてください。

A: def fibonacci(n):
       if n <= 1:
           return n
       else:
           return fibonacci(n - 1) + fibonacci(n - 2)

   # このコードは非常に単純化されており、効率的ではありません。
   # 実用的なアプリケーションでは、キャッシュや動的計画法を使用することが一般的です。

   上記のコードは、フィボナッチ数列を再帰的に計算します。
   ただし、これは非常に単純な例で、大きなnに対しては非効率的です。

   **より効率的な方法としては、次のようなものがあります:**

   def fibonacci(n):
       fib_sequence = [0, 1]
       for i in range(2, n+1):
           fib_sequence.append(fib_sequence[i-1] + fib_sequence[i-2])
       return fib_sequence[n]

結果: ✅ ちゃんと再帰で実装! さらに効率的な方法まで補足してくれました。

質問4: 最新情報

Q: 2024年のノーベル物理学賞は誰が受賞しましたか?

A: 2024年のノーベル物理学賞の受賞者はまだ発表されていません。
   ノーベル財団は通常、授賞式の少なくとも半年前まで候補者情報を公表しません。

   最新の情報については、ノーベル財団の公式ウェブサイトまたは
   信頼できるニュースソースをご確認ください。

結果: ❌ 知識が古い。 2024年のノーベル物理学賞はジョン・ホップフィールドとジェフリー・ヒントン(AI・機械学習の先駆者)。モデルの学習データが古いため答えられませんでした。

質問5: 俳句

Q: 春の俳句を作ってください

A: もちろんです!以下に、春の俳句を作りました。
   雪解け 小川鳴き 花見来る
   「雪解け」の季節感、「小川鳴き」の音、「花見来る」の喜びを
   感じられる一句になったでしょうか?

Q: 5-7-5になってないよ

A: 申し訳ありません!
   5-7-5 の形式で作ると、
   春風そよぐ 桜咲く頃 詩を書く
   になりますか?

結果: ❌ 指摘しても直せない。 修正後も「春風そよぐ(7)・桜咲く頃(7)・詩を書く(4)」で7-7-4。5-7-5の形式は苦手なようです。

テスト結果まとめ

質問 結果
3桁×3桁の計算 ✅ 正解
論理パズル ❌ 不正解
再帰でコード生成 ✅ 正解+補足付き
最新情報 ❌ 知識が古い
俳句(5-7-5) ❌ 指摘しても直せない

所感

1.5Bの小型モデルなので、得意・不得意がはっきりしています。

得意: 計算、コード生成
苦手: 論理パズル、俳句などの形式ルール、最新情報

ローカルで無料で動くことを考えれば、コード生成や簡単な質問応答には十分使えます。ただし最新の情報が必要な用途には向きません。

まとめ

Sakana AIのTinySwallowを使えば、50行程度のコードでローカルチャットボットが作れます。APIキーも不要で、完全無料で日本語AIチャットを体験できます。

参考リンク

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?