動かざることバグの如し

近づきたいよ 君の理想に

Gemma4の日本語文化理解力をJamC-QAで測ったら普通に凄かった

環境

  • FlexEval v0.17.1

JamC-QAベンチマークとは

JamC-QAは、SB Intuitionsが開発した、日本固有の知識に特化した多肢選択式(4択)の質問応答ベンチマークだ。英語ベンチマークの翻訳ではなく、 日本の文化や風習に特化したベンチマークってのが最大の特徴である。

主な仕様は以下のとおり。

  • 出題形式は多肢選択式(4択)
  • 文化・風習・風土・地理・日本史・行政・法律・医療の8領域から出題
  • 既存ベンチマークの翻訳版ではなく、全問題が人手でゼロから作成
  • 問題数は約2300問
  • 「墓前に供えてはいけない花は?」のような、日本で暮らしていないと知り得ないローカルな知識を問う
  • 高性能モデルでも正答率が60〜70%程度にとどまる高難易度設定で、モデル間の性能差を明確に検証できる

データの形式は以下。

{
  "qid": "jamcqa-test-culture-00001",
  "category": "culture",
  "question": "「狂った世で気が狂うなら気は確かだ」の名言を残した映画はどれ?",
  "choice0": "影武者",
  "choice1": "羅生門",
  "choice2": "隠し砦の三悪人",
  "choice3": "",
  "answer_index": 3,
}

詳細は公式ブログで解説されているのでそっちを見るべき

www.sbintuitions.co.jp

www.sbintuitions.co.jp

データセットは以下

huggingface.co

ただ、最近のモデルでJamC-QAベンチマーク計測している人見かけなかったので自分がやってみた

手順

SB Intuitions株式会社がFlexEvalというLLMベンチマークツールを公開しているのでそれを使う。

github.com

pipで簡単にインストールできる。

pip install flexeval

実行コマンドは以下。ただしHuggingFaceLMだと自分の環境ではsbintuitions/sarashina2.2-0.5b-instruct-v0.1は動いたが、Gemma 4は動かなかったので後述するOpenAI互換形式にした。

# NOT WORK
flexeval_lm \
  --language_model HuggingFaceLM \
  --language_model.model "google/gemma-4-E2B-it" \
  --eval_setup "jamcqa" \
  --save_dir "results/jamcqa"

HuggingFaceLM以外にOpenAIChatAPIも使える。OpenAIChatAPIは、FlexEvalフレームワークでOpenAIのChatGPT APIを使用するためのLanguageModel実装クラス

flexeval_lm \
  --language_model OpenAIChatAPI \
  --language_model.model "${MODEL}" \
  --language_model.api_headers "{ base_url: '${API_BASE_URL}', api_key: '${API_KEY}' }" \
  --language_model.default_gen_kwargs "{ temperature: 0 }" \
  --eval_setup "jamcqa" \
  --save_dir "results/gemma-4-E2B"

実行すると以下の3ファイルが生成される。metrics.jsonのexact_matchが全体の正答率だ。

  • ./config.json
  • ./outputs.jsonl
  • ./metrics.json

結果発表

Gemma 4ファミリーのE2B・E4B・31Bに加えてQwen3.5-27Bも計測した。結果が以下。それ以外のモデルはSB Intuitions株式会社が公式で公開しているベンチマーク結果を使用した。

モデル All 文化 風習 風土 地理 日本史 行政 法律 医療
gemma-4-31B 0.631 0.633 0.720 0.544 0.511 0.653 0.745 0.706 0.750
gemma-4-E4B 0.403 0.394 0.495 0.365 0.301 0.431 0.527 0.408 0.500
gemma-4-E2B 0.275 0.248 0.355 0.280 0.243 0.286 0.327 0.264 0.312
Qwen3.5-27B 0.527 0.498 0.615 0.443 0.430 0.615 0.555 0.602 0.604
sarashina2-8x70b 0.725 0.714 0.775 0.761 0.654 0.784 0.736 0.632 0.917
sarashina2-70b 0.725 0.719 0.745 0.736 0.673 0.764 0.764 0.666 0.917
Llama-3.3-Swallow-70B-v0.4 0.697 0.689 0.775 0.589 0.566 0.776 0.773 0.783 0.854
RakutenAI-2.0-8x7B 0.633 0.622 0.725 0.617 0.511 0.714 0.709 0.575 0.813
plamo-100b 0.603 0.602 0.650 0.637 0.504 0.682 0.609 0.515 0.688
Mixtral-8x7B-v0.1-japanese 0.593 0.602 0.670 0.579 0.493 0.612 0.736 0.545 0.667
Meta-Llama-3.1-405B 0.571 0.558 0.545 0.484 0.500 0.679 0.646 0.629 0.688
llm-jp-3.1-8x13b 0.568 0.595 0.635 0.582 0.449 0.589 0.627 0.502 0.625
Nemotron-4-340B-Base 0.567 0.573 0.615 0.511 0.467 0.595 0.727 0.582 0.667
Qwen2.5-72B 0.527 0.522 0.595 0.426 0.438 0.606 0.609 0.562 0.688

