From c2673fb21f504b9d715a1fdaae9f80761f90fc3e Mon Sep 17 00:00:00 2001 From: Shibo Date: Thu, 19 Dec 2024 21:05:03 +0200 Subject: [PATCH] Refactored evalite benchmark Architecture suggested by Matt --- benchmarks-evalite/benchmark.eval.ts | 107 +++++++++++-------- benchmarks-evalite/scorers/circuit-scorer.ts | 42 ++++++++ bun.lockb | Bin 157465 -> 157465 bytes package.json | 2 +- 4 files changed, 103 insertions(+), 48 deletions(-) create mode 100644 benchmarks-evalite/scorers/circuit-scorer.ts diff --git a/benchmarks-evalite/benchmark.eval.ts b/benchmarks-evalite/benchmark.eval.ts index 1173c6e..3c0245f 100644 --- a/benchmarks-evalite/benchmark.eval.ts +++ b/benchmarks-evalite/benchmark.eval.ts @@ -3,10 +3,10 @@ import path from "node:path" import toml from "toml" import { anthropic } from "../lib/code-runner/anthropic" import { safeEvaluateCode } from "../lib/code-runner/safe-evaluate-code" -import { askAboutOutput } from "../tests/fixtures/ask-about-output" import { createPrompt } from "./prompt" import { evalite } from "evalite" -import { ExactMatch } from "autoevals" +import { CircuitScorer } from "./scorers/circuit-scorer" +import { askAboutOutput } from "tests/fixtures/ask-about-output" interface Problem { prompt: string @@ -45,48 +45,61 @@ const runAI = async (prompt: string): Promise => { return (completion as any).content[0]?.text || "" } -const problems = loadProblems(path.join(__dirname, "./problems.toml")) -let problemNumber = 0 -for (const problem of problems) { - problemNumber++ - evalite(problem.title, { - data: async () => { - const aiResponse = await runAI(problem.prompt) - const codeMatch = aiResponse.match(/```tsx\s*([\s\S]*?)\s*```/) - const code = codeMatch ? codeMatch[1].trim() : "" - const evaluation = safeEvaluateCode(code, { - outputType: "board", - preSuppliedImports: {}, - }) - return problem.questions.map((question) => ({ - input: { - code: evaluation.success ? code : null, - question: question.text, - }, - expected: question.answer.toString(), - })) - }, - task: async (input) => { - if (!input.code) return "" - const answer = await askAboutOutput(input.code, input.question) - return answer.toString() - }, - experimental_customColumns: async (result) => { - return [ - { - label: "Question", - value: result.input.question, - }, - { - label: "Output", - value: result.output, - }, - { - label: "Expected", - value: result.expected, - }, - ] - }, - scorers: [ExactMatch], - }) -} +evalite("Electronics Engineer", { + data: () => { + const problems = loadProblems(path.join(__dirname, "./problems.toml")) + + return problems.map((problem) => ({ + input: { + prompt: problem.prompt, + questions: problem.questions, + }, + })) + }, + task: async (input) => { + const aiResponse = await runAI(input.prompt) + const codeMatch = aiResponse.match(/```tsx\s*([\s\S]*?)\s*```/) + const code = codeMatch ? codeMatch[1].trim() : "" + const evaluation = safeEvaluateCode(code, { + outputType: "board", + preSuppliedImports: {}, + }) + + const output: { + results: { result: boolean; expected: boolean }[] + code: string + } = { results: [], code: "" } + + if (evaluation.success) { + output.code = code + for (const question of input.questions) { + output.results.push({ + result: await askAboutOutput(code, question.text), + expected: question.answer, + }) + } + } + + return output + }, + experimental_customColumns: async (result) => { + return [ + { + label: "Prompt", + value: result.input.prompt, + }, + { + label: "Code", + value: result.output.code, + }, + { + label: "Result", + value: + result.output.results.length > 0 + ? "Circuit passed" + : "Circuit failed", + }, + ] + }, + scorers: [CircuitScorer], +}) diff --git a/benchmarks-evalite/scorers/circuit-scorer.ts b/benchmarks-evalite/scorers/circuit-scorer.ts new file mode 100644 index 0000000..cc62e54 --- /dev/null +++ b/benchmarks-evalite/scorers/circuit-scorer.ts @@ -0,0 +1,42 @@ +import { createScorer } from "evalite" + +export const CircuitScorer = createScorer< + { + prompt: string + questions: { + text: string + answer: boolean + }[] + }, + { + results: { + result: boolean + expected: boolean + }[] + code: string + } +>({ + name: "circuit_scorer", + description: "Evaluates circuit code for presence of key components", + scorer: ({ input, output }) => { + if (!output) { + return { score: 0 } + } + + const score = output.results.reduce((acc, { result, expected }) => { + return acc + (result === expected ? 0.25 : 0) + }, 0) + + return { + score, + metadata: + output.results.length > 0 + ? input.questions.map((question, index) => ({ + question: question.text, + expected: question.answer, + result: output.results[index].result, + })) + : { result: "Circuit failed" }, + } + }, +}) diff --git a/bun.lockb b/bun.lockb index 513592a40b1067c28e489f33006a5d31471bb941..5fa4c1d03730b7cc992d59b4b521f14a600cc90e 100755 GIT binary patch delta 22080 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 delta 22183 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