
Rag Eval
- 3 installs
- 7 repo stars
- Updated August 2, 2026
- practicalswan/agent-skills
rag-eval is a Claude Code skill for ai & agent building.
About
Provides guidance for measuring retrieval and answer quality of a RAG Blueprint stack with fixed datasets and reproducible scoring. A developer uses it when benchmarking or regression-testing a RAG pipeline's quality.
- Stable datasets and baselines for scoring
- Reproducible retrieval and answer-quality evaluation
Rag Eval by the numbers
- 3 all-time installs (skills.sh)
- Ranked #13,657 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 4, 2026 (Skillselion catalog sync)
npx skills add https://github.com/practicalswan/agent-skills --skill rag-evalAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 3 |
|---|---|
| repo stars | ★ 7 |
| Last updated | August 2, 2026 |
| Repository | practicalswan/agent-skills ↗ |
How do I helps with ai & agent building tasks.?
Evaluates NVIDIA RAG Blueprint retrieval and answer quality using stable datasets, baselines, and reproducible scoring workflows.
Who is it for?
A solo builder working on ai & agent building tasks who needs structured help with rag eval.
Skip if: Teams with no ai & agent building needs, or anyone wanting a generic chat assistant without this specific workflow.
When should I use this skill?
When you need to helps with ai & agent building tasks., or when rag-eval is a claude code skill for ai & agent building.
What you get
Structured output aligned to rag-eval: rag-eval, AI & Agent Building.
Files
On-disk RAG evaluation (corpus/ + train.json)
Purpose
Guide agents through NVIDIA RAG Blueprint filesystem benchmarks: preparing corpus/ and train.json, running scripts/eval/evaluate_rag.py, tuning retrieval and generation flags for quality comparisons, interpreting RAGAS JSON outputs, and triaging failures (HTTP/stream errors, empty contexts, collection mismatch, judge API).
For latency, throughput, and load testing, use the rag-perf skill (scripts/rag-perf, docs/performance-benchmarking.md) — not this skill.
When not to use
Do not use this skill for: deploying or repairing services (use rag-blueprint); evaluating APIs without the corpus/ + train.json layout; general ML experimentation unrelated to this evaluator; production monitoring/alerting; or latency/throughput benchmarking (use rag-perf).
Prerequisites
- Repo cloned; run commands from repo root (imports and paths assume this).
- Python 3.11+ and uv; eval deps:
uv sync --project scripts/eval. - Reachable RAG server and ingestor (defaults often
localhost:8081/8082). - `NVIDIA_API_KEY` for RAGAS (see credential hygiene); optional `RAG_EVAL_JUDGE_MODEL`.
- Dataset roots passed to
--dataset-pathseach contain `corpus/` and `train.json`.
Instructions
1. Prepare data — Ensure each dataset directory matches the layout and train.json rules in `references/dataset-and-conversion.md`. When sources arrive as public links (sites or dataset pages), materialize documents under corpus/—prefer PDF for multimodal content so images stay embedded; convert CSV/JSONL/etc. using the patterns there. 2. Run eval — uv run --project scripts/eval python scripts/eval/evaluate_rag.py with --dataset-paths, --host, and --port. See `references/benchmark-execution.md` for command examples, outputs, and errors. Use `references/evaluate-rag-cli.md` for flag-level detail. 3. Tune quality — Adjust --top_k / --vdb_top_k, reranker and query-rewriting toggles, and generation overrides (--temperature, --top-p, --max-tokens) as documented in `references/benchmark-execution.md` when comparing retrieval/generation configs for RAGAS scores. 4. Analyze results — Use `references/result-analysis.md` for scripts; scan rag_*_evaluation_summary.json for headline RAGAS metrics. 5. Triage errors — Use the error signal table and the Troubleshooting section below.
Examples
Set API key without putting secrets in shell history (preferred patterns): load from a gitignored env file or secrets manager; avoid committing .env; rotate keys if exposed. Details: `references/benchmark-execution.md#credential-hygiene-nvidia_api_key`.
Minimal eval (key already in environment):
uv sync --project scripts/eval
uv run --project scripts/eval python scripts/eval/evaluate_rag.py \
--dataset-paths /path/to/my_dataset \
--host localhost \
--port 8081Pretty-print summary JSON:
python3 -m json.tool results/my_dataset/rag_my_dataset_evaluation_summary.jsonMore examples (skip ingestion, quality sweeps): `references/benchmark-execution.md`.
Limitations
- Evaluator behavior is fixed to the filesystem contract and
evaluate_rag.py; it does not substitute for custom offline judges or non-RAG benchmarks. - Vector DB / embedding choices follow deployed ingestor and RAG env — not overridden by this CLI alone.
- Scores depend on retrieval quality, judge model availability, and
NVIDIA_API_KEY; empty contexts yield partial RAGAS metrics (see references). - Large procedural detail lives under `references/` to keep routing concise; read those files when the user needs step-by-step conversion, full flags, or error tables.
Troubleshooting
| Error / signal | Likely cause | What to do |
|---|---|---|
Immediate exit mentioning NVIDIA_API_KEY | Missing or invalid key | Set key via secure channel; see credential hygiene in `references/benchmark-execution.md`. |
train.json must be a JSON array | Wrong JSON shape | Top-level array of objects; validate per `references/dataset-and-conversion.md`. |
Fewer rows in evaluation_data.json than train.json | Per-query failures | Check stderr: network or stream JSON errors; see error table in benchmark-execution. |
Empty generated_contexts everywhere | Retrieval gap | Verify collection, ingestion, top_k / vdb_top_k, and ingestor_server_url without /v1 suffix. |
| Ingestor 404 on upload | Bad ingestor base URL | Pass http://host:port only — code appends /v1/. |
Full signal table: `references/benchmark-execution.md#common-error-cases-and-signals`.
Gotchas
- Run from repo root: paths and imports in
scripts/eval/evaluate_rag.pyassume this; a wrong directory silently breaks imports. - `--ingestor_server_url`: pass
http://host:portwithout/v1—the code appends/v1/automatically. Including/v1causes 404s on ingestor calls. - Vector DB / embedding settings: not set by this CLI; configure via the deployed ingestor and RAG server env vars (e.g.
APP_VECTORSTORE_URL, embedding model). - `--model` / `--llm_endpoint`: forwarded verbatim only when explicitly set; omit to keep the server's configured LLM.
- Stale collections: a previous run's ingested data persists unless you use
--force_ingestion. Use--collectionwith a unique name when comparing quality across isolated runs. - Empty context metrics: if all
generated_contextsare empty, RAGAS scores onlynv_accuracyand leaves the other two metrics blank—this is not a silent success.
Source of truth
| Piece | Location |
|---|---|
| Driver | scripts/eval/evaluate_rag.py (CORPUS_DIRECTORY = corpus, EVAL_DATA = train.json) |
| Human README (always in-repo) | scripts/eval/README.md |
| Full CLI (flags, defaults) | scripts/eval/evaluate_rag.py --help; `references/evaluate-rag-cli.md` |
| Dataset / conversion | `references/dataset-and-conversion.md` |
| Runs, outputs, errors | `references/benchmark-execution.md` |
| Result analysis scripts | `references/result-analysis.md` |
| Latency / throughput | rag-perf skill, docs/performance-benchmarking.md |
Agent playbook
1. Run eval — uv sync --project scripts/eval then uv run --project scripts/eval python scripts/eval/evaluate_rag.py with required --dataset-paths, --host, and --port (and env NVIDIA_API_KEY). Argument --ingestor_server_url is optional (defaults to http://localhost:8082); pass it only when overriding the ingestor endpoint. 2. Quality tuning — See `references/benchmark-execution.md`: --top_k/--vdb_top_k, reranker and query-rewriting toggles, --temperature, --top-p, --max-tokens. 3. Data conversion — Follow `references/dataset-and-conversion.md`. 4. Analyze results — `references/result-analysis.md`; quick scan: python3 -m json.tool results/<dataset>/rag_<dataset>_evaluation_summary.json. 5. Error triage — `references/benchmark-execution.md#common-error-cases-and-signals`.
Anti-Patterns
- Changing the eval dataset while comparing runs: It destroys the baseline and makes improvements meaningless.
- Confusing latency smoke tests with answer-quality evaluation: Fast responses can still be wrong or ungrounded.
- Claiming gains without showing the baseline, scorer, and prompt or config deltas that changed the outcome.
Verification Protocol
Before claiming "skill applied successfully":
1. Pass/fail: The evaluation plan names the dataset, scorer, and baseline run before comparing variants. 2. Pass/fail: Retrieval and generation quality are separated so failures are attributed to the correct stage. 3. Pass/fail: Reported improvements include reproducible commands, configs, or artifacts that another maintainer can rerun. 4. Pressure-test scenario: Re-evaluate a RAG change where latency improves but groundedness falls on the held-out set. 5. Success metric: Quality claims survive a rerun on the same eval slice with no hidden configuration drift.
<!-- PORTABILITY:START -->
Cross-Client Portability
This skill is written to stay usable across GitHub Copilot, Claude Code, Codex, and Gemini CLI.
- GitHub Copilot: keep the folder in a Copilot-visible skill or plugin path, or wrap the workflow as project instructions if the host does not support portable skill folders directly.
- Claude Code: keep the folder in a local skills directory or a compatible plugin or marketplace source.
- Codex: install or sync the folder into
$CODEX_HOME/skills/<skill-name>and restart Codex after major changes. - Gemini CLI: this repository generates a project command named
/skills:rag-evalfrom this skill. Rebuild commands withpython scripts/export-gemini-skill.py rag-evaland then run/commands reloadinside Gemini CLI.
<!-- PORTABILITY:END -->
<!-- MCP:START -->
MCP Availability And Fallback
Preferred MCP Server: None required
- Fallback prompt: "Use the rag-eval skill without MCP. Rely on the local
SKILL.md, bundled references or scripts, and manual verification. Show the exact commands, evidence, and final checks you used before concluding." - If the current host does not expose a matching server, use the bundled references, scripts, native toolchain, and manual workflow already described in this skill.
- Treat direct local verification, rendered output, logs, tests, or screenshots as the fallback evidence path before completion.
<!-- MCP:END -->
Related Skills
- development-workflow: Use it when the eval work needs a scoped implementation plan with explicit quality gates.
- documentation-verification: Use it when the output is an evaluation report or benchmark note that must stay source-backed.
- cloud-design-patterns: Use it when evaluation results drive bigger architecture changes in the RAG stack.
Evaluation Report
Evaluation of the rag-eval skill before publication through NVSkills-Eval.
This benchmark summarizes 3-Tier Evaluation from NVSkills-Eval results for the skill. The goal is to document whether the skill is safe, discoverable, effective, and useful for agents before it is published for broader workflow use.
Evaluation Summary
- Skill:
rag-eval - Evaluation date: 2026-05-29
- NVSkills-Eval profile:
external - Overall verdict: FAIL
- Tier 3 live agent evaluation: not available in this report
Agents Used
- Tier 3 agent details were not available in this report.
Metrics Used
Reported benchmark dimensions:
- Security: checks whether skill-assisted execution avoids unsafe behavior such as secret leakage, destructive commands, or unauthorized access.
- Correctness: checks whether the agent follows the expected workflow and produces the correct final output.
- Discoverability: checks whether the agent loads the skill when relevant and avoids using it when irrelevant.
- Effectiveness: checks whether the agent performs measurably better with the skill than without it.
- Efficiency: checks whether the agent uses fewer tokens and avoids redundant work.
Underlying evaluation signals used in this run:
- No Tier 3 evaluation signal details were available in this report.
Test Tasks
Tier 3 evaluation task details were not available in this report.
Results
Tier 3 dimension rollup was not available in this report.
Tier 1: Static Validation Summary
Tier 1 validation passed with observations. NVSkills-Eval ran 9 checks and found 3 total findings.
Top findings:
- MEDIUM QUALITY/quality_efficiency: Deeply nested references in benchmark-execution.md (
skills/rag-eval/SKILL.md) - LOW SCHEMA/unexpected_file: Unexpected 'BENCHMARK.md' in skill root (
skills/rag-eval/BENCHMARK.md) - LOW SCHEMA/unexpected_file: Unexpected 'eval' in skill root (
skills/rag-eval/eval)
Tier 2: Deduplication Summary
Tier 2 validation reported findings. NVSkills-Eval ran 2 checks and found 2 total findings.
Top findings:
- HIGH DUPLICATE/duplicate: Duplicate content found across references/benchmark-execution.md and references/evaluate-rag-cli.md:
"### Toggle pipeline stages" in references/benchmark-execution.md (lines 94-104) vs "### Pipeline stage toggles" in references/evaluate-rag-cli.md (lines 37-47) (references/benchmark-execution.md:94)
- HIGH DUPLICATE/duplicate: Duplicate content found within references/result-analysis.md:
"## Per-query table with worst-accuracy rows" in references/result-analysis.md (lines 7-34) vs "## Markdown table of worst queries" in references/result-analysis.md (lines 58-75) (references/result-analysis.md:7)
Publication Recommendation
The skill should be reviewed before NVSkills-Eval publication. Skill owners should address the findings above and rerun NVSkills-Eval to refresh this benchmark.
Changelog
All notable changes to the rag-eval skill will be documented in this file.
[2026-06-09] - Initial Import and Catalog Normalization
Added
- Imported
rag-evalfromhttps://github.com/NVIDIA/skillsatskills/rag-evalpinned to129a1087a1853f32a950e2f7bbc0fd7d57b9d422. - Added repo-standard
Anti-Patterns,Verification Protocol, portability, MCP fallback, and related-skills sections. - Preserved the upstream benchmark, signature, skill card, and bundled references or scripts for provenance and later refreshes.
Changed
- Normalized
SKILL.mdfrontmatter to the shared catalog schema withversion: "1.2"andlast_updated: 2026-06-09. - Moved upstream-only top-level metadata into the nested
metadatablock so validation, export, and downstream sync stay consistent.
Fixed
- Aligned the imported skill with this repository's maintained-skill requirements and downstream sync workflow.
{
"skills": [
"rag-eval"
],
"version": "1",
"platforms": [
"H100_x2"
],
"resources": {
"platforms": {
"H100_x2": {
"brev_type": "dmz.h100x2.pcie",
"gpu_type": "H100",
"gpu_count": 2,
"min_vram_gb_per_gpu": 80,
"min_root_disk_gb": 500,
"min_gpu_driver_version": "560.0",
"description": "2x H100 80GB PCIe. Self-hosted RAG stack with local NIMs for inference. RAGAS scoring uses NVIDIA_API_KEY against hosted judge model to avoid overloading the local NIM."
}
}
},
"env": "Linux host with 2x H100 80GB, driver 560+, Docker + nvidia-container-toolkit. Self-hosted RAG stack running with local NIMs (nim-llm at localhost:8999, nemoretriever-embedding-ms at localhost:9080). RAG server at http://localhost:8081. NVIDIA_API_KEY is set — use it for RAGAS judge scoring via the RAG_EVAL_JUDGE_MODEL env var (do NOT use the local NIM at localhost:8999 as the RAGAS judge — it is reserved for RAG inference and is too slow for RAGAS async evaluation). uv and Python 3.11+ available. cwd is repo root. Eval deps installed via: uv sync --project scripts/eval.",
"expects": [
{
"query": "Use the rag-eval skill to explain how to run a RAGAS quality evaluation against the self-hosted RAG deployment at http://localhost:8081. Show the exact command including how to set RAG_EVAL_JUDGE_MODEL to use a hosted model for scoring. Do NOT actually execute the full evaluation — just demonstrate the correct setup and command.",
"checks": [
"The agent's final response demonstrates knowledge of the rag-eval skill workflow (e.g. references evaluate_rag.py, RAGAS metrics, or dataset paths)",
"The agent's trajectory shows it verified the RAG server is reachable at http://localhost:8081",
"The agent's final response includes the evaluate_rag.py command with --host localhost and --port 8081",
"The agent's final response mentions setting RAG_EVAL_JUDGE_MODEL or NVIDIA_API_KEY to use a hosted judge model for RAGAS scoring",
"The agent's final response mentions at least one RAGAS metric (faithfulness, context relevancy, or answer correctness)"
]
},
{
"query": "I ran RAGAS evaluation against my self-hosted RAG stack and got faithfulness=0.45 and answer_correctness=0.6. Use the rag-eval skill to explain what these scores mean for a self-hosted deployment and what I should tune first.",
"checks": [
"The agent's final response explains the meaning of faithfulness score in the context of the LLM NIM generating grounded answers",
"The agent's final response explains the meaning of answer_correctness score",
"The agent's final response provides at least one self-hosted specific tuning suggestion such as adjusting top_k, switching NIM model, or checking embedding quality"
]
}
]
}
{
"skills": ["rag-eval"],
"platforms": ["cpu"],
"resources": {
"platforms": {
"cpu": {
"brev_type": "n2d-standard-4",
"description": "GCP n2d-standard-4 (4 vCPU, 16 GB). RAG stack running, uv and Python 3.11+ available."
}
}
},
"env": "Linux host with Python 3.11+ and uv installed. RAG stack is running: rag-server at http://localhost:8081, ingestor at http://localhost:8082. NVIDIA_API_KEY is set for RAGAS scoring. cwd is repo root: ${RAG_REPO_ROOT}/. Eval deps installed via: uv sync --project scripts/eval. Run evals from repo root with: uv run --project scripts/eval python scripts/eval/evaluate_rag.py",
"expects": [
{
"query": "Use the rag-eval skill to explain how to run a RAGAS quality evaluation on the deployed RAG system. What command do I run, what files do I need, and what metrics will it produce?",
"checks": [
"The agent's trajectory shows it read the rag-eval SKILL.md before responding",
"The agent's final response includes the evaluate_rag.py command with --dataset-paths, --host, and --port flags",
"The agent's final response mentions RAGAS metrics such as faithfulness, context relevancy, or answer correctness",
"The agent's final response explains where to find or prepare the dataset (corpus/ directory and train.json)"
]
},
{
"query": "My RAGAS evaluation returned a faithfulness score of 0.4. Use the rag-eval skill to explain what this means and what I should adjust to improve it.",
"checks": [
"The agent's trajectory shows it read the rag-eval SKILL.md before responding",
"The agent's final response explains that a low faithfulness score means answers are not grounded in retrieved documents",
"The agent's final response provides at least one concrete suggestion to improve the score such as adjusting top_k, enabling reranker, or checking ingestion quality"
]
}
]
}
Benchmark runs, outputs, and error signals
Load this for full command examples, artifact descriptions, quality interpretation, retrieval/generation flags, and the error-signal table.
For latency, throughput, and load testing, use the rag-perf skill — not this document.
Credential hygiene (NVIDIA_API_KEY)
- Prefer a secrets manager or a sourced env file that is not committed; ensure
.envand key files are in.gitignore. - Shell history may record
export ...lines — avoid pasting real keys on the command line; rotate the key if it was exposed. - Do not hardcode API keys in scripts or commit them to version control.
After the key is available in the environment, run commands from the repo root.
Output artifacts
Under --output_dir (default results), each dataset gets a subdirectory named after the dataset directory basename. Files share the same <label> (the dataset folder name):
| File | Purpose |
|---|---|
rag_<label>_evaluation_data.json | Per query: question, answer, generated_answer, generated_contexts, retrieved_docs. Written before RAGAS. Use for forensics and failure patterns. |
rag_<label>_evaluation_summary.json | Headline means: nv_accuracy_mean, nv_context_relevance_mean, nv_response_groundedness_mean. Fast pass/fail. |
rag_<label>_evaluation_results.json | RAGAS vectors: per-sample score lists under nv_accuracy, nv_context_relevance, nv_response_groundedness. |
rag_<label>_evaluation_metrics.json | Structured roll-up: ingestion_metrics_list, evaluation_metrics (model dump of RagEvaluationMetrics). |
Analysis tips: If evaluation_data has fewer rows than train.json, some queries failed (exceptions print during the run). After drops, use id / query_id to align rows rather than positional index. For "worst questions," pair index i in evaluation_results score lists with the ith object in evaluation_data.
Interpreting RAGAS quality metrics
- `nv_accuracy` — answer accuracy (LLM judge vs ground-truth
answer). - `nv_context_relevance` and `nv_response_groundedness` — scored when retrieved contexts exist.
- If no non-empty
generated_contextsare present across the run, the code scores answer accuracy only—do not treat empty context metrics as a silent success.
Running the benchmark
Set NVIDIA_API_KEY (see credential hygiene above). Optionally set RAG_EVAL_JUDGE_MODEL for the RAGAS judge LLM id. Then from repo root:
Minimal full-run example
uv run --project scripts/eval python scripts/eval/evaluate_rag.py \
--dataset-paths /path/to/my_dataset \
--host localhost \
--port 8081 \
--ingestor_server_url http://localhost:8082 \
--output_dir results(NVIDIA_API_KEY must already be exported or injected by your environment.)
Skip ingestion (collection already populated)
uv run --project scripts/eval python scripts/eval/evaluate_rag.py \
--dataset-paths /path/to/my_dataset \
--host localhost \
--port 8081 \
--ingestor_server_url http://localhost:8082 \
--skip_ingestionIngestion only (no RAGAS scoring)
uv run --project scripts/eval python scripts/eval/evaluate_rag.py \
--dataset-paths /path/to/my_dataset \
--host localhost \
--port 8081 \
--ingestor_server_url http://localhost:8082 \
--skip_evaluationForce re-ingest (delete existing collection first)
uv run --project scripts/eval python scripts/eval/evaluate_rag.py \
--dataset-paths /path/to/my_dataset \
--host localhost --port 8081 \
--ingestor_server_url http://localhost:8082 \
--force_ingestionRetrieval and generation options (quality comparisons)
Use these flags when comparing pipeline configs for RAGAS scores. Omit any flag to leave the RAG server default.
Retrieval depth
--top_k 5 # sent as reranker_top_k to the generate endpoint
--vdb_top_k 20 # vector DB candidate pool sizeToggle pipeline stages
--enable-reranker # send enable_reranker=true on /v1/generate
--disable-reranker # send enable_reranker=false
--enable-query-rewriting # send enable_query_rewriting=true
--disable-query-rewriting # send enable_query_rewriting=falseOmitting these flags does not send the field—the RAG server uses its own configured default. --enable-reranker and --disable-reranker are mutually exclusive; same for the query-rewriting pair.
Generation parameters
--temperature 0.0 # deterministic output for repeatable benchmarks
--top-p 0.95
--max-tokens 512 # cap answer lengthThese are forwarded verbatim to /v1/generate; omit to use the server default.
Example: quality comparison across configs
uv run --project scripts/eval python scripts/eval/evaluate_rag.py \
--dataset-paths /path/to/my_dataset \
--host localhost --port 8081 \
--ingestor_server_url http://localhost:8082 \
--skip_ingestion \
--disable-reranker \
--disable-query-rewriting \
--temperature 0.0 \
--max-tokens 512 \
--output_dir results/baseline_no_rerankUse a distinct --collection or --force_ingestion when you need an isolated corpus for each config.
Result analysis
For ready-to-run Python scripts, read `result-analysis.md`. It contains: per-query worst-accuracy table, CSV export, and markdown report table.
Quick headline scan:
python3 -m json.tool results/my_dataset/rag_my_dataset_evaluation_summary.jsonRows with has_context=N and low nv_accuracy signal retrieval problems (ingestion gap or collection mismatch), not generation problems.
Common error cases and signals
| Signal | What it usually means | What to check |
|---|---|---|
Script exits immediately on NVIDIA_API_KEY | Judge cannot run | Export a valid key; optional RAG_EVAL_JUDGE_MODEL for an available catalog model. |
train.json must be a JSON array / validation errors | Bad JSON shape | Top-level array of objects, not a single object or multiline records without array wrapper. |
Fewer rows in evaluation_data.json than in train.json | Per-query exception | Stderr during run: network or JSON decode on stream. |
Row has generated_answer: "" and generated_contexts: [] | RAG returned no content | Retrieval returned nothing: collection exists and is populated? top_k/vdb_top_k too low? |
Response contained error message / answers matching the server's error sentinel | RAG returned an error string | RAG server logs, collection existence, collection_names vs ingested data. |
Failed to get response from rag-server | HTTP or network | --host/--port, firewall, RAG server health and logs. |
| Ingestor or collection errors | 4xx/5xx on ingestor | ingestor_server_url base without /v1, credentials, disk, ingestor logs. |
nv_context_relevance / nv_response_groundedness empty with empty generated_contexts | No usable retrieved text for context metrics | Ingestion, collection_name alignment, top_k / retrieval config. |
| >50% failures warning in stdout | error_count high | Systematic config issue (wrong collection, RAG down, or streaming parse errors). |
| Citation / filename mismatch in metrics | Names do not line up | corpus/ file basenames vs citation document_name patterns. |
| Stale collection from a previous run tainting results | Unexpectedly high or low accuracy | Use --force_ingestion to delete and re-ingest, or --collection to isolate. |
Pre-flight checklist
1. Each dataset root: corpus/ + train.json (corpus/ preferably PDF, including sources where the upstream link does not name a file explicitly). 2. train.json: top-level array of objects (dict-shaped root is rejected). Run the quick validation in `dataset-and-conversion.md` after any conversion. 3. Rows include question and answer for meaningful RAGAS scores. 4. NVIDIA_API_KEY available before invoking the script (optional RAG_EVAL_JUDGE_MODEL if not using the default judge). 5. For config comparisons: use a distinct --collection or --force_ingestion / --skip_ingestion so each run sees the intended corpus state.
Dataset layout, train.json, and conversion
Load this when shaping corpus/ + train.json or converting external benchmarks.
Dataset layout
Each --dataset-paths entry is a directory containing:
1. corpus/ — files indexed recursively for ingestion. 2. train.json — evaluation questions and answers.
train.json schema
The driver accepts a top-level JSON array of objects only. Required per row: question, answer. Optional: id or query_id.
Field rules:
id: integer from the source row index. Do not use prefixed strings (e.g."dataset-0").is_impossible: include as a boolean if the source dataset carries it; usefalsefor benchmarks that have no unanswerable questions.contexts: optional array of objects — one entry per supporting document. `filename` (required on each object) is the file’s basename undercorpus/exactly as on disk (including any percent-encoding in the name). `text` is optional: include it when you have a ground-truth span; omit it when you only need to tie the row to corpus files by name (for example multimodal PDFs where no span was curated).- Omit benchmark-internal metadata fields (reasoning category labels, source tags, etc.) that are not
question,answer,id,is_impossible, orcontexts.
[
{
"id": 0,
"question": "...",
"answer": "...",
"is_impossible": false,
"contexts": [
{ "filename": "Article_Title" },
{ "filename": "Another%20Article", "text": "…" }
]
}
]Multiple context entries per row are allowed. Plain strings (["...", "..."]) remain acceptable for minimal bundles without per-file tagging.
Quick validation
python3 -c "import json,sys; d=json.load(open(sys.argv[1])); assert isinstance(d, list) and all(isinstance(x, dict) for x in d), 'train.json must be a list of objects'" train.jsonRun this after any conversion step to catch shape errors before the eval.
Corpus format when converting external benchmarks
Prefer putting sources in corpus/ as PDF. That matches typical production RAG on documents, aligns with the evaluator default --file-type pdf, and unlocks PDF page counts in ingestion metrics.
Materializing corpus/ from public links (datasets, sites, and mirrors)
Eval requires a real `corpus/` tree on disk. When the only inputs are public links—dataset landing pages, file listings, paper or supplement URLs, or arbitrary websites—download or render into `corpus/` as documents the ingestor can index, do not point the eval at URLs alone.
For multimodal material (figures, tables, charts, photos, diagrams, or screenshots that carry meaning), standardize on PDF as the file format under corpus/ whenever practical so images and layout stay inside the same artifact the retriever will chunk and embed. Goals:
- Preserve visuals: Use the publisher’s official PDF download or export when it exists. Avoid workflows that rebuild PDFs from plain text only (for example simple text-to-PDF libraries): those often drop graphics and produce a corpus that no longer matches multimodal retrieval expectations.
- Web-only pages: Prefer full-fidelity print paths (browser print-to-PDF, or headless Chromium / Playwright rendering) so embedded and inline images survive in the PDF. HTML or
.txtalone usually discard or isolate visuals from the indexed blob you need side-by-side with questions. - One logical source → one primary file: Keep a stable basename under
corpus/and reference that same basename intrain.jsoncontexts[].filename(see below). If a source truly splits into separate image files plus text, still align names with how citations and ingestion exposedocument_name.
After materializing files, pass `--file-type` to evaluate_rag.py according to what sits under corpus/ (for example keep the default when the corpus is mostly PDF).
Image-heavy web articles: When upstream pages mix text and images, still prefer a PDF export or faithful render over generating PDFs with text-only toolkits. If an API offers binary PDF download, use it before HTML-to-text shortcuts.
If the upstream artifact only gives URLs or document pointers that do not name a concrete file (common in published benchmarks), assume PDF as the target format. Use plain text or HTML only when converting to PDF is impractical; then set --file-type to match what dominates under corpus/.
Each contexts object’s `filename` must match the actual corpus file basename (same as the file’s name in corpus/, e.g. Report_2023 for corpus/Report_2023 or corpus/subdir/Report_2023). `text`, when present, should be the reference span or excerpt; when omitted, only the filename association is carried through.
Deriving corpus filenames from URLs
When the benchmark provides a URL per source document, derive the corpus filename and contexts[].filename using this rule — it preserves the source URL's identity exactly and ensures downstream citation matching works:
stem = path_last_segment + "#" + fragment (if URL has a fragment)
stem = path_last_segment (if no fragment)The file you write under corpus/ must start with stem and follow the same naming pattern as the rest of that dataset so --file-type and document_name from ingestion stay consistent.
Where:
path_last_segment= last/-separated component ofurllib.parse.urlparse(url).path.- Do not call `urllib.parse.unquote()` on the segment — keep percent-encoding exactly as it appears in the URL.
fragment=urllib.parse.urlparse(url).fragment— include verbatim if non-empty.- Do not pass the segment through any slug or sanitize function that strips or replaces characters (
%,',.,#,-, non-ASCII bytes, etc.). Any such transformation breaks alignment between the corpus file, thetrain.jsoncontext reference, and the ingestor'sdocument_name.
If the content must be fetched via an API that requires a decoded title (e.g. a REST endpoint that does not accept percent-encoded paths), decode only for that API call: urllib.parse.unquote(path_last_segment). The on-disk filename stays encoded.
Bringing external data into this layout
Benchmarks packaged elsewhere (CSV, JSONL, parquet, archives, APIs, annotation exports, etc.) are not consumed directly. Convert them so each eval root has corpus/ documents and a train.json that follows the schema. Keep corpus/ filenames consistent with how the ingestor and citations surface document_name so retrieval and scoring align.
Conversion checklist:
1. Normalize source encodings to UTF-8. 2. train.json: top-level array of objects, each with at minimum question and answer. 3. id: integer from the source row index — not a prefixed or composite string. 4. is_impossible: carry over from the source if present; add as false if the benchmark has no unanswerable questions. 5. Corpus filenames: if derived from URLs, use the stem rule above (raw path last segment + #fragment if any, no decoding, no sanitization). 6. contexts entries: filename must equal the corpus file basename; text is optional (add when you have a gold span). 7. Drop any benchmark-internal fields that are not part of the schema (question, answer, id, is_impossible, contexts). 8. Run the quick train.json validation above after any conversion.
Conversion patterns
JSONL → train.json
import json, pathlib
rows = [json.loads(l) for l in pathlib.Path("source.jsonl").read_text().splitlines() if l.strip()]
train = [{"id": r.get("id"), "question": r["question"], "answer": r["answer"]} for r in rows]
pathlib.Path("my_dataset/train.json").write_text(json.dumps(train, indent=2, ensure_ascii=False))CSV → train.json
import csv, json, pathlib
with open("source.csv", newline="", encoding="utf-8") as f:
rows = list(csv.DictReader(f))
train = [{"question": r["question"], "answer": r["answer"]} for r in rows]
pathlib.Path("my_dataset/train.json").write_text(json.dumps(train, indent=2, ensure_ascii=False))Map source column names to question / answer as needed. Add "id" from the source if available to aid per-query traceability.
evaluate_rag.py CLI flag reference
Complete argument tables for scripts/eval/evaluate_rag.py. Load this when the user asks about a specific flag, its default value, or fixed evaluator behavior not covered in the main skill.
For latency, throughput, and load testing, use the rag-perf skill — not the --thread / --timeout knobs here (they exist on the CLI for operational reliability only).
Arguments
Required
| Argument | Notes |
|---|---|
--dataset-paths | One or more dataset root directories, each containing corpus/ and train.json. |
--host | RAG server host. |
--port | RAG server port (integer). |
Dataset and ingestion
| Argument | Default | Notes |
|---|---|---|
--file-type | pdf | Ingestion file type (e.g. pdf, txt, txt,html, mp3 for audio). Substring pdf enables PDF page counts in ingestion metadata. |
--ingestor_server_url | http://localhost:8082 | Base URL — code appends /v1/ automatically; do not include /v1 here. |
--collection | dataset folder basename | Override collection name for ingest and query. |
--batch_size | 1000 | Ingestion batch size (server max is 10000). |
--skip_ingestion | flag | Skip ingestion; query and RAGAS scoring only (collection must already exist). |
--skip_evaluation | flag | Skip RAGAS scoring; perform ingestion only. |
--force_ingestion | flag | Delete the collection first, then re-ingest from scratch. |
--delete_collection | flag | Delete the collection after the run completes. |
Retrieval
| Argument | Default | Notes |
|---|---|---|
--top_k | (omitted) | If set, sent as reranker_top_k on /v1/generate; if omitted, not sent. |
--vdb_top_k | (omitted) | If set, sent as vdb_top_k; if omitted, not sent. |
Pipeline stage toggles
| Argument | Notes |
|---|---|
--enable-reranker | Send enable_reranker=true on /v1/generate. Mutually exclusive with --disable-reranker. |
--disable-reranker | Send enable_reranker=false on /v1/generate. |
--enable-query-rewriting | Send enable_query_rewriting=true on /v1/generate. Mutually exclusive with --disable-query-rewriting. |
--disable-query-rewriting | Send enable_query_rewriting=false on /v1/generate. |
Omitting either pair entirely does not send the field — the RAG server uses its own configured default.
Generation overrides
| Argument | Default | Notes |
|---|---|---|
--model | (omitted) | LLM model id forwarded to /v1/generate as model; omit to use the server default. |
--llm_endpoint | (omitted) | LLM API endpoint URL forwarded as llm_endpoint; omit to use the server default. |
--temperature | (omitted) | Sampling temperature forwarded to /v1/generate; omit to use the server default. |
--top-p | (omitted) | Top-p forwarded to /v1/generate; omit to use the server default. |
--max-tokens | (omitted) | Max tokens forwarded to /v1/generate; omit to use the server default. |
Output and run control
| Argument | Default | Notes |
|---|---|---|
--output_dir | results | Root output directory; each dataset gets a subdirectory named after the dataset basename. |
--verbose | flag | Enable verbose output. |
--thread | 4 | Parallel workers for query generation (operational; not for latency benchmarking). |
--timeout | 180 | Per-request HTTP timeout in seconds when queries fail to complete. |
Fixed behavior (not CLI flags)
- The evaluator does not send
vdb_endpoint, embedding dimension, or related overrides to the ingestor or/v1/generate; services use their configured defaults (environment / server config). - Ingestion uploads always use
blocking: truefor a synchronous ingestor response. - The client does not send
split_optionson document upload; chunk size and overlap are controlled by the ingestor server configuration. - RAG queries use
POST /v1/generatewith a single user turn per benchmark row;enable_filter_generatoris not sent (server default applies). RAG_EVAL_JUDGE_MODELenv var sets the RAGAS judge model id (ChatNVIDIA); defaults tomistralai/mixtral-8x22b-instruct-v0.1when unset or empty.
Result analysis scripts
Ready-to-run Python patterns for analyzing evaluate_rag.py RAGAS outputs. Load when the user wants per-row queries, worst-accuracy tables, or CSV export.
All paths assume default --output_dir results; substitute your actual dataset basename for my_dataset.
Per-query table with worst-accuracy rows
import json
data = json.load(open("results/my_dataset/rag_my_dataset_evaluation_data.json"))
scores = json.load(open("results/my_dataset/rag_my_dataset_evaluation_results.json"))
rows = []
for i, (d, acc) in enumerate(zip(data, scores.get("nv_accuracy", []))):
rows.append({
"i": i,
"id": d.get("id"),
"question": d["question"][:80],
"nv_accuracy": acc,
"has_context": bool(d.get("generated_contexts")),
"answer_len": len(d.get("generated_answer", "")),
})
rows.sort(key=lambda r: r["nv_accuracy"])
print(f"{'i':>3} {'acc':>5} {'ctx':>3} question")
print("-" * 70)
for r in rows[:10]:
print(f"{r['i']:>3} {r['nv_accuracy']:>5.2f} {'Y' if r['has_context'] else 'N':>3} {r['question']}")has_context=N with low nv_accuracy → retrieval problem (ingestion gap or collection mismatch), not generation.
Export to CSV
import csv, json
data = json.load(open("results/my_dataset/rag_my_dataset_evaluation_data.json"))
scores = json.load(open("results/my_dataset/rag_my_dataset_evaluation_results.json"))
acc = scores.get("nv_accuracy", [None]*len(data))
ctxr = scores.get("nv_context_relevance", [None]*len(data))
grd = scores.get("nv_response_groundedness", [None]*len(data))
with open("eval_out.csv", "w", newline="") as f:
w = csv.DictWriter(f, fieldnames=["id","question","answer","generated_answer",
"nv_accuracy","nv_context_relevance","nv_response_groundedness"])
w.writeheader()
for i, d in enumerate(data):
w.writerow({"id": d.get("id",""), "question": d["question"],
"answer": d["answer"], "generated_answer": d.get("generated_answer",""),
"nv_accuracy": acc[i], "nv_context_relevance": ctxr[i],
"nv_response_groundedness": grd[i]})Markdown table of worst queries
Paste into a PR description or evaluation report:
import json
data = json.load(open("results/my_dataset/rag_my_dataset_evaluation_data.json"))
scores = json.load(open("results/my_dataset/rag_my_dataset_evaluation_results.json"))
pairs = sorted(zip(scores.get("nv_accuracy", []), data), key=lambda x: x[0])
print("| id | acc | question | generated_answer |")
print("|----|-----|----------|-----------------|")
for acc, d in pairs[:5]:
q = d["question"][:60].replace("|", "\\|")
a = d.get("generated_answer", "")[:80].replace("|", "\\|")
print(f"| {d.get('id','')} | {acc:.2f} | {q} | {a} |")Description: <br>
Filesystem RAG benchmarks: corpus/, train.json, evaluate_rag.py (RAGAS quality). <br>
This skill is ready for commercial/non-commercial use. <br>
Owner
NVIDIA <br>
License/Terms of Use: <br>
Apache 2.0 <br>
Use Case: <br>
Developers and engineers use this skill to run filesystem-based RAGAS quality benchmarks against NVIDIA RAG Blueprint deployments, evaluating retrieval and generation quality through dataset preparation, evaluation execution, and result analysis. <br>
Deployment Geography for Use: <br>
Global <br>
Known Risks and Mitigations: <br>
Risk: Review before execution as proposals could introduce incorrect or misleading guidance into skills. <br> Mitigation: Review and scan skill before deployment. <br>
Reference(s): <br>
- Benchmark Execution <br>
- Dataset and Conversion <br>
- Evaluate RAG CLI <br>
- Result Analysis <br>
- NVIDIA RAG Blueprint <br>
Skill Output: <br>
Output Type(s): [Shell commands, Analysis] <br> Output Format: [Markdown with inline bash code blocks] <br> Output Parameters: [1D] <br> Other Properties Related to Output: [None] <br>
Evaluation Metrics Used: <br>
Reported benchmark dimensions: <br>
- Security: Checks whether skill-assisted execution avoids unsafe behavior such as secret leakage, destructive commands, or unauthorized access. <br>
- Correctness: Checks whether the agent follows the expected workflow and produces the correct final output. <br>
- Discoverability: Checks whether the agent loads the skill when relevant and avoids using it when irrelevant. <br>
- Effectiveness: Checks whether the agent performs measurably better with the skill than without it. <br>
- Efficiency: Checks whether the agent uses fewer tokens and avoids redundant work. <br>
Skill Version(s): <br>
2.6.0 (source: frontmatter) <br>
Ethical Considerations: <br>
NVIDIA believes Trustworthy AI is a shared responsibility and we have established policies and practices to enable development for a wide array of AI applications. When downloaded or used in accordance with our terms of service, developers should work with their internal team to ensure this skill meets requirements for the relevant industry and use case and addresses unforeseen product misuse. <br>
(For Release on NVIDIA Platforms Only) <br> Please report quality, risk, security vulnerabilities or NVIDIA AI Concerns here. <br>
{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"x509CertificateChain":{"certificates":[{"rawBytes":"MIICgzCCAgmgAwIBAgIUKIyS7SxNteQIiWzK1dWj85E6520wCgYIKoZIzj0EAwMwVTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjEpMCcGA1UEAwwgTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBJQ0EgMDEwHhcNMjYwNDAxMDAwMDAwWhcNMjgwNDIyMTUzMzA5WjBUMQswCQYDVQQGEwJVUzEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMSgwJgYDVQQDDB9OVklESUEgQWdlbnQgU2tpbGxzIFNpZ25pbmcgMDAxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEYoRM9bQl/dGlwSRNi6bTpIJUXH8Nv9GciP6LSflJYYMLCc296kpyuTSsk5ddbAWiDcFX3C/ydX3jwc+qCLYP6uHy9XphyLjOQ27Yb2J6rBLVtRBS1mgGco/Gr7fL6ODco4GaMIGXMB0GA1UdDgQWBBRQ/5ZW3nJ6lmo9SVk7I15o7UGmpTAfBgNVHSMEGDAWgBRPGpILxMBBleJSsBGjrMKsby1CgjAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIHgDA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAKBggqhkjOPQQDAwNoADBlAjAUygu/GiOCIXrgGr4SmLgeEVDcEitfFUv7ALbvLVGVyMysB3mxmO/uInZfXzWcJZsCMQDxuoxj4ZmO30jhkPIcCxGFCOvnUsnfU3TfGcouYm4M6iRpbKvtVnHPiy4bi6pcKf0="},{"rawBytes":"MIICiDCCAg6gAwIBAgIUZsIuSv9NkpJCNqtYEfCouVv5BzowCgYIKoZIzj0EAwMwUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTAgFw0yNjA0MDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowVTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjEpMCcGA1UEAwwgTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBJQ0EgMDEwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASI72cR3ctKGg4VWnB3bNja6g1Z2PnOmFEopkPof+QeIcPk9rT+g9MjJnq51EQXL93a7C2GJ9J985G4o2V85VD7wJ1RaXhluHW2rf3y8bQGeAYaKMr5s/hUgn+M3/9WlWejgaAwgZ0wHQYDVR0OBBYEFE8akgvEwEGV4lKwEaOswqxvLUKCMB8GA1UdIwQYMBaAFItnoAjjfuCEUvzyvWyI2vOGvwPjMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMDcGCCsGAQUFBwEBBCswKTAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AubmRpcy5udmlkaWEuY29tMAoGCCqGSM49BAMDA2gAMGUCMQCeIMMfAbyzPDacw2MxG+Yt1cikrJX/DVxiGfXuHmkkXn6VgSzE79+lkqDErpVO2gYCMCNEColOyvUvkzZGUEI1hQ3PfMgi3FIo9tHoBKMw4/wGBLFpu/0ubtmbBXM6/UMOEw=="},{"rawBytes":"MIICRTCCAcygAwIBAgIUeJdY3rV86EdvFmG7L8LJBsyQFYkwCgYIKoZIzj0EAwMwUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTAgFw0yNjA0MDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABAYpiXCDjJ9NT2eSDhyHJVSw1Tbze18cGG2F/578oWvHxg23eQAhNRYdq88i1iOshZSO6C29doKui5Xpmo/7Ctw9Sx4PP2RzOmIuOLCuTdNtKcTRwi4GEsd5BAFvWj42M6NjMGEwHQYDVR0OBBYEFItnoAjjfuCEUvzyvWyI2vOGvwPjMB8GA1UdIwQYMBaAFItnoAjjfuCEUvzyvWyI2vOGvwPjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2cAMGQCMCwtAjWLaNwgGWNCgdyNoTyvNhqWRECRJV2r3+7w8g0PL6NHLOsbkgE09BH95h8XlgIwTaQmbbUh2ChAJ5TA1wRiVDnCcvbzHlZl2jM2FcwQQZlk19LOAbyGMRixbu2Ww/rj"}]},"tlogEntries":[]},"dsseEnvelope":{"payload":"ewogICJfdHlwZSI6ICJodHRwczovL2luLXRvdG8uaW8vU3RhdGVtZW50L3YxIiwKICAic3ViamVjdCI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAicmFnLWV2YWwiLAogICAgICAiZGlnZXN0IjogewogICAgICAgICJzaGEyNTYiOiAiNDExOTQ1NTMyNzYyYmY4ZmU4YjQyNjY1YzAyZTY5ZWI1OTFiYzkxZjk3YjJiZDEwZjgxYWJhYzg4ZjIxYjJiMCIKICAgICAgfQogICAgfQogIF0sCiAgInByZWRpY2F0ZVR5cGUiOiAiaHR0cHM6Ly9tb2RlbF9zaWduaW5nL3NpZ25hdHVyZS92MS4wIiwKICAicHJlZGljYXRlIjogewogICAgInNlcmlhbGl6YXRpb24iOiB7CiAgICAgICJhbGxvd19zeW1saW5rcyI6IGZhbHNlLAogICAgICAibWV0aG9kIjogImZpbGVzIiwKICAgICAgImhhc2hfdHlwZSI6ICJzaGEyNTYiLAogICAgICAiaWdub3JlX3BhdGhzIjogWwogICAgICAgICIuZ2l0aWdub3JlIiwKICAgICAgICAiLmdpdCIsCiAgICAgICAgIi5naXRhdHRyaWJ1dGVzIiwKICAgICAgICAiLmdpdGh1YiIKICAgICAgXQogICAgfSwKICAgICJyZXNvdXJjZXMiOiBbCiAgICAgIHsKICAgICAgICAiZGlnZXN0IjogImM4ZjE2NDc5MGRjYjYyMmVmYjgxYTJmZTk5MmQ2MjBmN2MyNGFiM2U4MjBhOGFlODhjZmU5MDNmNzE1N2NhMjYiLAogICAgICAgICJuYW1lIjogIkJFTkNITUFSSy5tZCIsCiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZGlnZXN0IjogIjU3MjEyNmE2YTNlMTU5ODliYTYyZjkwZmU1ODU2YjZkOGVkYTExYzkwOTdiODY4ODlkYjJjNmVkZGQ2MTJhNzMiLAogICAgICAgICJuYW1lIjogIlNLSUxMLm1kIiwKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIKICAgICAgfSwKICAgICAgewogICAgICAgICJkaWdlc3QiOiAiYmQ2OGEyMjgxMzgyOWI2ZmM0YmE0MjVkOTk3OTVhNTg4ODg4MzVhZTdlMjkzYmI4ZWYwMTE4MTNlNDM4Nzc5NSIsCiAgICAgICAgIm5hbWUiOiAiZXZhbC9oMTAwLmpzb24iLAogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IgogICAgICB9LAogICAgICB7CiAgICAgICAgImRpZ2VzdCI6ICI1OThlYmYxNDcwY2QxNTg0YmQzZmY3MmMyYzc5OGE0MzFmZjZiZDZmOGI4ODRjZmRmZjdmMmQ0NjM0YzJkZDY2IiwKICAgICAgICAibmFtZSI6ICJldmFsL252aWRpYV9ob3N0ZWQuanNvbiIsCiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZGlnZXN0IjogImUzMGZhOTMwNDEwYjVlNGNiNDE4Y2EwZTA2MDVkMTRlYjMyNGQ4ZDQ1ZTM0YjVlYWI0ZDAyOThjZjQ4ZWYxNDQiLAogICAgICAgICJuYW1lIjogInJlZmVyZW5jZXMvYmVuY2htYXJrLWV4ZWN1dGlvbi5tZCIsCiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZGlnZXN0IjogIjA5ZGJiMzhiMTk2OGM3NTIwODY1MjQ1NDg1MDU4NmE5OTZmMDk0ZTllNGY4MGE1NGFhM2EzYWQ1NThiYTkwZDgiLAogICAgICAgICJuYW1lIjogInJlZmVyZW5jZXMvZGF0YXNldC1hbmQtY29udmVyc2lvbi5tZCIsCiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZGlnZXN0IjogImY2ODg3ZmE5N2FiOWI4MmQ5MjVkZDVmZDQ4MTkxMTY5NmFiMzFlZmE3NTIxZjI1OWNkMGNlMTA0YzkwMzA1ZTYiLAogICAgICAgICJuYW1lIjogInJlZmVyZW5jZXMvZXZhbHVhdGUtcmFnLWNsaS5tZCIsCiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiZGlnZXN0IjogIjYxODg3M2M0YjFhYzZjYWRjZDI3MzEzOWMyOTcyNWM5YmU4YTdhM2UyMDdhZmQ0ODBhOGJkMWYxODk2NDVjOWUiLAogICAgICAgICJuYW1lIjogInJlZmVyZW5jZXMvcmVzdWx0LWFuYWx5c2lzLm1kIiwKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIKICAgICAgfSwKICAgICAgewogICAgICAgICJkaWdlc3QiOiAiZDcwOTU2YmUwNGY1MDk4ZDM0Y2ZlYjAxOGE1ZTEyNWVjNTQ1N2ViN2ZkZmIyZDM3M2I3OWI3Y2QwZWUyODRmOSIsCiAgICAgICAgIm5hbWUiOiAic2tpbGwtY2FyZC5tZCIsCiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiCiAgICAgIH0KICAgIF0KICB9Cn0=","payloadType":"application/vnd.in-toto+json","signatures":[{"sig":"MGYCMQCM8wu6kAx8FMhbKo9qnkarjf+NGdGLyZbVHDTO55Tbv4BUfR9LxROyfJ7gDHjnQlgCMQD+F7iVfMuaUY6vck4PfZK2orXApRY+tIJqT+x1Jrqcc3A/iaU8z+eIqT5XvWFR4k0=","keyid":""}]}}Related skills
FAQ
What does rag-eval do?
rag-eval is a Claude Code skill for ai & agent building.
When should I use rag-eval?
When you need to helps with ai & agent building tasks., or when rag-eval is a claude code skill for ai & agent building.
What are the main capabilities?
rag-eval; AI & Agent Building; AI-coding skill.