Files
danyang-match/匹配推荐算法与公益红娘协同机制详细设计.md

3184 lines
37 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 丹阳公益婚恋服务平台
# V1.0 匹配推荐算法与公益红娘协同机制详细设计
版本:V1.0
适用范围:微信小程序用户端、公益红娘工作台、运营管理后台
设计目标:规则透明、结果可解释、双向匹配、人工可辅助、用户拥有最终决定权
---
# 第一章 设计目标
V1.0匹配系统不追求复杂AI。
核心目标只有五个:
1. 不推荐明显不符合的人
2. 必须同时考虑双方条件
3. 优先推荐更适合进一步了解的人
4. 告诉用户为什么推荐
5. 给公益红娘提供可靠候选,而不是让红娘从全库人工翻找
因此V1.0采用:
> **硬条件过滤 + 双向条件验证 + 规则评分 + 推荐排序 + 公益红娘人工辅助**
而不是:
- 黑盒AI
- 大模型直接判断婚恋匹配
- 深度学习推荐
- 向量数据库
- 颜值模型
- 收入阶层模型
---
# 第二章 匹配系统总体结构
```text
用户A
↓
建立候选池
↓
基础资格过滤
↓
A的“必须符合”检查B
↓
B的“必须符合”检查A
↓
双方硬条件全部通过
↓
计算A对B适配度
↓
计算B对A适配度
↓
计算双方综合分
↓
生成推荐理由
↓
排序
↓
去重/冷却/频控
↓
进入每日推荐/找对象/红娘候选
```
---
# 第三章 匹配系统最重要原则
必须是:
> **双向匹配。**
不是:
```text
A喜欢什么
↓
平台找一个符合A的人
```
而是:
```text
A符合B吗?
+
B符合A吗?
```
都通过,才有资格进入推荐候选池。
---
# 第四章 条件分两级
用户择偶条件统一分为:
## 4.1 Required
前端:
> 必须符合
含义:
> 不符合则直接淘汰。
---
## 4.2 Preferred
前端:
> 最好符合
含义:
> 不符合不会直接淘汰,但会降低推荐分。
---
# 第五章 V1支持的核心匹配字段
建议正式纳入算法的字段:
```text
年龄
身高
地区
婚姻状态
子女情况
学历
吸烟
饮酒
定居意愿
婚姻计划
生活方式
兴趣
```
其中最核心:
```text
年龄
地区
婚姻状态
子女情况
婚姻计划
定居意愿
```
---
# 第六章 不进入算法的字段
V1不建议直接用于匹配评分:
- 收入
- 房产
- 汽车
- 外貌
- 身份证地区
- 单位级别
- 家庭资产
- 用户照片颜值
- 工作单位知名度
避免让产品走向:
> 商业婚恋分层与“条件估价”。
---
# 第七章 候选人基础资格过滤
在计算任何分数前,先过滤。
候选人B必须满足:
```text
B != A
B.account_status = normal
B.profile_review = approved
B.relationship_status允许推荐
B.visible_in_recommendations = true
B有有效主头像
```
---
# 第八章 必须排除的关系
A与B存在以下任一情况:
直接排除:
```text
A blocked B
B blocked A
A passed B且仍处于冷却期
A与B已经successful
A与B已有active match
B账号风险受限
B暂停寻找
B退出婚恋服务
```
---
# 第九章 已经喜欢的用户
如果:
```text
A liked B
```
但B未回应。
不应继续频繁出现在A每日推荐。
应该进入:
> 我喜欢的。
避免重复展示。
---
# 第十章 对方已喜欢A
如果:
```text
B liked A
```
A还没有处理。
这类用户可以给予:
> 适度排序提升。
但不能直接告诉A:
> “因为TA喜欢你,所以排第一。”
除非在:
> 喜欢我的
模块明确展示。
---
# 第十一章 性别匹配规则
基于用户当前产品设定与个人择偶条件执行。
如果V1仅支持异性婚恋匹配,必须在产品规则和数据结构中明确。
如果未来支持更广泛的择偶方向,应扩展:
```text
preferred_gender
```
V1算法不要通过代码写死隐含规则,而应通过明确配置表达。
---
# 第十二章 年龄Required判断
例如A要求:
```text
28~35
required
```
如果B年龄:
```text
32
```
则通过。
如果:
```text
36
```
直接淘汰。
---
# 第十三章 年龄Preferred评分
例如:
```text
28~35
preferred
```
建议评分:
```text
范围内 100%
超出1岁 80%
超出2岁 60%
超出3岁 40%
超出4岁+ 0%
```
具体梯度配置化。
---
# 第十四章 身高规则
Required:
> 不在范围直接淘汰。
Preferred:
可按偏差计算。
例如:
```text
范围内 满分
差1~3cm 80%
差4~5cm 60%
差6~10cm 30%
更大偏差 0
```
---
# 第十五章 地区规则
地区是丹阳本地平台非常重要的字段。
建议支持:
```text
丹阳
镇江市区
镇江其他辖区
不限
```
未来可扩展省市区代码。
---
# 第十六章 地区匹配等级
示例:
```text
同一主要地区 100
同一镇江市范围 80
江苏其他地区 40
其他地区 20
```
但如果用户地区设置为Required:
必须严格执行用户选定范围。
---
# 第十七章 地区与“长期定居”结合
单纯看当前居住地不够。
例如:
A在丹阳。
B现在在南京,但:
> 明确愿意回丹阳长期定居。
这种情况可以获得一定适配分。
因此地区建议拆:
```text
当前生活区域
+
未来定居意愿
```
---
# 第十八章 婚姻状态规则
用户可选:
```text
未婚
离异
丧偶
```
Required:
> 候选状态必须在用户允许集合中。
Preferred:
> 符合则加分。
婚姻状态本身不做价值排序。
例如:
> 未婚不能默认比离异得分高。
只能根据用户自己的选择。
---
# 第十九章 子女情况
不要把:
> 有子女
默认设计成扣分。
正确规则:
```text
对方情况
是否符合用户自己的接受条件
```
例如:
```text
接受
不接受
视情况
```
---
# 第二十章 学历
学历作为较低权重条件。
原因:
> 学历不能直接代表婚恋适配程度。
因此即便用户设置Preferred:
也不应让学历对最终结果产生过大影响。
---
# 第二十一章 婚姻计划
婚姻计划是重要字段。
例如:
```text
半年内
1年内
1~2年
2年以上
顺其自然
```
建议匹配距离模型。
---
# 第二十二章 婚姻计划距离
例如:
```text
A:1年内
B:1年内
```
100%。
```text
A:1年内
B:1~2年
```
80%。
```text
A:半年内
B:2年以上
```
20%或更低。
---
# 第二十三章 定居意愿
对丹阳本地产品非常重要。
例如:
```text
长期在丹阳
愿意未来在丹阳
视情况
不考虑
```
双方:
> 一个必须丹阳,一个明确不愿丹阳。
即使其他条件很好:
也应该低分或直接排除。
---
# 第二十四章 吸烟与饮酒
属于生活方式匹配。
建议低~中权重。
不要做社会价值判断。
只是:
> 是否符合对方偏好。
---
# 第二十五章 兴趣匹配
兴趣:
> 不是必要条件。
计算:
```text
共同兴趣数
/
双方兴趣并集
```
可采用Jaccard Similarity:
```text
intersection(A,B)
-----------------
union(A,B)
```
例如:
A:
```text
旅行 阅读 运动 电影
```
B:
```text
旅行 运动 美食
```
共同:
```text
旅行 运动
```
用于低权重加分。
---
# 第二十六章 兴趣不能权重过高
兴趣相同:
> 不代表适合结婚。
所以V1建议兴趣:
> 5分左右。
主要用于:
- 推荐理由
- 排序细微区分
- 聊天破冰
---
# 第二十七章 生活方式评分
可以由以下字段组成:
```text
吸烟
饮酒
社交倾向
生活规律
户外/居家
家庭倾向
```
V1如果用户资料量不足:
> 先只使用吸烟、饮酒等已确认字段。
不要为了算法强制增加大量资料。
---
# 第二十八章 V1建议权重
推荐默认100分:
```text
年龄 15
地区 15
婚姻状态 10
子女情况 10
学历 5
身高 5
婚姻计划 15
定居意愿 10
生活方式 10
兴趣 5
--------------------
总计 100
```
这是系统默认权重。
后台必须允许版本化配置。
---
# 第二十九章 权重不是用户个人权重
V1建议:
用户只选择:
```text
必须符合
最好符合
```
不让普通用户自己调:
```text
年龄权重17
学历权重8
```
这会明显增加使用复杂度。
---
# 第三十章 单方向适配分
定义:
```text
Score(A→B)
```
表示:
> B有多符合A的择偶期待。
例如:
```text
年龄 15/15
地区 15/15
婚姻状态 10/10
子女 10/10
学历 5/5
身高 4/5
婚姻计划 12/15
定居 10/10
生活方式 8/10
兴趣 3/5
Score(A→B)=92
```
---
# 第三十一章 双方向评分
还必须算:
```text
Score(B→A)
```
例如:
```text
Score(A→B)=92
Score(B→A)=78
```
不能只展示92。
---
# 第三十二章 双向综合分公式
不建议简单:
```text
(92 + 78) / 2 = 85
```
因为平均数可能掩盖单方明显偏低。
建议V1采用:
```text
MutualScore =
0.6 × min(A→B, B→A)
+
0.4 × average(A→B, B→A)
```
---
# 第三十三章 综合公式示例
例如:
```text
A→B = 92
B→A = 78
```
则:
```text
min = 78
average = 85
MutualScore
= 0.6×78 + 0.4×85
= 80.8
```
这样可以体现:
> 双向适合比单方高分更重要。
---
# 第三十四章 为什么不用最低分直接作为最终分
如果:
```text
final = min(A→B,B→A)
```
虽然强调双向,但损失部分区分度。
因此:
> 最低分主导 + 平均分修正
更适合V1。
---
# 第三十五章 Required不参与补偿
重要:
> 不符合Required,直接淘汰。
不能:
```text
年龄不符合Required
但兴趣很多
所以总分仍有85
```
这是错误的。
---
# 第三十六章 算法完整伪代码
```text
function calculateMatch(A, B):
if not isEligible(A, B):
return REJECT
if !requiredMatch(A.preference, B.profile):
return REJECT
if !requiredMatch(B.preference, A.profile):
return REJECT
scoreAB = calculateDirectionalScore(A, B)
scoreBA = calculateDirectionalScore(B, A)
minScore = min(scoreAB, scoreBA)
avgScore = (scoreAB + scoreBA) / 2
mutualScore =
minScore * 0.6 +
avgScore * 0.4
reasons = generateReasons(A, B)
return {
scoreAB,
scoreBA,
mutualScore,
reasons
}
```
---
# 第三十七章 最低推荐阈值
建议初始:
```text
MutualScore >= 60
```
才能进入普通推荐候选。
后台可配置。
---
# 第三十八章 推荐等级
建议:
```text
85~100
很合适
70~84
比较合适
60~69
值得了解
<60
默认不推荐
```
前台:
> 不显示数字。
只显示文字等级和推荐理由。
---
# 第三十九章 为什么不显示百分比
不要显示:
```text
匹配度92%
```
原因:
这会让用户误以为:
> 92%概率适合结婚。
实际上只是规则评分。
因此前台建议:
```text
比较合适
值得了解
```
更加诚实。
---
# 第四十章 推荐理由生成原则
推荐理由必须:
> 来自真实数据。
不能让AI编。
---
# 第四十一章 推荐理由优先级
优先展示:
1. 双方都满足的重要条件
2. 本地生活
3. 婚姻计划
4. 定居意愿
5. 生活方式
6. 兴趣
---
# 第四十二章 推荐理由示例
```text
年龄符合双方的择偶要求
你们都长期生活在丹阳
你们对结婚时间的计划比较一致
双方都不吸烟
你们都喜欢运动和旅行
```
---
# 第四十三章 推荐理由不要出现
避免:
```text
系统认为你们很般配
AI判断你们适合结婚
成功概率86%
条件等级相近
经济实力匹配
```
---
# 第四十四章 推荐理由最多数量
首页:
> 3条。
详情:
> 最多4条。
不要展示十几条。
---
# 第四十五章 每日推荐策略
建议默认:
```text
6人/天
```
后台配置:
```text
5~10
```
不要做:
> 无限刷人。
---
# 第四十六章 为什么控制每日数量
公益婚恋平台核心不是:
> 增加刷卡时长。
而是:
> 让用户认真看有限、相对合适的人。
数量少还有利于:
- 候选资源利用
- 本地小用户池
- 降低疲劳
- 减少“逛商品”感觉
---
# 第四十七章 每日推荐生成方式
推荐两种:
## 方式A
用户打开首页时实时计算。
早期用户少:
> 完全可行。
## 方式B
每日提前生成推荐池。
用户量增大后:
> 推荐使用。
V1技术可以先:
> 候选实时计算 + Redis缓存。
---
# 第四十八章 每日推荐基本排序
候选池按照:
```text
1 MutualScore
2 双方Required完整度
3 新鲜度
4 对方活跃度
5 推荐历史
```
综合排序。
---
# 第四十九章 活跃度只能低权重使用
活跃用户可以稍微靠前。
但不能:
> 谁每天登录就永远排第一。
否则新用户和不高频用户会被饿死。
---
# 第五十章 活跃状态建议
例如:
```text
7天内活跃 正常
30天未登录 轻降权
90天未登录 明显降权
```
如果长期不活跃:
> 暂停推荐曝光。
具体周期后台配置。
---
# 第五十一章 新用户冷启动
新用户刚审核通过。
没有行为数据。
直接使用:
> Profile + Preferences规则匹配。
不需要行为推荐。
这正是V1规则算法的优势。
---
# 第五十二章 新用户适度曝光
新审核通过用户可以获得:
> 轻度新鲜度加权。
例如:
```text
前7天
+少量排序修正
```
目的:
> 避免新人长期没有曝光。
不能过度加权。
---
# 第五十三章 曝光公平性
如果只按最高分排序:
少数高分用户可能:
> 每天被大量推荐。
其他人没人看到。
因此需要:
> Exposure Balance。
---
# 第五十四章 曝光控制
建议记录:
```text
最近7天曝光次数
最近30天曝光次数
```
当候选人短期曝光明显过多:
> 轻微降权。
---
# 第五十五章 曝光平衡不是平均主义
仍然应该:
> 匹配度优先。
公平性只是:
> 同等匹配程度下的排序修正。
---
# 第五十六章 推荐排序最终分
可以定义内部:
```text
RankingScore =
MutualScore
+ FreshnessBoost
+ ActivityBoost
+ ReciprocityBoost
- ExposurePenalty
- RepeatPenalty
```
---
# 第五十七章 修正项范围必须小
例如:
```text
FreshnessBoost 0~3
ActivityBoost 0~2
ReciprocityBoost 0~3
ExposurePenalty 0~5
RepeatPenalty 0~10
```
核心100分匹配不能被运营修正彻底覆盖。
---
# 第五十八章 ReciprocityBoost
如果B已经喜欢A:
可以:
```text
+3
```
让双方更容易在推荐中相遇。
这可以提高:
> 双向匹配效率。
但不能绕过Required。
---
# 第五十九章 RepeatPenalty
同一候选人已经展示多次:
应该降权。
例如:
```text
已曝光1次 0
2次 -3
3次 -6
```
如果用户明确Pass:
直接进入冷却,不再靠Penalty。
---
# 第六十章 推荐冷却机制
建议:
### 仅曝光未操作
7~30天后可以再次出现。
### 用户Pass
较长冷却。
建议:
> 180天可配置。
### Unmatch
默认长期排除。
### Block
直到用户主动解除。
---
# 第六十一章 用户池很小时怎么办
丹阳本地早期很可能遇到:
> 符合条件的人很少。
系统不能擅自放宽:
> Required。
---
# 第六十二章 无候选时处理顺序
```text
第一步:
确认是否真的没有满足Required的人
第二步:
扩大Preferred条件容忍范围
第三步:
向用户提示可调整择偶条件
第四步:
提供公益红娘入口
```
---
# 第六十三章 不允许后台偷偷改Required
运营管理员不能:
> 为了让推荐更多,自动放宽用户的必须条件。
这是用户明确偏好。
只有用户本人:
> 修改。
---
# 第六十四章 Preferred自动放宽
Preferred允许系统做适度容忍。
例如:
年龄最好:
```text
30~35
```
可逐步考虑:
```text
29或36
```
但得分下降。
---
# 第六十五章 放宽顺序
建议按影响从低到高:
```text
兴趣
↓
生活方式
↓
身高
↓
学历
↓
年龄Preferred
↓
地区Preferred
```
婚姻状态、子女等是否放宽:
> 必须严格按照用户设置和业务含义处理。
---
# 第六十六章 “找对象”与“每日推荐”算法区别
每日推荐:
> 系统主动精选。
找对象:
> 用户主动筛选。
两者底层候选资格规则相同。
---
# 第六十七章 找对象排序
默认:
```text
综合推荐
```
可后续提供:
```text
最近活跃
年龄
```
V1不建议增加太多排序。
---
# 第六十八章 临时筛选不修改择偶条件
例如用户临时筛:
> 30~32岁。
只影响当前Find结果。
不能覆盖:
> 我的择偶条件。
---
# 第六十九章 红娘候选算法
公益红娘工作台调用:
> 同一个Match Engine。
但可以看到更多解释信息。
---
# 第七十章 红娘候选列表结构
建议:
```text
王女士 32岁
双向综合:高
A→B:较高
B→A:较高
Required:
全部符合
主要推荐理由:
✓ 年龄
✓ 丹阳
✓ 婚姻计划
```
红娘不需要看到复杂数学公式。
---
# 第七十一章 红娘比普通用户多看到什么
可以多看到:
- 哪些Required通过
- 哪些Preferred不符合
- 双方婚恋计划差异
- 用户最近推荐情况
- 是否长期没有Match
目的是:
> 帮助人工判断。
---
# 第七十二章 红娘不能看到什么
不能因为匹配工作看到:
- 身份证
- 完整聊天
- 举报证据
- 无关风险内部材料
- 精确家庭住址
---
# 第七十三章 红娘人工推荐机制
流程:
```text
用户A申请红娘帮助
↓
Match Engine生成候选
↓
红娘查看候选
↓
人工判断
↓
选择B
↓
填写推荐理由
↓
发送给A
↓
A自己决定喜欢/不合适
```
---
# 第七十四章 红娘人工判断可以补充什么
算法难以完全处理:
- 用户真实表达偏好
- 近期家庭计划
- 对沟通风格的期待
- 用户主动向红娘说明的特殊情况
红娘可以在用户授权范围内:
> 人工辅助判断。
---
# 第七十五章 红娘不能覆盖Required
再次强调:
```text
算法Required失败
↓
红娘不可直接推荐
```
如果红娘认为用户设置过严:
应:
> 建议用户修改。
用户确认修改后:
> 重新计算。
---
# 第七十六章 红娘建议修改择偶条件
红娘可以说:
> “目前符合你全部必须条件的用户较少,是否考虑把学历从必须符合改成最好符合?”
用户可以:
```text
接受
拒绝
```
只有用户接受:
> 系统更新条件。
---
# 第七十七章 红娘不得代修改
后台不能提供:
> 直接替用户改择偶条件
普通按钮。
若特殊线下协助确需操作:
必须:
- 明确用户授权
- 留操作日志
- 告知用户变更结果
V1建议仍由用户本人改。
---
# 第七十八章 红娘联系意向对象流程
例如A:
> 希望红娘帮我联系B。
系统:
```text
A明确申请
↓
红娘确认B仍可联系
↓
向B发系统通知
↓
“有一位用户希望进一步了解你”
↓
B自主查看/决定
```
---
# 第七十九章 不直接给手机号
红娘不能:
```text
A想了解B
↓
直接把B手机号发给A
```
正确:
> 平台内发起意向。
---
# 第八十章 红娘推荐来源标记
推荐记录:
```text
source = matchmaker
```
与:
```text
daily
discover
activity
```
区分。
方便后续统计:
> 哪种方式转化更好。
---
# 第八十一章 红娘效果评价
不要只看:
> 红娘推荐了多少人。
建议看:
```text
服务人数
推荐人数
查看率
喜欢率
双向匹配率
正在了解率
成功牵手率
```
---
# 第八十二章 不做红娘排行榜
V1不建议:
```text
金牌红娘Top10
牵手王
红娘PK榜
```
公益服务不需要游戏化竞争。
---
# 第八十三章 红娘工作量控制
后台建议:
```text
每位红娘服务中用户数
待跟进数
超时数
```
管理员据此分配。
---
# 第八十四章 长时间无匹配用户识别
系统可以识别:
```text
审核通过30天
+
有活跃
+
无双向匹配
```
标记:
> 可关注。
---
# 第八十五章 长期无结果原因分析
系统可给红娘提示:
```text
候选池过小
Required过多
地区范围很窄
用户很少主动Like
资料完整度一般
```
不能写:
> “用户条件太差”。
---
# 第八十六章 用户资料完整度与推荐
资料未完整:
> 本就不能审核通过。
审核后仍有选填项缺失:
不应该直接重罚。
但信息越完整:
> 推荐理由可能更充分。
---
# 第八十七章 照片数量与排序
不能因为:
> 上传6张照片
就比:
> 只上传2张照片
获得明显匹配加分。
否则会诱导用户过度上传。
照片主要影响:
> 用户自己判断。
不是算法核心分。
---
# 第八十八章 被喜欢数量不能作为质量分
禁止:
```text
被喜欢越多
→ 排名越高
```
否则会形成:
> 马太效应。
---
# 第八十九章 热门用户控制
如果一个用户短时间收到大量Like:
系统可以:
> 降低曝光频率。
避免其积累大量无法处理的意向。
---
# 第九十章 双向匹配效率指标
核心指标:
```text
Mutual Match Rate =
双向匹配数
/
有效Like数
```
但不能只优化这个指标。
---
# 第九十一章 更重要的最终指标
长期真正关注:
```text
聊天建立率
持续沟通率
正在了解率
线下见面率
成功牵手率
```
V1先把数据记录好。
---
# 第九十二章 推荐算法不能只追求点击
如果只优化:
> 用户点击喜欢。
可能会把系统变成:
> 外貌刷人产品。
所以V1不做点击率机器学习。
---
# 第九十三章 用户反馈闭环
推荐后行为:
```text
查看
喜欢
Pass
Match
Unmatch
成功
```
都记录。
未来可以优化规则。
但V1不做自动机器学习。
---
# 第九十四章 Pass原因V1策略
前面已确定:
> 点击不合适不强制询问原因。
因此算法不能依赖:
> Pass原因。
减少用户操作负担。
---
# 第九十五章 Unmatch原因可用
解除匹配时已有原因选项。
可以作为:
> 运营分析数据。
但V1不直接自动训练模型。
---
# 第九十六章 推荐规则版本
每条RecommendationRecord应记录:
```text
rule_version
```
例如:
```text
v1
v2
```
以后修改权重:
可以比较效果。
---
# 第九十七章 权重修改流程
后台管理员:
```text
创建新版本
↓
检查权重总和
↓
保存草稿
↓
人工确认
↓
激活
```
不直接覆盖旧版本。
---
# 第九十八章 权重调整必须审计
记录:
```text
谁改
什么时候
旧值
新值
原因
```
避免运营人员随意调算法。
---
# 第九十九章 是否需要A/B测试
V1:
> 不需要复杂A/B平台。
如果以后需要:
可以按小比例用户测试新规则。
V1先:
> 一个正式规则版本。
---
# 第一百章 算法解释接口
后端建议:
```text
MatchResult {
scoreAB
scoreBA
mutualScore
level
reasons
requiredChecks
preferredChecks
}
```
普通用户DTO:
只返回:
```text
level
reasons
```
红娘DTO:
可增加:
```text
requiredChecks
preferredChecks
```
---
# 第一百零一章 推荐服务内部模块建议
```text
MatchEligibilityService
RequiredConditionService
DirectionalScoringService
MutualScoringService
RecommendationReasonService
RankingService
ExposureControlService
RecommendationHistoryService
```
不一定拆成独立微服务。
都可在Match模块内。
---
# 第一百零二章 MatchEligibilityService
负责:
- 账号状态
- 审核状态
- 婚恋状态
- 隐私
- Block
- 已有关系
- 冷却期
---
# 第一百零三章 RequiredConditionService
负责:
```text
A Required → B
B Required → A
```
必须纯规则、可测试。
---
# 第一百零四章 DirectionalScoringService
负责:
```text
Score(A→B)
```
输入:
```text
A preference
B profile
active rule config
```
输出:
```text
dimension scores
total
```
---
# 第一百零五章 MutualScoringService
负责公式:
```text
0.6 × min
+
0.4 × avg
```
后续公式如果变化:
> 不影响前端。
---
# 第一百零六章 ReasonService
只从:
> 已经通过的真实匹配字段
生成说明。
不能独立“创造”理由。
---
# 第一百零七章 RankingService
处理:
```text
MutualScore
+
Freshness
+
Activity
+
Reciprocity
-
Exposure
-
Repeat
```
最终输出顺序。
---
# 第一百零八章 ExposureControlService
维护:
```text
最近曝光量
单日曝光上限
重复推荐
```
避免热门用户被过度曝光。
---
# 第一百零九章 SQL候选池初筛
数据库先做:
```text
审核通过
账号normal
目标性别
年龄粗范围
地区粗范围
未暂停
隐私允许
```
例如先得到:
> 100~500个候选。
再在应用层计算。
---
# 第一百一十章 不建议数据库写超复杂评分SQL
不要把所有:
```text
CASE WHEN...
CASE WHEN...
```
都塞SQL。
V1:
> SQL过滤 + 应用层评分
更容易维护和测试。
---
# 第一百一十一章 Redis推荐缓存
可缓存:
```text
recommendation:{userId}:{date}
```
内容:
> 排序后的候选ID。
详情数据:
> 实时/短缓存读取。
---
# 第一百一十二章 推荐缓存失效事件
以下事件发生:
立即使相关缓存失效:
```text
修改择偶条件
资料审核变化
暂停寻找
成功牵手
Block
Unmatch
风险封禁
隐私修改
```
---
# 第一百一十三章 推荐时二次校验
即使缓存中有B:
真正返回卡片前:
> 再做轻量Eligibility检查。
避免:
> B刚暂停,A仍然看到。
---
# 第一百一十四章 算法性能目标
丹阳本地早期:
单用户候选池并不会非常大。
目标:
```text
候选过滤 < 300ms
评分排序 < 300ms
推荐接口整体 P95 < 1.5s
```
完全不需要重型推荐基础设施。
---
# 第一百一十五章 单元测试要求
每个维度至少测试:
- 完全符合
- 边界值
- Required失败
- Preferred部分符合
- Null/未填写
- 异常值
---
# 第一百一十六章 双向条件测试
必须测试:
```text
A接受B
B不接受A
```
结果:
> REJECT。
不是:
> 仍推荐给A。
---
# 第一百一十七章 地区边界测试
例如:
A:
```text
丹阳 required
```
B:
```text
南京
未来愿意丹阳
```
如果A要求的是:
> 当前居住地丹阳
则失败。
如果A要求的是:
> 未来定居丹阳
则按对应字段判断。
字段含义必须清楚。
---
# 第一百一十八章 Null字段处理
对于非必填选项:
候选人没有填写。
不能默认:
> 符合。
建议:
```text
Required + 对方未知
→ 不通过/不可判断
Preferred + 对方未知
→ 该维度0分或中性低分
```
具体按字段定义。
---
# 第一百一十九章 为什么Required未知不能自动通过
例如:
A:
> 不接受吸烟者,Required。
B:
> 没填吸烟状态。
系统不能假设:
> B不吸烟。
否则违反用户硬条件。
---
# 第一百二十章 信息不完整提示
如果由于关键Required字段未知导致候选池很少:
可以提示用户:
> 完善生活资料有助于更准确匹配。
而不是系统猜测。
---
# 第一百二十一章 推荐结果审计
对于每次推荐,可以保存:
```text
user_id
target_id
rule_version
mutual_score
reasons
shown_at
source
```
后续有投诉:
可以知道:
> 当时为什么推荐。
---
# 第一百二十二章 算法不应保存敏感推断
不要保存:
```text
用户大概率高收入
用户看起来性格强势
用户可能离婚风险高
```
这些都不属于V1。
---
# 第一百二十三章 红娘操作审计
红娘人工推荐必须记录:
```text
operator
user
target
reason
time
service_id
```
---
# 第一百二十四章 红娘推荐理由规范
建议:
> 基于资料事实。
例如:
```text
年龄、地区和婚姻计划均较符合,
双方都希望长期在丹阳生活,
建议进一步了解。
```
不要写:
```text
我觉得你们一定很合适。
```
---
# 第一百二十五章 系统与红娘边界
系统负责:
```text
筛
算
排
解释
```
红娘负责:
```text
看
判断
沟通
辅助
跟进
```
用户负责:
```text
最终决定
```
---
# 第一百二十六章 理想协同流程
```text
系统发现候选
↓
普通推荐有效?
├─ 是 → 直接推荐用户
└─ 用户长期无结果
↓
红娘介入
↓
系统提供候选解释
↓
红娘人工筛选
↓
用户自主决定
```
---
# 第一百二十七章 红娘不是“人工绕过算法”
红娘存在的价值不是:
> 算法不行,所以全人工。
而是:
> 算法做大规模初筛,人工处理复杂情况。
这是V1最适合公益组织的协同方式。
---
# 第一百二十八章 系统自动触发红娘建议
V1可以轻量提示:
如果用户:
```text
30天无Mutual Match
```
且活跃:
首页提示:
> 可以让公益红娘帮你进一步看看。
但:
> 不自动创建红娘服务。
用户自己申请。
---
# 第一百二十九章 红娘主动介入边界
V1建议:
> 默认用户申请后介入。
如果公益机构要主动服务:
必须有:
> 用户事先同意接受公益红娘推荐/协助。
没有同意:
> 不主动电话联系婚恋事项。
---
# 第一百三十章 自动推荐频率
每日一次主推荐即可。
不建议:
```text
上午推6个
中午推6个
晚上再推6个
```
避免打扰。
---
# 第一百三十一章 推荐通知
可以有:
> 今天有新的合适推荐。
但不是:
> 每个候选人一个通知。
降低骚扰感。
---
# 第一百三十二章 系统无法推荐时文案
正确:
> 暂时没有完全符合你条件的人。
可以:
> 调整“最好符合”的条件,或申请公益红娘帮助。
不要:
> 你的条件太高。
---
# 第一百三十三章 用户条件过窄提示
系统可计算:
```text
Required过滤前候选100
↓
Required过滤后0
```
可以判断:
> 条件较严格。
文案:
> 当前符合所有“必须符合”条件的人较少。
---
# 第一百三十四章 条件优化助手V1
不需要AI。
可以规则提示:
```text
你的6项条件中有5项设为必须符合,
当前候选范围较小。
```
按钮:
> 查看择偶条件。
---
# 第一百三十五章 不自动推荐“降低标准”
不要使用:
> 降低要求
文案。
建议:
> 调整条件
> 扩大了解范围
更加尊重用户。
---
# 第一百三十六章 未来AI升级接口预留
未来可增加:
```text
AICompatibilityService
```
但它只能:
> 作为额外排序信号。
不能替代:
- Required
- 用户隐私
- Block
- 账号状态
---
# 第一百三十七章 AI未来的正确位置
未来:
```text
硬条件过滤
↓
规则匹配
↓
AI辅助理解文本/兴趣
↓
排序微调
```
而不是:
```text
把两个用户资料扔给大模型
↓
问“适不适合结婚?”
```
---
# 第一百三十八章 不允许AI自动作婚姻判断
未来也不能对用户输出:
> “AI判断你们婚后幸福率89%。”
这种结果既不可验证,也容易误导。
---
# 第一百三十九章 算法核心监控指标
运营后台建议:
```text
候选池平均人数
无候选用户比例
每日推荐完成率
详情查看率
Like率
Mutual Match率
Chat启动率
Unmatch率
红娘介入率
```
---
# 第一百四十章 性别供需统计
本地平台需要关注:
```text
男女用户数量
各年龄段比例
各地区比例
```
但只是:
> 运营参考。
不能用于对用户差别收费,因为本项目永久免费。
---
# 第一百四十一章 候选池健康度
后台可以显示:
例如:
```text
30~35岁男性
有效候选 83
30~35岁女性
有效候选 61
```
帮助公益组织:
> 设计线下活动和招募宣传。
---
# 第一百四十二章 红娘运营数据
建议:
```text
平均接单时间
平均首次跟进时间
平均服务时长
平均推荐人数
推荐后Like率
Match率
```
不建议只统计:
> 电话打了多少个。
---
# 第一百四十三章 算法配置权限
只有:
```text
超级管理员
或
指定算法配置管理员
```
可修改。
普通红娘:
> 只读。
---
# 第一百四十四章 推荐规则回滚
新规则出现异常:
后台支持:
> 激活旧版本。
不要现场改数据库权重。
---
# 第一百四十五章 推荐规则发布前检查
系统自动检查:
```text
权重总和=100
最低分0~100
所有必要字段存在
规则版本唯一
```
---
# 第一百四十六章 推荐算法V1完整数据流
```text
用户进入首页
↓
RecommendationService
↓
检查缓存
├─ 有
│ ↓
│ Eligibility二次校验
│
└─ 无
↓
数据库初筛候选
↓
Required双向过滤
↓
Score A→B
↓
Score B→A
↓
MutualScore
↓
RecommendationReasons
↓
Ranking修正
↓
Exposure控制
↓
写RecommendationRecord
↓
Redis缓存
↓
返回6位
```
---
# 第一百四十七章 红娘协同完整数据流
```text
用户申请红娘
↓
建立MatchmakerService
↓
分配红娘
↓
系统调用Match Engine
↓
生成候选列表
↓
红娘查看:
Required
Preferred
推荐理由
历史服务
↓
人工筛选
↓
推荐给用户
↓
用户自主查看
↓
Like / Pass
↓
正常Relationship流程
```
---
# 第一百四十八章 核心验收场景一
A条件:
```text
年龄30~35 Required
丹阳 Required
本科以上 Preferred
```
B:
```text
32
丹阳
大专
```
A→B:
> Required通过。
学历Preferred不满足:
> 扣相应分。
仍可推荐。
---
# 第一百四十九章 核心验收场景二
A要求B符合。
但B要求:
```text
年龄40~45 Required
```
A只有36。
即使A非常喜欢B:
> 系统不应推荐。
因为:
> B的Required不接受A。
---
# 第一百五十章 核心验收场景三
系统评分:
```text
A→B 95
B→A 62
```
不能显示:
> 95分超高匹配。
最终双向分应明显受到:
> 62
影响。
---
# 第一百五十一章 核心验收场景四
A Pass B。
B第二天高分候选。
仍:
> 不应该重新推荐给A。
必须遵守冷却。
---
# 第一百五十二章 核心验收场景五
A Block B。
红娘搜索B准备推荐给A。
系统必须:
> 排除。
不能靠红娘记忆。
---
# 第一百五十三章 核心验收场景六
用户有5项Required导致候选0。
系统:
> 不偷偷放宽。
而是:
```text
暂时没有完全符合条件的人
+
修改择偶条件
+
公益红娘
```
---
# 第一百五十四章 核心验收场景七
红娘推荐B给A。
A查看后Pass。
系统记录:
```text
source = matchmaker
action = passed
```
后续不要不断由其他红娘重复推荐B。
---
# 第一百五十五章 V1明确不建设
不建设:
- 深度学习推荐
- 协同过滤
- AI婚恋预测
- LLM自动决定对象
- 人脸颜值评分
- 财富评分
- “高价值用户”标签
- 用户等级
- 热门榜
- 付费曝光
- 超级喜欢
- Boost
- AI聊天代聊
---
# 第一百五十六章 匹配系统开发优先级
## P0
```text
Eligibility
Required双向过滤
DirectionalScore
MutualScore
RecommendationReason
每日推荐
Like/Pass排除
```
---
## P1
```text
曝光控制
新用户修正
活跃度修正
对方已喜欢轻度Boost
红娘候选
```
---
## P2
```text
长期无结果分析
候选池健康度
规则效果对比
更完善的运营统计
```
---
# 第一百五十七章 推荐系统代码验收标准
任何算法版本必须:
- 相同输入得到稳定结果
- Required绝不被软分覆盖
- 双向评分
- 规则可配置
- 规则版本化
- 推荐理由可解释
- 不访问不需要的敏感数据
- Block即时生效
- 用户状态即时生效
- 有单元测试
---
# 第一百五十八章 公益红娘协同验收标准
必须做到:
> 红娘不需要从全部用户中盲目搜索。
> 系统先提供合格候选。
> 红娘可以理解为什么推荐。
> 红娘不能突破用户硬条件。
> 红娘不能替用户喜欢。
> 红娘不能私自提供联系方式。
> 红娘每次推荐都有记录。
---
# 第一百五十九章 V1核心算法公式最终确定
候选资格:
```text
Eligible
AND
Required(A→B)
AND
Required(B→A)
```
方向评分:
```text
Score(A→B) = Σ DimensionScore × Weight
```
双向综合:
```text
MutualScore =
0.6 × min(ScoreAB, ScoreBA)
+
0.4 × average(ScoreAB, ScoreBA)
```
排序:
```text
RankingScore =
MutualScore
+ SmallPositiveAdjustments
- ExposureAndRepeatPenalty
```
---
# 第一百六十章 最终设计原则
V1.0匹配系统必须坚持:
> **先排除不合适,再判断谁更合适。**
> **双方条件同等重要。**
> **用户“必须符合”的条件系统不得偷偷修改。**
> **评分是排序工具,不是假装预测婚姻幸福。**
> **推荐必须能解释。**
> **兴趣只能辅助,不能替代核心婚恋条件。**
> **不能根据财富、外貌、人气给用户隐性分级。**
> **算法负责大规模初筛,红娘负责复杂人工辅助。**
> **红娘不能突破系统安全和用户自主权。**
> **最终喜欢谁、是否聊天、是否进一步交往,始终由用户本人决定。**
整个V1.0匹配机制最终可以概括为:
> **规则筛得准,双方都合适,红娘帮得上,用户自己选。**