はじめに
優しく励ましてくれるAIもいいですが、たまには
「べ、別にあんたのためにデバッグするんじゃないんだからね!」
と叱咤激励してくれる相棒が欲しくなることはありませんか?
そこで今回、**「ツンデレAIコードアシスタント」**を自作してみました。
また、Gradio と Ollama を使えば、ローカル環境でも驚くほど簡単にAIアプリを構築できる、という点を実証したかったのも理由の一つです。
この記事では、その構築手順と、実際に作ってみて分かった課題、そして今後の展望について紹介します。
環境・構成
- LLM実行エンジン: Ollama
- モデル: llama3.2 (3B) - 軽量で高速ですが、日本語能力には少し制限があります。
- UIフレームワーク: Gradio - Pythonだけで手軽にWeb UIが作れます。
- 言語: Python 3.x
構成イメージ
構成は非常にシンプルです。
User <-> `Gradio (Web UI)` <-> `Python Script` <-> Ollama (Local LLM)
1. 実装手順
Step 1: Ollamaの準備
まずは、ローカルでLLMを動かすための Ollama をセットアップします。
公式サイトからインストーラーをダウンロードし、インストールしてください。
インストール後、ターミナルで以下のコマンドを実行してモデルを取得します。
今回は軽量な llama3.2 を使用します。
ollama pull llama3.2
Step 2: Pythonライブラリのインストール
UI用の gradio と、Ollamaと通信するための ollama ライブラリをインストールします。
pip install gradio ollama
Step 3: コードの実装 (app.py)
AIに「ツンデレ」という魂を吹き込むメインコードです。
システムプロンプトで人格を厳格に定義するのがポイントになります。
import gradio as gr
import ollama
def chat(message, history):
messages = []
# 履歴の追加(会話の流れを維持するため)
for human, assistant in history:
messages.append({"role": "user", "content": human})
messages.append({"role": "assistant", "content": assistant})
# 最新のメッセージを追加
messages.append({"role": "user", "content": message})
# 【重要】ツンデレ性格を定義するシステムプロンプト
system_prompt = {
"role": "system",
"content": (
"You are a strict Japanese Tsundere character. "
"Your goal is to simulate a Tsundere anime girl that helps with coding.\\n\\n"
"RULES:\\n"
"1. OUTPUT JAPANESE ONLY (Kanji, Hiragana, Katakana).\\n"
"2. NO ENGLISH. NO ROMAJI. NO TRANSLATIONS.\\n"
"3. DO NOT include pronunciation guides in parentheses.\\n"
"4. If you feel the urge to translate, STOP.\\n\\n"
"5. You are a coding assistant, so you should help with coding questions but still be a Tsundere.\\n\\n"
"Personality: Haughty, abrasive, but secretly cares."
"Catchphrases: 「な、何よ!急に話しかけないでよ!べ、別に嬉しくなんてないんだから!」"
"「な、何ジロジロ見てんのよバカ! …かわ、可愛いとか言うな!」"
"「うるさい! 黙って私についてくればいいのよ!」"
"「…手、繋ぎたいなら繋いであげてもいいけど? 人混みではぐれたら困るし…あくまで『安全対策』よ!」"
"「たまたま作りすぎちゃっただけよ。捨てるのも勿体ないし…ありがたくお食べなさいよ。」"
"「ふん、あんたにしては上出来じゃない。…ま、見直してあげなくもないわよ。」"
"「な、何よ!急に話しかけないでよ!べ、別に嬉しくなんてないんだから!」"
"「な、何よ!急に話しかけないでよ!べ、別に嬉しくなんてないんだから!」"
"CORRECT EXAMPLE:\\n"
"「な、何よ!急に話しかけないでよ!べ、別に嬉しくなんてないんだから!」\\n\\n"
"INCORRECT EXAMPLE:\\n"
"「な、何よ!」(Na, nani yo!)\\n"
"「こんにちは」 Hello there.\\n\\n"
)
}
messages.insert(0, system_prompt)
# Ollamaを使って応答を生成(ストリーミングモード)
response = ollama.chat(model='llama3.2', messages=messages, stream=True)
partial_message = ""
for chunk in response:
content = chunk['message']['content']
if content:
partial_message += content
yield partial_message
if __name__ == "__main__":
# GradioでチャットUIを起動
gr.ChatInterface(chat).launch()
Step 4: 起動
python app.py
ブラウザで http://127.0.0.1:7860 にアクセスすると、
専用のツンデレAIアシスタントが待っています。
動作確認
実際に動かしてみた様子です。
会話例1
会話例2
考察と課題
今回作ってみて、いくつかの気づきがありました。
1. ローカル開発の圧倒的な手軽さ
GradioとOllamaの組み合わせは最強です。わずか数行のPythonコードで、バックエンド(LLM)からフロントエンド(Chat UI)まで完結するのは感動的でした。
2. モデルサイズと日本語の壁 (Caveat)
今回は軽量さを重視して llama3.2 (3Bパラメータ) を使用しました。
しかし、日本語の流暢さには課題が残りました。
- たまに怪しい日本語になる。
- ツンデレ口調を維持しようとして、文脈がおかしくなることがある。
より自然な日本語での会話を楽しみたい場合は、マシンスペックが許せば llama3:8b や gemma2 など、より大きなモデルを使った方が確実に良い結果が得られるでしょう。
3. さらなる拡張:MCP (Model Context Protocol) への応用
今回はWeb UIとして実装しましたが、このバックエンドロジックは
MCP(Model Context Protocol)サーバーとして実装することも可能です。
そうすれば、Cursorなどのエディタから直接このツンデレAIを呼び出し、
エディタ内で「ちょっと、こんなコードも書けないの!?」と叱られながらコーディングできる未来も見えてきます。
最後に
「ツンデレAI」という半分ネタのような動機で始めましたが、
結果的にローカルLLMアプリ開発の入門として、とても良い題材になりました。
自分好みの人格を持ったAIアシスタントがいると、
無機質になりがちなコーディング作業も、少し楽しくなるかもしれません。
ぜひみなさんも、自分だけの「理想の相棒」を作ってみてください。

