Shell脚本如何实现A/B测试策略

wen 实用脚本 25

本文目录导读:

Shell脚本如何实现A/B测试策略

  1. 基础A/B测试分配策略
  2. 带比例的A/B测试
  3. 多层A/B测试(多变量)
  4. 完整的A/B测试框架
  5. 高级特性:动态流量调整
  6. 统计分析脚本
  7. 使用建议

我来详细介绍Shell脚本实现A/B测试策略的几种方法:

基础A/B测试分配策略

基于随机数分配

#!/bin/bash
# A/B测试分配函数
assign_ab_test() {
    local user_id=$1
    # 基于用户ID生成确定性分组
    local hash=$(echo -n "$user_id" | md5sum | cut -c1-8)
    local group=$((16#${hash} % 2))
    if [ $group -eq 0 ]; then
        echo "A"
    else
        echo "B"
    fi
}
# 使用示例
user_id="user123"
group=$(assign_ab_test "$user_id")
echo "User $user_id assigned to group: $group"

带比例的A/B测试

#!/bin/bash
# 支持自定义比例分配
assign_custom_ratio() {
    local user_id=$1
    local ratio_a=$2  # A组比例(如70表示70%)
    # 使用确定性哈希
    local hash=$(echo -n "$user_id" | sha256sum | cut -c1-4)
    local hash_num=$((16#${hash}))
    local total_divisions=100
    if [ $((hash_num % 100)) -lt $ratio_a ]; then
        echo "A"
    else
        echo "B"
    fi
}
# 示例:70%用户进A组,30%进B组
assign_custom_ratio "user456" 70

多层A/B测试(多变量)

#!/bin/bash
# 多变量A/B测试
declare -A AB_CONFIG
# 配置不同测试维度
configure_ab_test() {
    # [维度名]="A组比例 B组比例"
    AB_CONFIG["ui_version"]="50 50"
    AB_CONFIG["algorithm"]="30 70"
    AB_CONFIG["price_model"]="60 40"
}
# 多维度分配
assign_multivariate() {
    local user_id=$1
    configure_ab_test
    for dimension in "${!AB_CONFIG[@]}"; do
        local ratios=(${AB_CONFIG[$dimension]})
        local hash=$(echo -n "${user_id}_${dimension}" | md5sum | cut -c1-8)
        local group_num=$((16#${hash} % 100))
        if [ $group_num -lt ${ratios[0]} ]; then
            echo "$dimension: A"
        else
            echo "$dimension: B"
        fi
    done
}
# 使用示例
echo "=== 多变量A/B测试分配 ==="
assign_multivariate "user789"

完整的A/B测试框架

#!/bin/bash
# 完整的A/B测试框架
AB_TEST_DIR="/var/log/ab_test"
EXPERIMENT_NAME="ui_redesign"
# 初始化测试环境
init_ab_test() {
    mkdir -p "${AB_TEST_DIR}/${EXPERIMENT_NAME}"
}
# 获取用户分组
get_user_group() {
    local user_id=$1
    local experiment=$2
    local cache_file="${AB_TEST_DIR}/${experiment}/assignments.cache"
    # 检查缓存
    if [ -f "$cache_file" ]; then
        local cached_group=$(grep "^${user_id}:" "$cache_file" | cut -d: -f2)
        if [ -n "$cached_group" ]; then
            echo "$cached_group"
            return
        fi
    fi
    # 分配新用户
    local hash=$(echo -n "${user_id}_${experiment}" | sha256sum | cut -c1-8)
    local group_num=$((16#${hash} % 2))
    if [ $group_num -eq 0 ]; then
        echo "A"
    else
        echo "B"
    fi
    # 缓存分配结果
    echo "${user_id}:$(echo $?)" >> "$cache_file"
}
# 执行A/B测试逻辑
execute_ab_logic() {
    local user_id=$1
    local group=$(get_user_group "$user_id")
    echo "User: $user_id, Group: $group"
    case $group in
        "A")
            # 控制组 - 原有逻辑
            echo "执行控制组逻辑"
            # 原有功能代码
            ;;
        "B")
            # 实验组 - 新逻辑
            echo "执行实验组逻辑"
            # 新功能代码
            ;;
    esac
}
# 记录测试结果
log_ab_result() {
    local user_id=$1
    local group=$2
    local event=$3
    local timestamp=$(date +%s)
    log_file="${AB_TEST_DIR}/${EXPERIMENT_NAME}/events.log"
    echo "${timestamp},${user_id},${group},${event}" >> "$log_file"
}
# 测试执行
test_user="user_$(date +%s)"
init_ab_test
execute_ab_logic "$test_user"
log_ab_result "$test_user" "$(get_user_group "$test_user")" "page_view"

高级特性:动态流量调整

#!/bin/bash
# 动态调整A/B测试比例
DYNAMIC_CONFIG_FILE="/tmp/ab_test_config"
# 更新配置
update_ab_config() {
    local experiment=$1
    local new_ratio=$2
    cat > "$DYNAMIC_CONFIG_FILE" << EOF
{
    "experiment": "$experiment",
    "ratio_a": $new_ratio,
    "enabled": true
}
EOF
}
# 读取动态配置
get_ab_config() {
    if [ -f "$DYNAMIC_CONFIG_FILE" ]; then
        cat "$DYNAMIC_CONFIG_FILE" | python3 -c "
import json,sys
config = json.load(sys.stdin)
print(config['ratio_a'])
"
    else
        echo "50"  # 默认50%
    fi
}
# 带动态配置的分配
dynamic_assign() {
    local user_id=$1
    local ratio_a=$(get_ab_config)
    local hash=$(echo -n "$user_id" | md5sum | cut -c1-4)
    local hash_num=$((16#${hash}))
    if [ $((hash_num % 100)) -lt $ratio_a ]; then
        echo "A"
    else
        echo "B"
    fi
}

统计分析脚本

#!/bin/bash
# A/B测试结果分析
analyze_ab_results() {
    local experiment=$1
    local log_file="${AB_TEST_DIR}/${experiment}/events.log"
    echo "=== A/B测试结果分析 ==="
    echo "实验: $experiment"
    echo ""
    # 统计各组用户数
    echo "用户分布:"
    awk -F',' '{group_count[$3]++} END {for(g in group_count) print g": "group_count[g]}' "$log_file"
    echo ""
    # 计算转化率
    echo "转化率统计:"
    awk -F',' '
    {
        if($4 == "page_view") views[$3]++
        if($4 == "conversion") conversions[$3]++
    }
    END {
        for(g in views) {
            rate = (conversions[g] / views[g]) * 100
            printf "%s: %.2f%% (views:%d, conversions:%d)\n", g, rate, views[g], conversions[g]
        }
    }' "$log_file"
}
# 使用示例
analyze_ab_results "ui_redesign"

使用建议

  1. 一致性: 使用确定性哈希确保同一用户始终分配到同一组
  2. 持久化: 将分配结果缓存,避免重复计算
  3. 日志记录: 详细记录用户行为用于后续分析
  4. 监控告警: 添加监控检查各组用户数量是否均衡
  5. 灰度发布: 支持动态调整比例,实现灰度发布

这个框架可以根据具体需求进行扩展,比如添加更多维度、支持嵌套测试或实现复杂的分流规则。

抱歉,评论功能暂时关闭!