import { EvaluationLogger } from 'weave';
// シンプルなデータセットを作成する
interface DatasetExample {
question: string;
expected?: string;
expected_one_of?: string[];
}
const dataset: DatasetExample[] = [
{ question: 'What is 2 + 2?', expected: '4' },
{ question: 'What is the capital of France?', expected: 'Paris' },
{ question: 'Name a primary color', expected_one_of: ['red', 'blue', 'yellow'] },
];
// Scorerを定義する
const accuracyScorer = weave.op(function accuracyScorer(args: {
expected: string;
output: string;
expected_one_of?: string[];
}): { correct: boolean; score: number } {
const outputClean = args.output.trim().toLowerCase();
let isCorrect: boolean;
if (args.expected_one_of) {
isCorrect = args.expected_one_of.some(option =>
outputClean.includes(option.toLowerCase())
);
} else {
isCorrect = outputClean.includes(args.expected.toLowerCase());
}
return { correct: isCorrect, score: isCorrect ? 1.0 : 0.0 };
});
// WeaveのEvaluationLoggerを使用してモデルを評価する
async function evaluateModel(
model: (question: string) => Promise<string>,
modelName: string,
dataset: DatasetExample[]
): Promise<void> {
// トークン使用量を取得するため、モデルを呼び出す前にEvaluationLoggerを初期化する
// Serverless Inferenceでコストをトラッキングする場合は特に重要
// モデル名を有効な形式に変換する(英数字以外の文字をアンダースコアに置換)
const safeModelName = modelName.replace(/\//g, '_').replace(/-/g, '_').replace(/\./g, '_');
const evalLogger = new EvaluationLogger({
name: 'inference_evaluation',
model: { name: safeModelName },
dataset: 'qa_dataset'
});
for (const example of dataset) {
// モデルの予測を取得する
const output = await model(example.question);
// 予測をログする
const predLogger = evalLogger.logPrediction(
{ question: example.question },
output
);
// 出力をスコアリングする
const score = await accuracyScorer({
expected: example.expected || '',
output: output,
expected_one_of: example.expected_one_of
});
// スコアをログする
predLogger.logScore('accuracy', score.score);
// この予測のログを完了する
predLogger.finish();
}
// サマリーをログする - Weaveが精度スコアを自動的に集計する
await evalLogger.logSummary();
console.log(`Evaluation complete for ${modelName} (logged as: ${safeModelName}). View results in the Weave UI.`);
}
// 複数モデルの比較 - Weaveの評価フレームワークの主要機能
const modelsToCompare = [
{ model: llamaModel, name: 'meta-llama/Llama-3.1-8B-Instruct' },
{ model: deepseekModel, name: 'deepseek-ai/DeepSeek-V3.1' },
];
for (const { model, name } of modelsToCompare) {
await evaluateModel(model, name, dataset);
}
// Weave UIのEvalsタブにアクセスして、モデル間の結果を比較する