AI eval ツール: Autoevals — SaaS 不要の OSS LLM スコアラ

AI eval ツール: Autoevals — SaaS 不要の OSS LLM スコアラ

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 回呼び出して採点します。代表的なものに次が揃っています。

ヒューリスティック系 は、LLM を使わず決定論的に計算します。

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 系統に分けると、この弱点を補えます。

決定論的スコアラの候補として、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 を実運用に乗せるときに踏みがちな点を整理します。

  1. OpenAI API キーが実質必須: LLM-as-a-judge 系はデフォルトで OpenAI を叩きます。クローズド環境では、OPENAI_BASE_URL で互換 API に差し替えるか、ヒューリスティック系に限定して使う判断が要ります。
  2. 採点コストが地味に効く: 大きなデータセットに Factuality や Translation を全件適用すると、採点だけで数ドル〜数十ドル掛かります。サンプリングや、まずヒューリスティックで足切り、という段構えが現実的です。
  3. 英語バイアス: 多くの採点器のプロンプトは英語前提で設計されています。日本語出力への採点では、同じ内容でもスコアが揺れることがあります。日本語用の採点基準は、LLMClassifierFromTemplate で日本語テンプレートを書き直すのが安全です。
  4. ゆらぎの計測を忘れない: 同じ入出力に対する複数回採点のばらつきを測り、意味のある差分として扱える下限、つまり有意差の閾値を事前に把握しておきます。

まとめ

Autoevals は、Braintrust SaaS に依存せず単体で動く MIT ライセンスの OSS 採点ライブラリです。pre-built なスコアラが揃っていて、Python / TypeScript から統一シグネチャで呼べます。カスタムスコアラとの共存も容易で、chaff grade のような決定論的採点と組み合わせると、LLM 判定のゆらぎを別軸で補えます。

SaaS 導入前にまず eval ループを回したいチームや、既存のテスト基盤に採点器だけ組み込みたいチームにとって、入口として最も軽い選択肢になります。

関連記事


Singularity Society はテクノロジー集団として MulmoClaude / MulmoTerminal / MulmoCast を開発しています。エンジニア・起業家向けの実践プログラム BootCamp も運営しています。

この記事をシェア

関連記事

記事一覧に戻る