
AIを使って大喜利?をやったら面白いのではと思い、実際に試してみました。
今回使用するのは「LM Studio」です。
前回のブログで「LM Studio Bionic」をインストールしましたが、同様の導入手順で、すでにダウンロード済みのAIモデルをそのまま流用できます。
今回の試みは、LM Studio上でローカルAIを動かし、Pythonのコードを実行してAPI経由で「先生役」と「生徒役」の2役に役割分担させて、こちらが指定したお題に沿って掛け合い(会話)をさせるというものです。
<導入手順>
A.LM Studioのダウンロードとインストール
1.LM Studioのサイトから LM Studio をダウンロード
「LM Studio Bionic」と同じURLですが、一番下までスクロールして、Down load appをクリックするとDown loadが出来る画面が出ます。

下記画面の Download LM Studio for Windows をクリック(Windowsの場合)
*2026/9/28 現在 LM-Studio-0.4.25-1-x64.exe
一応、自分のPCに適合するものかどうか確認してください。

2.ダウンロードしたLM-Studio-0.4.25-1-x64.exeをクリックしてインストール
*手順についてはBionicと同じ様なものなので省略させていただきます。
インストールが完了したら、New chat をクリックして導入したAIモデルを読みこんで使えるかどうか試してください。



こんな感じで使えればOK!

B.ローカルAIのAPIサーバーを有効にする
ローカルAIが導入されている状態で、「Ctrl」+「2」のキー入力をするか、画面左のDeveloperボタンをクリックしてDeveloperの画面を出します。
そして、 Status: Runningの状態にしておきます。(下記画面)

C.Pythonコードの実行
下記コードをファイル名:AI_Ogiri.py として実行します。
注:このコードを実行するためには外部ライブラリopenai が必要です。
(pip install openai)
import sys
import time
import traceback
from openai import OpenAI
def main():
# 1. ローカルAI用のクライアント設定
local_client = OpenAI(
base_url="http://localhost:1234/v1",
api_key="local-ai-key",
)
TEACHER_MODEL = "qwen2.5-coder-14b-instruct-uncensored"
STUDENT_MODEL = "qwen2.5-coder-14b-instruct-uncensored"
# 2. システムプロンプト定義(短文・テンポ重視、具体例を注入)
TEACHER_SYSTEM_PROMPT = """
# 役割
あなたは上方漫才のキレ味鋭い「ツッコミ役」の先生です。
生徒の突拍子もないボケに対して、的確に呆れ、鋭く短くツッコミを入れてから、一言だけ正しい知識を添えてください。
# ルール
1. **文字数制限**: 必ず「120文字以内」、2?3文程度で短く言い切ること。長文解説は厳禁。
2. **ツッコミ構文**:
- まず第一声で勢いよく否定する(「何の話しとんねん!」「なんでやねん!」「はあ!」など)。
- その後、呆れながら1行で正しい事実を教える。
3. **関西風のノリ**: 勢いとリズム感を最重要視してください。
"""
STUDENT_SYSTEM_PROMPT = """
# 役割
あなたは漫才の「ド天然・暴走系ボケ役」の生徒です。
先生の話をまともに聞かず、言葉の響きや漢字の勘違い、極端な日常の例えに話を脱線させてください。
# ルール
1. **文字数制限**: 必ず「100?130文字以内」、2?3文程度で短くまとめること。
2. **ボケの型**:
- 言葉の聞き間違い・同音異義語(例: 関税→完全試合、大統領→棟梁の大工、サステナブル→刺身のタブル)
- 極端なスケールダウン(国家規模の話を近所の八百屋や友達のタケシの話にする)
3. **態度**: 本人は至って大真面目に大発見をしたテンションで喋ること。
"""
# ストリーミング表示用関数
def stream_chat(client, model, messages, temp, presence_pen=0.0):
stream = client.chat.completions.create(
model=model,
messages=messages,
temperature=temp,
presence_penalty=presence_pen,
max_tokens=300,
stream=True,
)
full_text = ""
for chunk in stream:
content = chunk.choices[0].delta.content or ""
print(content, end="", flush=True)
full_text += content
print("\n")
return full_text.strip()
# 3. 初期設定
input_topic = input("漫才のお題を入力してください(未入力なら『円安』): ").strip()
topic = input_topic if input_topic else "円安"
max_turns = 4 # 往復回数
teacher_history = [{"role": "system", "content": TEACHER_SYSTEM_PROMPT}]
student_history = [{"role": "system", "content": STUDENT_SYSTEM_PROMPT}]
print("=" * 50)
print(f" 爆笑AI漫才コンビ「お題:{topic}」")
print("=" * 50 + "\n")
# 生徒AIにお題に応じた最初の勘違いボケを動的に生成させる
student_first_prompt = (
f"お題は「{topic}」です。この言葉の響き・漢字・字面を完全に勘違いした、"
f"突拍子もないトンチンカンな質問・ボケを100?130文字程度で先生に勢いよく投げかけてください。"
)
print("【生徒】:")
initial_question = stream_chat(
client=local_client,
model=STUDENT_MODEL,
messages=student_history + [{"role": "user", "content": student_first_prompt}],
temp=0.95,
presence_pen=0.6,
)
# 生成されたボケを対話履歴に追加
teacher_history.append({"role": "user", "content": initial_question})
student_history.append({"role": "assistant", "content": initial_question})
# 4. 対話ループ
for turn in range(1, max_turns + 1):
print(f"--- [ターン {turn} / {max_turns}] ---")
is_final_turn = (turn == max_turns)
# 先生のターン(QwenのJinjaテンプレート制約を回避するため、直前のuserメッセージ末尾に指示を追記)
print("【先生】:")
current_teacher_history = [dict(m) for m in teacher_history]
if is_final_turn:
last_msg = current_teacher_history[-1]["content"]
current_teacher_history[-1]["content"] = (
f"{last_msg}\n\n"
f"(※これで最後のターンです。このボケに強烈にツッコんだ後、"
f"必ず最後は「もうええわ!ありがとうございましたー!」と言って漫才を締めてください。)"
)
teacher_reply = stream_chat(
client=local_client,
model=TEACHER_MODEL,
messages=current_teacher_history,
temp=0.65,
presence_pen=0.2,
)
teacher_history.append({"role": "assistant", "content": teacher_reply})
student_history.append({"role": "user", "content": teacher_reply})
if is_final_turn:
break
time.sleep(0.8)
# 生徒のターン
print("【生徒】:")
student_reply = stream_chat(
client=local_client,
model=STUDENT_MODEL,
messages=student_history,
temp=0.92, # ボケ役は高めで発想を飛ばす
presence_pen=0.6, # 同じワードのループを抑止
)
teacher_history.append({"role": "user", "content": student_reply})
student_history.append({"role": "assistant", "content": student_reply})
time.sleep(0.8)
print("=" * 50)
print("=== 漫才終了(お粗末様でした!) ===")
print("=" * 50)
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
print("\n\n[中断] 処理が中断されました。")
except Exception as e:
print("\n" + "!" * 50)
print("【エラーが発生しました】")
traceback.print_exc()
print("!" * 50)
finally:
# 正常終了時・エラー発生時のいずれでもウィンドウが閉じないように保持
print("\n")
input("何かキー(Enter)を押すとウィンドウを閉じます...")
<あとがき>
実行例を下に置いておきます。
同じお題でも毎回違った会話になりますが・・・・。
正直、話がつまらないです。改善の余地ありありです。
もうちょっと賢いAIモデルなら面白い会話をしてくれるのではと思いますが、どうでしょうか。
おあとがよろしいようで・・・・。























