Files

3184 lines
37 KiB
Markdown
Raw Permalink Normal View History

2026-09-09 22:05:00 +08:00
# 丹阳公益婚恋服务平台
# 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匹配机制最终可以概括为:
> **规则筛得准,双方都合适,红娘帮得上,用户自己选。**