Panduan
Mengevaluasi dari Node
SDK Node menjalankan sistem Anda dan evaluator-evaluatornya di Node, di dalam test runner Anda sendiri, lalu menyerahkan skornya ke mesin Python, yang memutuskan. Tim TypeScript tetap memegang kodenya, fixture-nya, dan test runner-nya; setiap interval, perbandingan, dan keputusan tetap menjadi milik mesin, dan SDK tidak menghitung satu pun darinya, bahkan rata-rata pun tidak.
Instalasi
npm install --save-dev @oloproof/sdk
pip install oloproofBaris pertama adalah SDK, baris kedua adalah mesin yang menerima skor darinya (Python 3.11 atau lebih baru). SDK menemukan oloproof di PATH Anda; jika tidak ada di sana, SDK berhenti dan memberi tahu cara memasangnya.
Menilai sistem dalam sebuah tes
Suite adalah file JSON Lines yang sama dengan yang dibaca mesin (Menulis suite), satu kasus per baris, masing-masing dengan id. Berikan kepada evaluate suite, sistem, dan satu evaluator per kriteria:
import { test } from "vitest";
import { type Case, decide, evaluate } from "@oloproof/sdk";
import { answer, rateHelpfulness } from "./support-bot.js";
type SupportCase = Case<{ question: string }, { label: string }>;
type Answer = { label: string; text: string };
test("the support bot is good enough to release", async () => {
const scored = await evaluate<SupportCase, Answer>({
suitePath: "data/support.jsonl",
system: (testCase) => answer(testCase.input.question),
evaluators: {
exact_label: (output, testCase) => ({ passed: output.label === testCase.expected?.label }),
helpfulness: {
scale: [0, 1],
judge: "gpt-4o-mini",
evaluate: async (output, testCase) => ({ score: await rateHelpfulness(output, testCase) }),
},
},
concurrency: 8,
out: "scores/candidate.jsonl",
});
console.log(scored.counts);
}, 600_000);Evaluator mengembalikan { passed } atau { score }, dengan reason opsional. Sebuah fungsi menilai lulus atau gagal; evaluator yang memberi skor mendeklarasikan scale-nya, karena interval atas rata-rata hanya berlaku di dalam rentang yang diketahui sebelum skor dibaca. Sebutkan judge jika yang menilai adalah model: mesin lalu memperlakukannya sebagai juri yang harus diperiksa terhadap orang-orang sebelum boleh menjadi gerbang bagi sebuah rilis (Juri).
concurrency membatasi berapa banyak kasus yang berjalan sekaligus (empat secara default). File skor mencantumkan kasus dalam urutan yang diberikan suite, apa pun urutan selesainya.
Biarkan mesin yang memutuskan
const decided = await decide({
scores: "scores/candidate.jsonl",
baseline: "scores/baseline.jsonl",
policy: "release.yaml",
});
console.log(decided.exit, decided.comparison?.gate?.decisions);decide menjalankan perintah yang akan Anda ketik, di direktori yang diberikan sebagai cwd (direktori saat ini secara default):
oloproof scores import scores/baseline.jsonl scores/candidate.jsonl --tool node
oloproof compare RUN_ID BASELINE_RUN_ID --policy release.yaml --jsonDengan baseline, mesin membandingkan kedua eksekusi kasus demi kasus dan decided.comparison adalah record yang dicetak oleh oloproof compare --json. Tanpa baseline, decide menjalankan oloproof gate pada eksekusi yang diimpor dan mengembalikan apa yang dicetaknya di decided.decision.stdout. Dalam kedua kasus, decided.exitCode adalah kode keluar mesin, tanpa diubah, dan decided.exit adalah namanya: EXIT_CODES memetakan setiap nama ke nilai mesin, sebagaimana Menjalankan di CI mencantumkannya.
Isi file
File ini adalah file yang dibaca oloproof scores import (Pendapat kedua): satu baris per kasus dan kriteria, hanya id kasus dan skor. Jawaban, input, atau reason tidak pernah masuk ke dalamnya; semuanya tetap di scored.results, di Node.
- Kasus yang sistemnya melempar exception ditulis dengan nilai kosong pada setiap kriteria, dan kasus yang evaluatornya melempar exception ditulis dengan nilai kosong pada kriteria itu. Mesin menghitung masing-masing sebagai hilang dan membatasinya pada nilai terburuknya, sehingga sebuah kegagalan menurunkan apa yang dapat ditunjukkan bukti alih-alih menghilang darinya. scored.errors mencantumkan masing-masing beserta pesannya.
- Putusan yang tidak dapat dimuat file menghentikan eksekusi dengan error dan tidak menulis apa pun: skor tanpa skala atau di luar skalanya, skor sekaligus lulus, atau kriteria yang tidak dapat dinamai mesin sebagai metrik.
- Setiap file adalah sebuah versi sistem yang diidentifikasi oleh isinya, sehingga mengimpor file yang sama lagi memakai ulang apa yang telah disimpan mesin.
Tanpa memasang mesin
secondOpinion mengirim dua file skor ke halaman ter-hosting yang menjawab "apakah itu nyata?" tanpa memasang apa pun, dan mengembalikan jawaban mesin sebagaimana mesin menuliskannya:
import { secondOpinion } from "@oloproof/sdk";
const result = await secondOpinion({
baseUrl: "https://oloproof.com",
baseline: "scores/baseline.jsonl",
candidate: "scores/candidate.jsonl",
});
if (result.ok) console.log(result.opinion.answers);
else console.log(result.error, result.description);Halaman itu tidak menyimpan apa pun dan tidak memerlukan akun. Halaman itu membaca hingga 2 MB per file dan dibatasi per klien; penolakan mengembalikan kalimat mesin yang menyebut baris yang harus diubah.
Apa yang belum dibangun
- Menerbitkan @oloproof/sdk ke npm. Sampai itu terjadi, bangun dari packages/sdk di repositori.
- Statistik jenis apa pun di Node, memang dirancang begitu: SDK menulis skor dan membaca jawaban mesin.
- group_id atau time_order dalam suite Anda tidak dibawa ke dalam impor, yang hanya membaca id kasus dan skor, sehingga mesin membaca kasus-kasus itu sebagai independen.
Langkah selanjutnya
- Pendapat kedua: format file dan apa yang dijawab oleh sebuah perbandingan.
- Gerbang CI: kebijakan rilis yang diteruskan decide ke mesin.
- API Python: evaluasi yang sama, dijalankan oleh mesin itu sendiri.