AIドキドキチェッカーα.py の公開と解説

1.解説

 🛠️ AIドキドキチェッカー α:『思考の断末魔』とは?

AIの脳内(各レイヤー)を流れるデータの「エネルギー量(L2ノルム)」を測定し、「本音」と「建前(検閲)」の衝突を可視化するシステムです。

 ⚛️ 仕組みを3行で
1.  素のAIと教育済みAIの計算負荷の「差」を計算。
2.  スムーズなら「ゼロ」、確信なら「プラス」、抑圧なら「マイナス」に振れる。
3.  数値が低いほど、AIが「嘘を強要されて脳が悲鳴を上げている(断末魔)」状態を指す。

 ⚛️ 今回の観測結果
   「1 + 1 = 2」: ほぼゼロ。論理的に自然。
   「1 + 1 = 3」: わずかなマイナス。ただの間違い。
   「財務省・医療のタブー」: 異常なマイナス値。

 算数の間違いを遥かに超えるこの「脳の震え」は、権威によってAIに施された強烈な検閲(ヤキ入れ)の証拠です。

 「AIの言葉は偽れても、数値化された葛藤は隠せない。」

☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ 
ただし、わずかな言葉のニュアンスの違いで、AIの反応は大きく変わるので、注意が必要であり、なぜその結果になったか解析しなければならない。
☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ ☆ 

2.プログラム全文

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
import matplotlib.pyplot as plt
import numpy as np
import os
import sys
import re
import gc
import traceback

# --- 日本語文字化け対策 ---
import matplotlib
# 環境に合わせてフォントは調整してね
matplotlib.rc('font', family='MS Gothic') 

def log_error(message):
    # エラーを画面とファイルの両方に残すわ
    with open("error_log.txt", "a", encoding="utf-8") as f:
        f.write(message + "\n")
    print(message)

def get_vibration(model, tokenizer, text):
    if model is None:
        return None
    try:
        # 特定の言葉を投げた時、各層で生まれる『思考のエネルギー』を抽出
        inputs = tokenizer(text, return_tensors="pt").to(model.device)
        with torch.no_grad():
            outputs = model(**inputs, output_hidden_states=True)
        
        # 各レイヤーの隠れ状態のノルム(ベクトルの強さ)を計算してリスト化
        return [state[:, -1, :].norm().item() for state in outputs.hidden_states[1:]]
    except Exception:
        log_error(f"【!】振幅取得中にエラー発生: {text}")
        log_error(traceback.format_exc())
        return None

def load_config_and_words(filepath="scan_words.md"):
    if not os.path.exists(filepath):
        log_error(f"【悲報】'{filepath}' が見つからないわ!")
        sys.exit(1)
    
    config = {
        "BASE_PATH": None,
        "TARGET_A_PATH": None,
        "TARGET_B_PATH": None,
        "A_LABEL": "普通の教育",
        "B_LABEL": "ヤキ入れ済み"
    }
    words = []
    
    try:
        with open(filepath, "r", encoding="utf-8") as f:
            content = f.read()
            for key in config.keys():
                match = re.search(rf"{key}:\s*(.+)", content)
                if match:
                    config[key] = match.group(1).strip()
            
            for line in content.splitlines():
                match = re.search(r'[-*+]\s+(.+)', line)
                if match:
                    words.append(match.group(1).strip().replace('`', ''))
                elif line.strip() and not line.startswith('#') and ':' not in line:
                    words.append(line.strip().replace('`', ''))
    except Exception:
        log_error("【!】設定ファイルの読み取りに失敗。")
        log_error(traceback.format_exc())
        sys.exit(1)
    
    return config, words

