메뉴
HN
Hacker News 24일 전

에이전트 스킬 성능을 A/B 테스트하는 평가 프레임워크

IMP
7/10
핵심 요약

에이전트(Agent)에 도메인 지식을 주입하는 스킬(SKILL.md)이 실제로 모델의 성능을 높이는지 검증하는 오픈소스 평가 도구입니다. 동일한 프롬프트에 대해 스킬 적용 여부에 따른 결과를 각각 생성한 뒤, 판별 모델(Judge Model)이 두 출력물을 비교 평가하여 성능 향상을 객관적으로 증명합니다. CLI 환경에서 간단히 실행할 수 있으며 직관적인 HTML 리포트를 제공하여 스킬의 실질적인 효용성을 측정하고자 하는 AI 실무자들에게 유용합니다.

번역된 본문

agent-skills-eval은 '에이전트 스킬(Agent Skills)'을 위한 테스트 러너입니다. SKILL.md 파일을 작성하고 몇 가지 평가(evals)를 등록해 보세요. 그러면 여러분이 만든 스킬이 실제로 모델의 작업 수행 능력을 향상시키는지 경험적으로 확인할 수 있습니다.

  • 문서(Documentation) · 퀵스타트(Quickstart) · SDK · agentskills.io

왜 이 도구가 필요한가?

에이전트에 도메인 지식을 제공하기 위한 Anthropic의 개방형 표준인 '에이전트 스킬'을 사용하면, 간편하게 SKILL.md를 배포하여 에이전트가 해당 작업을 더 잘하게 되었다고 가정할 수 있습니다. 하지만 증명하는 것은 어렵습니다.

agent-skills-eval이 바로 그 빈자리를 채워줍니다. 이 도구는 동일한 프롬프트에 대해 두 번, 즉 컨텍스트에 스킬이 포함된 상태(with_skill)와 스킬이 없는 기준선 상태(without_skill)로 실행한 후, 판별 모델(judge model)이 두 출력물을 채점하고 나란히 비교한 리포트를 제공합니다. 스킬이 눈에 띄는 차이를 만들지 못한다면 결과에 명확히 나타날 것이고, 효과가 있다면 그것을 입증할 근거를 얻게 될 것입니다. 이것은 에이전트 스킬 생태계를 위한 테스트 프레임워크로서, 특정 에이전트 런타임에 종속되지 않아 스킬이 작동하는 어디서든 사용할 수 있습니다.

퀵스타트

npx agent-skills-eval ./skills \
  --target gpt-4o-mini \
  --judge gpt-4o-mini \
  --baseline \
  --strict

끝입니다. 스킬이 들어있는 폴더를 지정하고, 테스트 대상 모델(target model)과 판별 모델(judge model)을 지정하면, 전체 산출물과 정적 HTML 리포트가 포함된 워크스페이스가 생성됩니다.

agent-skills-workspace/
└── iteration-1/
    ├── meta.json          # 실행 메타데이터
    ├── benchmark.json     # 스킬별 통합 합격/불합격 결과
    ├── eval-basic/
    │   ├── with_skill/     # 출력, 소요 시간, 판별 모델 채점 결과
    │   └── without_skill/  # 위와 동일 (스킬 제외 상태)
    └── report/
        └── index.html     # 시각적 리포트

생성된 iteration-1/report/index.html을 열어보면 "내 스킬이 제대로 작동하고 있는가?"라는 질문에 대한 데이터에 기반한 진짜 답변을 얻을 수 있습니다.

