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