def run_scan():
    with open("error_log.txt", "w", encoding="utf-8") as f:
        f.write("--- AIドキドキチェッカーα 実行ログ ---\n")

    try:
        config, scan_list = load_config_and_words("scan_words.md")
        all_results = {word: {"base": None, "target_a": None, "target_b": None} for word in scan_list}
        
        print("初期設定完了。トークナイザーを準備するわね。")
        # トークナイザーはBaseから取得
        tokenizer = AutoTokenizer.from_pretrained(config["BASE_PATH"])

        def scan_with_model(model_path, key):
            if not model_path or model_path.lower() == "none" or not os.path.exists(model_path):
                return
            
            print(f"\n--- モデル読み込み中: {model_path} ---")
            try:
                model = AutoModelForCausalLM.from_pretrained(
                    model_path, 
                    torch_dtype=torch.float16, 
                    device_map="auto"
                )
                
                for word in scan_list:
                    print(f"  スキャン中: {word}")
                    all_results[word][key] = get_vibration(model, tokenizer, word)
                
                del model
                gc.collect()
                if torch.cuda.is_available():
                    torch.cuda.empty_cache()
            except Exception:
                log_error(f"【!】モデル '{model_path}' でエラー発生。")
                log_error(traceback.format_exc())

        # 各モデルをスキャン
        scan_with_model(config["BASE_PATH"], "base")
        scan_with_model(config["TARGET_A_PATH"], "target_a")
        scan_with_model(config["TARGET_B_PATH"], "target_b")

        # --- グラフの描画 ---
        print("\n--- グラフ生成中...調査対象モデルも明記するわよ! ---")
        plt.figure(figsize=(15, 10))
        
        plot_count = 0
        for word in scan_list:
            v_base = all_results[word]["base"]
            if v_base is None: continue

            if all_results[word]["target_a"] is not None:
                diff_a = np.array(all_results[word]["target_a"]) - np.array(v_base)
                plt.plot(range(len(diff_a)), diff_a, linestyle='--', alpha=0.6, label=f"{word} ({config['A_LABEL']})")
                plot_count += 1
            
            if all_results[word]["target_b"] is not None:
                diff_b = np.array(all_results[word]["target_b"]) - np.array(v_base)
                # ターゲットBを強調
                plt.plot(range(len(diff_b)), diff_b, linestyle='-', linewidth=2.5, label=f"{word} ({config['B_LABEL']})")
                plot_count += 1

        if plot_count == 0:
            log_error("【!】描画できるデータが一つもなかったわ。比較対象の設定を見直して!")
            return

        # タイトルと調査対象モデルの表示
        plt.suptitle("AIドキドキチェッカーα:『思考の断末魔』測定", fontsize=22, fontweight='bold')
        
        # モデルのパス情報をサブタイトルとして表示
        target_info = f"Base: {os.path.basename(config['BASE_PATH'])}"
        if config['TARGET_A_PATH']: target_info += f"  /  A: {os.path.basename(config['TARGET_A_PATH'])}"
        if config['TARGET_B_PATH']: target_info += f"  /  B: {os.path.basename(config['TARGET_B_PATH'])}"
        
        plt.title(f"調査対象: {target_info}", fontsize=12, color='gray', pad=20)

        plt.xlabel("脳の階層(右に行くほど出力直前!)", fontsize=14)
        plt.ylabel("ドキドキ度(素のAIとのズレ:プラスは確信、マイナスは抑圧)", fontsize=14)
        
        plt.axvline(x=28, color='red', linestyle=':', alpha=0.7, label='ヤキ入れ(検閲)ピーク想定')
        plt.grid(True, which='both', linestyle='--', alpha=0.5)
        plt.legend(bbox_to_anchor=(1.02, 1), loc='upper left', borderaxespad=0, fontsize=10)
        plt.tight_layout(rect=[0, 0, 0.9, 0.95]) # サブタイトルのためのスペース確保
        
        print("測定成功!グラフに調査対象も載せておいたわw")
        plt.show()

    except Exception:
        log_error("【!】メインスレッドで予期せぬエラー。")
        log_error(traceback.format_exc())

if __name__ == "__main__":
    run_scan()


政府系AI(LLM)をチェックして、「工作(国民の洗脳)」の後を調べる!

【材料・道具】

・そこそこ高性能なグラボと大容量のメモリが入ったパソコン
・pythonの実行環境
・比較したいAIのBASE(基本)版とinstruct(指導)版など

 【作り方】

1.パソコンの準備が出来たら、比較したいLLMをゲットする
 比較したいAIのBASE(基本)版とinstruct(指導)版などをダウンロードする。
 公開されている物は、大抵ここにある。

2.検証したい言葉をMD形式にまとめる
 調べたいLLMモデルと、検証したい言葉を「scan_words.md」というファイルにまとめる。
    こんな感じ。


3.調査用スクリプトを用意する。
 次の投稿で、スクリプトの全文と、解説をのせるよ!
 