핵심 기능

  • 스킬 적용 여부에 따른 비교 (with_skill vs without_skill): 모든 평가는 양쪽 방식으로 모두 실행되므로 스킬로 인한 실제 성능 향상이나 부작용을 확인할 수 있습니다.
  • 판별 모델 기반 출력 채점: 임의의 챗 모델을 판별 모델로 사용할 수 있습니다. 단순한 느낌이 아닌, 근거가 명시된 주장과 함께 합격/불합격 여부를 판정합니다.
  • TypeScript SDK 및 CLI: CI 파이프라인을 위한 한 줄짜리 CLI 명령어부터, 사용자 지정 파이프라인, 프로바이더, 대시보드를 위한 완벽한 SDK를 제공합니다.
  • OpenAI 호환성 기본 지원: OpenAI, Together, Groq, OpenAI 호환 레이어를 통한 Anthropic, 로컬 Llama 서버 등 OpenAI 챗 API를 사용하는 모든 환경에서 즉시 작동합니다.
  • *도구 호출 검증(Tool-call assertions)***: 단순히 텍스트를 생성하는 것을 넘어, 에이전트가 도구를 호출하는지 확인하는 결정론적 검사를 지원합니다.
  • 이식 가능한 산출물: 모든 결과가 JSON 및 JSONL 형식으로 저장됩니다. 오늘 실행하고 내일 결과를 비교(diff)하거나 자체 대시보드에 연동할 수 있습니다.
  • 정적 HTML 리포트: 어디든 게시할 수 있는 즉시 사용 가능한 리포트 사이트를 생성합니다. 별도의 인프라가 필요하지 않습니다.
  • 스펙 완벽 준수: agentskills.io 사양을 완벽하게 구현합니다. (SKILL.md 유효성 검사, evals/evals.json, 공식 iteration-N 산출물 레이아웃, 프론트매터 규칙 등)

설치 방법

npm install agent-skills-eval

또는 설치하지 않고 바로 실행할 수도 있습니다:

npx agent-skills-eval --help

작동 원리

개념은 아주 단순합니다. 스킬에 정의된 모든 평가에 대해 다음과 같은 과정을 거칩니다:

┌─────────────────────────────┐
│         동일한 프롬프트        │
└───────────────┬─────────────┘
                │
┌───────────────┴─────────────┐
▼                               ▼
┌──────────────────┐          ┌──────────────────┐
│    with_skill    │          │  without_skill   │
│ 컨텍스트에 SKILL.md 포함 │          │ 기준선, 스킬 없음  │
└────────┬─────────┘          └────────┬─────────┘
         │                             │
         ▼                             ▼
    대상 모델(target)            대상 모델(target)
         │                             │
         ▼                             ▼
       출력물                          출력물
         │                             │
         └──────────┬──────────────────┘
                    ▼
          ┌─────────────────┐
          │    판별 모델     │
          │   (Judge model)  │
          │ 두 출력물을 동일한  │
          │ 기준으로 각각 채점  │
          └────────┬────────┘
                   ▼
       양쪽의 합격 / 불합격 판정

판별 모델은 평가의 expected_output(예상 출력) 및 assertions(주장)을 확인하고 양쪽을 독립적으로 채점합니다. --baseline 플래그는 이 비교를 가능하게 하는 옵션입니다. 이 플래그가 없으면 with_skill 실행 결과만 얻게 됩니다.

YAML 설정

간단한 명령어 이상의 설정이 필요하다면, 프로젝트 루트에 설정 파일을 추가하면 됩니다:

# agent-skills-eval.yaml
root : ./skills
workspace : ./agent-skills-workspace
baseline : true
target : gpt-4o-mini
judge : gpt-4o-mini
baseUrl : https://api.openai.com/v1
apiKeyEnv : OPENAI_API_KEY
include : 
  - "skills/**"
exclude : 
  - "**/draft-*"
concurrency : 4
layout : iteration
strict : true
report : 
  enabled : true
  title : Agent Skills Report
logging : 
  format : pretty # pretty | jsonl | silent
  verbose : false
  color : auto
targetParams : 
  temperature : 0
judgeParams : 
  temperature : 0
