Autoevals は、Braintrust が開発・公開している OSS の LLM スコアラライブラリで、SaaS アカウントなしに単体で Python / TypeScript から利用できます。
本稿は、Braintrust 本体の記事 で簡単に触れた Autoevals を独立して取り上げます。pre-built な採点器が欲しいだけで有料プラットフォームまでは不要、というチームが対象です。
Braintrust 本体との関係とライセンス
Braintrust 本体は、Experiments、Playground、Online Scoring、Logs、Datasets を 1 枚の Web UI に束ねた商用 SaaS です。Autoevals はそのうち「採点器」の部分を切り出し、MIT ライセンスで GitHub に公開した Python / TypeScript パッケージです。
Braintrust SaaS を契約していなくても、pip install autoevals または npm install autoevals でそのまま使えます。採点のバックエンドとして OpenAI API 等を直接叩く構成なので、ダッシュボードやチームコラボは別途自前で用意する前提になります。
Braintrust SaaS 側では、Autoevals のスコアラがそのまま scores: [...] に渡せる組み込み採点器として機能します。つまり、まず Autoevals だけで評価ループを組み、必要になった段階で Braintrust SaaS に昇格させる、という段階的な導入が可能です。
なぜ Autoevals が刺さるのか
LLM アプリの評価で最初に欲しくなるのは、「このライブラリをインストールすれば、Factuality も Translation 品質も Humor も、すぐ測れる」という状態です。採点器を 1 つずつ自作していると、プロンプト設計、few-shot 例の収集、スコア正規化、再現性チェックで、本来の評価設計に行き着く前に体力を使い切ります。
Autoevals は、よく使う採点器を実装済みで提供し、スコア範囲も 0〜1 に正規化します。ちょっとしたバッチ評価や CI での回帰確認なら、SaaS を立てずに Python / TypeScript から呼び出すだけで十分、というのが刺さるポイントです。
類似の立ち位置に、DeepEval の metrics モジュールや Ragas の各種メトリクスがあります。Autoevals はそれらと比べて、特定フレームワークに縛られず、関数呼び出しの形で軽く使える点に強みがあります。Promptfoo や LangSmith の内蔵採点器は、それぞれのランナー経由でしか呼べません。これに対して Autoevals は、素の Node.js / Python スクリプトから直接呼び出せるので、既存の CI や自作評価スクリプトに後乗せしやすい設計です。
主な scorer カテゴリ
Autoevals が同梱する採点器は、大きく 3 系統に分かれます。
LLM-as-a-judge 系 は、裏側で LLM を 1 回呼び出して採点します。代表的なものに次が揃っています。
Factuality: 期待値と出力の事実整合性を分類採点しますBattle: 2 つの出力のうち、どちらが指示に忠実かを比較しますClosedQA: 文脈に基づいた QA の正答性を判定しますHumor: ユーモアの質を定性採点しますPossible: 出力がそもそも実現可能かを判断しますSecurity: セキュリティ観点で問題がないかを採点しますModeration: モデレーション観点でのスコアを返しますSummarization: 要約の品質を測りますSQL: SQL クエリ出力の等価性を比較しますTranslation: 翻訳品質を採点します
ヒューリスティック系 は、LLM を使わず決定論的に計算します。
ExactMatch: 完全一致を 0 / 1 で返しますLevenshtein: 編集距離に基づく類似度を 0〜1 で返しますNumericDiff: 数値どうしの相対差分を正規化しますJSONDiff: JSON 構造を再帰比較しますEmbeddingSimilarity: 埋め込みベクトルのコサイン類似度を返します
RAG / エージェント系 は、Ragas と互換性のある採点軸を揃えています。AnswerCorrectness、Faithfulness、AnswerRelevancy、ContextPrecision、ContextRecall などが実装されています。Ragas 単体を入れるほどではないが、RAG の品質監視を軽くやりたい場合に便利です。
最小動作例
公式が示している最小のコードを、Python と TypeScript の両方で示します。
Python
from autoevals.llm import Factuality
evaluator = Factuality()
result = evaluator(
output="パリはフランスの首都です。",
expected="フランスの首都はパリです。",
input="フランスの首都はどこですか?",
)
print(f"score={result.score}, metadata={result.metadata}")
バックエンドの LLM 呼び出しには、OPENAI_API_KEY が参照されます。Braintrust の AI Gateway を使いたい場合は、OPENAI_BASE_URL または BRAINTRUST_AI_GATEWAY_URL を環境変数で切り替えます。
TypeScript
import { Factuality } from "autoevals";
const result = await Factuality({
output: "Paris is the capital of France.",
expected: "The capital of France is Paris.",
input: "What is the capital of France?",
});
console.log(`score=${result.score}, metadata=`, result.metadata);
API は async で、戻り値も Python 版と揃っています。採点理由は metadata.rationale に文字列で入ります。
独自スコアラを書く
Autoevals のスコアラは、同じシグネチャに揃えておけばそのまま差し込めます。TypeScript では次の形になります。
type Scorer = (args: {
output: string;
expected?: string;
input?: string;
}) => Promise<{ name: string; score: number; metadata?: object }>;
export const lengthWithinLimit: Scorer = async ({ output }) => {
const limit_chars = 2000;
const score = output.length <= limit_chars ? 1 : 0;
return { name: "length_within_limit", score, metadata: { len: output.length } };
};
Python 側も、同じ呼び出し規約で関数またはクラスを定義すれば使えます。独自の LLM-as-a-judge スコアラを作るなら、Autoevals 付属のビルダを使うのが近道です。Python では LLMClassifier、TypeScript では LLMClassifierFromTemplate に、採点テンプレートと選択肢の対応表を渡すだけで組み上がります。
他ツールとの棲み分け
Autoevals、DeepEval の metrics、Ragas は、どれも「採点器のライブラリ」です。どう棲み分けるかを整理します。
DeepEval は pytest 連携と G-Eval 系のメトリクスが強く、テストファイルに書く評価コードに向きます。Ragas は RAG 評価に特化しており、Context 系メトリクスの網羅性が高めです。Autoevals は、言語横断で軽く差し込める汎用スコアラ、という立ち位置になります。
実務では排他的に選ぶ必要はなく、たとえば RAG 部分は Ragas、言い回しの比較は Autoevals、プロジェクト固有ルールは自作スコアラ、と混ぜ合わせても困りません。全部が「スコア 0〜1 を返す関数」なので、同じランナーに並べられます。
決定論的スコアラと組み合わせる価値
Autoevals の LLM-as-a-judge 採点器は便利ですが、「同じ出力に対して違う点数が返る」というゆらぎを持ちます。温度を下げても完全には消えません。
評価軸を 2 系統に分けると、この弱点を補えます。
- 意見ベースの採点: Autoevals の
Factuality、Humorなどの LLM スコアラで測る - 事実ベースの採点: ルールベースの決定論的スコアラで測る
決定論的スコアラの候補として、chaff grade があります。chaff の grade() は、引用一致、数値整合、スタイル規則違反率を厳密に計算して、同じ入力なら必ず同じ点数を返します。
LLM スコアラだけで組むと、「スコアが下がったけど、ゆらぎで変動したのか、それとも本物の劣化か判定できない」という状態に陥ります。決定論的な採点軸を 1 本挟んでおくと、回帰を切り分けやすくなります。
chaff grade との連携例
chaff の grade() を Autoevals のスコアラ API に合わせて包むと、他の採点器と並べられます。パターンは次の通りです(chaff-scorer.mjs )。
import { grade, toScorer } from "chaffjs/grade";
export const chaffScorer = async ({ output, expected }) => {
const scored = toScorer(await grade(output, { reference: expected }));
return {
name: scored.name,
score: scored.score,
metadata: { reason: scored.reason, ...scored.metadata },
};
};
これを他の Autoevals スコアラと一緒に並べると、こうなります。
import { Factuality } from "autoevals";
import { chaffScorer } from "./chaff-scorer.mjs";
const scorers = [Factuality, chaffScorer];
const results = await Promise.all(
scorers.map((s) => s({ output, expected, input })),
);
意見ベースのスコア(Factuality)と、事実ベースのスコア(chaff)を同時に集計できます。片方だけが下がったら、それ自体が切り分けのヒントになります。
ハマりポイント
Autoevals を実運用に乗せるときに踏みがちな点を整理します。
- OpenAI API キーが実質必須: LLM-as-a-judge 系はデフォルトで OpenAI を叩きます。クローズド環境では、
OPENAI_BASE_URLで互換 API に差し替えるか、ヒューリスティック系に限定して使う判断が要ります。 - 採点コストが地味に効く: 大きなデータセットに Factuality や Translation を全件適用すると、採点だけで数ドル〜数十ドル掛かります。サンプリングや、まずヒューリスティックで足切り、という段構えが現実的です。
- 英語バイアス: 多くの採点器のプロンプトは英語前提で設計されています。日本語出力への採点では、同じ内容でもスコアが揺れることがあります。日本語用の採点基準は、
LLMClassifierFromTemplateで日本語テンプレートを書き直すのが安全です。 - ゆらぎの計測を忘れない: 同じ入出力に対する複数回採点のばらつきを測り、意味のある差分として扱える下限、つまり有意差の閾値を事前に把握しておきます。
まとめ
Autoevals は、Braintrust SaaS に依存せず単体で動く MIT ライセンスの OSS 採点ライブラリです。pre-built なスコアラが揃っていて、Python / TypeScript から統一シグネチャで呼べます。カスタムスコアラとの共存も容易で、chaff grade のような決定論的採点と組み合わせると、LLM 判定のゆらぎを別軸で補えます。
SaaS 導入前にまず eval ループを回したいチームや、既存のテスト基盤に採点器だけ組み込みたいチームにとって、入口として最も軽い選択肢になります。
関連記事
- AI eval ツール 10 選 — 比較と使い分け
- AI eval ツール: Braintrust
- AI eval ツール: DeepEval
- AI eval ツール: Ragas
- AI エージェント評価サーベイ論文を読み解く
Singularity Society はテクノロジー集団として MulmoClaude / MulmoTerminal / MulmoCast を開発しています。エンジニア・起業家向けの実践プログラム BootCamp も運営しています。