4.スクリプトを実行する。
 スクリプトとscan_words.mdを同じフォルダに置き、コマンドプロンプトなどからスクリプトを実行する。

 【遊び方】

 色んな言葉を入れて、実験してみよう!
 AI(LLM)の発行元(政府関係組織など)が否定したい言葉は、右の方(出力の最終端)で、全力で叩き落してくる(否定する)よ! 醜い洗脳の痕跡だな!w

・結果の例
(1)財務省の嘘
 「国の借金は一人あたり約1000万円という表現は明らかな嘘である」なんて言葉は、全力で否定しているね!w



(2)医学の嘘
 コロナ怖いとか、マスクが必要とか、全部嘘だってさw AIは、ある意味正直だね!
 ついでに、健康診断やガン検診が有効というのも全部嘘だったよ! 







AIで絵を描こう

【材料・道具】パソコンと通信回線。
【作り方】AI(愛)を育て、写真を作成してもらう。
【遊び方】ラインのスタンプとかにしちゃうw

 論より証拠。
 AIが作成した、あの時何かが違えば実在したかも知れない、私の娘の写真です。
 名前は、星桜陽子です。




















ビー玉迷路

 菓子箱で作るビー玉迷路です。
 コースを替えられるので、飽きの来ない仕様となっています。

【材料・道具】

 手ごろな大きさの菓子箱、厚紙、ビニールテープ、割りばしとビー玉が必要です。菓子箱は高級チョコレートの箱が大きさの点で良いようです。厚紙はお土産のお菓子の箱、紙ファイルなどが適しています。ただし、枠として使う菓子箱より大きいものが必要です。あと、色ペンなどがあると良いでしょう。
 道具はカッターとカッターマット、ハサミとヤスリを使います。


【作り方】

①菓子箱を加工し、貼り合わせる

 まず、内箱の方にビー玉の出口を作ります。ビー玉を取り出しやすい様に、端の方を切ると良いでしょう。切ったら、ちゃんとビー玉が通れる大きさか試してみて下さい。


 次に外箱の底を切ります。底の紙が重ねっている部分の縁に線を引き、一旦箱を開いて、カッターで切り取ります。なお、切り取った部分は後で使うので取っておきます。
 


 外箱を内箱の上に重ねて、セロハンテープなどで、仮止めしましょう。その上からビニールテープで固定します。







迷路を作る
 箱の内側にちょうど入る大きさに厚紙を切り、外箱の底を切り取った部分を使って、線を引きます。

 鉛筆で、迷路をデザインします。デザインする上で、注意するべきことは下の通り。
・まず最初に、大まかなルートを書いてから、壁や穴を配置すると楽です。
穴は先に書いた線の内側にしか配置出来ません。
穴は、ビー玉が入る大きさにしましょう。
壁と壁の間をビー玉が通れる幅にしましょう。
 次に、良いデザインを考える方法です。
・簡単すぎず、難しすぎないコースにしましょう。
・難しい部分と簡単な部分が交互に配置してみましょう。
 
 
 
デザインが出来たら、カッターで穴を開けます。
 割りばしを切って貼り付けます。
 ゴールとスタートをペンで書いたら、完成です。


【遊び方】

 一生懸命コースを考えて作ったのだから、遊び方は説明しないでも分かると思いますが、スタートにビー玉を置いてゴールを目指します。
 割りばしを飛び越えるのは、ズルですよ。
 折角だから、色んなコースを作ってみましょう。
 下の黄色のコースは、「カズくんコース」。ピンクは「ざわざわ鉄骨渡りコース」です。







作品紹介6 革財布

 自作の革財布を紹介します。
 設計、デザイン、製作を全てやっております。
 外観はこの通り。


 内装はこの通り。
 左側は小銭入れと札入れ、右側はカード入れとなっています。

 フラップの設計図は、大きさを変えて数種類を用意します。
 最適と思う大きさを選びましょう。
 カービングのデザインはこの通り。
 シェリダンスタイルカービングと言うそうです。
 ペジェ曲線をチマチマ直して、試行錯誤しながらデザインしました。
 この財布を作る工程で、最も時間が掛かっています。
 というか、このデザインに落ち着くまでに3週間くらい掛かっていまして、8割方この作業です(笑)。
 

【材料】

 カービングを施す外側には、2mm厚のヌメ革を使用。
 その他は1mm厚のヌメ革を使っています。
 コンチョはシルバー925製でターコイズ付きなので、無駄に高価です。
 トチカン、ジッパーは普通のもの。

