fix:更新算法

This commit is contained in:
吕新雨
2026-02-02 11:22:35 +08:00
parent 814b96edb6
commit 58d17fc39f
27 changed files with 3286 additions and 62 deletions

View File

@@ -0,0 +1,81 @@
# 子模块Reco Engine推荐引擎编排Spec
## 1. 目标描述
实现推荐的主编排器Orchestrator
- 输入用户画像 + 历史集合 + 场景参数。
- 调用 `Content Repository` 拉取候选。
- 执行统一 PipelineCandidate → Hard Filter → Soft Scoring → Rerank/Freqcap → Fallback Ladder。
- 输出推荐句子与 `meta`(可观测字段),供 API 或 Celery 上层直接下发。
---
## 2. 输入 / 输出定义
### 2.1 输入
- `scene`: `feed | push | widget`
- `user_profile`: 客户端问卷画像V1.2
- `already_recommended_ids`: `List[str|int]`
- `touched_or_viewed_ids`: `List[str|int]`
- `k`: intfeed 默认 30push/widget 默认 1
- `now`: 时间戳
- (可选)`constraints`:黑名单 author/template、最大候选量上限等
### 2.2 输出
- `items: List[RecommendedItem]`(长度 ≤ k
- `content_id``text``final_score`
- `fallback_level_final`
- `explanations`(可选,便于调参/排查)
- `meta: RecoMeta`
- `candidate_pool_size_raw`
- `candidate_pool_size_after_hard_filter`
- `candidate_pool_size_after_dedup`
- `candidate_pool_size_after_freqcap`
- `fallback_level_final`
- `served_k`
- `empty_reason`served_k=0 必填)
- `missing_fields`need/context/emotion 的缺失情况)
- `scene``conf_U`
---
## 3. 缺失字段判定(必须与客户端契约一致)
- `U.need` 为空对象 `{}` 或不存在 → 视为缺失
- `U.context` 为空对象 `{}` 或不存在 → 视为缺失
- `U.emotion_score``null`/不存在 → 视为缺失
当缺失明显或 `conf_U` 偏低时:
- Push必须启用不确定性惩罚 `P_uncertainty`,并自动降个性化(限制 `personalization_power` 上限)。
- 任意场景:候选生成至少按 **L1** 处理(降个性化,增加通用安全占比)。
---
## 4. Fallback Ladder回退梯度必须实现
- L0正常召回配比
- L1放宽匹配 + `personalization_power ≤ 0.5`
- L2回退通用池 + `personalization_power = 0`
- L3仅安全池白名单/安全池)
触发条件(任一满足即可回退):
- 候选池为空 / Hard Filter 清空 / 去重清空 / 频控清空
- served_k < kfeed 可允许部分不足,但需记录并可继续回退补齐,具体由实现配置)
每次回退必须更新 meta 中的候选规模与触发原因。
---
## 5. 验收标准(可验证)
- **稳定性**:任意输入(包括画像字段缺失、历史集合为空/很大)不报错,返回结构稳定。
- **回退可观测**:当候选不足时能逐级回退,且 `fallback_level_final``empty_reason` 正确。
- **去重生效**:输出不包含 `already_recommended_ids``touched_or_viewed_ids` 中的 content_id。
- **风险优先**Hard Filter 始终优先执行(尤其 `block_health_medical` 必挡)。
- **跨调用复用**:同一引擎既可被 FastAPI API 调用,也可被 Celery 任务调用(无框架耦合)。