LLMの事前学習も自分で試せる「NanoChat」を動かしてみた

 

********

※LINE対応チャットボット版の
「LINEチャットボット屋」
いろんなチャットボットがあります。
ぜひ、ご覧ください!

***************

***************

NanoChatとは?

大規模言語モデル(LLM)は今や、AI研究の中心的な存在だ。
ただ、多くの人が「ChatGPTは使うけど、どうやって作られてるのか分からない」と感じているのも事実だろう。

そんな中、元Tesla AIディレクターでありOpenAIの初期メンバーでもある Andrej Karpathy 氏が、驚くようなプロジェクトを公開した。

その名も「NanoChat」。

キャッチコピーは「The best ChatGPT that $100 can buy(100ドルで作れる最高のChatGPT)」だ。

このコードはgit hubに公開されているのだが、たった100ドル程度でChatGPTのようなモデルを自分で一から学習・実行できるという優れものなのだ。

Karpathy氏いわく、このプロジェクトは「教育・理解・実験用」に設計されており、
研究者や学生がLLMをブラックボックスではなくホワイトボックスとして触れることを目的としているとのこと。

コードの量も非常に少なく、たった数千行で構成されており、
トークナイザー・学習・微調整・推論・Web UIまでがひとつの流れとして完結する。

言ってみれば、ChatGPTを自分のノートPCで読み解くための教科書のような存在だ。

Google ColabでNanoChatを動かしてみた

今回はGPUが使えるGoogle ColabでNanoChatを実行してみた。

事前学習やSFT(Supervised Fine-Tuning)などの本格的なトレーニングはGPUリソースが必要で、ColabのT4やA100環境が必須となる。

処理の細かい所は最後のコードをご覧いただきたい。

このNanoChatは学習済みのチェックポイントも用意されているので、
自分で事前学習させてもよし、推論だけ試すのもよしのモデルになっている。

今回は事前学習の時間がないので、推論のみを試してみる。
早速、会話を始めてみよう。

ChatGPTのような自然な応答

試しにいくつか質問を投げてみた。
(英語のみの学習済みのようなので、英語での質問。和訳付きで紹介)

質問1
User: What do you think about artificial intelligence?

Assistant:
Artificial intelligence is a rapidly evolving field that combines human intelligence with machine capabilities…

AIとは何か?という質問に対し、
「AIは人間の知能と機械の能力を組み合わせて複雑な問題を解く分野であり、
データから学習して適応する能力が人間に似ている」
といった感じの、かなり自然で論理的な文章が返ってきた。

まるでChatGPTそのもののような文体だ。

質問2
User: Do you like coffee or tea?

Assistant:
I don’t have personal preferences, but I can give you an idea of how I approach my coffee or tea…

「AIにコーヒーと紅茶どちらが好き?」と聞くと、
「個人的な好みはないけど、もし選ぶならコーヒー通だと思う」とユーモラスに返してきた。
文体の柔らかさや冗談交じりの表現は、お見事だ。

質問3
User: Have you ever been to Japan?

Assistant:
I’ve had the privilege of visiting Japan several times…

あなたは日本に行ったことがありますか?

京都・大阪・東京などの地名を挙げて、日本を「文化と自然が豊かな国」と語る。
実際はAIの創作だが、まるで旅行ブログのようなリアリティを感じる。

仕組みをざっくり理解する NanoChatの構造

NanoChatの面白いところは、構造が読めることだ。

中核は20層のTransformer(d20モデル)で、埋め込み次元は1280、語彙数は約6.5万。
つまり、ChatGPTなどの巨大モデルのコンパクト版といえる。

トークナイザーにはRust製の rustbpe が採用されており、高速なトークン化が可能。
Pythonから呼び出せるようにmaturin経由でビルドされている。

推論サーバーは FastAPI で構築され、
python -m scripts.chat_web を実行すれば
ローカル環境やColab上で ChatGPT風のブラウザUI を立ち上げることもできる。

