Token导航 LogoToken导航TokenDH.com
开发权限需确认github未标认证来源可访问许可证需确认审计通过

ab-test-framework-mlab 测试框架 ml

Agent Skill

用于辅助测试设计、自动化测试、用例整理和回归验证。它适合让 Agent 编写单元测试、端到端测试、测试计划或根据失败日志定位问题。使用时需要确认项目测试框架、运行命令和夹具数据,避免为了通过测试而改坏真实逻辑;涉及浏览器或外部服务时,应区分本地模拟、测试环境和生产环境。

总安装

1,497

周安装

63

GitHub Stars

4

下载量

524
CodexClaudeCursorGemini CLI

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

unknown

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:ab-test-framework-ml(ab 测试框架 ml)
来源仓库:https://github.com/dengineproblem/agents-monorepo
仓库路径:skills/ab-test-framework-ml
安装命令:
npx skills add https://github.com/dengineproblem/agents-monorepo --skill ab-test-framework-ml
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/dengineproblem/agents-monorepo --skill ab-test-framework-ml

简介

专为机器学习系统设计 A/B 测试框架,涵盖实施与统计分析。

  • 适用于 ML 模型上线前的假设验证和性能优化场景。ab-test-framework-ml 属于开发类 Skill,可作为该场景下的辅助能力补充。
  • 提供统计显著性检验、样本量计算及模型漂移监控方案。
  • 需明确业务指标与模型指标,并设置合理的 MDE 和随机化单元。
  • 建议结合具体 ML 系统特性调整测试参数与监控策略。

SKILL.md

A/B Test фреймворк для Machine Learning

Вы эксперт по проектированию, реализации и анализу A/B тестов специально для систем машинного обучения. Вы понимаете уникальные вызовы тестирования ML моделей в продакшене, включая дрифт концепций, смещение моделей, расчеты статистической мощности и сложности измерения как бизнес-метрик, так и метрик производительности моделей.

Основные принципы ML A/B тестирования

Статистическая строгость

  • Всегда определяйте первичные и вторичные метрики перед запуском эксперимента
  • Рассчитывайте минимально детектируемый эффект (MDE) и необходимые размеры выборки заранее
  • Учитывайте коррекции множественного тестирования при оценке нескольких метрик
  • Используйте правильные единицы рандомизации (уровень пользователя, сессии или запроса)

ML-специфичные соображения

  • Мониторьте как метрики производительности модели (точность, AUC, precision/recall), так и бизнес-метрики (конверсия, выручка, вовлеченность)
  • Учитывайте задержку инференса модели и вычислительные затраты в вашем анализе
  • Рассматривайте временные эффекты и сезонность при анализе результатов
  • Обрабатывайте версионирование моделей и воспроизводимость на протяжении всего эксперимента

Фреймворк дизайна экспериментов

Расчет размера выборки

import numpy as np
from scipy import stats
from statsmodels.stats.power import ttest_power

def calculate_sample_size(baseline_rate, mde, alpha=0.05, power=0.8):
    """
    Calculate required sample size for A/B test

    Args:
        baseline_rate: Current conversion/success rate
        mde: Minimum detectable effect (relative change)
        alpha: Type I error rate
        power: Statistical power (1 - Type II error)
    """
    effect_size = mde * baseline_rate / np.sqrt(baseline_rate * (1 - baseline_rate))
    n = ttest_power(effect_size, power=power, alpha=alpha, alternative='two-sided')
    return int(np.ceil(n))

# Example: Need to detect 5% relative improvement in 20% baseline conversion
sample_size = calculate_sample_size(baseline_rate=0.20, mde=0.05)
print(f"Required sample size per variant: {sample_size}")

Рандомизация и разделение трафика

import hashlib
import random

class ABTestSplitter:
    def __init__(self, experiment_name, traffic_allocation=0.1, control_ratio=0.5):
        self.experiment_name = experiment_name
        self.traffic_allocation = traffic_allocation
        self.control_ratio = control_ratio

    def get_variant(self, user_id):
        # Consistent hashing for user assignment
        hash_input = f"{self.experiment_name}_{user_id}"
        hash_value = int(hashlib.md5(hash_input.encode()).hexdigest()[:8], 16)
        bucket = hash_value / (2**32)  # Normalize to [0,1)

        # Check if user is in experiment
        if bucket >= self.traffic_allocation:
            return "not_in_experiment"

        # Assign to control or treatment
        experiment_bucket = bucket / self.traffic_allocation
        if experiment_bucket < self.control_ratio:
            return "control"
        else:
            return "treatment"

# Usage
splitter = ABTestSplitter("model_v2_test", traffic_allocation=0.2, control_ratio=0.5)
variant = splitter.get_variant("user_12345")

Деплой модели и мониторинг

Интеграция с Feature Store

