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チャットを体験できます。