1. 项目背景与核心问题
去年春节前夕,我团队接到一个有趣的需求:为某社交平台开发智能祝福语生成功能。产品经理的原话是"要让用户感觉每句祝福都像量身定制"。最初我们尝试用传统NLP模型生成祝福语,但很快发现两个致命问题:
- 生成内容虽然语法正确,但缺乏情感共鸣(用户反馈"像机器人写的")
- 无法结合具体对象特征(比如对长辈和同事用同样的祝福模板)
这时我们注意到RAG(Retrieval-Augmented Generation)架构在个性化内容生成领域的潜力。但将祝福语这种高度依赖语境和情感表达的短文本塞进向量数据库,真的能实现"走心"效果吗?经过三个月的实战验证,我们得出了些反直觉的结论。
2. 技术方案设计
2.1 传统方法的局限性
最初我们测试了三种主流方案:
| 方案 | 优点 | 缺点 |
|---|---|---|
| 规则模板 | 响应快,成本低 | 多样性差,需人工维护大量模板 |
| GPT微调 | 生成流畅自然 | 训练成本高,存在幻觉风险 |
| 纯向量检索 | 内容质量稳定 | 缺乏创造性,组合生硬 |
特别是在测试"给刚升职的老同学写祝福"场景时,纯向量检索返回的结果是:"恭喜升职!祝你事业蒸蒸日上"。虽然正确但过于通用,而GPT微调版生成:"听说你征服了新的高度,就像我们当年一起登顶泰山时那样..." 后者明显更有记忆点,但存在30%概率虚构不存在的事件。
2.2 RAG混合架构设计
最终方案采用三阶段流程:
-
知识库构建:
- 收集10万条人工撰写祝福语
- 每条标注:适用场景(春节/生日等)、对象关系(亲人/同事等)、情感强度(1-5分)
- 使用BAAI/bge-small-zh-v1.5模型生成768维向量
-
检索增强:
python复制def retrieve_blessings(query_embedding, top_k=3): # 计算余弦相似度 scores = np.dot(vectors, query_embedding.T) # 混合排序:60%相似度 + 20%情感分 + 20%热度分 combined_scores = 0.6*scores + 0.2*emotion_scores + 0.2*popularity return indices[np.argsort(combined_scores)[-top_k:]] -
生成控制:
- 将检索结果作为few-shot示例输入GPT-4
- 添加提示词:"请参考但不复制以下祝福语风格,结合用户描述的[具体事件]创作..."
关键发现:单纯增大向量库规模对效果提升有限。当祝福语超过5万条后,准确率仅提升2.3%,但检索延迟增加40ms。质量比数量更重要。
3. 实现细节与调优
3.1 向量编码的陷阱
测试发现,直接用原始祝福语文本编码效果不佳。我们改进的预处理流程:
-
信息增强:
text复制
原始文本:"生日快乐!" 增强后:"[生日祝福][亲密朋友][幽默风格]生日快乐!记得上次喝酒你..." -
维度优化:
- 测试发现768维向量中前300维承载了92%的有效信息
- 使用PCA降维后,检索速度提升3倍,精度仅损失1.8%
-
混合索引策略:
- 常规场景:使用FAISS索引
- 高并发场景:改用Milvus动态分区
3.2 情感量化方法
为给"走心"程度建模,我们设计了情感评估体系:
-
人工标注:邀请20人从三个维度评分(1-5分):
- 个性化程度
- 情感共鸣强度
- 创意新颖性
-
自动评估模型:
python复制class EmotionEvaluator: def __init__(self): self.tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese") self.model = AutoModelForSequenceClassification.from_pretrained("blessing-emotion-model") def predict(self, text): inputs = self.tokenizer(text, return_tensors="pt") outputs = self.model(**inputs) return outputs.logits.softmax(dim=1)[0][1] # 情感强度概率
实测该模型与人工评估的Pearson相关系数达到0.81。
4. 实战效果与反直觉发现
4.1 性能指标对比
| 指标 | 纯GPT | 纯检索 | RAG混合 |
|---|---|---|---|
| 情感得分 | 3.2 | 2.8 | 4.1 |
| 相关性 | 85% | 92% | 94% |
| 响应时间 | 1.2s | 0.3s | 0.8s |
| 意外率 | 18% | 2% | 5% |
4.2 关键经验
- 少即是多:展示3条候选祝福语比单条效果更好(选择率提升27%)
- 缺陷变特色:当系统无法确定具体信息时,生成"虽然不太了解细节,但..."开头的祝福,反而获得更高好评
- 冷启动方案:新用户首条祝福采用"时间胶囊"设计("一年后的今天,你会记得..."),分享率比常规祝福高40%
5. 典型问题解决方案
5.1 敏感场景处理
遇到用户输入"给刚离婚的朋友祝福"等敏感场景时:
- 检索阶段过滤负面关键词
- 生成时添加安全约束:
python复制safety_prompt = "请避免直接提及离婚,侧重表达对未来的美好祝愿"
5.2 多模态扩展
后期我们增加了图片祝福生成:
- 用CLIP编码用户上传的生活照
- 检索相似场景的祝福语
- 生成配图文案:"就像照片里那次旅行一样,愿生活永远充满惊喜"
这种方案的分享率是纯文本的2.3倍。
6. 系统优化方向
当前发现的待改进点:
- 长尾场景覆盖:对于"给宠物生日祝福"等罕见需求,准确率仅61%
- 实时个性化:无法动态结合聊天记录等上下文
- 文化适配:部分方言祝福语编码效果差(如粤语祝福准确率低15%)
我们正在尝试用LoRA微调小型化模型,在边缘设备实现实时适应。初步测试显示,结合用户历史行为的祝福语点击率可再提升22%。