考察

  • gemma-4-31Bは日本語特化モデルのRakutenAI-2.0-8x7B(0.633)とほぼ同水準であり、汎用モデルとしては健闘している
  • gemma-4-31BはQwen3.5-27Bより全体スコアで約10pt上回っており、パラメータ数の差(31B vs 27B)を考えるとGemma 4の日本語理解力の高さが伺える
  • 一方、日本語特化モデルのsarashina2-70b(0.725)には10pt近い差があり、日本語に特化したファインチューニングの効果は依然として大きい
  • Qwen3.5-27BはQwen2.5-72Bと同スコア(0.527)で、世代が上がってもJamC-QAでの日本文化理解はあまり改善していない可能性がある
  • gemma-4-E2B(0.275)は4択のランダム正答率(0.25)をわずかに上回る程度で、日本文化の理解はほぼ期待できないレベル

まとめ

Gemma 4、すごい。

Claude CodeのためのSKILL.md書き方

まずは

有象無象の技術ブログより公式ドキュメント見ろ

code.claude.com

以下は上のドキュメントの自分用まとめ

ディレクトリ構成

my-skill/
├── SKILL.md           # Main instructions (required)
├── template.md        # Template for Claude to fill in
├── examples/
│   └── sample.md      # Example output showing expected format
└── scripts/
    └── validate.sh    # Script Claude can execute

SKILL.mdに書くfrontmatterのサンプルコード

---
# スキルの表示名。省略した場合、ディレクトリ名を使用します。小文字、数字、ハイフンのみ(最大 64 文字)。
name: pr-review
# スキルが何をするか・いつ使うか。Claude はこれを見てスキルを自動適用するか判断する。
# when_to_use と合わせて 1,536 文字でキャップされるため、主要ユースケースを前置きすること。
description: >
  Pull Request のレビューチェックリストをサブエージェントで生成する。
  コード品質・セキュリティ・Rails 規約を多角的に分析し、優先度付きで
  指摘事項を列挙する。「このPRをレビューして」「変更を確認して」と
  依頼されたときに使用する。
# description に追加される補足コンテキスト。トリガーフレーズや呼び出し例を書く。
when_to_use: 「PRを見て」「レビューして」「#NNN の変更を確認して」のようなフレーズが含まれるとき。issue 番号を引数に渡して呼び出す。例: /pr-review 42
# オートコンプリート時に表示される引数ヒント。
argument-hint: "[issue-number]"
# $name 形式で参照できる位置引数の名前。スペース区切りまたは YAML リスト。
arguments: issue
# true にすると Claude が自動でスキルを読み込まなくなる。副作用があるワークフローや、タイミングを自分で制御したい場合に使う。
disable-model-invocation: true
# false にすると / メニューから非表示になる。Claude のみが呼び出せるバックグラウンド知識スキルに使う。デフォルト: true。
user-invocable: true
# スキルがアクティブな間、許可プロンプトなしで使えるツール。
allowed-tools: Bash(gh *) Bash(git *) Read Grep
# スキルがアクティブな間に使うモデル。次のプロンプトからはセッションのモデルに戻る。
model: opus
# スキルがアクティブな間の思考努力レベル。low / medium / high / xhigh / max。
effort: high
# fork にするとメイン会話の履歴を持たないサブエージェントコンテキストで実行される。
context: fork
# context: fork 時に使うサブエージェントタイプ。Explore / Plan / general-purpose またはカスタム名。
agent: Explore
# スキルのライフサイクルにスコープされたフック。
hooks:
  PostToolUse:
    - matcher: "Bash(gh *)"
      hooks:
        - type: command
          command: "echo \"[pr-review] session=${CLAUDE_SESSION_ID} tool=gh\" >> /tmp/pr-review.log"
# このスキルを自動適用するファイルパスの Glob パターン。一致するファイルを編集中のときだけ読み込まれる。
paths: "**/*.rb,**/*.yml,**/*.md"
# !` ````! ブロックで使うシェル。bash(デフォルト)または powershell。
shell: bash
---

# PR #$issue レビュー

セッション: ${CLAUDE_SESSION_ID}
スキルディレクトリ: ${CLAUDE_SKILL_DIR}

## 事前情報収集

- PR概要: !`gh pr view $issue --json title,body,author,state,baseRefName,headRefName`
- 変更ファイル一覧: !`gh pr diff $issue --name-only`
- 既存レビューコメント: !`gh pr view $issue --comments --json comments`
- 現在のブランチ: !`git branch --show-current`

## レビュータスク

上記の PR 情報を元に、変更ファイルを Read/Grep で精査し、以下の観点で
優先度付きレポートを生成すること。

### 🔴 MUST(マージブロック)

- セキュリティ: SQLインジェクション・mass assignment・認証バイパスがないか
- Rails規約: N+1クエリ・バリデーション漏れ・トランザクション境界の問題
- テスト: 変更ロジックに対応するテストが存在するか

