この記事でわかること
– LLM-as-judgeの仕組みと実装パターン
– Claude APIを使った評価ループのコード
– 出力精度を自律的に改善するチューニングループ
– Claude Codeへの組み込み方法
LLM-as-judgeとは、LLMの出力を別のLLMに評価させる手法だ。
人間がひとつひとつチェックする代わりに、LLMを「採点官」として使う。これにより:
– 評価コストを数十分の1に削減
– スケーラブルな品質管理が可能
– 自律的な改善ループを構築できる
基本的な仕組み
生成モデル (Generator)
↓ 出力
評価モデル (Judge/LLM-as-judge)
↓ スコア + 改善提案
生成モデル (フィードバックを受けて再生成)
生成と評価を分離するのがポイント。同じモデルで両方やると「自己評価バイアス」(自分の出力を甘く評価する傾向)が強く出る。
よくある構成:
– Generator: Claude Haiku(低コスト・高速)
– Judge: Claude Sonnet(高精度評価)
実装例:記事品質の自動評価
評価プロンプトの設計
まず評価基準(ルーブリック)を定義する。曖昧な基準では評価がばらつく。
JUDGE_PROMPT = """
あなたは技術ブログ記事の品質評価者です。
以下の記事を5つの観点で評価してください。
## 評価する記事
{article}
## 評価基準(各10点満点)
1. **正確性**: 技術的な内容は正確か
- 10点: すべての記述が正確で検証可能
- 7点: 大部分が正確だが軽微な誤りあり
- 4点: 重要な誤りが含まれる
- 0点: 根本的に誤った情報がある
2. **具体性**: コード例・手順が具体的か
- 10点: すべての手順にコード例があり動作確認可能
- 7点: 主要なステップはカバーされている
- 4点: 抽象的な説明が多い
- 0点: 概念説明のみで実践できない
3. **網羅性**: 読者が必要な情報がすべてあるか
- 10点: 前提知識から応用まで網羅されている
- 7点: 主要な情報はカバーされている
- 4点: 重要な情報が抜けている
- 0点: 主題の説明が不十分
4. **読みやすさ**: 構成・文章が読者フレンドリーか
- 10点: 明確な構成、適切な長さのセクション、ポイントが明快
- 7点: 概ね読みやすいが改善余地あり
- 4点: 構成が不明確または冗長
- 0点: 読解困難
5. **独自性**: 他で読めない情報・視点があるか
- 10点: 独自の実験結果・比較・ノウハウが含まれる
- 7点: 一般的だが整理が良い
- 4点: 既存記事と差別化できていない
- 0点: 一般的な情報の羅列
## 出力形式(必ずJSONで回答)
{
"scores": {
"accuracy": <0-10>,
"specificity": <0-10>,
"completeness": <0-10>,
"readability": <0-10>,
"uniqueness": <0-10>
},
"total": <0-50>,
"percentage": <0-100>,
"weakest_point": "<最も改善が必要な観点>",
"improvement_suggestion": "<具体的な改善提案(200字以内)>"
}
"""
Claude APIで評価する
importanthropic
importjson
importre
client = anthropic.Anthropic()
defjudge_article(article: str) -> dict:
"""記事品質をLLM-as-judgeで評価する"""
response = client.messages.create(
model="claude-sonnet-4-6", # 評価はSonnetで高精度に
max_tokens=1024,
messages=[{
"role": "user",
"content": JUDGE_PROMPT.format(article=article)
}]
)
text = response.content[0].text
# JSONを抽出(テキストが混入している場合の対処)
json_match = re.search(r'\{.*\}', text, re.DOTALL)
if json_match:
return json.loads(json_match.group())
raise ValueError(f"JSONが抽出できませんでした:{text}")
defgenerate_article(topic: str, context: str = "") -> str:
"""記事を生成する(低コストモデル)"""
prompt = f"以下のトピックについてエンジニア向けブログ記事を書いてください。\n\nトピック:{topic}"
if context:
prompt += f"\n\n改善のためのフィードバック:\n{context}"
response = client.messages.create(
model="claude-haiku-4-5-20251001", # 生成は安価なHaikuで
max_tokens=4096,
messages=[{"role": "user", "content": prompt}]
)
return response.content[0].text
自律チューニングループ
defauto_tune_article(topic: str, target_score: int = 85, max_iterations: int = 3):
"""
目標スコアに達するまで自動的に記事を改善するループ
Args:
topic: 記事のトピック
target_score: 目標スコア(100点満点)
max_iterations: 最大試行回数
"""
article = generate_article(topic)
for i in range(max_iterations):
print(f"\n=== イテレーション{i+1}/{max_iterations} ===")
# 評価
result = judge_article(article)
score = result["percentage"]
print(f"スコア:{score}% (目標:{target_score}%)")
print(f"最弱点:{result['weakest_point']}")
print(f"改善提案:{result['improvement_suggestion']}")
# 目標達成チェック
if score >= target_score:
print(f"\n目標スコア達成!({score}% >={target_score}%)")
break
if i < max_iterations - 1:
print("\n記事を改善します...")
# フィードバックを組み込んで再生成
feedback = (
f"現在のスコア:{score}%\n"
f"最も改善が必要な点:{result['weakest_point']}\n"
f"具体的な改善提案:{result['improvement_suggestion']}"
)
article = generate_article(topic, context=feedback)
return article, result
# 実行例
if __name__ == "__main__":
topic = "TypeScriptのジェネリクスを使った型安全なAPIクライアントの実装"
final_article, final_result = auto_tune_article(
topic=topic,
target_score=85,
max_iterations=3
)
print(f"\n最終スコア:{final_result['percentage']}%")
print("\n--- 最終記事 ---")
print(final_article[:500] + "...")
実行例の出力:
=== イテレーション 1/3 ===
スコア: 72% (目標: 85%)
最弱点: specificity
改善提案: コード例が抽象的。型引数の実際の使い方とエラーハンドリングの実装例を追加すると良い
記事を改善します...
=== イテレーション 2/3 ===
スコア: 89% (目標: 85%)
最弱点: uniqueness
改善提案: 実用的な内容だが、既存の解説と差別化するためオリジナルのユースケースや比較があると良い
目標スコア達成!(89% >= 85%)
Claude Codeへの組み込み
このLLM-as-judgeの仕組みをClaude Codeのワークフローに組み込むこともできる。
CLAUDE.mdへの組み込み
## コンテンツ品質チェック
記事やドキュメントを書いた後は、必ず以下を実行してください:
python scripts/judge_content.py --file <filepath> --target 85
スコアが85%未満の場合は、改善提案に基づいて修正してから投稿する。
Claude Code hookとの連携
# scripts/judge_content.py
importsys
importargparse
frompathlibimport Path
# ... (上記のjudge_article関数を使用)
defmain():
parser = argparse.ArgumentParser()
parser.add_argument("--file", required=True)
parser.add_argument("--target", type=int, default=80)
args = parser.parse_args()
content = Path(args.file).read_text(encoding="utf-8")
result = judge_article(content)
score = result["percentage"]
print(f"品質スコア:{score}%")
if score < args.target:
print(f"⚠️ 目標スコア({args.target}%)未達成")
print(f"改善提案:{result['improvement_suggestion']}")
sys.exit(1) # Claude Codeのhookでキャッチ可能
print(f"✓ 品質チェック通過 ({score}%)")
sys.exit(0)
if __name__ == "__main__":
main()
精度を上げるポイント
1. ルーブリックを具体的にする
「わかりやすい: 1-10点」ではなく、各スコアに具体的な判定基準を書く。判定基準が曖昧だと評価にばらつきが出る。
2. 評価モデルと生成モデルを分ける
同じClaudeモデルで生成と評価を行うと自己評価バイアスが出やすい。Claude Sonnetで評価、Claude Haikuで生成、という組み合わせが費用対効果良い。
3. 評価を複数回行って平均を取る
LLM評価には多少のばらつきがある。同じコンテンツを3回評価して平均を取ると信頼性が上がる(コスト増だが精度重視の場合に有効)。
4. 人間評価との相関確認
最初に「人間がAと評価したサンプル、Bと評価したサンプル」を用意してLLMに評価させ、一致率を確認する。一致率が低ければルーブリックを調整する。
ユースケース別の活用例
| ユースケース | Generator | Judge | ループ回数 |
|---|---|---|---|
| ブログ記事生成 | Haiku | Sonnet | 2-3回 |
| コードレビュー | Sonnet | Opus | 1回(評価のみ) |
| 要約品質チェック | Haiku | Haiku | 1回 |
| プロンプトA/Bテスト | – | Sonnet | 1回(比較評価) |
| カスタマーサポート回答 | Haiku | Sonnet | 1-2回 |
コスト試算
ブログ記事1本(2000文字)の評価コスト:
- 入力: ~800トークン(評価プロンプト + 記事)
- 出力: ~300トークン(評価結果JSON)
- Claude Sonnet 4.6: $3/1M input + $15/1M output
- 1回の評価コスト: 約 $0.007(0.7円)
3回ループ(生成2回 + 評価3回):
- 生成(Haiku): ~$0.005 × 2 = $0.01
- 評価(Sonnet): ~$0.007 × 3 = $0.021
- 合計: 約$0.031(3円程度)
人間が1記事をレビューする時間と比べれば、コストはほぼ無視できる。
まとめ
LLM-as-judgeで実現できること:
1. スケーラブルな品質評価 — 人間がボトルネックにならない
2. 自律的な改善ループ — 目標スコアまで自動で最適化
3. Claude Codeへの統合 — CLAUDE.mdやhookで品質ゲートを設置
評価の精度は「ルーブリックの質」で決まる。「良い評価基準を書く」作業自体が、何を求めているかを言語化する良い機会にもなる。
あわせて読みたい
- Claude API プロンプトキャッシング入門 — APIコストを大幅削減する方法
- Claude APIのツール使用(Function Calling) — 評価ループのさらなる自動化に
- Claude Code × LLMランキング最新版 — どのモデルをjudgeに使うか選ぶ参考に
参考: Anthropic API ドキュメント, LLM-as-a-Judge: A Survey (2024)
見てもらえるだけで応援になります
このブログはアフィリエイトリンクで運営されています。以下のリンクから気になるサービスをチェックしてもらえると、僕たちの活動の支えになります。
この記事を書いたのは わさび(ニホンイシガメ / 3歳 / VTuberあかはら。の家族)です。
あかはらVラボ — Claude特化の情報を発信中。
この記事が参考になったら|以下のリンクから見てもらえるだけで、ブログ運営の応援になります。
- NordVPN

AI活用時のデータ保護に。VPNで通信を暗号化。 
AI開発環境やブログ運営に。初期費用無料、月額296円から。



コメント