大模型A/B测试配置:零基础搭建流量分流与效果对比环境

大模型A/B测试配置的核心,是在同一个业务入口下,把用户请求按比例分给两个不同的模型服务,同时记录每次请求的模型标识和业务指标,最后对比效果。
如果你手里有两个模型(比如一个线上主力模型、一个待评估的新模型),想用真实流量判断哪个更合适,可以按下面的步骤在测试环境先跑通,再逐步放量。

先明确测试目标和前置条件

A/B测试不是配好分流就结束,开始前需要确认三件事:

  • 对比什么指标:是回答准确率、用户点赞率、人工评分,还是接口延迟和成本。指标不同,采集字段和分流方式也不同。
  • 流量从哪里来:如果是内部测试,可以直接用脚本模拟请求;如果是线上灰度,需要经过网关或反向代理。
  • 两个模型服务是否已可用:本文假设你已经有两个可调用的模型API端点,例如通过HTTP接口提供服务的自建模型或第三方模型。

建议在测试环境操作,避免影响线上用户。
需要准备:一台能运行Docker的Linux服务器(本文以Ubuntu 22.04为例),已安装docker和docker compose,以及两个模型的API地址和密钥。

用Nginx做流量分流

最直接的方式是在两个模型服务前加一层Nginx,按权重把请求分发到不同上游。
下面是一个最小可用的配置片段,保存为/etc/nginx/conf.d/ab-test.conf:

upstream model_a {
    server 127.0.0.1:8001;
}

upstream model_b {
    server 127.0.0.1:8002;
}

split_clients "${remote_addr}${http_user_agent}${date}" $model_group {
    50%     model_a;
    50%     model_b;
    *       model_a;
}

server {
    listen 8080;

    location /v1/chat/completions {
        proxy_pass http://$model_group;
        proxy_set_header X-Model-Group $model_group;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

关键点说明:

  • split_clients 根据请求特征哈希分流,同一个用户(相同IP和User-Agent)会稳定落到同一组,减少体验波动。
  • 分流比例通过50%调整,初期建议小流量试探,比如10%给新模型。
  • X-Model-Group请求头会传给后端,方便模型服务记录本次请求属于哪一组。

修改后执行检查并重载:

sudo nginx -t
sudo systemctl reload nginx

如果nginx -t报错,先检查split_clients模块是否可用(Nginx官方包默认包含),以及引号和中括号是否写错。

让模型服务返回分组标识并记录日志

仅靠Nginx分流还不够,后端需要把分组信息写入访问日志,后续才能按组统计。
假设你的模型服务用Python FastAPI编写,可以在中间件中读取X-Model-Group并记录到日志文件:

from fastapi import FastAPI, Request
import logging

app = FastAPI()
logger = logging.getLogger("ab_test")
logger.setLevel(logging.INFO)
handler = logging.FileHandler("/var/log/model_ab.log")
logger.addHandler(handler)

@app.middleware("http")
async def log_group(request: Request, call_next):
    group = request.headers.get("X-Model-Group", "unknown")
    response = await call_next(request)
    logger.info(f"group={group} path={request.url.path} status={response.status_code}")
    return response

如果没有代码改造条件,也可以直接在Nginx的access_log中记录$model_group变量,例如:

log_format ab '$remote_addr - $model_group [$time_local] "$request" $status';
access_log /var/log/nginx/ab_access.log ab;

把access_log加到server块内即可。
之后用grep model_a和grep model_b分别统计请求量和状态码。

避坑与效果验证

配置过程中容易踩的几个坑:

  • 分流后两个模型返回格式不一致:如果模型A返回JSON字段名与模型B不同,前端会报错。建议在网关层做一次响应适配,或者先用小流量验证字段一致性。
  • 没有记录分组标识:只配了分流但日志里没有组别,事后无法归因。务必在请求头或日志中保留分组信息。
  • 分流比例改完没重载:修改split_clients后必须执行nginx -t和reload,否则配置不生效。
  • 测试期间流量过小:样本太少时对比没有意义,建议每个组至少积累几百次可评估请求再下结论。

验证分三步:先直接请求http://你的服务器:8080/v1/chat/completions,用curl -H "Content-Type: application/json" -d '{"messages":[{"role":"user","content":"你好"}]}'检查是否正常返回;
再查看/var/log/nginx/ab_access.log中是否出现两种分组标识;
最后用简单脚本统计两组请求数和错误率,确认分流比例接近设定值。

常见疑问

分流比例可以按用户ID而不是IP吗?
可以,把split_clients的哈希输入换成$http_x_user_id之类的变量即可,前提是业务请求里带有稳定的用户标识。

两个模型部署在不同机器上怎么办?
把upstream中的127.0.0.1:8001改成实际内网IP和端口,确保Nginx所在服务器能访问到两个模型服务。

测试结束后怎么关闭分流?
把split_clients中非目标组的比例改为0%,或直接让location固定proxy_pass到一个上游,然后重载Nginx。

大模型A/B测试配置并不复杂,关键是分流稳定、分组可追溯、指标可统计。
按本文步骤先在测试环境跑通,再根据样本量逐步调整比例,就能得到相对可靠的对比结论。

分享到:
上一篇
大模型灰度发布配置:从准备到验证的实操流程
下一篇
大模型版本管理配置:用 Git 和 DVC 管好模型文件
1
系统公告

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意