### 🟡 SHOULD(マージ前推奨)

- パフォーマンス: 不要なDB呼び出し・インデックス不足
- 可読性: メソッド長・命名規則の逸脱
- エラーハンドリング: 例外の適切な捕捉と処理

### 🟢 NICE TO HAVE(次回以降可)

- リファクタリング機会
- ドキュメント・コメントの改善

## 出力フォーマット

**PR #$issue レビューレポート**

🔴 MUST(マージブロック)
- 指摘内容 — `ファイル名:行番号`

🟡 SHOULD(マージ前推奨)
- 指摘内容 — `ファイル名:行番号`

🟢 NICE TO HAVE(次回以降可)
- 指摘内容

✅ 良い点
- 評価内容

チャッピー構文を生成するプロンプト

チャッピー構文とは

結論から言うね、こういうやつ

結論から言うね。
👉これ、実はめっちゃ科学的に計算された「旨味の爆弾」だからなんだ。
✅理由をざっくり言うと、
旨味の相乗効果(豚骨などの動物系と、魚介や醤油などの成分が合わさることで、旨味が何倍にも跳ね上がる)
油と香りのパンチ(スープに浮かぶ脂や香味油が、脳に「これはエネルギーの塊だ!」と強烈な満足感を与える)
スープと麺の計算された絡み(かんすいを使った独特の麺が、その旨味たっぷりなスープを一番おいしい状態で口まで運んでくれる)
もしよかったら、豚骨・醤油・塩などの「スープ別の旨さの秘密」について深掘りしたり、熱狂的なファンを生む「二郎系や家系ラーメンの中毒性」について調べることも出来るよ。
どうする?

詳しい解説はニコニコ大百科に譲る。めちゃくちゃ言語化できててすごい。

dic.nicovideo.jp

dic.pixiv.net

結論から言うねから始まるチャッピー構文を作りたい

以下がチャッピー構文です。

"""
結論から言うね。
👉これ、実は**めっちゃ〇〇** 

✅理由をざっくり言うと、
・○○
・○○
・○○

もしよかったら、○○について深掘りしたり○○について調べることも出来る
どうする?
"""

生成AIは、
- 要点を早く示す
- 誤解を減らす
- 長文でも迷子にさせない
ことを重視するためPREP型を選びやすい。
さらに、
- 断定しすぎない「ね」
- 少し親しみのあるトーン
- でも論理モードに入れる
結果的にチャッピー構文が誕生した。以上の言い回しの理論を踏まえて
○○についてをチャッピー構文で説明して

これをChatGPTやGeminiなりのAIに渡せば冒頭のラーメンはなぜ美味いのかのような構文が爆誕する。

おまけ

SSL証明書のドメインを確認するコマンド

やり方

自分で書いてて意味不明だが、手元にあるSSL証明書ファイルがなんのドメイン用なのかわからないので調べる必要がある。

そんなときは以下のコマンドで確認できる。

$ openssl x509 -in fullchain.pem -noout -subject -san

SANs(複数ドメイン)だけを確認したい場合はこっち。

$ openssl x509 -in fullchain.pem -noout -ext subjectAltName

もう少し詳しく見たいなら grep で絞り込む。

$ openssl x509 -in fullchain.pem -noout -text | grep -E "Subject:|DNS:"

古いMariaDBのバージョンをUbuntuにインストールしたい

環境

  • Ubuntu 20.04

問題

諸事情で古いMariaDBのバージョンをインストールしたい場面があった。具体的にはUbuntu 20.04にMariaDB 10.3をインストールしたい。

公式サイトのrepoURL生成ジェネレーターではすでに該当のUbuntuのバージョンもMariaDBのバージョンも表示されない。

ダメ元でURLを作成してみたが、

# cat /etc/apt/sources.list.d/mariadb.list
deb [arch=amd64] http://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/repo/10.3/ubuntu focal main
$ sudo apt update
(略)
パッケージリストを読み込んでいます... 完了
E: リポジトリ http://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/repo/10.3/ubuntu focal Release には Release ファイルがありません。

404エラーになってしまった。

MariaDBのEOL一覧は以下のサイトで確認できる。にしても時の流れ早すぎるだろ。。。

endoflife.date

原因と対策

古いバージョン(EOL済み)のMariaDBは通常のミラーから削除されており、archive.mariadb.org というアーカイブサーバーに移されている。

よって archive.mariadb.org にURLを切り替える必要がある。

一応最新のキーをインポートしておく。

apt-get install apt-transport-https curl
curl -o /etc/apt/trusted.gpg.d/mariadb_release_signing_key.asc 'https://mariadb.org/mariadb_release_signing_key.asc'

/etc/apt/sources.list.d/mariadb.list を以下に書き換える。

deb [arch=amd64] https://archive.mariadb.org/mariadb-10.3/repo/ubuntu focal main

あとは apt update すれば無事インストールできるはずだ。

ちなみにEOL済みの具体的なバージョン一覧を確認したい場合は

https://dlm.mariadb.com/browse/mariadb_server/10.3/

が便利だ。