引言
教培机构在做AI获客优化时,最常遇到的问题不是"不知道该优化什么",而是"不知道怎么衡量优化效果"。
做了信息一致性修正、补全了课程描述、积累了场景化口碑——这些动作做完后,AI推荐效果变好了吗?很多机构只能靠"感觉"判断,缺乏量化评估手段。
这篇文章介绍一套面向教培AI推荐场景的Evaluation框架设计思路——从评估指标定义、测试用例构建、自动化评测Pipeline到持续监控,帮助教培从业者建立"可度量、可追踪、可迭代"的优化闭环。
一、评估维度:教培AI推荐的5个核心指标
评估推荐质量,首先需要定义"好"的标准。对于教培机构场景,我们定义5个核心评估维度。
1.1 覆盖率(Coverage)
定义:当家长用N种不同方式提问时,你的机构被AI提及的比例。
# 覆盖率计算 coverage = mentioned_count / total_queries * 100 # 示例:20种提问方式中,被提及12次 coverage = 12 / 20 * 100 # 60%为什么重要:覆盖率反映的是你的机构在AI"视野"中的存在感。覆盖率低说明AI根本不知道你,所有其他优化都无从谈起。
测试用例设计:
query_templates = [ # 基础查询 "本地数学辅导机构推荐", "附近初中英语哪家好", # 场景化查询 "孩子数学基础薄弱去哪补", "初三中考冲刺辅导班", # 对比查询 "A机构和B机构哪个好", # 条件查询 "有一对一数学辅导吗", "周末班有没有", ] def test_coverage(queries, institution_name, ai_client): """测试机构在AI推荐中的覆盖率""" results = [] for q in queries: response = ai_client.query(q) mentioned = institution_name in response results.append({ "query": q, "mentioned": mentioned, "response": response }) coverage = sum(1 for r in results if r["mentioned"]) / len(queries) return coverage, results1.2 排名位置(Rank Position)
定义:在AI推荐的机构列表中,你的机构排在第几位。
# 排名位置计算 def get_rank_position(response_text, target_name, all_institutions): """获取目标机构在推荐列表中的排名""" # 解析AI推荐列表的顺序 mentioned_order = [] for inst in all_institutions: if inst in response_text: pos = response_text.index(inst) mentioned_order.append((inst, pos)) # 按出现位置排序 mentioned_order.sort(key=lambda x: x[1]) for rank, (name, _) in enumerate(mentioned_order, 1): if name == target_name: return rank return -1 # 未被推荐为什么重要:首位推荐的转化率远高于第三位。排名反映的是AI对你的"偏好程度"。
1.3 描述质量(Description Quality)
定义:AI推荐你时给出的描述中,包含的具体事实数量。
# 描述质量评分 def score_description_quality(description): """评估AI推荐描述的信息密度""" score = 0 dimensions = { "科目": False, "年级": False, "班型": False, "师资": False, "效果数据": False, "教学特色": False, "口碑引用": False, } # 检查每个维度是否在描述中被提及 if any(w in description for w in ["数学", "英语", "物理"]): dimensions["科目"] = True if any(w in description for w in ["初中", "高中", "小学", "初三"]): dimensions["年级"] = True if any(w in description for w in ["一对一", "小班", "6人"]): dimensions["班型"] = True if any(w in description for w in ["教师", "教龄", "硕士", "985"]): dimensions["师资"] = True if "分" in description or "提升" in description or "提高" in description: dimensions["效果数据"] = True if any(w in description for w in ["诊断", "三步", "独创", "特色"]): dimensions["教学特色"] = True if any(w in description for w in ["家长反馈", "据评价", "口碑"]): dimensions["口碑引用"] = True score = sum(1 for v in dimensions.values() if v) return score, dimensions # 示例 desc1 = "这是一家数学辅导机构" score1, _ = score_description_quality(desc1) # 得分: 1/7 desc2 = "专注初中数学一对一,8位全职教师平均教龄9年,据家长反馈80%学员3个月内提升15分以上" score2, _ = score_description_quality(desc2) # 得分: 6/7为什么重要:描述质量直接决定AI推荐你的"说服力"。描述越丰富,家长越有可能采取行动。
1.4 一致性得分(Consistency Score)
定义:AI对你的描述与你的官方信息之间的一致程度。
def check_consistency(ai_description, official_info): """检查AI描述与官方信息的一致性""" conflicts = [] # 检查关键字段 if ai_description.get("师资数量") != official_info.get("师资数量"): conflicts.append({ "field": "师资数量", "ai_value": ai_description.get("师资数量"), "official_value": official_info.get("师资数量"), "severity": "high" }) if ai_description.get("成立年份") != official_info.get("成立年份"): conflicts.append({ "field": "成立年份", "ai_value": ai_description.get("成立年份"), "official_value": official_info.get("成立年份"), "severity": "high" }) # 计算一致性得分 total_fields = len(official_info) conflict_count = len(conflicts) consistency = (total_fields - conflict_count) / total_fields * 100 return consistency, conflicts为什么重要:一致性是AI信任度的基础。AI发现你不同平台信息矛盾时,会降低对你的可信度评估。
1.5 时效性指数(Freshness Index)
定义:AI系统中关于你的信息的平均"年龄"。
from datetime import datetime, timedelta def calculate_freshness_index(information_sources): """计算信息时效性指数""" now = datetime.now() ages = [] for source in information_sources: last_update = source.get("last_updated") if last_update: age_days = (now - last_update).days ages.append(age_days) if not ages: return 0 # 无任何信息 avg_age = sum(ages) / len(ages) max_age = max(ages) # 时效性指数:0-100分 # 平均年龄30天内 = 100分 # 平均年龄90天内 = 70分 # 平均年龄180天内 = 40分 # 平均年龄365天以上 = 10分 if avg_age <= 30: freshness = 100 elif avg_age <= 90: freshness = 100 - (avg_age - 30) * 0.5 elif avg_age <= 180: freshness = 70 - (avg_age - 90) * 0.33 elif avg_age <= 365: freshness = 40 - (avg_age - 180) * 0.16 else: freshness = 10 return round(freshness, 1)为什么重要:信息越新鲜,AI越认为你"活跃运营中",推荐时更有底气。
二、自动化评测Pipeline
定义了指标后,需要建立自动化评测流程——定期跑测试、记录结果、追踪趋势。
2.1 Pipeline架构
class EvaluationPipeline: """教培AI推荐评测Pipeline""" def __init__(self, config): self.config = config self.results_history = [] def run_evaluation(self): """执行一轮完整评测""" timestamp = datetime.now().isoformat() results = { "timestamp": timestamp, "coverage": self._test_coverage(), "rank_position": self._test_rank(), "description_quality": self._test_description(), "consistency": self._test_consistency(), "freshness": self._test_freshness(), } # 计算综合得分 results["overall_score"] = self._calc_overall(results) # 保存结果 self.results_history.append(results) self._save_report(results) return results def _test_coverage(self): """测试覆盖率""" queries = self.config["test_queries"] mentioned_count = 0 for q in queries: response = self.query_ai(q) if self.config["institution_name"] in response: mentioned_count += 1 return { "score": mentioned_count / len(queries) * 100, "details": f"{mentioned_count}/{len(queries)}" } def _test_rank(self): """测试排名位置""" # 使用标准查询测试排名 queries = self.config["rank_test_queries"] positions = [] for q in queries: response = self.query_ai(q) rank = self._extract_rank(response) if rank > 0: positions.append(rank) avg_rank = sum(positions) / len(positions) if positions else -1 return { "score": max(0, 100 - (avg_rank - 1) * 25) if avg_rank > 0 else 0, "avg_position": avg_rank } def _test_description(self): """测试描述质量""" queries = self.config["test_queries"] quality_scores = [] for q in queries: response = self.query_ai(q) desc = self._extract_description(response, self.config["institution_name"]) if desc: score, _ = score_description_quality(desc) quality_scores.append(score) avg_quality = sum(quality_scores) / len(quality_scores) if quality_scores else 0 return { "score": avg_quality / 7 * 100, # 满分7维度 "avg_dimensions": avg_quality } def _calc_overall(self, results): """计算综合得分""" weights = { "coverage": 0.25, "rank_position": 0.25, "description_quality": 0.20, "consistency": 0.15, "freshness": 0.15, } overall = sum( results[metric]["score"] * weight for metric, weight in weights.items() ) return round(overall, 1)2.2 测试用例管理
# 测试用例配置示例 EVAL_CONFIG = { "institution_name": "XX教育", "test_queries": [ # 基础类(5条) "本地数学辅导机构", "附近初中英语辅导", "本地高中物理补习", "小学奥数培训班", "本地中考冲刺班", # 场景类(5条) "孩子数学不及格去哪补", "初三物理一对一辅导", "小学三年级英语启蒙", "高中数学基础薄弱怎么办", "中考数学怎么提高", # 对比类(3条) "XX教育和YY教育哪个好", "本地最好的数学辅导是哪家", "性价比高的辅导机构", # 条件类(3条) "有一对一数学辅导吗", "周末有课吗", "可以试听吗", ], "rank_test_queries": [ "本地数学辅导推荐", "初中英语哪家好", "本地高中物理补习推荐", ], }2.3 趋势追踪
def generate_trend_report(history): """生成趋势报告""" if len(history) < 2: return "数据不足,需要至少两轮评测" latest = history[-1] previous = history[-2] report = { "period": f"{previous['timestamp']} → {latest['timestamp']}", "metrics_change": {}, "alerts": [], } for metric in ["coverage", "rank_position", "description_quality", "consistency", "freshness"]: current_score = latest[metric]["score"] prev_score = previous[metric]["score"] change = current_score - prev_score report["metrics_change"][metric] = { "current": current_score, "previous": prev_score, "change": round(change, 1), "trend": "↑" if change > 0 else "↓" if change < 0 else "→" } # 告警:任何指标下降超过10分 if change < -10: report["alerts"].append(f"⚠️ {metric} 下降 {abs(change):.1f} 分") # 综合得分变化 overall_change = latest["overall_score"] - previous["overall_score"] report["overall_change"] = round(overall_change, 1) return report三、评测结果解读与优化决策
评测不是目的,优化才是。拿到评测结果后,如何转化为具体的优化动作?
3.1 诊断矩阵
| 覆盖率 | 描述质量 | 诊断 | 优先动作 |
|---|---|---|---|
| 低 | 低 | AI不知道你的存在 | 先做信息铺设,补全基础信息和课程描述 |
| 低 | 高 | AI知道你但覆盖不足 | 扩展查询场景覆盖,补充更多维度的信息 |
| 高 | 低 | AI能搜到但描述苍白 | 优化信息结构,增加具体事实和可引用句子 |
| 高 | 高 | 表现良好 | 维护时效性,持续更新,监测竞品动态 |
3.2 优化优先级决策树
def decide_optimization_priority(eval_results): """根据评测结果决定优化优先级""" coverage = eval_results["coverage"]["score"] desc_quality = eval_results["description_quality"]["score"] consistency = eval_results["consistency"]["score"] freshness = eval_results["freshness"]["score"] # 决策逻辑 if coverage < 40: return "P0: 覆盖率过低,优先做信息铺设" elif consistency < 60: return "P0: 一致性不足,优先做多平台信息对齐" elif desc_quality < 50: return "P1: 描述质量不够,优先优化信息具体度和场景化" elif freshness < 50: return "P1: 信息过旧,优先做内容刷新和更新" elif coverage < 70: return "P2: 覆盖率还有提升空间,扩展测试查询集" else: return "维护模式:保持更新频率,监测竞品动态"四、工程化实践建议
4.1 评测频率
- 新机构(0-6个月):每周一次全量评测,快速迭代
- 成长期机构(6-18个月):每两周一次,关注趋势
- 成熟机构(18个月以上):每月一次,重点监测异常波动
4.2 注意事项
- AI模型版本变化:不同AI的推荐逻辑不同,评测应针对目标AI分别进行
- 避免过度测试:频繁测试同一问题可能触发限流,建议分散测试时间
- 测试用例迭代:定期更新测试查询集,模拟真实家长的提问变化
- 基线建立:首次评测建立基线,后续评测与基线对比
4.3 与业务动作的关联
评测框架的价值在于把"优化动作"和"效果变化"关联起来:
[第1周] 补全课程描述 → [第2周] 覆盖率从45%→55% [第3周] 统一多平台信息 → [第4周] 一致性从60%→85% [第5周] 引导具体好评 → [第6周] 描述质量从2.1→4.5这种关联让优化从"凭感觉"变成"看数据",也让投入更有方向感。
五、总结
教培机构AI获客优化正在从"信息铺设"阶段走向"精细化运营"阶段。Evaluation框架是精细化运营的基础设施——没有度量就没有优化。
5个核心指标(覆盖率/排名/描述质量/一致性/时效性)提供了评估维度的完整性,自动化Pipeline提供了持续追踪的可行性,诊断矩阵和决策树提供了从数据到行动的转化路径。
镜子AI在帮助教培机构做AI搜索可见度优化时,始终强调"先诊断再优化"——而诊断的核心就是这套评测框架。与其盲目堆信息,不如先跑一轮评测,找到最该优先修复的短板。