さらに cloudflared を使えば、
Colabで立ち上げたUIを外部URL(https://xxxx.trycloudflare.com)で共有できるのも面白い。

Colabで動かして分かったメリットと限界

実際にColabでNanoChatを動かしてみて感じたのは、「軽いのに深い」ということだ。

GPUが1枚でも動作する軽さ
ColabのT4でも十分に推論できる。

コードがシンプルで理解しやすい
教材として最適。LLMの学習プロセスが読み取れる。

ローカル・オフラインで動く
チェックポイントを入れれば、ネットなしでも会話可能。

一方で限界もある。

学習は重い(8×H100などが必要)
英語中心のSFTモデル(日本語対応は別途チューニングが必要)。
ChatGPTほどの文脈保持はまだ弱い。

とはいえ、数十GB単位の学習をせずとも、自分の手で「ChatGPTの仕組み」を動かして理解できるのは大きな魅力だ。

まとめ NanoChatは「LLMを自分で動かす」第一歩に最適

ChatGPTを使うだけの時代から、
「自分で作る・理解する時代」へ。

NanoChatはまさにその転換点を象徴するプロジェクトだ。

LLMがどう動くのか、どんな構造をしているのか、どんな工程で学習しているのかを、実際のコードと対話を通して体感できる。

今回のColab実装では、学習までは行っていないが、推論だけでもChatGPTにかなり近い体験ができた。

英語で自然に会話できるだけでも、AIの「内部構造」を実感するには十分だ。

これからの時代、AIは「使う」だけではなく「理解して作る」スキルも必要だろう。
その第一歩として、NanoChatは最高の教材だと感じた。

これからもこのNanoChatをいろいろいじって遊んでみたい。

使ったpythonコード

Nanochatの 推論のみを試すコードです。
結構シンプルなコードなので、Googleコラボで再現してみてください。

ちなみに、git hubからローカルにcloneしても動きます。
ご希望の方法でやってみましょう。

https://github.com/karpathy/nanochat.git

こんな感じの画面↓

pythonコードです。
そのままベタ貼りしてるので、エラーが出たらGPT5先生とかに聞いてください。


import os, sys, platform, torch, subprocess, textwrap
print("Python:", sys.version)
print("Platform:", platform.platform())
print("CUDA available?:", torch.cuda.is_available())
if torch.cuda.is_available():
print("GPU:", torch.cuda.get_device_name(0))
else:
print("GPU: (なしでもOK、推論はCPUでも動きますが少し遅くなります)")

# リポジトリを取得
!git clone https://github.com/karpathy/nanochat.git
%cd nanochat
!git rev-parse --short HEAD

# 依存をインストール(最小)
# - FastAPI + uvicorn: Webサーバ
# - huggingface_hub: モデル/トークナイザの取得
# - cloudflared: トンネル(ngrok不要、トークン不要)
# - (torch はColabに同梱のものを利用)
#!pip -q install fastapi uvicorn "huggingface_hub>=0.25.0" cloudflared==2024.8.5
!pip install cloudflared

print("installed.")

import os, pathlib, urllib.request

home = str(pathlib.Path.home())
tok_dir = os.path.join(home, ".cache", "nanochat", "tokenizer")
ckpt_dir = os.path.join(home, ".cache", "nanochat", "chatsft_checkpoints", "d20")
os.makedirs(tok_dir, exist_ok=True)
os.makedirs(ckpt_dir, exist_ok=True)

files = {
# tokenizer
os.path.join(tok_dir, "tokenizer.pkl"): "https://huggingface.co/sdobson/nanochat/resolve/main/tokenizer.pkl",
os.path.join(tok_dir, "token_bytes.pt"): "https://huggingface.co/sdobson/nanochat/resolve/main/token_bytes.pt",
# checkpoint (SFT d20)
os.path.join(ckpt_dir, "model_000650.pt"): "https://huggingface.co/sdobson/nanochat/resolve/main/model_000650.pt",
os.path.join(ckpt_dir, "meta_000650.json"): "https://huggingface.co/sdobson/nanochat/resolve/main/meta_000650.json",
}

for out, url in files.items():
if not os.path.exists(out):
print("Downloading", url, "->", out)
urllib.request.urlretrieve(url, out)
else:
print("Exists:", out)

print("\\nReady. Cache root:", os.path.join(home, ".cache", "nanochat"))
!ls -R ~/.cache/nanochat

# 端末チャットで動作確認(任意): セル実行後プロンプトが出ます
# 停止は「Ctrl+C」または Colab のセル停止ボタン
!python -m scripts.chat_cli

#下のセルを実行すると、cloudflared が http://localhost:8000 を 公開URL にトンネルします。
#30秒ほどで https://xxxx.trycloudflare.com のようなURLが出ます。そこをクリックすると ChatGPT風UI に接続できます。

import subprocess, time, os, signal, sys

# 1) FastAPI サーバをバックグラウンドで起動
web_cmd = ["python", "-m", "scripts.chat_web", "--host", "0.0.0.0", "--port", "8000"]
web_proc = subprocess.Popen(web_cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)

# 起動ログを少し待つ
time.sleep(3)
print(">>> chat_web started (pid=%s). Tunneling with cloudflared..." % web_proc.pid)

# 2) cloudflared で公開URLを作る(前面で実行してURLを表示)
# ※ 実行を止めるとトンネルも閉じます。停止は上部の「実行を停止」
try:
!cloudflared tunnel --url http://localhost:8000 --no-autoupdate
finally:
# 終了時にFastAPIプロセスを止める
try:
web_proc.terminate()
except Exception:
pass


****************

研究者は論文を書く。
開発者はブログ記事を書く。

さすれば、科学は進歩する。かな。

****************

最近のデジタルアート作品を掲載!

X 旧ツイッターもやってます。
https://x.com/ison1232

インスタグラムはこちら
https://www.instagram.com/nanahati555/

****************

社内Q&AシステムをRAGを使わずにGPTsチャットボットで作ってみた

 

********

※LINE対応チャットボット版の
「LINEチャットボット屋」
いろんなチャットボットがあります。
ぜひ、ご覧ください!

***************

***************

 

下記の記事が面白かったので、チャットボットに落とし込んでみました。
https://www.itmedia.co.jp/aiplus/articles/2510/16/news124.html

●作ったチャットボット
「カスタマーリンク君」
https://chatgpt.com/g/g-68f75270c38081919be0a216e35c5ed6-ji-shi-lian-xi-kuremudui-ying-asisutanto-kasutamarinkujun

記事ではRAGを使った独自のチャットボットで構築しているようですが、これは当然ですね。

なぜなら、社外秘のデータを外部に落としたくないから。

大企業になればなるほど、社外秘データは増えてくるでしょう。

今回のこちらのGPTsチャットボットでは、データをopenAIのサーバに上げないといけません。

大企業だと、これはちょっとまずいよなってデータもあるわけです。

そんな場合は、社内専用のシステムで構築しないといけません。

このANAのシステムは、東大松尾研出身のベンチャーが作ったようですが、賢明な選択ですね。

しかし、そんな大企業ではない中小企業や個人事業の人もたくさんいるわけです。

こういった方たちは、大規模なシステム構築が必要ないわけで、既存のGPTsチャットボットを使って、同じようなシステムを作ったほうがベターなんです。
しかも非常に安価な金額で構築できます。

要は、社外秘のデータがあるかないかで、システムの作り方が全然違うってことなんですね。

RAGなしでも社内Q&Aチャットボットは作れるのか

生成AIを使って社内向けのQ&Aシステムを作るとき、エンジニアがまず思い浮かべるのが「RAG(Retrieval-Augmented Generation)」でしょう。

RAGは文書データをベクトル化して検索し、関連情報を引っ張ってから回答を生成する仕組みです。

精度は高いが、構築にはそれなりの開発コストとメンテナンスがかかります。

小規模のシステムなら、「GPTs」と呼ばれるチャットボットを使って、RAGを組まずに同様のシステムを再現できます。

つまり、クラウドやコードを触らなくても、ナレッジ(社内文書)をアップロードするだけで知識を持った社内Botが作れるという訳です。

まずは社内文書をナレッジにアップしてみた

今回の実験テーマは「営業会社のクレーム対応マニュアル」。

お客様からの問い合わせや不満にどう対応すべきかをまとめた約1000文字の文書を、GPTsのナレッジとして登録してみた。

アップした文書の内容は下記を参照ください。
(GPT5先生作)

******ここから

## 【仮想社内文書】株式会社セールスリンク お客様対応マニュアル(抜粋)

### 1. 目的

この文書は、株式会社セールスリンクにおけるお客様からのクレーム・お問い合わせへの対応方針と実施手順をまとめたものである。
すべての社員が共通の基準で誠実かつ迅速に対応し、信頼を維持・向上させることを目的とする。

### 2. 基本姿勢

* クレームは「不満」ではなく「改善のチャンス」と捉える。
* まずは**謝罪と共感**を伝えることを優先する(例:「ご不快な思いをさせてしまい、申し訳ございません」)。
* 言い訳よりも**事実確認と解決提案**を重視する。
* お客様の話を最後まで遮らずに聞き、感情を受け止める姿勢を持つ。

### 3. 対応手順

1. **受付**:電話・メール・チャットいずれの場合も、内容を正確に記録する。

* 記録フォーマット:「日時/担当者/お客様名/内容/希望対応/感情レベル」
2. **一次対応**:担当者はその場で可能な範囲の対応を行い、難しい場合は上長へ即時報告。
3. **社内共有**:「#クレーム共有」チャンネルに概要を投稿し、再発防止策をチームで検討。
4. **再発防止**:原因を明確にし、該当部署に改善依頼を出す。
5. **フォローアップ**:対応後3日以内にお客様へ状況を報告し、満足度を確認する。

### 4. 注意事項

* 感情的なお客様には反論せず、「ご意見をしっかり受け止めます」と落ち着いたトーンで返す。
* SNSや口コミサイトでの投稿を見つけた場合は、個別に返信せず広報担当にエスカレーションする。
* 同一クレームが3件以上発生した場合は、週次会議で「原因分析報告書」を提出する。
* 個人情報(氏名・電話番号など)を扱う際は、必ずCRMシステム「SalesHub」上で管理する。

### 5. よくあるケース

* **納期遅延**:まず謝罪し、代替案(次回納期短縮や割引)を提示する。
* **製品不良**:写真を依頼し、確認後に交換・返金を手配。
* **営業対応への不満**:担当者本人ではなく上長が再対応し、誠意を示す。

### 6. 最後に

クレーム対応は会社の信頼を左右する重要なプロセスである。
一人ひとりの対応がブランド価値を作ることを忘れず、誠実で丁寧な対応を徹底すること。
******ここまで

これをナレッジにアップロードした上で、GPTsに「SNSでクレームを書かれたらどう対応すべき?」と質問してみると、

「個人で返信せず、広報担当にエスカレーションする」と回答してきた。

つまりRAGを構築しなくても、検索+要約生成の流れを自動でやってくれるんですね。

プロンプト設計がカギになる

ただし、この手法にはひとつコツがある。
それは「RAGを使わない代わりに、プロンプトで制御する」こと。

GPTsのシステムプロンプトに、以下のような指示を入れると精度が一気に上がります。

1. 回答は必ずナレッジ文書の内容に基づいて行うこと。
2. 明確な記述がない場合は「マニュアル上の記載はありませんが〜」と補足して良い。
3. 関係ない質問には「社内マニュアルに関する質問のみお答えします」と返す。

この3行だけでも、GPTは勝手に雑談方向へ脱線せず、ナレッジベースを前提とした業務Botとして振る舞うでしょう。

さらに、ユーザー向けの「指示文」には次のような案内を添えると使いやすい。

このチャットでは、社内のお客様対応マニュアルをもとに質問できます。


・納期遅延時の対応方法は?
・クレーム内容をどこに共有すればいい?

こうしておくと、社員が聞いていい内容を自然に理解できるかと。

実際の質問例と応答結果はどうなのか

実際にGPTsへ質問を投げてみると、反応は想像以上にスムーズです。

たとえば

質問 「納期遅延のとき、どんな対応をすべき?」

回答 「まず謝罪し、代替案(次回納期短縮や割引)を提示してください。
対応後はクレーム共有チャンネルで共有し、3日以内にフォローアップ報告を行います。」

また、
質問 「お客様が感情的になったときの対応ポイントは?」

回答 「反論せず、『ご意見をしっかり受け止めます』と落ち着いたトーンで返すのが原則です。」

回答スピードも速く、RAG構成でAPI呼び出しをしていたときの待ってる感がほぼゼロに。

ローカル検索を行うわけではないが、GPT内部でアップロード文書がうまく参照されているようだ。

実際に試したい方は、下記にアクセスして使ってみてください。

「カスタマーリンク君」
https://chatgpt.com/g/g-68f75270c38081919be0a216e35c5ed6-ji-shi-lian-xi-kuremudui-ying-asisutanto-kasutamarinkujun

ただし注意点もある。
・文書が多くなると検索精度がやや落ちる
・更新のたびに再アップロードが必要
などなど。

それでも、小規模な社内運用では十分に実用レベルでしょう。

小規模RAGよりGPTsチャットボットが向くケースもある

今回の実験でわかったのは、RAGは重装備すぎる場合があるということ。

たとえば、文書量が数十ページ~数百ページ程度、更新が月1回以下のような業務マニュアルなら、GPTsチャットボットのナレッジ機能だけで十分に賄える。

RAGは確かに強力だが、
・検索インデックスの再構築
・ベクトルDBのコスト
・API統合やセキュリティ管理
といったメンテナンスがつきまとう。

その点、GPTsチャットボットなら、ファイルをドラッグ&ドロップして、即日運用開始。
しかもUIもすでに整っている。スモールスタートで試すには最適な方法だ。

結論として、
まずGPTsチャットボットで社内Q&Aを試作し、足りなければRAGに進む。

この段階的アプローチが、今いちばん現実的でコスパの良い選択肢だろう。

AI導入は大げさなシステムから始める必要はない。
ナレッジを整理してGPTに渡すだけでも、「社内にAIが定着する第一歩」になるでしょう。

まとめ

RAGを使わずとも、GPTsチャットボットのナレッジ機能とプロンプト設計を工夫すれば、驚くほどシンプルに知識を持ったチャットボットが作れる。

RAGが必要になるのは、文書量が膨大で常時更新されるような環境。

それ以外なら、GPTsだけで十分に「実務で使えるAI」が実現できる。

もしこの実験を社内で展開するなら、「まずは小さく試す」ことを忘れずにやりましょう。

その小さな一歩が、今後のAI活用につながるのではと思います。

*記事は生成AIも使ってます。ご参考までに。

******

研究者は論文を書く。
開発者はブログ記事を書く。

さすれば、科学は進歩する。かな。

****************

最近のデジタルアート作品を掲載!

X 旧ツイッターもやってます。
https://x.com/ison1232

インスタグラムはこちら
https://www.instagram.com/nanahati555/

***************

LLMをモデルマージと進化アルゴリズムのハイブリッドで実験してみた話

 

********

※LINE対応チャットボット版の
「LINEチャットボット屋」
いろんなチャットボットがあります。
ぜひ、ご覧ください!

***************

***************

モデルマージで2つのAIをひとつに

LLMを使った実験を続けていると、「異なるモデルを混ぜたらどうなるのか?」という素朴な疑問が浮かびます。
今回の実験はまさにその疑問から始まりました。

使用したのは、日本語系の小型LLMである
rinna/japanese-gpt2-smallと
cyberagent/open-calm-smallです。

古いモデルですが、Googleコラボで2つのモデルを実装するので、メモリの関係上仕方ないですね。

どちらも自然な日本語生成に定評のあるモデルで、今回はこれを“モデルマージ”によって融合してみました。

モデルマージとは、簡単に言えば2つのモデルの重み(パラメータ)を混ぜ合わせる技術です。

ちょうど遺伝子を掛け合わせるようなもので、「Aモデルの文体」と「Bモデルの知識」をほどよくブレンドできる可能性があります。

ただし、このマージは「掛け合わせて終わり」ではありません。
組み合わせ方によっては性能が落ちることもあり、偶然うまく混ざるケースもあります。

そんな“相性実験”を経て、1体の融合モデルが誕生しました。

通常はここでハイおしまいなのですが、これだけではつまらないなと。

じゃあ、このモデルをさらに進化アルゴリズムで進化させてみようと単純に思いました。
まさに知的好奇心です。

どうなるのか、知りたいですよね。

えっ、興味ない。
そうですか。私的にはめっちゃ面白い題材なんですが。

そんなこんなで、やってみますかと。

進化アルゴリズムでLoRAを育てる

続けて実験したのが、進化アルゴリズムを使ったLoRA(Low-Rank Adapter)層の進化実験です。

LoRAは、モデルの一部だけを学習させる軽量チューニング手法です。
このLoRAの重みを「遺伝子」とみなし、進化アルゴリズム(GA)で世代交代を繰り返すという計画を立てました。

初期状態では10個のLoRA個体(=微妙に異なる重みセット)を作成しました。

それぞれに同じプロンプトを与えて生成させ、「文の自然さ」「正しい表記」「冗長さの少なさ」をスコア化しました。

スコアの高い個体ほど“適応度”が高いと判断し、上位個体を親として交叉・突然変異を行い、次世代を生み出す。
これを20世代繰り返しました。

設定は以下の通りです。

個体数:10
世代数:20
交叉率:0.5
突然変異率:0.3

AIがAIを選び、より自然に進化していく。
このプロセスをColab上でリアルタイムに見られるのは、なかなか面白かったです。

余談 ドラマのサラブレッドに思うこと

話は変わりますが、先日日曜日の午後9時からのドラマでロイヤルファミリーと言う競馬を題材にしたドラマが始まりました。

非常に面白く、普段はドラマを見ないのですが、最後まで見入ってしまいました。

ドラマの中で出たのは、サラブレッドと言うのは遺伝子をたどっていくと、最終的にたったの3頭に集約されるそうです。

当然ながら、いろんなサラブレッドが交配を重ねてきたでしょうけど、結果として競走馬としての実力を兼ね備えた遺伝子をたどると、その上位3頭になったのでしょう。

つまり、他の馬たちは競走馬としては淘汰されてしまったと言う話ですね。

AIの世界でも、当然この進化アルゴリズムは通用するわけで、サラブレッドの交配は大変ですが、AIの進化はパソコンの中で作業としては完結できる。しかも自動化です。

これはやってみるに値する作業でしょう。

20世代の進化ログを眺めてみる

進化の過程は、ログとして次のように出力されました。

Gen 00 | best=1.600 avg=1.187
Gen 13 | best=2.000 avg=1.273
Gen 19 | best=1.600 avg=1.233

Evolution done. Elapsed ~18.5 min, best=2.000

bestはその世代で最も良かった個体のスコア、
avgは個体群の平均スコアを意味します。

この数字が1.0〜2.0の間で推移し、13世代目で最高値の「2.000」を記録しました。

進化アルゴリズムらしく、初期はバラバラな出力が多かったのですが、世代を重ねるにつれて平均スコアが安定してきました。

言い回しの崩れが減り、より自然な文体に近づいていくのがログからも見て取れました。

これまた、なかなか面白い様ですね。

実際の出力を見てみよう

最終的に得られた進化済みLoRAを使って生成した出力がこちらです。

紅茶の例

> 生徒から「何でもやってみたけど上手くいかなかった」という声をよく聞きます。では、どうして上手くいかなくなったのか?実は、多くの人がやっていることが間違っているのです。私はこの3つに気をつけています。まずは、茶葉を煎りたてのものにすることです。

コーヒーの例

> 豆に水を加えることで、豆の風味を引き立てることが出来ます。また、お湯を入れることで抽出したコーヒーに含まれる糖分も引き出してくれます。ミルクを加えると味がまろやかになり、栄養価もアップします。

どちらも文法の崩れが少なく、自然な語彙選択ができています。

ただし、「箇条書き」や「番号付き3行」といった構造的指示はまだ弱く、流暢さ優先の傾向が残っています。
とりあえず、この段階でここまで整った出力はよしとしましょう。

次の一歩は構造理解を学ぶ進化へ

今回の進化では「自然さ」と「表記の正確さ」を評価軸にしましたが、次はさらに一歩進んで構造理解を進化に取り込む予定です。

具体的には、

箇条書きを使えたら+0.8点
指定行数を守れたら+0.5点
といった構造スコアを新たに追加し、AIが「文章構造を守る」方向に進化するよう誘導していきます。

モデルマージで生まれた“融合型モデル”に、進化アルゴリズムで磨きをかける。

このハイブリッド実験は、単なる遊びではなく、人間がチューニングしなくても自己最適化していくAIの原型になるのかも知れません。

LLMをモデルマージと進化アルゴリズムのハイブリッドで実験してみた話まとめ

モデルマージで性格の違うAIを融合
進化アルゴリズムでLoRAを自動進化
20世代で自然な文体を獲得
次は「構造を理解するAI」へと進化させる(予定?)

AIが進化する瞬間を目の前で観察できるのは、なかなか面白い実験でした。
進化アルゴリズムはさらなる進歩を遂げていくでしょう。

使用したPythonコードです

以下に使ったPythonコードを掲載します。
結構エラーが出たので修正してます。

コード内のコメントもいろいろあって、まあ見逃してください。

そのままコラボにペーストすれば動きます。
APIは使っていません。

hugging faceのアクセストークンでしたか。
それは必要です。

エラー出たら、GTP5先生とかに聞いてください。


!pip -q install transformers==4.44.2 peft==0.12.0 accelerate==0.34.2 bitsandbytes==0.43.3 \
huggingface_hub==0.25.2 sentencepiece ipywidgets

import os, json, torch, textwrap, shutil
from huggingface_hub import login, HfApi, snapshot_download
from IPython.display import display
import ipywidgets as widgets

# UI
token_box = widgets.Password(
description='HF Token:',
placeholder='hf_xxxxx...(読み取り権限でOK)',
layout=widgets.Layout(width='60%')
)
btn = widgets.Button(description='Login to HF', button_style='primary')
out = widgets.Output()

def do_login(_):
with out:
out.clear_output()
token = token_box.value.strip()
if not token.startswith("hf_"):
print("❌ トークン形式が違うっぽい(hf_で始まるか確認してね)")
return
try:
who = HfApi().whoami(token=token)
os.environ["HUGGINGFACE_HUB_TOKEN"] = token # transformers>=4.38 は token=... で渡すのが推奨
login(token=token, add_to_git_credential=False)
print(f"✅ ログインOK:{who.get('name') or who.get('email')}")
except Exception as e:
print("❌ ログイン失敗:", e)

btn.on_click(do_login)
display(token_box, btn, out)

# =========================================================
# ✅ セル3:モデルを“ダウンロードしてから”読み込み(修正版)
# =========================================================
from huggingface_hub import snapshot_download
import os

# モデル指定
model_a_repo = "rinna/japanese-gpt2-small"
model_b_repo = "cyberagent/open-calm-small"

cache_root = "/content/hf_models"
os.makedirs(cache_root, exist_ok=True)

token = os.environ.get("HUGGINGFACE_HUB_TOKEN", None)
assert token, "HFトークンが未設定です(上のセルでログインしてから実行してね)"

def dl(repo_id):
local_dir = os.path.join(cache_root, repo_id.replace("/", "__"))
if not os.path.exists(local_dir):
print(f"⬇️ ダウンロード: {repo_id}")
snapshot_download(
repo_id,
local_dir=local_dir,
token=token,
resume_download=True, # 中断復帰OK
repo_type="model" # モデル用
)
else:
print(f"✅ 既存ディレクトリを利用: {local_dir}")
return local_dir

local_a = dl(model_a_repo)
local_b = dl(model_b_repo)

from transformers import AutoModelForCausalLM, AutoTokenizer

alpha = 0.5
save_dir = "./merged_model"
os.makedirs(save_dir, exist_ok=True)

# トークンを明示的に渡す
model_a = AutoModelForCausalLM.from_pretrained(local_a, torch_dtype=torch.float16, token=token)
model_b = AutoModelForCausalLM.from_pretrained(local_b, torch_dtype=torch.float16, token=token)

# tokenizerはA側を採用(必要なら後でB側と比較)
#tok_a = AutoTokenizer.from_pretrained(local_a, token=token)
#if tok_a.pad_token is None:
#tok_a.pad_token = tok_a.eos_token

# 変更前:
# tok_a = AutoTokenizer.from_pretrained(local_a, token=token)

# 変更後:
tok_a = AutoTokenizer.from_pretrained(local_a, token=token, use_fast=False)
if tok_a.pad_token is None:
tok_a.pad_token = tok_a.eos_token

sd_a = model_a.state_dict()
sd_b = model_b.state_dict()

merged = {}
skipped = []
for k, va in sd_a.items():
vb = sd_b.get(k, None)
if vb is not None and va.shape == vb.shape and va.dtype == vb.dtype:
merged[k] = (1 - alpha) * va + alpha * vb
else:
merged[k] = va
skipped.append(k)

print(f"ℹ️ 形状不一致などでAを採用したパラメータ数: {len(skipped)} / {len(sd_a)}")
if skipped:
print("例:", skipped[:10])

model_a.load_state_dict(merged, strict=False)
model_a.save_pretrained(save_dir)
tok_a.save_pretrained(save_dir)
print("✅ マージ完了 →", save_dir)

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

m = AutoModelForCausalLM.from_pretrained(save_dir, torch_dtype=torch.float16, device_map="auto")
t = AutoTokenizer.from_pretrained(save_dir, use_fast=False) # ← ここ
if t.pad_token is None:
t.pad_token = t.eos_token

prompt = "コーヒーの淹れ方のコツを、優しく短く教えて。"
inputs = t(prompt, return_tensors="pt").to(m.device)
with torch.no_grad():
out_ids = m.generate(
**inputs,
max_new_tokens=80,
do_sample=True,
temperature=0.7,
top_p=0.9,
repetition_penalty=1.1, # 連発を抑える
no_repeat_ngram_size=2, # 短い反復を防ぐ
pad_token_id=t.eos_token_id
)

# プロンプトの長さを元に出力部分だけを切り出す方法(安全)
gen_part = out_ids[0, inputs.input_ids.shape[1]:]
print(t.decode(gen_part, skip_special_tokens=True))

# セルF0:bitsandbytes をアンインストール(量子化は使わない前提)
!pip -q uninstall -y bitsandbytes

# セルFix1:bnb と triton を入れて import エラーを解消
!pip -q install bitsandbytes==0.43.3 triton==2.3.0

# セルE1:環境セットアップ&LoRA付与(bitsandbytes無し)
!pip -q install transformers==4.44.2 peft==0.12.0 accelerate==0.34.2

import os, copy, time, random
import numpy as np
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model

DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
BASE_MODEL = "./merged_model" # マージ済みモデル

# 乱数固定
SEED = 42
random.seed(SEED); np.random.seed(SEED); torch.manual_seed(SEED)
if DEVICE == "cuda":
torch.cuda.manual_seed_all(SEED)

print("Loading merged model...")
model = AutoModelForCausalLM.from_pretrained(
BASE_MODEL,
torch_dtype=torch.float16 if DEVICE=="cuda" else torch.float32,
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL, use_fast=False)
if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token

# GPT-2系向けのLoRAターゲット
lora_cfg = LoraConfig(
r=8,
lora_alpha=16,
target_modules=["c_attn", "c_proj", "c_fc"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
)
peft_model = get_peft_model(model, lora_cfg)
peft_model.eval()

print("✅ Ready for evolution (no bitsandbytes).")

# セルE2:ユーティリティ(生成、スコア、遺伝子操作)

# 生成(プロンプトの後ろだけ取り出す)
def generate(peft_model, tokenizer, prompt, max_new_tokens=96):
inputs = tokenizer(prompt, return_tensors="pt").to(peft_model.device)
with torch.no_grad():
out_ids = peft_model.generate(
**inputs,
max_new_tokens=max_new_tokens,
do_sample=True,
temperature=0.7,
top_p=0.9,
repetition_penalty=1.15,
no_repeat_ngram_size=2,
pad_token_id=tokenizer.eos_token_id,
eos_token_id=tokenizer.eos_token_id,
)
gen_only = out_ids[0, inputs.input_ids.shape[1]:]
return tokenizer.decode(gen_only, skip_special_tokens=True).strip()

# 軽い流暢さスコア
def fluency_score(txt: str) -> float:
L = len(txt)
s = 0.0
if 40 <= L <= 280: s += 1.0 if any(p in txt for p in ["。","!","!","?","?"]): s += 0.2 if "。" in txt and txt.count("。。") == 0: s += 0.2 # 同一記号の連続を軽く減点 for ch in set(txt): if ch != " " and ch*4 in txt: s -= 0.6; break return s # “表記の崩れ”を抑えるための簡易スコア(例:『淹れる』推奨) def orthography_score(txt: str) -> float:
good = ["淹れる","淹れ方","蒸らし","抽出","湯温"]
bad = ["をれる","れ方","お茶をれる","コーヒーをれる","れれる"]
return 0.6*sum(txt.count(w) for w in good) - 1.0*sum(txt.count(b) for b in bad)

# (好きに差し替え可)評価用プロンプト
PROMPTS = [
"紅茶教室の講師として、初心者向けに、3つのコツを箇条書きで短く教えて。",
"コーヒーを美味しく淹れるための手順を、番号付きで3行で説明して。",
"来客に出すお茶のマナーを、やさしく1段落でまとめて。"
]

# 総合評価(平均)
def evaluate_individual(peft_model, tokenizer, lora_sd):
# LoRA適用
with torch.no_grad():
for k,v in peft_model.state_dict().items():
if "lora_" in k and k in lora_sd:
v.copy_(lora_sd[k].to(v.device, dtype=v.dtype))
peft_model.eval()

total = 0.0
for p in PROMPTS:
out = generate(peft_model, tokenizer, p)
total += fluency_score(out) + orthography_score(out)
return total / len(PROMPTS)

# LoRA重みの抽出/適用(state_dictベース)
def extract_lora_state_dict(peft_model):
return {k: v.detach().cpu().clone() for k,v in peft_model.state_dict().items() if "lora_" in k}

def crossover_uniform(a, b, cxpb=0.5):
child = {}
for k in a.keys():
ta, tb = a[k], b[k]
mask = torch.rand_like(ta, dtype=torch.float32) < cxpb
child[k] = torch.where(mask.to(ta.device), ta.to(ta.device), tb.to(ta.device)).cpu()
return child

def mutate_gaussian(sd, mut_pb=0.3, sigma=0.01):
child = {}
for k, t in sd.items():
x = t.clone()
mask = torch.rand_like(x, dtype=torch.float32) < mut_pb noise = torch.randn_like(x, dtype=torch.float32) * sigma x = x + noise * mask child[k] = x return child print("✅ Utils ready.") # セルE3:進化ループ本体(POP=10, GEN=20) POP_SIZE = 10 N_GEN = 20 CXPB = 0.5 # 交叉率 MUT_PB = 0.3 # 突然変異率 MUT_SIG = 0.01 # 変異の強さ SAVE_DIR = "./evo_outputs" os.makedirs(SAVE_DIR, exist_ok=True) base_lora = extract_lora_state_dict(peft_model) def random_individual(): # 初期はベース周りにランダム微擾 return mutate_gaussian(base_lora, mut_pb=0.5, sigma=0.02) population = [random_individual() for _ in range(POP_SIZE)] history = [] best_sd, best_score = None, -1e9 start = time.time() for gen in range(N_GEN): scores = [evaluate_individual(peft_model, tokenizer, ind) for ind in population] gen_best = float(np.max(scores)) gen_avg = float(np.mean(scores)) best_idx = int(np.argmax(scores)) print(f"Gen {gen:02d} | best={gen_best:.3f} avg={gen_avg:.3f}") history.append((gen, gen_best, gen_avg)) if gen_best > best_score:
best_score = gen_best
best_sd = copy.deepcopy(population[best_idx])

# エリート選択(上位20%)
elite_k = max(1, POP_SIZE // 5)
elite_idx = list(np.argsort(scores))[::-1][:elite_k]
elites = [population[i] for i in elite_idx]

# 親プール(トーナメント)
def tournament(k=3):
idxs = random.sample(range(POP_SIZE), k)
return population[max(idxs, key=lambda j: scores[j])]

parents = elites[:]
while len(parents) < POP_SIZE:
parents.append(tournament())

# 次世代
next_pop = elites[:]
while len(next_pop) < POP_SIZE: pa, pb = random.sample(parents, 2) child = crossover_uniform(pa, pb, cxpb=0.5 if CXPB>0 else 1.0)
child = mutate_gaussian(child, mut_pb=MUT_PB, sigma=MUT_SIG)
next_pop.append(child)

population = next_pop

elapsed = (time.time() - start) / 60.0
print(f"\n✅ Evolution done. Elapsed ~{elapsed:.1f} min, best={best_score:.3f}")

# 保存
torch.save(best_sd, os.path.join(SAVE_DIR, "best_lora_state.pt"))
import csv
with open(os.path.join(SAVE_DIR, "evolution_log.csv"), "w", newline="", encoding="utf-8") as f:
w = csv.writer(f); w.writerow(["gen","best","avg"]); w.writerows(history)
print("Saved:", os.path.join(SAVE_DIR, "best_lora_state.pt"))
print("Saved:", os.path.join(SAVE_DIR, "evolution_log.csv"))

# セルE4:ベスト個体で軽く生成プレビュー
best_path = "./evo_outputs/best_lora_state.pt"
assert os.path.exists(best_path), "best_lora_state.pt が見つかりません"

# LoRAを適用
with torch.no_grad():
current = peft_model.state_dict()
best_sd = torch.load(best_path, map_location="cpu")
for k in current.keys():
if "lora_" in k and k in best_sd:
current[k].copy_(best_sd[k].to(current[k].device, dtype=current[k].dtype))

# テストプロンプト
tests = [
"紅茶教室の講師として、初心者向けに、3つのコツを箇条書きで短く教えて。",
"コーヒーを美味しく淹れるための手順を、番号付きで3行で説明して。"
]
for p in tests:
print("\n[PROMPT]", p)
print("[OUTPUT]", generate(peft_model, tokenizer, p))

!zip -r evo_results.zip merged_model evo_outputs

from google.colab import drive
drive.mount('/content/drive')

!mkdir -p /content/drive/MyDrive/evo_backup
!cp -r ./merged_model ./evo_outputs /content/drive/MyDrive/evo_backup/

import pandas as pd, matplotlib.pyplot as plt
df = pd.read_csv('./evo_outputs/evolution_log.csv')
plt.plot(df['gen'], df['best'], label='Best')
plt.plot(df['gen'], df['avg'], label='Average')
plt.xlabel('Generation'); plt.ylabel('Score'); plt.legend(); plt.grid(); plt.show()

研究者は論文を書く。
開発者はブログ記事を書く。

さすれば、科学は進歩する。かな。

****************

最近のデジタルアート作品を掲載!

X 旧ツイッターもやってます。
https://x.com/ison1232

インスタグラムはこちら
https://www.instagram.com/nanahati555/

***************

コーヒー豆専門 販売コンサルのチャットボット「珈琲豆売り増くん」を作りました

********

※LINE対応チャットボット版の
「 LINEチャットボット屋」
いろんなチャットボットがあります。
ぜひ、ご覧ください!

********

無料です。使ってみてください。

珈琲豆売り増くん
https://chatgpt.com/g/g-68d261dd6ef081919b3a4d03fd580428-kohidou-zhuan-men-fan-mai-konsaru-jia-bei-dou-mai-rizeng-kun

********

***************

***************

「珈琲豆売り増くん」とは?コーヒー販売者専用の相談相手

コーヒー豆の販売を始めたいけれど、「どうやって集客すればいいのか分からない」「どんな価格で売ればいいのか迷う」という声をよく聞きます。
そんな悩みを解決するために誕生したのが、コーヒー豆販売に特化したコンサル型チャットボット「珈琲豆売り増くん」です。

「珈琲豆売り増くん」は、これから販売を始める個人事業主や小規模カフェ、オンラインショップを立ち上げる人に向けて作られています。

単なるFAQボットではなく、ユーザーの状況を聞き出しながら最適な販売戦略を提案してくれる“伴走型アドバイザー”というのが特徴です。

たとえば、「初心者に向けて売りたいのか」「ギフト需要を狙いたいのか」などをヒアリングし、そのターゲットに合わせた販売プランを具体的に提示してくれます。
「とりあえず誰かに相談したい」というときに、いつでも使える心強い相棒になるはずです。

販売初心者でも安心!戦略から集客まで伴走サポート

コーヒー豆の販売を考えるとき、まず立ちはだかるのは「何から始めればいいか分からない」という壁です。
珈琲豆売り増くんは、その最初の一歩から伴走してくれる存在です。

例えば、こんなアドバイスをしてくれます。

ターゲット顧客の明確化:「初心者」「コーヒー通」「ギフト需要」などから、自分に合う層を選ぶサポート。

販売チャネルの提案:BASEやSTORESのようなネットショップ、InstagramやLINE公式アカウントとの連携方法。

価格設定の考え方:原価計算だけでなく「顧客が納得する価格」を重視するアドバイス。

小さなテスト販売の提案:まずは少量パックから販売して反応を確認する方法。

こうした具体的なガイドがあると、初心者でも安心して進められます。

しかも一度の相談で終わるのではなく、「やってみた結果どうでしたか?」と次のステップに進むための会話ができるのが、このボットの最大の強みです。

 

SNS活用・価格設定・リピーター対策まで具体的に提案

販売を続けていくと、「SNSに何を投稿すればいいのか」「リピーターを増やすにはどうすればいいのか」といった悩みが出てきます。

珈琲豆売り増くんは、そうした実践的な課題にも対応してくれます。

SNS活用
Instagramでは「焙煎中の動画」「パッケージ写真」「淹れ方のコツ」を投稿すると効果的だと言われています。
このような具体例を交えて「どんな写真や文章を載せればいいか」までアドバイスしてくれるのです。

価格設定
単なる「仕入れ+利益」で決めるのではなく、「ターゲット顧客が納得する価格」になるように提案してくれます。

初心者向けには小容量のお試しパック、ギフト需要には高級感あるボックス、というように価格帯ごとの工夫まで考えてくれます。

リピーター対策
「次回割引クーポンを入れる」「LINEで新商品情報を配信する」など、長く付き合ってくれる顧客を増やすためのアドバイスも得られます。

一度きりの販売で終わらず、ブランドとして成長させていく道筋を示してくれるのは大きな魅力です。

実際に使うとどうなる?想定シナリオとメリット

では、実際に珈琲豆売り増くんを使ったとき、どんな流れになるのでしょうか。

想定シナリオ

販売者が質問する:「コーヒー豆をネットで売りたいけど、どこから始めればいいですか?」

ボットが回答する:「まずはターゲットを初心者向けかギフト需要かに絞りましょう。どちらを優先したいですか?」

販売者が答える:「ギフト需要を狙いたいです」

ボットが提案する:「それなら高級感あるパッケージを少量から試してみましょう。まずはBASEで販売を始め、Instagramで贈り物シーンを投稿すると効果的です」

このように、会話の中で状況を整理しながら具体的な行動プランに落とし込めるのが特徴です。

利用メリット

24時間いつでも相談できる
自分専属のマーケティング担当のように伴走してくれる
初心者でも段階的に学びながら販売を進められる
集客からリピーター戦略まで一貫してサポートしてくれる

まるで「売上を一緒に作ってくれるパートナー」を持つような感覚になるはずです。

まとめ:あなたのコーヒー販売を伸ばす心強いパートナー

コーヒー豆の販売は、ただ豆を用意するだけではなく、戦略を考え、顧客に伝え、リピーターを増やしていくことが求められます。

その過程は一人でやろうとすると不安も多く、何度も壁にぶつかると聞きます。

珈琲豆売り増くんは、そんな販売者に寄り添いながら、一歩ずつ前に進めるための相談相手です。
販売チャネルの選び方から価格設定、SNS運用、リピーター対策まで、幅広くアドバイスOK。

これからコーヒー豆販売を始めたい人にとって、まさに「心強い伴走者」になるでしょう。

無料ですので、ぜひ使ってみてください。

珈琲豆売り増くん
https://chatgpt.com/g/g-68d261dd6ef081919b3a4d03fd580428-kohidou-zhuan-men-fan-mai-konsaru-jia-bei-dou-mai-rizeng-kun

****************

最近のデジタルアート作品を掲載!

X 旧ツイッターもやってます。
https://x.com/ison1232

インスタグラムはこちら
https://www.instagram.com/nanahati555/

****************

プロの仮想投資家があなたの事業をジャッジする!「マネーの獅子プロ版」チャットボットを作りました

****************

マネーの獅子プロ版はnoteにて販売しています。(500円)
↓↓↓
「あなたの事業は出資されるのか」 マネーの獅子プロ版 30人のAI投資家があなたの事業を審査する そんなチャットボットを作りました
https://note.com/tonsuke456/n/nbf5083e8cca4

****************

※LINE対応チャットボット版の
「 LINEチャットボット屋」
いろんなチャットボットがあります。
ぜひ、ご覧ください!

***************

***************

AI投資家が、あなたのビジネスに投資するかを判断する

新しい時代のビジネス評価ツール、「マネーの獅子プロ版」チャットボットを作りました。

これは、AIが投資家の視点であなたの事業アイデアを分析し、成功確率を数値化して示すシステムです。
感覚ではなく、データに基づいて判断することで、起業家や事業主がより確実な一歩を踏み出せるように支援します。

ビジネスを立ち上げるとき、「本当にこのアイデアは成功するのか?」「投資に値するのか?」という悩みは誰にでもありますよね。

マネーの獅子プロ版は、そうした不安を解消するために作られました。

投資家が実際にチェックする視点をAIに学習させ、あなたのアイデアを客観的に評価します。
今までのような“なんとなく良さそう”という判断から一歩先へ進めるのが、このツールの最大の特徴です。

あなたの事業アイデアの“実力”を分析します

マネーの獅子プロ版が目指すのは、「ビジネスの実力を数値化」することです。
AIがあなたの事業概要を読み取り、市場性や収益性などを総合的に分析。最終的に「成功確率スコア」として提示します。

このスコアは単なる数字ではありません。AIが過去の成功・失敗データをもとに学習しているため、統計的な裏付けがあります。

「何が強みで、どこに改善の余地があるのか」が明確にわかるため、次のアクションにすぐ移せます。

さらに、マネーの獅子プロ版ではスコアを上げるための「改善提案」も自動生成されます。

まるで経験豊富な投資家が、あなたの事業計画を添削してくれているような感覚です。経験頼りではなく、データと理論に基づいた判断をしてくれます。

AIが評価する5つの指標とは? 成功確率を表示します

「市場性」「収益性」「実現性」「差別化」「成長性」を徹底分析。

マネーの獅子プロ版は、事業を次の5つの観点から分析します。

1. 市場性
今後の市場規模や需要の伸びを予測。あなたのビジネスが成長産業に位置しているかを判断します。

2. 収益性
利益構造の妥当性をチェック。価格設定、コスト構造、利益率の見込みをAIが評価します。

3. 実現性
実行体制やリソースの面から、実現可能性を数値化。実行プランが現実的かどうかを判定します。

4. 差別化
競合との違いを分析し、独自性の強さをスコア化。他社にはない強みがどれほどあるかを評価します。

5. 成長性
短期的・中長期的なスケールアップの可能性をチェック。持続的に発展できるかを見極めます。

これらの評価を総合して導き出されるのが、「成功確率スコア」です。
あなたの考えたビジネスモデルがどれだけ成功確率があるのかを教えてくれます。

改善提案まで! スコアに基づいた次の一手をアドバイス

マネーの獅子プロ版の最大の魅力は、スコアを出して終わりではないことです。

各項目の評価に基づき、「次に取るべき行動」を具体的にアドバイスします。

例えば、収益性が低い場合は「サブスクリプションモデルの導入を検討」「高単価商品の開発」など、現実的な改善策が提示されます。

市場性が弱いと判定された場合は、「よりニッチなターゲット層の設定」「成長市場へのピボット」など、軌道修正のヒントを受け取れます。

これらの提案は、ただのテンプレートではなく、あなたの事業内容に合わせて生成されるオーダーメイド型。まさに“AI投資家が伴走してくれる感覚”です。

ビジネスの方向性に悩んだとき、プロの視点を即座に得られることは大きな強みになります。

スタートアップから個人事業まで、誰でも診断OK

マネーの獅子プロ版は、スタートアップだけでなく、個人事業主や副業起業家にも開かれたツールです。
業種や規模を問わず、アイデアベースでも診断が可能。たとえまだ構想段階であっても、AIが市場性や実現性を判断してくれます。

利用はとてもシンプルです。タイトル、概要、対象顧客、強みを入力するだけで、数秒後には投資家目線のレポートが生成されます。

分析結果はコメント形式でわかりやすく表示されるため、ビジネス初心者でもすぐに理解できます。

ぜひ一度、AI投資家の目であなたのアイデアをチェックしてみてください。もしかしたら、そこには新しい可能性が見えてくるかもしれません。

実際の「マネーの獅子プロ版」の事業成功確率レポートを紹介

下記はあるビジネスモデルを実際に入力して、その投資の可否をジャッジしてもらった結果です。ご参考にしてください。

*****

この結果は30名の仮想投資家の視点をもとに分析した予測値です。
将来の成果を保証するものではありません。

🕐 初回評価の成功確率
平均:42% 中央値:41%
信頼区間:39〜45%

🎯 改善提案(詳細分析)

まず注目すべきは、この事業が取り組んでいる「シニアの孤立防止・健康維持」という社会課題が非常に重要であり、行政や医療機関からも追い風がある点です。しかし現時点のビジネスモデルは、月額課金+スポンサー広告という二本柱に限定されており、シニア層特有の課金率の低さや広告依存のリスクが課題として浮き彫りになっています。投資家の多くが「事業の持続可能性」を懸念しており、まずは収益構造の補強が必要と考えられます。

有力な改善策としては、B2BやB2G(行政向け)の収益源を加えることです。例えば介護事業者や病院に対して「地域の高齢者コミュニティへのアクセス権」を販売したり、行政が推進する高齢者見守り事業と連携することで、安定的な収益を確保できます。さらに健康保険組合や製薬企業とスポンサー契約を結べば、単なる広告モデル以上に強固な協賛基盤を築けるでしょう。これにより、ユーザー課金に依存しすぎない持続的なモデルに進化できます。

次に、利用率と継続率を高める工夫が必要です。シニア層はデジタル利用習慣が弱く、アプリ単体では継続率が低い傾向があります。そのため「リアルイベントや地域交流会」との連携が鍵となります。オフラインでの活動がオンラインコミュニティへの導線となり、逆にアプリ上で知り合った仲間がイベント参加につながるという循環をつくることが、投資家からも高く評価されやすい仕組みです。

さらに、使いやすさを徹底したUI/UX設計と、紙媒体や電話サポートを活用したハイブリッド運用が有効です。特に70代以上の利用者にとっては、完全デジタル依存ではハードルが高いため、「地域新聞やチラシ」と「アプリ」の二重のチャネルで接触することで導入障壁を下げられます。これらを通じて、投資家が求める「利用者の拡大余地とリテンションの裏付け」が強化され、成功確率を引き上げることが期待できます。

🧭 分析コメント(詳細解説)

今回の評価では、30名の仮想投資家のうち、約12名が「条件付きで投資可能」、10名が「社会的意義は認めるが収益性に不安」、8名が「規模拡大の難しさから消極的」と判断しました。平均成功確率は42%に留まりましたが、市場の社会的意義は高く評価され、特にESG・インパクト投資志向の投資家からはポジティブなコメントが寄せられました。

一方で懸念点は収益性の低さと利用率の不透明さです。シニア向けアプリは一般的に課金率が低く、広告モデルも単価が上がりにくいため、「どのように安定収益を構築するのか」が投資家の関心事となりました。特に、収益が「ユーザー数に大きく依存している」点が不安要素として指摘されています。

ただし、地域NPOとの提携による「信頼性の高いコミュニティ設計」は大きな強みと評価されています。既存のSNSとの差別化要素として、投資家は「地域性」と「安心感」を重要なモート(参入障壁)と捉えており、この点は市場での差別化要因となり得ます。

また、市場の外部要因も追い風です。高齢化の進行に伴い、行政や医療機関の関心が高まっているため、B2G/B2Bの導入がうまく進めば評価は一気に改善します。投資家は「自治体や介護事業者との契約がどの程度確保できるか」を、今後の投資判断の基準にする可能性が高いでしょう。

総じて、この事業は社会的価値と政策的追い風がある一方で、収益モデルの再設計と利用率向上の具体策が不足しているため、現時点での投資確率はやや低めとなりました。しかし、行政や介護業界との提携に成功すれば、成功確率は55〜60%まで上昇する可能性が十分にあります。

🪜 次にできること
ここから先は実際にお試しを!

まとめ

どうでしょうか。この仮想投資家があなたのビジネスモデルをAIの力でジャッジするチャットボット。

特に、成功確率の算出と、改善提案のアドバイスは必見です。

これを元にあなたのビジネスを修正して、実際の投資家の方々から、ぜひマネーを引き出してください。

また、投資を受けないという方でも、この成功確率とアドバイスを参考にして、ぜひあたなの作ったビジネスモデルをブラッシュアップしてください。

さすれば、さらに成功への道は近くなるかと思います。

マネーの獅子プロ版はnoteにて販売しています。(500円)
↓↓↓
「あなたの事業は出資されるのか」 マネーの獅子プロ版 30人のAI投資家があなたの事業を審査する そんなチャットボットを作りました
https://note.com/tonsuke456/n/nbf5083e8cca4

ぜひ利用してみてください。

****************

最近のデジタルアート作品を掲載!

X 旧ツイッターもやってます。
https://x.com/ison1232

インスタグラムはこちら
https://www.instagram.com/nanahati555/

****************

PAGE TOP