※ この記事はZennにも同内容を投稿しています。
はじめに
LLMを使ったアプリケーションを開発していると、こんな疑問が生まれませんか?
- GPT-4oとClaude 3.5 Sonnet、どちらの出力品質が高いか数値で比較したい
- プロンプトを変えたら本当に出力が改善されたのか確認したい
- 正解テキストがない場合でもLLMの出力を評価したい
既存のライブラリ(lm-eval-harnessやevaluate)は研究用途に特化しており、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)
正解が定義できないタスクに使えます。
LLMJudgeMetric の compute() は他の指標と引数の意味が異なります。
- 第1引数
predictions:LLMの回答テキスト - 第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からお気軽にどうぞ!