この記事のポイント
- ✓AI出力の体感レビューをやめ、重複率・カテゴリ精度・見出し忠実性の3指標で毎配信を採点する評価ハーネスを作った
- ✓コードで測れる指標はコードで(無料)、意味判断だけLLM-as-Judgeに集約して1配信あたり実測 約$0.003。評価にもコスト設計がいる
- ✓前提になるのは「配信ごとに入力と出力を丸ごとアーカイブする」こと。記録があれば、指標は後からいくらでも足せる
「今朝の紙面、ちょっと微妙だったな」をどうするか
自作の朝刊エージェントが毎朝6:30にニュースメールを届けてくれるようになって、2ヶ月半が経った。動き続けるシステムには、動き続けるシステム特有の悩みが出てくる。
「今朝の紙面、ちょっと微妙だったな」——これだ。
昨日載った記事がまた載っている。金融の記事がAIカテゴリに入っている。見出しが元記事の内容と微妙に違う。どれも毎回ではない。でも、たまにある。
問題は、その「たまに」を体感でしか把握していなかったことだ。プロンプトを直して「直った気がする」と思っても、それは今日の紙面がたまたま良かっただけかもしれない。逆に悪化していても、数日は気づけない。LLMの出力は毎回違うので、1回の観察では何も言えないのだ。
コードの品質ならテストを書く。ではLLMの出力品質には何を書くか。答えは評価ハーネス——出力を継続的に採点する仕組みだった。機械学習の世界で「evals」と呼ばれているものを、個人開発のスケールに落として組み込んでみた。
評価の前に、記録——実行アーカイブという土台
評価ハーネスを作ろうとして最初に気づいたのは、評価したくても材料が残っていないことだった。配信されたメールは残っている。でも「そのときLLMに何を入力したか」が残っていなければ、出力の良し悪しは判定できない。見出しが元記事に忠実かどうかは、元記事がないと確かめようがない。
そこでまず、配信のたびに以下を丸ごとS3にアーカイブするようにした。
1配信分の実行アーカイブ(RunArchive)
- 収集ソースの生データ — LLMに渡したRSS・Webページ本文そのもの
- 紙面に載った記事 — 集約・重複除去後の最終出力
- 注目記事(picks) — 編集長コメント付きのピックアップ
- 実行時点のトピック定義 — カテゴリ精度を判定する基準
- エージェント別の実行統計 — トークン数・実行時間
ポイントは、これが入力と出力のペアだということ。これがあれば「同じ入力でプロンプトだけ変えたらどうなるか」というA/B再実行もできるし、良い配信・悪い配信の実例を集めてゴールデンセット(正解データ集)の原料にもなる。
コストはほぼゼロだ。1配信分のJSONはたかが知れていて、S3の保存料は誤差の範囲。後から「あのとき記録しておけば」と思っても、過去のデータは二度と手に入らない。記録だけは、評価の設計が固まる前から始めておく価値がある。
指標①: 重複率はコードで測る(無料)
最初の指標は重複率。「同じ記事が同じ紙面や直近の配信に2回載っていないか」だ。一番目につく品質問題で、新聞としては一番恥ずかしいやつでもある。
これはLLMに聞くまでもなく、コードで判定できる。
URL正規化による突き合わせ
トラッキングパラメータ等を除去したURLで一致を見る。完全一致の再掲はこれで捕まる。
タイトルのbigram類似度
URLが違っても同じニュースはある(配信元違い・続報など)。タイトルを2文字ずつの断片(bigram)に分解し、断片集合の重なり(Jaccard係数)が閾値0.75以上なら同一候補と判定する。
bigram類似はたいそうな機械学習ではない。文字列処理だけの素朴な手法だ。でも日本語ニュースタイトルの「同じ話題の言い換え」を拾うには十分で、なにより実行コストがゼロ円。毎配信どころか、過去全配信に対して何度でも走らせられる。
「AIの評価」と聞くとAIで評価したくなるが、コードで測れる指標から先に作る。
決定的で、無料で、毎回同じ基準で測れる。LLMを使う評価は、コードで測れないものだけに取っておく。
指標②③: 意味の判断はLLM-as-Judgeで測る($0.003)
残る2つの指標は、文字列処理では測れない。
カテゴリ精度
記事が正しいトピック(AI・金融・ゲーム・論文・政治行政)に分類されているか。「半導体企業の決算」はAIか金融か——意味の理解が要る。
見出し忠実性
生成された見出し・要約が、収集ソースの原文に書いてあることから逸脱していないか。つまりハルシネーション検出。アーカイブに原文があるから判定できる。
こういう「意味の判断」には、LLMに審判をさせるLLM-as-Judgeという手法を使う。生成とは別のLLM呼び出しで「この分類は適切か」「この見出しは原文に忠実か」を判定させ、判定理由つきの構造化JSONで返させる。
ここで気をつけたのが評価自体のコストだ。品質を測るために本体より高い金を払っていたら本末転倒だから、judgeにも生成と同じコスト設計を適用した。
判定は1配信分を1呼び出しに集約する
記事1件ずつjudgeを呼ぶと呼び出し数×固定オーバーヘッドがかさむ。紙面1日分をまとめて渡し、全記事の判定を一度に返させる。
judgeは小さいモデル(Haiku)で十分
「分類が合っているか」「原文にない話を足していないか」は、生成より判定のほうが簡単なタスク。原文の引用も上限1,200字に切り詰めて渡す。
出力はJSONスキーマで強制する
judgeの返答が毎回違う形式だと集計できない。structured outputsでverdictの形を固定し、パース失敗のリトライコストも消す。
結果、judgeのコストは実測で1配信分あたり約$0.003。配信本体が$0.02前後なので、評価は本体の15%程度。これなら気兼ねなく回せる。
評価は意思決定を変える——web_search拡大の判断材料
評価ハーネスを作って早々に、実用の場面が来た。
このシステムは記事の収集経路が2つある。RSS・Webページの並列フェッチ(無料)と、鮮度を補強するためのweb_search(1検索$0.01、現在は一部トピックのみ・回数上限つき)。当然「検索をもっと増やせば紙面は良くなるのでは?」という誘惑がある。でも検索は従量課金だ。勘で増やしたくない。
そこで紙面の各記事にorigin(収集経路)タグを付け、評価ハーネスに「web_search由来の記事がどれだけ紙面に貢献しているか」を集計するレポートを足した。
ある朝刊のorigin寄与レポート(実測値)
紙面に占める検索由来
1 / 4記事
注目記事に占める検索由来
1 / 2件
検索由来の平均スコア
4.0
フェッチ由来の平均スコア
3.7
スコアはLLMが編集時に付ける重要度(1〜5)。検索由来の記事は数こそ少ないが、スコアが高く、注目記事にも選ばれている(※まだ数日分・サンプル数が小さい点に注意)。
まだ数日分のデータだが、すでに「検索由来は1件でも紙面の上位に食い込む傾向がある」ことが見えはじめている。このまま蓄積すれば、「$0.01/検索を追加で払う価値があるか」を数字で判断できる。
体感レビューの時代には、この問いは「なんとなく検索があったほうが良い気がする」で止まっていた。評価の仕組みは品質チェックのためだけでなく、次の投資判断の材料を生むためにある——作ってみて一番実感したのはここだった。
個人開発の評価ハーネス、4つの設計原則
企業のML基盤のような大掛かりなものは要らない。個人開発のスケールで効いた設計原則を4つにまとめる。
アーカイブが先、指標は後
入力と出力のペアさえ残っていれば、指標は後からいくらでも追加できる。実際、origin寄与レポートは評価ハーネスの初版完成後に思いついて、その日のうちに足せた。
コードで測れるものをLLMに聞かない
重複・件数・日付・形式チェックは決定的なコードで。無料で何度でも走り、基準もぶれない。LLM-as-Judgeは意味判断専用。
評価は配信を止めない場所に置く
評価ハーネスは本番パイプラインの外のスクリプトとして実装し、手元から任意のタイミングで全アーカイブに対して実行する。評価の失敗が朝刊の配信に影響しない。
評価のコストも設計する
評価にも本体と同じコスト設計を効かせる(手法は指標②③で前述)。1配信$0.003なら習慣になり、$0.3なら「たまにやる儀式」になって続かない。
運用コストの削減で使った考え方(別記事)と、根っこは同じだ。LLMにしかできない仕事だけをLLMに渡し、残りは全部コードでやる。生成でも評価でも、この原則は変わらなかった。
測れないものは、改善できない
評価ハーネスができて変わったのは、数字が出ることそのものより、改善の議論の土台ができたことだ。
「最近重複が多い気がする」は「直近7配信の重複率は0%、ただし6/10は際どい類似ペアが1組」になった。「見出しが盛ってる気がする」は、忠実性judgeの判定理由つきで具体的な1件を指せるようになった。プロンプトを変えるときは、変更前後で同じアーカイブに対して評価を走らせれば、良くなったか悪くなったかが分かる。
ソフトウェア開発でテストコードが果たしている役割を、LLMシステムでは評価ハーネスが果たす。そして面白いことに、テスト文化で言われてきた格言がほぼそのまま通用する。後から書くのは大変、先に仕込めば資産になる。全部を自動化しなくても、回帰だけは機械に見張らせる。
次にやりたいのは2つ。プロンプト変更時に過去アーカイブで差分評価する回帰テストの定型化と、judgeの判定が自分の感覚とズレていないかを確かめる「judgeの評価」だ。審判を雇ったら、審判の精度も見なければいけない。この再帰がevalsの沼であり、面白さでもある。
本稿の数値について
judgeコスト(約$0.003/配信分)・origin寄与レポートの数値は、自分の構成(Haiku 4.5・日本語ニュース・1配信あたり数記事)での実測値です。レポート例は2026年6月10日朝刊分。評価対象の規模やモデルによって数値は変わります。
著者: しきぴょんた / 2026年6月