在生成式检索系统的开发中,评估是连接理论创新与实际应用的关键桥梁。与传统检索系统相比,生成式方法带来了全新的评估挑战:如何衡量一个直接生成文档标识符的模型性能?如何在离线评估中预测在线表现?本章将深入探讨生成式检索的评估体系,介绍新型评估指标的设计思路,并通过主流基准测试和工业实践案例,帮助读者建立完整的评估方法论。
传统检索系统的评估建立在”排序列表”的基础上,而生成式检索直接输出文档标识符序列,这种根本性差异带来了多重挑战:
1. 离散输出空间的评估复杂性
传统检索输出连续的相关性分数,而生成式检索输出离散的token序列:
传统检索:query → [doc1: 0.95, doc2: 0.87, doc3: 0.76, ...]
生成式检索:query → ["1", "2", "4", "5"] (docid序列)
这种差异使得许多基于排序的传统指标(如NDCG)需要重新设计。
2. 生成多样性与检索精度的平衡
生成模型天然具有创造性,但在检索任务中,这种”创造性”可能导致幻觉(hallucination):
输入查询:"深度学习优化算法"
理想输出:[docid_123, docid_456] # 真实相关文档
实际输出:[docid_789, docid_???] # docid_???可能不存在
3. 部分匹配的语义评估
当生成的文档标识符序列部分正确时,如何公平评估?
Gold标准:["d1", "d2", "d3", "d4"]
预测输出:["d1", "d5", "d3", "d6"]
传统的精确匹配过于严格,而简单的token级别F1又忽略了检索的语义。
生成式检索的效率评估需要考虑多个维度:
延迟分解模型: \(\text{Total Latency} = \text{Encoding}_\text{time} + \text{Generation}_\text{time} + \text{Verification}_\text{time}\)
其中:
吞吐量考量:
批处理场景下,需要评估:
生成式检索面临严重的在线-离线评估不一致问题:
离线评估:静态测试集 → 固定文档集合 → 稳定的评估指标
在线评估:动态查询流 → 实时更新文档 → 用户行为反馈
关键差异因素:
生成式检索特有的差距放大效应:
生成式检索的记忆化特性使得在线-离线差距更加明显。模型在训练时”记住”了文档集合,但实际部署时面临的是动态变化的文档库:
训练时:Model memorizes {d1, d2, ..., d10000}
部署后Day 1:需要检索 {d1, d2, ..., d10000, d10001} # 新增文档
部署后Day 7:需要检索 {d1, d2, ..., d9998, d10001, ..., d10500} # 删除+新增
部署后Day 30:查询分布从"技术类"转向"娱乐类" # 用户兴趣迁移
协变量偏移(Covariate Shift)问题:
离线测试集通常采样自历史数据,而在线环境的输入分布P(X)持续变化:
\[P_{\text{train}}(X) \neq P_{\text{deploy}}(X)\]对于生成式检索,这种偏移体现在多个层面:
标注延迟与反馈稀疏性:
用户查询 → 系统返回结果 → 用户浏览 → 点击/不点击
↓ ↓
T=0秒 T=5-30秒
进一步行为:收藏/购买/分享
↓
T=分钟到天级别
离线评估使用的是完整标注数据,而在线系统只能获得部分隐式反馈,且存在显著延迟。
生成式检索独有的”幻觉”问题给评估带来新挑战:
幻觉类型分类:
Query: "最新iPhone评测"
Generated: ["doc_99999"] # 文档库最大ID是50000
Query: "Python编程教程"
Generated: ["doc_123"] # doc_123是关于Java的
Query: "初学者编程入门"
Generated: ["basic_101", "advanced_999"] # 难度不匹配
幻觉检测指标:
\[\text{Hallucination Rate} = \frac{\text{幻觉生成次数}}{\text{总生成次数}}\]细分为: \(\text{HR}_{\text{complete}} = \frac{|\text{Invalid IDs}|}{|\text{All Generated IDs}|}\) \(\text{HR}_{\text{semantic}} = \frac{|\text{Irrelevant Valid IDs}|}{|\text{Valid IDs}|}\)
幻觉的代价不对称性:
不同类型的幻觉造成的影响差异巨大:
因此需要加权的幻觉惩罚: \(\text{Weighted Hallucination Cost} = \sum_{i} w_i \cdot \mathbb{1}[\text{hallucination}_i]\)
其中$w_i$根据领域敏感性和业务影响确定。
1. 标识符级别精确率(ID-Level Precision)
定义生成的标识符序列中有效且相关的比例:
\[\text{ID-Precision@k} = \frac{|\text{Generated}_k \cap \text{Relevant}|}{k}\]其中$\text{Generated}_k$是前k个生成的文档标识符。
2. 序列编辑距离(Sequence Edit Distance, SED)
衡量生成序列与gold标准的差异:
\[\text{SED} = \frac{\text{EditDistance}(\text{pred}, \text{gold})}{\max(|\text{pred}|, |\text{gold}|)}\]3. 语义召回率(Semantic Recall)
考虑语义等价的文档:
\[\text{Semantic-Recall@k} = \frac{|\text{Retrieved}_k \cap \text{Semantically-Relevant}|}{|\text{Semantically-Relevant}|}\]这里”语义相关”通过embedding相似度或人工标注确定。
1. 生成成功率(Generation Success Rate, GSR)
\[\text{GSR} = \frac{\text{成功生成有效docid的查询数}}{\text{总查询数}}\]2. 首位命中时间(Time to First Hit, TTFH)
衡量生成第一个相关文档所需的时间:
\[\text{TTFH} = t_{\text{first-relevant}} - t_{\text{query-start}}\]3. 累积增益效率(Cumulative Gain Efficiency, CGE)
结合检索质量和计算成本:
\[\text{CGE} = \frac{\text{DCG@k}}{\text{Computational Cost}}\]其中计算成本可以是FLOPs、延迟或能耗。
1. 对抗鲁棒性(Adversarial Robustness)
测试对轻微扰动的敏感度:
\[\text{Robustness} = 1 - \frac{|\Delta\text{Performance}|}{|\Delta\text{Input}|}\]具体扰动策略:
a) 字符级扰动:
原始查询:"深度学习框架比较"
扰动查询:"深度学习框架比交" # 错别字
"深度 学习框架比较" # 额外空格
"深度学习framwork比较" # 中英混合
b) 语义级扰动:
原始查询:"如何学习机器学习"
同义替换:"怎样学习ML"
改写查询:"机器学习入门方法"
c) 对抗性扰动: 通过梯度攻击生成最坏情况输入: \(x_{adv} = x + \epsilon \cdot \text{sign}(\nabla_x L(f(x), y))\)
2. 分布外泛化(Out-of-Distribution Generalization)
评估在未见过的查询类型上的表现:
\[\text{OOD-Score} = \frac{\text{Performance}_{\text{OOD}}}{\text{Performance}_{\text{IID}}}\]OOD测试集构建:
3. 一致性指标(Consistency Metrics)
衡量相似查询是否得到相似结果:
\[\text{Consistency} = \frac{1}{|\mathcal{Q}|} \sum_{q \in \mathcal{Q}} \text{sim}(f(q), f(q'))\]其中$q’$是$q$的语义等价变换。
4. 稳定性指标(Stability Metrics)
评估模型输出的时间稳定性:
\[\text{Temporal Stability} = 1 - \frac{1}{T} \sum_{t=1}^{T-1} |f_t(q) - f_{t+1}(q)|\]这对生成式检索尤其重要,因为模型更新可能导致完全不同的ID序列生成。
传统指标往往忽略了用户体验的细微差别,生成式检索需要更贴近用户感知的指标:
1. 认知负荷指标(Cognitive Load)
衡量用户理解和处理结果的难易程度:
\[\text{Cognitive Load} = \alpha \cdot \text{结果复杂度} + \beta \cdot \text{决策时间} + \gamma \cdot \text{返回率}\]2. 探索-利用平衡(Exploration-Exploitation Balance)
\[\text{E-E Balance} = \frac{\text{新颖结果数}}{\text{总结果数}} \times \text{相关性保持率}\]3. 会话连贯性(Session Coherence)
对于多轮检索会话:
\[\text{Session Coherence} = \frac{1}{n-1} \sum_{i=1}^{n-1} \text{transition_quality}(q_i, q_{i+1})\]4. 期望违背度(Expectation Violation)
衡量结果是否符合用户预期:
\[\text{EV} = |P(\text{result}|\text{query}) - P(\text{expected}|\text{query})|\]生成式检索可能产生”创造性”但违背用户期望的结果。
数据集特点:
生成式检索适配:
# MS MARCO的docid设计示例
原始文档ID: "D1234567"
层次化ID: ["1", "234", "567"] # 便于生成模型学习
语义化ID: ["tech", "ml", "bert"] # 基于内容聚类
评估协议:
数据集特点:
生成式检索应用:
NQ特别适合评估生成式检索的语言理解能力:
查询:"谁发明了电话?"
传统检索:返回包含"电话"、"发明"的文档
生成式检索:直接生成 Wikipedia 页面ID "Alexander_Graham_Bell"
评估维度:
套件组成: 18个不同领域的检索数据集,包括:
零样本评估协议:
BEIR强调零样本泛化能力:
训练:MS MARCO
评估:18个异构数据集(无微调)
生成式检索的BEIR挑战:
评估指标扩展:
# BEIR生成式评估框架
metrics = {
'traditional': ['NDCG@10', 'Recall@100'],
'generative': ['GSR', 'Domain-Adaptation-Score'],
'efficiency': ['Queries-per-Second', 'Memory-Usage']
}
随着生成式检索的发展,社区开发了专门的评估基准:
1. GenIR-Bench(2023)
专为生成式检索设计的综合基准:
数据规模:
- 10M文档,100K查询
- 5种语言(英、中、日、德、法)
- 8个垂直领域
特色任务:
- 增量索引更新
- 跨语言检索
- 多跳推理检索
- 时序感知检索
评估维度:
2. DSI-QA数据集
专注于问答场景的生成式检索:
# 数据集结构
{
"question": "谁发明了电话?",
"doc_ids": ["wiki_bell_001", "patent_1876_174"],
"answer_spans": ["亚历山大·贝尔", "1876年3月10日"],
"difficulty": "easy",
"reasoning_type": "factual"
}
特点:
3. Streaming-IR基准
评估动态文档流场景:
时间线:
T0: 初始10K文档
T1: +1K新文档,-500旧文档
T2: +2K新文档,-1K旧文档
...
T100: 文档集完全更新
关键指标:
1. BioASQ(生物医学)
规模:15M PubMed文档
查询类型:
- Yes/No问题
- 事实型问题
- 列表型问题
- 摘要型问题
生成式检索挑战:
- 专业术语的准确生成
- 医学实体的规范化
- 证据链的完整性
2. MSMARCO-Product(电商)
特点:
- 真实产品查询
- 多模态信息(文本+图像)
- 用户行为信号(点击、购买、评价)
生成式适配:
- 产品ID的层次化编码
- 考虑库存状态的动态生成
- 个性化排序的融合
3. TREC-Legal(法律)
挑战:
- 超长文档(平均10K词)
- 精确性要求极高
- 引用关系的保持
生成式方案:
- 分层标识符(法院-年份-案件号)
- 约束生成确保合法ID
- 引用图的联合建模
1. 数据集选择策略
def select_benchmarks(system_type, deployment_scenario):
core_benchmarks = ['MS-MARCO', 'Natural Questions']
if deployment_scenario == 'zero-shot':
core_benchmarks.append('BEIR')
if system_type == 'multilingual':
core_benchmarks.append('mMARCO', 'XOR-QA')
if requires_streaming:
core_benchmarks.append('Streaming-IR')
return core_benchmarks
2. 评估流程标准化
Step 1: 数据预处理
- 文档ID映射设计
- 查询规范化
- 训练/验证/测试划分
Step 2: 模型训练
- 超参数网格搜索
- 早停策略
- 检查点保存
Step 3: 推理评估
- 批处理 vs 流式
- 缓存策略
- 错误分析
Step 4: 结果报告
- 平均值±标准差
- 统计显著性检验
- 失败案例分析
3. 公平比较原则
传统的离线评估往往陷入相关性陷阱,无法准确预测系统变更的真实影响。因果推断框架为生成式检索提供了更可靠的离线评估方法。
Simpson悖论在检索评估中的体现:
考虑两个检索系统A和B的表现:
整体表现:System A (NDCG=0.65) < System B (NDCG=0.70)
按查询类型分解:
- 导航型查询:A (0.90) > B (0.85) [占比20%]
- 信息型查询:A (0.75) > B (0.70) [占比30%]
- 事务型查询:A (0.55) > B (0.50) [占比50%]
虽然A在每个子类别都优于B,但整体指标却相反。这提示我们需要因果框架来理解真实效果。
潜在结果模型(Potential Outcomes Model):
对于每个查询$q$,定义:
挑战:我们只能观察到其中一个结果(fundamental problem of causal inference)。
解决方案:倾向分数匹配(Propensity Score Matching)
# 伪代码:因果效应估计
def estimate_causal_effect(queries, traditional_results, generative_results):
# 1. 计算倾向分数(使用查询特征)
propensity_scores = compute_propensity(queries.features)
# 2. 匹配相似查询
matched_pairs = match_queries(propensity_scores)
# 3. 估计平均处理效应(ATE)
ate = 0
for (q_treated, q_control) in matched_pairs:
effect = generative_results[q_treated] - traditional_results[q_control]
ate += effect
return ate / len(matched_pairs)
当存在未观测的混淆因素时,使用工具变量(Instrumental Variables, IV):
应用场景:评估生成式检索对用户满意度的因果影响
工具变量选择:
两阶段最小二乘法(2SLS):
第一阶段:$\text{GenerativeUsage}_i = \alpha + \beta \cdot \text{RandomAssignment}_i + \epsilon_i$
第二阶段:$\text{Satisfaction}_i = \gamma + \delta \cdot \widehat{\text{GenerativeUsage}}_i + \nu_i$
其中$\delta$是我们关心的因果效应。
利用阈值规则评估生成式检索的效果:
设计思路:
数学框架:
\[\tau_{RD} = \lim_{x \downarrow c} E[Y_i | X_i = x] - \lim_{x \uparrow c} E[Y_i | X_i = x]\]其中$c$是阈值,$X_i$是运行变量(如查询长度)。
可视化分析:
性能
^
| 传统检索 生成式检索
| . . * *
| . . * *
| . . * *
| . . | * *
+------------|--------------> 查询长度
10词
理解生成式检索影响用户满意度的机制:
因果链路:
生成式检索 → 响应时间 → 用户满意度
↘ 结果多样性 ↗
中介效应分解:
Baron-Kenny中介分析步骤:
结构方程模型(SEM)应用:
对于多个中介变量的复杂情况,使用SEM同时估计所有路径:
# 路径系数估计
paths = {
'gen_retrieval → response_time': -0.35, # 负相关:生成更快
'gen_retrieval → diversity': 0.42, # 正相关:更多样
'gen_retrieval → relevance': -0.08, # 轻微负相关
'response_time → satisfaction': -0.28, # 快速响应提升满意度
'diversity → satisfaction': 0.15, # 多样性的正面影响
'relevance → satisfaction': 0.65, # 相关性最重要
'gen_retrieval → satisfaction': 0.12 # 直接效应
}
# 总效应计算
total_effect = 0.12 + (-0.35)*(-0.28) + 0.42*0.15 + (-0.08)*0.65
# = 0.12 + 0.098 + 0.063 - 0.052 = 0.229
Sobel检验:
验证中介效应的统计显著性:
\[z = \frac{a \times b}{\sqrt{b^2 \times s_a^2 + a^2 \times s_b^2}}\]其中$a$是自变量到中介变量的系数,$b$是中介变量到因变量的系数。
不同用户群体对生成式检索的响应存在显著差异:
条件平均处理效应(CATE)估计:
\[\tau(x) = E[Y_i(1) - Y_i(0) | X_i = x]\]机器学习方法估计HTE:
X = user_features
T = treatment_assignment
Y = satisfaction_score
causal_forest = CausalForestDML( n_estimators=100, min_samples_leaf=10 ) causal_forest.fit(Y, T, X=X)
individual_effects = causal_forest.effect(X)
2. **元学习器(Meta-Learners)**:
**S-Learner**:
```python
# 单一模型,treatment作为特征
model = XGBoostRegressor()
X_with_treatment = concat([X, T])
model.fit(X_with_treatment, Y)
T-Learner:
# 分别训练treatment和control模型
model_treated = XGBoostRegressor()
model_control = XGBoostRegressor()
model_treated.fit(X[T==1], Y[T==1])
model_control.fit(X[T==0], Y[T==0])
# HTE = 预测差异
hte = model_treated.predict(X) - model_control.predict(X)
X-Learner:
# 改进T-Learner,使用倾向分数加权
# Step 1: 训练结果模型
# Step 2: 计算伪结果
# Step 3: 训练HTE模型
# Step 4: 倾向分数加权组合
发现的用户群体差异:
新手用户(使用<1月):
- CATE = +12.3%
- 原因:更容易接受新界面,探索意愿强
专家用户(使用>2年):
- CATE = -3.5%
- 原因:习惯传统检索,精确查询需求
移动用户:
- CATE = +8.7%
- 原因:生成式检索减少输入,适合移动场景
桌面用户:
- CATE = +2.1%
- 原因:效果提升有限,传统方法已经很好
当无法进行随机实验时,使用合成控制法构建反事实:
应用场景:某个地区率先部署生成式检索
方法步骤:
预处理期匹配: 找到控制地区的权重$W$,使得: \(\min_W \sum_{t<T_0} (Y_{treated,t} - \sum_j W_j Y_{control_j,t})^2\)
构建合成控制: \(Y_{synthetic,t} = \sum_j W_j^* Y_{control_j,t}\)
估计处理效应: \(\tau_t = Y_{treated,t} - Y_{synthetic,t}, \quad t \geq T_0\)
实际案例:
# 北京地区部署生成式检索
treated_region = 'Beijing'
control_regions = ['Shanghai', 'Guangzhou', 'Shenzhen', 'Hangzhou']
# 预处理期(部署前3个月)
pre_period = range(-90, 0)
# 后处理期(部署后1个月)
post_period = range(0, 30)
# 学习权重
weights = {
'Shanghai': 0.35,
'Guangzhou': 0.25,
'Shenzhen': 0.20,
'Hangzhou': 0.20
}
# 构建合成北京
synthetic_beijing = sum(w * metrics[region] for region, w in weights.items())
# 计算效应
effect = metrics['Beijing'][post_period] - synthetic_beijing[post_period]
置换检验(Permutation Test):
验证效应的统计显著性:
def placebo_test(data, treated_unit, n_iterations=1000):
placebo_effects = []
for _ in range(n_iterations):
# 随机选择一个控制单位作为"假处理"
placebo_treated = random.choice(control_units)
placebo_effect = estimate_synthetic_control(placebo_treated)
placebo_effects.append(placebo_effect)
# 计算p值
true_effect = estimate_synthetic_control(treated_unit)
p_value = sum(abs(p) >= abs(true_effect) for p in placebo_effects) / n_iterations
return p_value
Airbnb在2019-2023年间逐步将搜索系统从传统的Elasticsearch迁移到包含生成式组件的混合架构。这个过程中,他们构建了一套专门针对生成式检索的评估框架。
核心挑战:
Phase 1: 影子模式(Shadow Mode)
# 并行运行两个系统,只记录不展示
def shadow_evaluation():
# 生产流量
for query in production_traffic:
# 主系统(传统检索)
main_results = elasticsearch.search(query)
serve_to_user(main_results)
# 影子系统(生成式检索)
shadow_results = generative_model.generate(query)
log_for_analysis(shadow_results)
# 离线对比
compute_metrics(main_results, shadow_results)
关键发现:
Phase 2: 交错实验(Interleaving)
将两个系统的结果交错展示:
位置1: 传统检索结果1
位置2: 生成式检索结果1
位置3: 传统检索结果2
位置4: 生成式检索结果2
...
优势:
Phase 3: 多臂赌博机(Multi-Armed Bandit)
动态调整生成式检索的使用比例:
class AdaptiveRouter:
def __init__(self):
self.generative_weight = 0.5
self.epsilon = 0.1
def route_query(self, query):
if random() < self.epsilon: # 探索
return random_choice(['traditional', 'generative'])
else: # 利用
return weighted_choice(self.generative_weight)
def update_weights(self, rewards):
# Thompson Sampling更新
self.generative_weight = thompson_sample(rewards)
短期指标(实时):
中期指标(天级):
长期指标(周/月级):
北极星指标:
Nights Booked per Search Session
= (搜索会话数) × (转化率) × (平均预订晚数)
1. 溢出效应处理
房源的竞争关系导致溢出效应:
# 市场级别随机化
def market_level_randomization():
markets = get_all_markets()
treatment_markets = random_sample(markets, 0.5)
for market in markets:
if market in treatment_markets:
enable_generative_search(market)
else:
use_traditional_search(market)
2. 异质性处理效应分析
不同用户群体的响应差异:
# CATE (Conditional Average Treatment Effect)估计
segments = {
'first_time': lambda u: u.bookings == 0,
'frequent': lambda u: u.bookings > 5,
'business': lambda u: u.trip_type == 'business',
'leisure': lambda u: u.trip_type == 'leisure'
}
for segment_name, segment_filter in segments.items():
segment_users = filter(segment_filter, all_users)
cate = estimate_treatment_effect(segment_users)
print(f"{segment_name}: {cate}")
发现:
1. 渐进式部署的价值
影子模式(0%) → 1%流量 → 5%流量 → 20%流量 → 50%流量 → 全量
2个月 1周 2周 1个月 1个月
每个阶段都有明确的成功标准和回滚条件。
2. 混合架构的优势
最终方案:
def hybrid_search(query):
# 查询分类
query_type = classify_query(query)
if query_type == 'navigational':
return traditional_search(query)
elif query_type == 'exploratory':
return generative_search(query)
else: # 混合
trad_results = traditional_search(query)[:5]
gen_results = generative_search(query)[:5]
return merge_and_rerank(trad_results, gen_results)
3. 长期效应的重要性
短期指标可能误导:
4. 可解释性的业务价值
为每个生成的结果提供解释:
推荐原因:
- "与您搜索的'树屋'风格相似"
- "其他预订了A房源的用户也喜欢"
- "符合您的'安静'、'自然'偏好"
本章深入探讨了生成式检索系统的评估方法论,从理论到实践,从离线到在线,构建了完整的评估体系:
核心要点:
评估挑战的本质:生成式检索的离散输出特性和创造性本质带来了与传统检索截然不同的评估挑战,需要重新思考评估范式。
新型指标的必要性:传统的排序指标不再适用,需要设计考虑生成质量、语义一致性和计算效率的综合指标体系。
因果推断的价值:通过倾向分数匹配、工具变量、断点回归等方法,可以更准确地估计生成式检索的真实效果,避免相关性陷阱。
渐进式实验的智慧:Airbnb案例展示了从影子模式到全量部署的渐进路径,强调了风险控制和持续学习的重要性。
混合架构的优越性:纯生成式方案并非最优,根据查询类型智能路由的混合架构能够发挥各自优势。
关键公式回顾:
| 标识符精确率:$\text{ID-Precision@k} = \frac{ | \text{Generated}_k \cap \text{Relevant} | }{k}$ |
| 断点回归:$\tau_{RD} = \lim_{x \downarrow c} E[Y_i | X_i = x] - \lim_{x \uparrow c} E[Y_i | X_i = x]$ |
未来展望:
评估体系的发展方向包括:
练习15.1 设计评估指标 给定一个生成式检索系统输出docid序列[“d1”, “d2”, “d3”, “d4”],而相关文档集合为{“d1”, “d3”, “d5”}。计算: a) ID-Precision@2 b) ID-Precision@4 c) Semantic Recall(假设”d2”与”d5”语义相似)
Hint: 注意生成序列的顺序性和语义等价性。
练习15.2 Simpson悖论分析 某公司测试两个检索系统,数据如下:
计算两个系统的整体成功率,并解释Simpson悖论。
Hint: 考虑不同时段的查询量权重。
练习15.3 BEIR零样本评估 解释为什么生成式检索在BEIR基准上的零样本性能通常低于密集检索方法,并提出三种改进策略。
Hint: 考虑文档标识符的泛化问题。
练习15.4 因果效应估计 某电商平台进行A/B测试,treatment组使用生成式推荐,control组使用协同过滤。已知:
如何使用倾向分数匹配估计真实的因果效应?设计具体步骤。
Hint: 用户活跃度是混淆因素。
练习15.5 长期效应评估设计 设计一个评估框架,用于衡量生成式检索对用户长期行为的影响(例如3个月后的留存率)。考虑:
Hint: 考虑生存分析和时间序列方法。
练习15.6 多目标优化评估 生成式推荐系统需要同时优化:
设计一个综合评估框架,包括: a) 如何标准化不同量纲的指标 b) 如何设置权重 c) 如何处理指标间的权衡
Hint: 考虑Pareto前沿和多目标优化理论。
练习15.7 在线学习与评估 设计一个在线学习系统,能够:
给出系统架构和关键算法。
Hint: 考虑概念漂移检测和增量学习。
问题:只关注平均性能,忽略尾部表现
# 错误做法
avg_performance = np.mean(all_queries_performance)
# 正确做法
p50 = np.percentile(all_queries_performance, 50)
p95 = np.percentile(all_queries_performance, 95)
p99 = np.percentile(all_queries_performance, 99)
解决:始终报告性能分布,特别关注长尾查询。
问题:测试集信息泄露到训练过程
# 错误:使用全部数据生成文档标识符
all_docs = train_docs + test_docs
doc_ids = generate_ids(all_docs)
# 正确:只使用训练数据
doc_ids = generate_ids(train_docs)
# 测试时处理未见文档
问题:用户倾向点击靠前的结果,影响评估准确性
解决:
问题:过度关注CTR等短期指标,损害长期用户价值
解决:
问题:样本量不足就下结论
# 需要进行功效分析
from statsmodels.stats.power import TTestPower
power_analysis = TTestPower()
sample_size = power_analysis.solve_power(
effect_size=0.1, # 期望检测的效应大小
alpha=0.05, # 显著性水平
power=0.8 # 统计功效
)
问题:同时测试多个假设时,假阳性率增加
解决:使用Bonferroni校正或FDR控制