neuron-explorer
Qwen3.5‑4B 전용 조향형 뉴런 탐색기, 모든 MLP 뉴런을 밀어 결과를 보관·탐색
AI 기능의 상태·품질·진화를 관리하고, 기준 데이터셋으로 평가·회귀 감지·배포 제어합니다
The control plane for the health, quality, and evolution of your AI features. Evaluate against golden datasets, catch regressions, and gate deploys.
개발 도구Python · TypeScriptGitHub @rajverma212온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기An AI Evaluation Operating System: continuously tests LLM features against versioned golden datasets, detects regressions against a trusted baseline, and gates deploys — a premium Next.js web app over a feature-agnostic Python eval engine.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
An AI evaluation platform and deployment-safety system for LLM-powered features.
EvalGate continuously tests AI features against versioned "golden" datasets, scores them, compares every candidate against a promoted baseline, detects quality regressions, generates reports, sends Slack alerts, and blocks deployments when quality drops — the same way unit tests and CI block buggy code from shipping.
Formerly the Model Regression Detection System (MRDS) — the underlying Python package (mrds) and CLI (mrds) keep that name internally.README 전문 보기 ↗An AI evaluation platform and deployment-safety system for LLM-powered features. EvalGate continuously tests AI features against versioned "golden" datasets, scores them, compares every candidate against a promoted baseline, detects quality regressions, generates reports, sends Slack alerts, and blocks deployments when quality drops — the same way unit tests and CI block buggy code from shipping.
Formerly the Model Regression Detection System (MRDS) — the underlying Python package (
mrds) and CLI (mrds) keep that name internally.
🛰️ The EvalGate web app. The primary product surface is a premium Next.js frontend (
web/) backed by a thin HTTP API (src/mrds/api/) over the unchanged engine — fleet health, verdict-first run analysis with per-case failure explanations, root-cause drilldowns, and in-UI baseline promotion. See docs/web-frontend.md. The Streamlit dashboard remains as the original prototype.
🔌 API: health check • 📐 Architecture • 🛰️ Web frontend • 🚢 Deploy guide • 💾 Durable deploy • 🤖 Agent context
The original Streamlit dashboard — the prototype this product grew out of — is archived at modelregressiondetector.streamlit.app.
Three features are under test, chosen so the fleet shows both verdicts the gate can reach:
| Feature | State | What it demonstrates |
|---|---|---|
| Email Classifier | 🔴 Critical | A prompt change that cost 20 points of pass rate. The gate is closed — this merge is blocked. |
| Ticket Router | 🔴 Critical | A 30-point drop traced to two specific categories, with the exact misrouted tickets listed. |
| Review Sentiment | 🟢 Healthy | The other half of the story: regressed, was caught, was fixed, and the repair was promoted. Now 4 points above its baseline — the gate is open. |
Every number is produced by the real engine against a versioned golden dataset. The demo data is seeded deterministically offline (no model calls), so the narrative is identical on every machine.
Most software has a safety net: write code, run tests, and CI refuses to merge anything that breaks them. AI features have no such net by default. A reworded prompt, a model upgrade, or a new training example can quietly make an LLM feature worse — and nobody notices until customers do.
MRDS is that missing safety net for AI. It treats prompts, datasets, and models as versioned, testable artifacts, runs them through a custom evaluation engine, and uses a regression gate to stop quality drops before they reach production.
The platform is feature-agnostic. A new AI feature plugs in by implementing one interface — the evaluation engine, regression detector, reporting, alerting, database, and CLI never change. The included Customer Support Email Classifier is simply the first feature under test.
When you build a feature on top of a large language model, "is it good?" is surprisingly hard to answer — and "did my last change make it worse?" is harder still:
assert output == expected; quality is fuzzy and multi-dimensional (correct? well-summarized? fast? cheap?).The result: AI features degrade silently, and teams find out last.
MRDS turns LLM evaluation into a disciplined, automated engineering practice:
| Capability | What it means |
|---|---|
| Versioned golden datasets | Hand-curated test cases (input → expected output) are versioned and immutable — your "ground truth." |
| Versioned prompts | Every prompt lives in a YAML file with a version; you create v2 rather than editing v1. |
| Custom evaluation engine | Runs a feature against a dataset, scores each case with deterministic scorers, and aggregates accuracy, latency, and token/cost metrics. |
| Baseline comparison | Each candidate run is compared, metric-by-metric, against the currently promoted baseline. |
| Regression detection | Configurable thresholds classify each metric move as OK, WARNING, or CRITICAL. |
| Quality gate (fail-closed) | A critical regression makes the CLI exit non-zero, which blocks the merge in CI. |
| Explicit baselines | Baselines are never silently overwritten by a worse run; promotion is deliberate (or auto-promoted only on a green main). |
| Reports, alerts, history | Markdown reports, Slack alerts on regressions/promotions, and a read-only dashboard over the full history. |
Everything is reproducible: every run pins a prompt version, a dataset version, and a model, and runs at temperature=0. Identity of prompts and datasets is their content hash.
A feature-agnostic core orchestrates everything; the only feature-specific code lives behind a plug-in interface.
flowchart TD
CLI["CLI (single entrypoint)<br/>evaluate · compare · report · promote-baseline"]
subgraph CORE["Feature-agnostic core"]
REG["Feature Registry<br/>(Feature / Scorer interfaces)"]
ENG["Evaluation Engine<br/>scoring · metrics · aggregation"]
DET["Regression Detector<br/>thresholds · severity"]
PROMO["Baseline Promoter"]
REP["Report Builder (Jinja2)"]
ALERT["Slack Notifier"]
DB[("SQLite — system of record")]
end
subgraph PLUGINS["Pluggable features (only feature-specific code)"]
EC["email_classifier<br/>schema · feature · scorers"]
FUT["future: rag_qa · chatbot · …"]
end
PROMPTS["prompts/<feature>/vN.yaml"]
DATA["datasets/<feature>/vN.json"]
LLM["Anthropic client<br/>(structured output)"]
CLI --> ENG
CLI --> DET
CLI --> PROMO
CLI --> REP
REG --> EC
REG --> FUT
ENG --> REG
ENG --> PROMPTS
ENG --> DATA
ENG --> LLM
ENG --> DB
DET --> DB
PROMO --> DB
DET --> ALERT
PROMO --> ALERT
REP --> DB
DB --> DASH["Web App · Next.js + FastAPI<br/>(+ Streamlit prototype)"]
Key principles enforced by the design:
prompt_versions, dataset_versions, runs, test_results, baselines, regressions — and all writes go through a repository layer. Reports and the dashboard are derived views.Feature + Scorer interface and self-register. The first feature (email classifier) ships built-in.compare returns exit code 1 on a blocking (critical) regression; CI keys the merge gate off that exact code.main is green).temperature=0, deterministic scorers for gating, LLM-as-judge off in CI, smoke subsets on PRs and full datasets nightly.The four CLI commands compose into the full lifecycle:
flowchart LR
A["mrds evaluate<br/>--feature email_classifier"] -->|"persists a run + per-case results"| B[("SQLite")]
B --> C["mrds compare<br/>--feature email_classifier"]
C -->|"metric-by-metric vs. baseline"| D{Blocking regression?}
D -->|"CRITICAL"| E["exit 1 → blocks merge<br/>+ Slack alert + report"]
D -->|"OK / WARNING"| F["exit 0 → merge allowed"]
F --> G["mrds promote-baseline<br/>(explicit, or auto on green main)"]
G --> B
mrds evaluate — runs a feature against its golden dataset (pinning prompt + dataset + model), scores every case, aggregates metrics, and persists a run with all per-case test_results.mrds compare — compares the candidate run to the active baseline, classifies each metric move, writes a regression report, and returns the gate exit code (0 ok / 1 blocked).mrds report — renders a Markdown report for any run.mrds promote-baseline — promotes a run to be the new baseline (a worse run is rejected), recording who promoted it and why.Example:
mrds evaluate --feature email_classifier --segment-field category --triggered-by local
mrds compare --feature email_classifier # exits 1 if quality regressed
mrds report --run <run-id>
mrds promote-baseline --run <run-id> --promoted-by you --note "v2 prompt looks great"
The primary surface is a premium Next.js app (React + TypeScript + Tailwind, deployed on Vercel) backed by a thin, feature-agnostic FastAPI layer over the same engine — see docs/web-frontend.md. It's organized as Mission Control → feature workspace: a fleet view of every AI feature's health, then a per-feature workspace with the views below. (The original read-only Streamlit prototype mirrors the same set.)
Runs are shown with human-readable names (e.g. Email Classifier #12 · claude-haiku-4-5 · Dataset v1 · Jun 2, 2026) throughout tables, pickers, and charts, while the internal run id is preserved for traceability.
Both surfaces are hardened for public hosting: they degrade gracefully and fall back safely if optional configuration is missing.
Two workflows give the platform its teeth (both pinned to Python 3.11):
ci.yml — fast, secret-free checks on every push and PR: Ruff lint, Ruff format check, and the full pytest suite (Anthropic is mocked, so it's free and deterministic).
eval.yml — the Evaluation Gate (the deployment-safety mechanism). It triggers when prompts/, datasets/, src/mrds/features/, or config/ change, plus a nightly full run and manual dispatch. It orchestrates only the existing CLI — no logic is duplicated in YAML:
main and nightly.mrds compare's exit code is the merge gate (wire it as a required status check). A CRITICAL regression fails the job and blocks the merge.main push only, auto-promotes the run to the new baseline and caches the updated database.Fork PRs without an API key skip the live gate gracefully instead of failing.
When a SLACK_WEBHOOK_URL is configured, MRDS posts to a Slack incoming webhook on:
Alerting is best-effort and total: the Slack client never raises. A missing webhook, a build error, or a delivery failure is logged and returned as a non-delivered result — it can never change an evaluation's pass/fail outcome or break a run.
So the public dashboard is meaningful without any Anthropic API access, MRDS ships a deterministic, fully offline demo.
Set MRDS_DEMO=true. On first load with an empty database, the dashboard seeds a realistic narrative — baseline runs, a regression, and a promotion — by driving the real pipeline (the actual EvaluationEngine, RegressionDetector, and BaselinePromoter) against an offline oracle instead of Anthropic. Nothing is faked or bypassed, so the demo genuinely exercises the platform. Seeding is idempotent (it no-ops if any runs already exist) and never makes a network call.
| Concern | Choice |
|---|---|
| Language | Python 3.11 |
| Models / validation / settings | Pydantic v2 + pydantic-settings |
| LLM API | Anthropic (Claude, structured outputs) |
| Persistence | SQLite (stdlib sqlite3) |
| Prompt versioning | YAML files |
| Datasets | JSON files |
| Reports / templating | Jinja2 |
| Web frontend | Next.js (React, TypeScript, Tailwind) — deployed on Vercel |
| Web API | FastAPI (feature-agnostic, over the same engine) |
| Dashboard (prototype) | Streamlit |
| CI/CD | GitHub Actions |
| Alerts | Slack incoming webhooks |
| Testing | pytest (Anthropic always mocked) |
| Lint / format | Ruff |
src/mrds/
cli/ single entrypoint + commands (evaluate, compare, report, promote-baseline)
core/ feature-agnostic primitives: interfaces, registry, hashing, ids, errors
features/ the ONLY feature-specific code → email_classifier/ (schema, feature, scorers)
prompts/ prompt versioning runtime (loader, registry, validation)
datasets/ dataset versioning runtime (loader, validation)
evaluation/ custom engine, metrics, scoring, models, config
regression/ detector, thresholds, severity, baseline promotion
reporting/ Jinja2 report builder + models
alerting/ Slack client, notifier, message templates
llm/ Anthropic structured-output client (injectable, mockable)
db/ SQLite connection, schema.sql, migrations, repositories, store
config/ layered Pydantic settings
observability/ structured logging
demo/ deterministic offline demo seeding
api/ feature-agnostic HTTP API (FastAPI) backing the web frontend
dashboard/ Streamlit app + pages (original prototype)
web/ Next.js "EvalGate" frontend — the primary product surface (Vercel)
prompts/ versioned prompt YAML → prompts/email_classifier/v1.yaml
datasets/ versioned golden JSON → datasets/email_classifier/v1.json
config/ settings.yaml (committed, non-secret)
.github/workflows/ ci.yml, eval.yml
tests/ unit/, integration/, fixtures/, conftest.py
docs/ architecture.md
Requirements: Python 3.11 (supported range >=3.11,<3.14).
# 1. Create and activate a virtual environment
python3.11 -m venv .venv && source .venv/bin/activate
# 2. Install the package (editable) with dev tooling, the dashboard, and the API
pip install -e ".[dev,dashboard,api]"
# 3. Configure your environment
cp .env.example .env # then fill in ANTHROPIC_API_KEY (and SLACK_WEBHOOK_URL if desired)
# 4. Explore the CLI
mrds --help
# 5. Run an evaluation end-to-end
mrds evaluate --feature email_classifier --segment-field category
mrds compare --feature email_classifier
# 6. Quality checks (what CI runs)
ruff check .
ruff format --check .
pytest -q
Run the EvalGate web app (the primary surface — offline demo data, no API key needed):
python -m mrds.demo # one-time: seed data/eval.db with a realistic history
python -m mrds.api # data plane → http://127.0.0.1:8000 (or: mrds-api)
cd web && npm install && npm run dev # product → http://localhost:3000
Run the Streamlit dashboard (the original prototype; offline demo data):
MRDS_DEMO=true streamlit run src/mrds/dashboard/app.py
Configuration is layered, lowest to highest precedence:
src/mrds/config/settings.py)config/settings.yaml (committed, non-secret).env (secrets and per-environment overrides)Secrets (ANTHROPIC_API_KEY, SLACK_WEBHOOK_URL) come from the environment only and are never committed. All other settings use the MRDS_ prefix (e.g. MRDS_LOG_LEVEL, MRDS_MODEL, MRDS_DEMO).
▶️ mrds-web.vercel.app — the EvalGate web app (Next.js + FastAPI, on Vercel).
Original Streamlit prototype (archived): modelregressiondetector.streamlit.app.
The hosted dashboard runs in demo mode — deterministic, offline-seeded data that walks through baseline runs, a detected regression, and a baseline promotion, so you can explore the whole platform without an API key.
The platform is built to extend without touching its core. Natural next steps:
rag_qa, chatbot. Each is a self-contained plug-in; the evaluation core stays untouched. (ticket_router and review_sentiment have since landed — the latter without a line of feature code, as a spec persisted in the database.)Built as a portfolio project demonstrating production-minded ML/AI infrastructure: clean architecture, full type hints, mocked-API testing, deterministic evaluation, and a real CI quality gate.