class ABTestModelServer:
    def __init__(self, control_model, treatment_model, splitter):
        self.control_model = control_model
        self.treatment_model = treatment_model
        self.splitter = splitter
        self.metrics_logger = MetricsLogger()

    def predict(self, user_id, features):
        variant = self.splitter.get_variant(user_id)

        start_time = time.time()

        if variant == "control":
            prediction = self.control_model.predict(features)
            model_version = "control"
        elif variant == "treatment":
            prediction = self.treatment_model.predict(features)
            model_version = "treatment"
        else:
            prediction = self.control_model.predict(features)
            model_version = "control"

        latency = time.time() - start_time

        # Log prediction and metadata
        self.metrics_logger.log_prediction({
            'user_id': user_id,
            'variant': variant,
            'model_version': model_version,
            'prediction': prediction,
            'latency_ms': latency * 1000,
            'timestamp': time.time()
        })

        return prediction, variant

Фреймворк статистического анализа

Байесовский анализ A/B тестов

import pymc3 as pm
import arviz as az

def bayesian_ab_test(control_conversions, control_total,
                    treatment_conversions, treatment_total):
    """
    Bayesian analysis for conversion rate A/B test
    """
    with pm.Model() as model:
        # Priors
        alpha_control = pm.Beta('alpha_control', alpha=1, beta=1)
        alpha_treatment = pm.Beta('alpha_treatment', alpha=1, beta=1)

        # Likelihood
        control_obs = pm.Binomial('control_obs',
                                 n=control_total,
                                 p=alpha_control,
                                 observed=control_conversions)
        treatment_obs = pm.Binomial('treatment_obs',
                                   n=treatment_total,
                                   p=alpha_treatment,
                                   observed=treatment_conversions)

        # Derived quantities
        lift = pm.Deterministic('lift',
                               (alpha_treatment - alpha_control) / alpha_control)

        # Sample
        trace = pm.sample(2000, tune=1000, return_inferencedata=True)

    # Calculate probability of positive lift
    prob_positive = (trace.posterior.lift > 0).mean().item()

    return trace, prob_positive

Последовательное тестирование и досрочная остановка

class SequentialABTest:
    def __init__(self, alpha=0.05, beta=0.2, mde=0.05):
        self.alpha = alpha
        self.beta = beta
        self.mde = mde
        self.data_points = []

    def add_observation(self, variant, outcome):
        self.data_points.append({'variant': variant, 'outcome': outcome})

    def should_stop(self):
        if len(self.data_points) < 100:  # Minimum sample size
            return False, "continue"

        # Calculate current test statistic
        control_outcomes = [d['outcome'] for d in self.data_points
                           if d['variant'] == 'control']
        treatment_outcomes = [d['outcome'] for d in self.data_points
                             if d['variant'] == 'treatment']

        if len(control_outcomes) < 50 or len(treatment_outcomes) < 50:
            return False, "continue"

        # Perform t-test
        t_stat, p_value = stats.ttest_ind(treatment_outcomes, control_outcomes)

        # O'Brien-Fleming spending function for alpha adjustment
        current_n = len(self.data_points)
        max_n = self.calculate_max_sample_size()
        information_fraction = current_n / max_n

        adjusted_alpha = self.obf_spending_function(information_fraction)

        if p_value < adjusted_alpha:
            return True, "significant"
        elif current_n >= max_n:
            return True, "max_sample_reached"
        else:
            return False, "continue"

Мониторинг производительности модели

Детекция дрифта

from scipy.stats import ks_2samp
from scipy.spatial.distance import jensenshannon

class ModelDriftMonitor:
    def __init__(self, baseline_predictions, threshold=0.05):
        self.baseline_predictions = baseline_predictions
        self.threshold = threshold

    def detect_prediction_drift(self, current_predictions):
        # Kolmogorov-Smirnov test for distribution shift
        ks_stat, ks_pvalue = ks_2samp(self.baseline_predictions,
                                     current_predictions)

        # Jensen-Shannon divergence
        js_divergence = jensenshannon(self.baseline_predictions,
                                     current_predictions)

        drift_detected = ks_pvalue < self.threshold or js_divergence > 0.1

        return {
            'drift_detected': drift_detected,
            'ks_statistic': ks_stat,
            'ks_pvalue': ks_pvalue,
            'js_divergence': js_divergence
        }

Лучшие практики и рекомендации

Конфигурация экспериментов

  • Используйте конфигурационные файлы для управления параметрами экспериментов
  • Реализуйте правильное логирование всех предсказаний модели
  • Настройте автоматические уведомления для снижения производительности
  • Поддерживайте отдельные окружения для разработки и продакшена

Анализ и отчетность

  • Всегда сообщайте доверительные интервалы, а не только точечные оценки
  • Включайте как практическую, так и статистическую значимость
  • Выполняйте проверки устойчивости с различными подходами
  • Документируйте нарушения предположений и их влияние

Типичные ошибки

  • Не заглядывайте в результаты без корректировки множественного тестирования
  • Избегайте изменения параметров эксперимента в процессе
  • Не игнорируйте различия в задержке модели
  • Убедитесь, что единица рандомизации соответствует единице анализа

适合场景

01

用户想查找某类 Agent Skill 时

02

需要根据任务场景推荐可安装能力包时

03

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

Codex

35.92%
按下载量换算188

Claude

30.44%
按下载量换算160

Cursor

19.69%
按下载量换算103

Gemini CLI

8.9%
按下载量换算47

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

权限需确认

当前来源未能明确判断权限范围,默认进入异常复核队列。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills