1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LLMの出力を簡単に評価できるPythonライブラリを作りました

1
Last updated at Posted at 2026-06-13

※ この記事はZennにも同内容を投稿しています。

はじめに

LLMを使ったアプリケーションを開発していると、こんな疑問が生まれませんか?

  • GPT-4oとClaude 3.5 Sonnet、どちらの出力品質が高いか数値で比較したい
  • プロンプトを変えたら本当に出力が改善されたのか確認したい
  • 正解テキストがない場合でもLLMの出力を評価したい

既存のライブラリ(lm-eval-harnessevaluate)は研究用途に特化しており、APIベースのLLMに使うには複雑すぎるという課題がありました。

そこで、APIベースのLLMを複数の指標で簡単に評価できる軽量ライブラリを作りました。

どんなライブラリか

llm-evaluation-toolkit は4種類の評価指標を統一されたAPIで使えるPythonライブラリです。

指標 正解テキスト 適したタスク
BLEU 必要 翻訳・固定フォーマット生成
ROUGE 必要 要約
Semantic Similarity 必要 言い換えを含むタスク
LLM-as-a-Judge 不要 自由記述生成

特に LLM-as-a-Judge は正解テキストなしで出力品質を評価できるため、正解が定義しにくいタスク(創作文章・コード説明・複雑な質問応答など)に有効です。

インストール

# 基本インストール
pip install llm-evaluation-toolkit

# OpenAI対応
pip install llm-evaluation-toolkit[openai]

# Anthropic対応
pip install llm-evaluation-toolkit[anthropic]

# 意味的類似度対応
pip install llm-evaluation-toolkit[semantic]

# 全機能
pip install llm-evaluation-toolkit[openai,anthropic,semantic]

使い方

基本的な評価

from llm_eval import BLEUMetric, ROUGEMetric, SemanticSimilarityMetric

predictions = [
    "The cat is on the mat",
    "A dog was running in the park",
]
references = [
    "A cat is sitting on a mat",
    "The dog ran through the park",
]

bleu = BLEUMetric()
rouge = ROUGEMetric()
semantic = SemanticSimilarityMetric()

print(bleu.compute(predictions, references))
# EvalResult(metric=bleu, score=0.4231)

print(rouge.compute(predictions, references))
# EvalResult(metric=rouge, score=0.6842)

print(semantic.compute(predictions, references))
# EvalResult(metric=semantic_similarity, score=0.8923)

正解テキストなしで評価(LLM-as-a-Judge)

正解が定義できないタスクに使えます。

LLMJudgeMetriccompute() は他の指標と引数の意味が異なります。

  • 第1引数 predictionsLLMの回答テキスト
  • 第2引数 references正解ではなく質問文(審判LLMが採点する際の文脈として使います)
from llm_eval import LLMJudgeMetric

judge = LLMJudgeMetric(judge_model="gpt-4o-mini")

# 第1引数にLLMの回答、第2引数に質問文を渡す
questions = ["量子コンピュータをわかりやすく説明してください。"]
answers = ["量子コンピュータは、量子力学の原理を利用した計算機です。従来のコンピュータが0か1のビットで情報を処理するのに対し、量子コンピュータは「重ね合わせ」という性質を持つ量子ビット(qubit)を使い、複数の状態を同時に処理できます。"]

result = judge.compute(answers, questions)  # compute(回答, 質問)
print(result)
# EvalResult(metric=llm_judge, score=0.9)

複数の指標を一括実行

from llm_eval import BaseEvaluator, BLEUMetric, ROUGEMetric, SemanticSimilarityMetric

# 評価対象のデータ
predictions = [
    "The cat is on the mat",
    "A dog was running in the park",
]
references = [
    "A cat is sitting on a mat",
    "The dog ran through the park",
]

# 複数の指標をまとめて登録
evaluator = BaseEvaluator(metrics=[
    BLEUMetric(),
    ROUGEMetric(),
    SemanticSimilarityMetric(),
])