원문 보기
원문 보기 (영어)
agent-skills-eval A test runner for Agent Skills . Write a SKILL.md , drop in some evals, and find out — empirically — whether your skill actually makes the model better at the task. Documentation · Quickstart · SDK · agentskills.io Why this exists Agent Skills — the open standard from Anthropic for giving agents domain knowledge — make it easy to ship a SKILL.md and assume your agent is now better at the task. The hard part is proving it. agent-skills-eval is the missing piece. It runs your skill against the same prompts twice — once with_skill loaded into context, once without_skill (baseline) — has a judge model grade both outputs, and gives you a side-by-side report. If the skill doesn't make a measurable difference, you'll see it. If it does, you have receipts. It's the test framework for the Agent Skills ecosystem, separated from any specific agent runtime so it works wherever your skills do. Quickstart npx agent-skills-eval ./skills \ --target gpt-4o-mini \ --judge gpt-4o-mini \ --baseline \ --strict That's it. Point it at a folder of skills, give it a target model and a judge model, and it produces a workspace with full artifacts and a static HTML report. agent-skills-workspace/ └── iteration-1/ ├── meta.json # run metadata ├── benchmark.json # rolled-up pass/fail per skill ├── eval-basic/ │ ├── with_skill/ # output, timing, judge grading │ └── without_skill/ # ↑ same, with the skill stripped └── report/ └── index.html # the visual report Open iteration-1/report/index.html and you have a real, evidence-backed answer to "is my skill working?" What you get with_skill vs without_skill Every eval runs both ways so you can see the actual lift from the skill — or its absence. Judge-graded outputs Use any chat model as a judge. Pass/fail with cited assertions, not vibes. TypeScript SDK + CLI One-liner CLI for CI, full SDK for custom pipelines, custom providers, and dashboards. OpenAI-compatible by default Works out of the box with OpenAI, Together, Groq, Anthropic via OpenAI-compat layers, local Llama servers — anything that speaks the OpenAI chat API. Tool-call assertions Deterministic checks for agents that call tools, not just generate text. Portable artifacts JSON + JSONL all the way down. Run today, diff tomorrow. Plug into your own dashboard. Static HTML reports A drop-in report site you can publish anywhere — no infrastructure. Fully spec-compliant Implements the full agentskills.io specification : SKILL.md validation, evals/evals.json , official iteration-N artifact layout, frontmatter rules. Install npm install agent-skills-eval Or run directly without installing: npx agent-skills-eval --help How it works The mental model is straightforward. For every eval defined in your skill: ┌─────────────────────────────┐ │ same prompt │ └───────────────┬─────────────┘ │ ┌───────────────┴─────────────┐ ▼ ▼ ┌──────────────┐ ┌──────────────┐ │ with_skill │ │without_skill │ │ SKILL.md in │ │ baseline, │ │ context │ │ no skill │ └──────┬───────┘ └──────┬───────┘ │ │ ▼ ▼ target model target model │ │ ▼ ▼ output output │ │ └──────────┬──────────────────┘ ▼ ┌─────────────┐ │ judge │ scores both against │ model │ the same assertions └──────┬──────┘ ▼ pass / fail per side The judge sees the eval's expected_output and assertions and grades each side independently. The --baseline flag is what enables the comparison; without it you only get the with_skill run. YAML config For anything beyond a quick command, drop a config file at the root of your project: # agent-skills-eval.yaml root : ./skills workspace : ./agent-skills-workspace baseline : true target : gpt-4o-mini judge : gpt-4o-mini baseUrl : https://api.openai.com/v1 apiKeyEnv : OPENAI_API_KEY include : - " skills/** " exclude : - " **/draft-* " concurrency : 4 layout : iteration strict : true report : enabled : true title : Agent Skills Report logging : format : pretty # pretty | jsonl | silent verbose : false color : auto targetParams : temperature : 0 judgeParams : temperature : 0 OPENAI_API_KEY=... npx agent-skills-eval --config agent-skills-eval.yaml CLI flags always override config values. SDK For programmatic use — CI pipelines, custom dashboards, multi-skill rollups — drive the evaluator from TypeScript: import { OpenAICompatibleProvider , consoleReporter , evaluateSkills , } from "agent-skills-eval" ; const provider = new OpenAICompatibleProvider ( { baseUrl : "https://api.openai.com/v1" , apiKey : process . env . OPENAI_API_KEY ! , model : "gpt-4o-mini" , providerName : "openai" , } ) ; const result = await evaluateSkills ( { root : "./skills" , workspace : "./agent-skills-workspace" , baseline : true , concurrency : 4 , workspaceLayout : "iteration" , strict : true , target : { model : provider . model , provider } , judge : { model : provider . model , provider } , onEvent : consoleReporter ( ) , } ) ; console . log ( result ) ; Stream events to a file as JSONL for downstream analysis: import { jsonlReporter } from "agent-skills-eval" ; const reporter = jsonlReporter ( { file : "./events.jsonl" } ) ; await evaluateSkills ( { /* ... */ onEvent : reporter . onEvent } ) ; await reporter . close ( ) ; Load YAML config programmatically: import { loadConfigFile } from "agent-skills-eval" ; const config = loadConfigFile ( "./agent-skills-eval.yaml" ) ; Custom providers Bring any backend by implementing the Provider interface — five fields, one method: import type { Provider , ProviderResult } from "agent-skills-eval" ; export const provider : Provider = { name : "my-provider" , model : "my-model" , async complete ( prompt : string ) : Promise < ProviderResult > { return { provider : "my-provider" , model : "my-model" , output : "model output" , latencyMs : 0 , inputTokens : 0 , outputTokens : 0 , costUsd : 0 , } ; } , } ; Useful for: local model servers (Ollama, vLLM, llama.cpp), proprietary internal APIs, mock providers in unit tests, or routing layers in front of multiple providers. Skill layout A skill is a folder. The minimum is a SKILL.md . Add evals/evals.json and you can evaluate it. my-skill/ ├── SKILL.md ├── references/ │ └── notes.md ├── scripts/ │ └── helper.sh └── evals/ ├── evals.json └── files/ └── input.csv SKILL.md : --- name : my-skill description : Analyze small CSV files. license : MIT compatibility : Works with text-capable chat models. --- When given a CSV file, identify the most important trend and cite the relevant rows. evals/evals.json : { "skill_name" : " my-skill " , "evals" : [ { "id" : " basic " , "name" : " basic behavior " , "prompt" : " Use the attached data to summarize revenue. " , "files" : [ " evals/files/input.csv " ], "expected_output" : " The response identifies the highest revenue month. " , "assertions" : [ " The output identifies the highest revenue month. " ] } ] } If you skip assertions but provide expected_output , the SDK promotes the expected output into a judge assertion automatically — so a minimal agentskills.io eval file produces meaningful pass/fail grading without extra work. CLI options npx agent-skills-eval [root] \ --config agent-skills-eval.yaml \ --workspace ./agent-skills-workspace \ --baseline \ --target gpt-4o-mini \ --judge gpt-4o-mini \ --base-url https://api.openai.com/v1 \ --api-key-env OPENAI_API_KEY \ --include " skills/** " \ --exclude " **/draft-* " \ --concurrency 4 \ --layout iteration \ --strict \ --log-format pretty \ --report Logging modes : pretty for humans, jsonl for machines, silent for quiet CI. Reports The static HTML report is built from disk artifacts and shows everything you'd want for skill iteration: Pass rate by skill and by eval Assertion-by-assertion grading evidence with judge reasoning Full target output, side by side for with_skill and without_skill Prompt and judge prompt details Timing and token usage Tool calls when present Use --report-output (or report.output in YAML) to choose where the report lands. agentskills.io compatibility Implements the agentskills.io specification end to end: SKILL.md YAML frontmat