一、问题:采集之前的工程准备
在向AI平台发起批量提问之前,有一项容易被忽视但至关重要的工程准备工作:问题库的构建与治理。
问题的质量直接决定了采集到的回答样本是否可用。如果问题覆盖面不够、意图分类不清晰、表达方式不符合真实用户习惯,那么后续无论做多精细的数据清洗和指标计算,结果的参考价值都会打折扣。
本文从数据工程角度,分享一套从问题库构建到AI回答样本指标输出的完整处理流程,重点涉及问题分类与场景标签、样本清洗与无效回答过滤、品牌别名合并、指标口径定义与聚合四个环节,并结合阿里云DataWorks + MaxCompute给出可复用的实现方案。
二、整体架构
整个流程分为六个阶段:
阶段 核心任务 依托组件 输出
① 问题库构建 围绕分析目标生成覆盖多意图的问题集 规则生成 + 人工审核 原始问题库表
② 问题分类与打标 按用户意图和场景维度分类 MaxCompute SQL + 规则匹配 带标签问题表
③ 分层采样 按场景维度均衡抽样,控制问题分布 MaxCompute采样函数 采样问题集
④ 采集 多平台API调用,获取回答 DataWorks调度 + 采集节点 原始回答表
⑤ 清洗与归一化 剔除无效样本,合并别名 MaxCompute UDF + 维表 标准化样本表
⑥ 指标聚合 按统一口径计算提及率、推荐率等 MaxCompute聚合查询 指标输出表
三、问题库构建与治理
3.1 问题库的数据结构
问题库需要记录每个问题的元信息,以便后续进行分层采样和分类分析:
CREATE TABLE question_bank (
question_id STRING COMMENT '问题唯一ID',
question_text STRING COMMENT '问题原文',
category STRING COMMENT '一级分类(如:推荐/对比/认知)',
sub_category STRING COMMENT '二级分类(如:购买决策/场景发现)',
target_entity STRING COMMENT '问题涉及的目标对象',
difficulty_level INT COMMENT '问题复杂度 1-5',
is_active BOOLEAN COMMENT '是否启用',
created_at DATETIME
) PARTITIONED BY (dt STRING);
3.2 问题分类体系
问题分类需要覆盖用户可能向AI提问的主要意图类型。参考实际用户行为分析,可以将问题分为以下类别:
分类代码 分类名称 典型问题示例 分析价值
REC 推荐决策 “有哪些值得推荐的XX?” 衡量推荐率
CMP 对比分析 “A和B有什么区别?” 衡量差异化认知
PUR 购买意图 “选XX时应该优先考虑哪个?” 衡量购买导向推荐
SCN 场景发现 “XX场景下有什么解决方案?” 衡量场景匹配度
NAV 信息导航 “XX品牌主要是做什么的?” 衡量解释能力
RIS 风险判断 “XX品牌靠谱吗?” 衡量风险认知
3.3 问题分类的规则实现
-- 基于关键词规则的自动分类
SELECT
question_id,
question_text,
CASE
WHEN question_text REGEXP '推荐|选哪个|哪家好|值得买|选择什么' THEN 'REC'
WHEN question_text REGEXP '区别|对比|相比|哪个更|差异|优势' THEN 'CMP'
WHEN question_text REGEXP '购买|价格|多少钱|下单|采购|预算' THEN 'PUR'
WHEN question_text REGEXP '场景|适合|怎么用|解决方案|应用' THEN 'SCN'
WHEN question_text REGEXP '是什么|什么意思|介绍|定义|背景' THEN 'NAV'
WHEN question_text REGEXP '靠谱|安全|风险|问题|投诉|可信' THEN 'RIS'
ELSE 'OTHER'
END AS category
FROM question_bank;
3.4 分层采样策略
问题库构建完成后,需要按分类维度进行分层采样,确保各场景类别在采集样本中均有合理覆盖,避免某一类问题占比过高导致指标偏差。
-- 按分类分层采样,每类抽取指定数量
WITH stratified_sample AS (
SELECT
question_id,
question_text,
category,
ROW_NUMBER() OVER (PARTITION BY category ORDER BY RAND()) AS rn
FROM question_bank
WHERE is_active = TRUE
)
SELECT
question_id,
question_text,
category
FROM stratified_sample
WHERE rn <= 20; -- 每类抽取20个
四、采集与样本清洗
4.1 无效样本的典型特征
采集到的AI回答中,有相当比例需要剔除:
类型 特征 清洗方式
明确拒答 含“无法回答”“不能提供”等 关键词匹配
内容过短 少于20个字符 长度过滤
语义偏离 回答与问题无关 相似度阈值(可选)
格式异常 乱码、截断、重复 规则+长度校验
4.2 基于问题分类的清洗校验
清洗后的样本需要按问题分类进行数据量校验,确保各类别样本数满足后续分析需求:
-- 按分类统计清洗后的样本数
SELECT
q.category,
COUNT(DISTINCT a.sample_id) AS sample_count,
COUNT(DISTINCT a.question_id) AS question_count
FROM valid_samples a
JOIN question_bank q ON a.question_id = q.question_id
GROUP BY q.category
ORDER BY sample_count DESC;
五、品牌别名合并
5.1 别名映射与问题库的关联
品牌别名映射不仅需要在回答端处理,还需要与问题库关联——如果问题中已经使用了品牌别名,需要能够反向映射到标准品牌ID。
CREATE TABLE entity_alias_mapping (
canonical_id STRING,
canonical_name STRING,
alias_name STRING,
alias_type STRING,
status STRING
);
5.2 归一化ETL
SELECT
COALESCE(m.canonical_id, 'UNKNOWN') AS entity_id,
COALESCE(m.canonical_name, extracted.entity_raw) AS entity_name,
extracted.sample_id,
extracted.question_id,
q.category AS question_category
FROM entity_extraction_results extracted
LEFT JOIN entity_alias_mapping m
ON extracted.entity_raw = m.alias_name AND m.status = 'active'
LEFT JOIN question_bank q
ON extracted.question_id = q.question_id;
六、指标口径定义与聚合
6.1 核心指标及口径说明
指标口径的定义需要在数据聚合前明确,确保计算结果可解释、可复核:
指标 计算公式 口径说明
提及率 提及样本数 / 有效样本总数 × 100% 同一问题中同一实体最多计一次
推荐率 推荐样本数 / 有效样本总数 × 100% 含强推荐和一般推荐
强推荐率 强推荐样本数 / 有效样本总数 × 100% 仅统计“首选”“最佳”等
场景提及率 某场景中提及样本数 / 该场景样本总数 × 100% 按分类维度细分
6.2 按问题分类的指标聚合
SELECT
entity_id,
entity_name,
q.category,
COUNT(DISTINCT a.sample_id) AS sample_count,
COUNT(DISTINCT CASE WHEN is_mentioned = 1 THEN a.sample_id END) AS mention_count,
COUNT(DISTINCT CASE WHEN is_recommended = 1 THEN a.sample_id END) AS recommend_count,
ROUND(mention_count 100.0 / sample_count, 2) AS mention_rate,
ROUND(recommend_count 100.0 / sample_count, 2) AS recommend_rate
FROM labeled_samples a
JOIN question_bank q ON a.question_id = q.question_id
WHERE a.is_valid = 1
GROUP BY entity_id, entity_name, q.category
ORDER BY entity_id, q.category;
6.3 综合指标计算
综合得分建议按问题分类设置差异化权重,因为不同场景下各指标的重要性不同:
WITH entity_category_metrics AS (
SELECT
entity_id,
entity_name,
category,
mention_rate,
recommend_rate
FROM entity_metrics_by_category
)
SELECT
entity_id,
entity_name,
-- 推荐决策类:推荐率权重更高
SUM(CASE
WHEN category = 'REC' THEN 0.6 recommend_rate + 0.3 mention_rate
WHEN category = 'NAV' THEN 0.3 recommend_rate + 0.5 mention_rate
ELSE 0.4 recommend_rate + 0.4 mention_rate
END) / COUNT(DISTINCT category) AS weighted_composite_score
FROM entity_category_metrics
GROUP BY entity_id, entity_name;
七、数据质量保障
7.1 问题层面的质量校验
分类覆盖度:各类别问题数量是否均衡,是否存在某类问题过少
问题有效性:问题是否清晰、无歧义、符合真实用户表达习惯
问题独特性:是否存在大量语义重复的问题
7.2 样本层面的质量校验
清洗率监控:各问题类别、各平台的无效样本比例是否在合理范围内
样本量充足性:各分类维度下的样本数是否满足统计分析需求
别名覆盖率:别名映射表是否覆盖了回答中出现的常见别名
7.3 DataWorks任务编排与质量规则
DataWorks质量规则配置示例
规则名称: 样本量检查
检查对象: valid_samples
检查条件: COUNT() >= 1000
告警阈值: COUNT() < 500规则名称: 分类覆盖度检查
检查对象: valid_samples JOIN question_bank
检查条件: 每个category的样本数 >= 50
告警阈值: 存在category样本数 < 30
八、实践总结
从问题库到AI回答样本再到指标输出,数据工程的价值贯穿从采集前到计算后的全过程。问题库作为数据链路的起点,其质量直接影响后续所有环节的产出。
整个流程中的几个关键节点:
问题分类决定了分析的粒度。分类过细则样本稀疏,分类过粗则分析价值不足。建议基于实际业务场景设计分类体系,并保留一定的灵活性以便后续调整。
分层采样保障了样本的代表性。如果某类问题占比过高,指标会向该场景偏移;反之,样本量不足则统计显著性不足。分层采样是平衡这两者的工程手段。
指标口径需要在聚合前明确。提及率、推荐率的计算公式在不同场景下可能有不同定义,口径不一致会导致结果不可比。建议在DataWorks中将口径逻辑封装为可复用的函数或视图。
在阿里云技术栈上,DataWorks的任务编排能力支撑了从问题库更新、采样、采集到清洗、聚合的完整链路,MaxCompute的计算能力保障了大规模问题库和回答样本的处理效率,数据质量规则保障了各环节产出的可靠性。