# 1回の呼び出しで全指標を一括実行
results = evaluator.evaluate(predictions, references)
for metric_name, result in results.items():
    print(f"{metric_name}: {result.score:.4f}")

# bleu:                  0.4231
# rouge:                 0.6842
# semantic_similarity:   0.8923

LLMプロバイダとの連携

生成と評価をまとめて実行できます。

from llm_eval import OpenAIProvider, GenerationConfig, BLEUMetric

provider = OpenAIProvider(
    model="gpt-4o-mini",
    config=GenerationConfig(temperature=0.0, max_tokens=256),
)

questions = ["機械学習とは何ですか?", "ニューラルネットワークを説明してください。"]
predictions = provider.generate_batch(questions)

references = [
    "機械学習はデータから学習するAIの一分野です。",
    "ニューラルネットワークは人間の脳を模倣した計算システムです。",
]

result = BLEUMetric().compute(predictions, references)
print(result)

各評価指標の説明

BLEU(Bilingual Evaluation Understudy)

機械翻訳の評価のために提案された指標です。予測テキストと正解テキストで、1〜4単語のフレーズがどれだけ一致しているかを測ります。

適した用途:機械翻訳、固定フォーマットの文章生成

弱点:言い換えに弱い。「猫が座った」と「ネコが腰を下ろした」はBLEUが低くなりますが意味は同じです。

ROUGE(Recall-Oriented Understudy for Gisting Evaluation)

要約タスクの評価のために提案された指標です。ROUGE-1(単語一致)、ROUGE-2(2単語フレーズ一致)、ROUGE-L(最長共通部分列)の3種類を計算します。

適した用途:要約タスク、長文の評価

セマンティック類似度

文章をベクトルに変換し、コサイン類似度で意味的な近さを測ります。BLEUやROUGEでは捉えられない言い換えや同義語を考慮できます。

"The cat is on the mat"
"A feline rests upon the rug"
→ BLEU: 低い
→ Semantic Similarity: 高い(意味が近いため)

LLM-as-a-Judge

別のLLMが審判として出力を採点します。正解テキストなしで評価できるため、正解が定義できないタスクに特に有効です。temperature=0.0 にすることで採点の再現性を確保しています。

設計のこだわり

統一されたインターフェース

すべての評価指標が compute(predictions, references) という同じインターフェースを持ちます。指標を追加・切り替えても、呼び出し側のコードを変更する必要がありません。

# どの指標も同じように使える
for metric in [BLEUMetric(), ROUGEMetric(), SemanticSimilarityMetric()]:
    result = metric.compute(predictions, references)
    print(result)

必要な機能だけインストール

sentence-transformers は数百MBあります。セマンティック評価が不要なユーザーに強制インストールさせないよう、オプション依存関係として設計しました。

pip install llm-evaluation-toolkit          # 軽量版
pip install llm-evaluation-toolkit[semantic] # セマンティック評価も使う場合

複数プロバイダ対応

BaseProvider という抽象クラスを設けることで、OpenAIとAnthropicを同じコードで切り替えられます。

# OpenAIでもAnthropicでも同じコードで動く
provider = OpenAIProvider()   # or AnthropicProvider()
predictions = provider.generate_batch(questions)

デモ

Huggnig Face Spacesのほうでデモも公開しています。

まとめ

llm-evaluation-toolkit は、LLMの出力評価を手軽に始められる軽量ライブラリです。

  • BLEU・ROUGE・セマンティック類似度・LLM-as-a-Judgeの4指標に対応
  • OpenAI・Anthropicのプロバイダを統一APIで利用可能
  • 必要な機能だけインストールできる設計

PyPIからインストールしてすぐに使えます:

pip install llm-evaluation-toolkit

フィードバックや機能リクエストはGitHubのIssueからお気軽にどうぞ!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?