共计 1997 个字符,预计需要花费 5 分钟才能阅读完成。
背景与痛点
在智能对话系统中,Agent Skill 推荐是提升用户体验的关键环节。传统方案主要有两种:

- 规则引擎:基于预定义的 if-else 逻辑匹配用户 query 和技能。这种方案实现简单,但维护成本高,且难以覆盖复杂场景。
- 协同过滤:根据历史交互数据计算技能相似度。虽然能发现隐含关联,但面临严重的冷启动问题——新技能或低频技能难以获得推荐机会。
我们在实际业务中还观察到两个典型问题:
- 长尾分布:头部 5% 的技能占据了 90% 的请求,大量低频技能无法触达用户
- 语义鸿沟:用户 query 与技能名称的字面匹配度低(如 ” 帮我订机票 ” vs “ 航班预订服务 ”)
技术选型
对比主流方案后,我们选择 双塔模型 + 语义匹配 的混合架构,核心考虑点包括:
- BERT:在意图识别阶段表现优异,但在线推理延迟高(300ms+)
- GNN:适合挖掘技能间拓扑关系,但对动态新增技能支持差
- 双塔模型:平衡效果与性能,通过分离用户塔和技能塔实现高效向量检索
最终方案组合:
1. 轻量级 BERT 变体(DistilBERT)处理用户 query
2. 技能侧使用静态特征(调用频次、成功率等)+ 动态 embedding
3. 混合召回策略(语义匹配 + 行为协同)
系统架构
推荐系统采用经典的三层架构:
graph TD
A[在线服务] --> B[召回层]
A --> C[排序层]
A --> D[策略层]
B --> B1[语义召回]
B --> B2[行为召回]
C --> C1[精排模型]
C --> C2[实时特征]
D --> D1[业务规则]
D --> D2[流量分配]
核心组件说明:
- 特征工程
- 用户侧:query 分词、意图分类、历史行为序列
-
技能侧:服务等级协议(SLA)、上下文依赖、领域标签
-
召回排序
- 一级召回:ANN 搜索(FAISS)获取 Top100 候选
-
精排模型:DeepFM 处理交叉特征
-
在线服务
- 基于 Flask 的轻量 API 服务
- Redis 缓存热点技能特征
代码实现
关键代码模块示例:
# 特征提取示例
class SkillFeatureGenerator:
def __init__(self, skill_meta):
self.skill_embedding = load_pretrained_embedding()
def transform(self, skill_id):
"""生成技能特征向量"""
meta = self.skill_meta[skill_id]
# 静态特征
stat_feat = [meta['invoke_count'],
meta['success_rate'],
meta['avg_latency']
]
# 动态 embedding
dyn_feat = self.skill_embedding[skill_id]
return np.concatenate([stat_feat, dyn_feat])
# 模型训练片段
def train_double_tower():
user_model = DistilBertModel.from_pretrained('distilbert-base')
skill_model = tf.keras.Sequential([layers.Dense(256, activation='relu'),
layers.LayerNormalization()])
# 对比损失
loss = tfa.losses.TripletSemiHardLoss()
# 自定义采样器解决长尾问题
sampler = WeightedRandomSampler(weights=compute_class_weight('balanced', classes, y),
num_samples=len(train_data)
)
性能优化
生产环境中我们实施了以下优化措施:
- 模型量化
- 将精排模型从 FP32 转为 INT8,推理速度提升 2.3 倍
-
使用 TensorRT 优化 BERT 计算图
-
缓存策略
- 技能特征缓存 TTL 设置为 5 分钟
-
实现请求级缓存(相同 query 返回相同结果)
-
异步处理
- 非关键特征(如实时点击率)通过消息队列更新
- 离线特征预计算存入特征库
避坑指南
实际部署中遇到的典型问题:
- 数据漂移
- 现象:线上效果每周衰减 15%
-
解决方案:
- 建立自动化监控报表
- 实现模型热更新机制
-
服务雪崩
- 现象:特征服务超时引发连锁故障
-
改进措施:
- 为特征查询添加熔断器(Hystrix)
- 实施分级降级策略
-
评估陷阱
- 离线 AUC 提升但线上无效果
- 原因:测试集与线上分布不一致
- 改进:构建时间敏感的验证集划分策略
总结与展望
当前系统在业务指标上取得了显著提升:
– 推荐准确率提升 32%(A/ B 测试)
– 第 90 百分位延迟从 450ms 降至 210ms
未来优化方向:
1. 强化学习:考虑用户长期满意度优化目标
2. 联邦学习:在隐私保护前提下利用跨域数据
3. 多模态扩展:处理语音、图像等新型输入
实践表明,推荐系统的建设是持续迭代的过程。建议开发者先搭建最小可行系统(MVP),再逐步引入复杂组件。关键要建立完善的数据监控闭环,确保模型迭代有据可依。