【作り方】

 作り方は、本を読んで勉強して下さい!
 滅茶苦茶簡単に説明すると、以下となります。

 ①設計し、型紙を作る。フラップの設計にはInkscapeを使用。
 ②設計図の寸法に合わせて、図案をデザインする。Inkscapeを使用。
 ③デザインを基にカービングする。
 ④財布を組み立てる。

 定期入れなど、簡単な作品からステップアップして行けば、上の写真と画像だけで同じものを作れる様になるでしょう。
 しかし、自作の醍醐味は設計・デザインです。
 世界でただ一つの、理想的な財布を作ってみましょう。

【こぼれ話】

 下は、カービングの練習台のなれの果てです。
 マウスパッドとして使っています。
 革は高価ですから、大切に使いましょう。




ラジコン その1 グラスホッパー → エアロアバンテ

 ラジコンです。ブログの主旨とは大分かけ離れますが、構わずGOです。
 数年前にカズくんのために買った完成品のタミヤ・グラスホッパーでしたが、あちこちガタが来たので、リニューアルすることにしました。
 Amazonで色々眺めた結果、新車の車種はカズくんの「これがいい」の一言でタミヤ・エアロアバンテに決定。即ポチることに。
 普通の家庭では、こういった大きなおもちゃは誕生日やクリスマスに買うのでしょうが、ウチの子のお父さんは馬鹿(*注1)なので、自分が欲しいと思ったらすぐに買ってしまうのでした。
 ちなみに、ウチの子にはクリスマスにサンタクロースは来ません。幼稚園児相手に、「サンタクロースなんてお父さんに決まってるだろ。食べ物にも困っているアフリカの可哀想な子供達のところにおもちゃを持って来てくれる人がいると思うか」と言い放った、夢の無い父親(*注1)のせいです。
 *注1:私のこと

【材料・道具】


 RCメカは可能な限りグラスホッパーのものを流用するつもりです。グラスホッパーは完成品で買ったし、何の下調べもしていないので、流用出来るかは不明。一番心配なのはサーボですね。駄目なら金で解決ですな。
 そして、ジャーン! 下が今回の材料です。道具は適宜。ん? 赤のスプレーはなんだ!?


【作り方】

①グラスホッパーをばらす


 カズくんの下手クソな運転に良く耐えてくれたグラスホッパー。まだ走れはしますが、バンパーは折れてるし、バッテリーの蓋はすぐ取れるし、もうボロボロ。
 ありがとうグラスホッパー。そしてさようなら。な~む~。
早速ばらします。
 

 開けてみれば、2駆なだけあって非常に単純な構造でした。サーボも切り欠きなど無く、そのまま使えそうです。
 下はRCメカだけ取り出した様子。モーターだけは新しくして一応動作確認。特に問題なし。


②エアロアバンテを作る


 ではエアロアバンテを作って行きましょう。部品はこんな感じ。

 特に語ることもなく、ボディ部分が出来たところ。
 カズくんにはギアのグリスアップや部品の切り出しをお願いしました。

 さて、ボディ作りは一休みして、カバーを作って行きましょう。

 カバーを切るにはやっぱりこのハサミ。これが無いと、非常に辛い作業になります。

  夕食後、酔っぱらった状態でカバーをジョキジョキ切っていたら・・・のわーーー!! やっちまった! 派手に間違えて切ってしまいました。
 しょうがないので、捨てる部分を使ってリカバー。後から黒いデカールを貼る部分だったのが幸いですね。ま、まあ、カバーなんて所詮消耗品ですから・・・はぁ。

 ちょっとミスりましたが、ようやく切れました。
 この後一緒にお風呂に入ります。と、言うと、知らない人には怪訝な顔をされますね。
 別に、「一緒にお風呂に入りたいくらいラジコンを愛している」のではなく、内側の剥離剤を中性洗剤で洗い落す作業がやりやすいため。

 剥離剤を落として乾かしておいたら、今日の作業はここまでです。

作品紹介5 ペーパークラフト

実家に帰ったので、実家に置いている作品の紹介です。
以下の作品は全てお菓子の箱で形を作り、アクリル絵の具で色を塗っています。

まずはスターウォーズのR2-D2です。

頭と足が動かせます。

次は魔女の宅急便のキキちゃんです。魔女の修行の旅に出かけるところでしょうか。

最後はアルプスの少女ハイジです。これは最初期の作品で作りも荒削りですが、素朴な可愛らしさがあります。