← 精品代码功能 · 可复用实现库

精品功能 07:可解释打分引擎(加权 + 人话理由)

这个引擎强制要求"每条推荐都能说出人话理由,写不出理由就不许进日报"。

核心实现

六维加权(权重在文件开头明确列出):

"""
权重沿用任务卡:
    score = 0.35×主题匹配 + 0.20×引用势能 + 0.15×种子关联
          + 0.15×作者权重 + 0.10×可复现性 + 0.05×新颖度
"""
WEIGHTS = {"topic": 0.35, "citation": 0.20, "seed": 0.15,
           "author": 0.15, "repro": 0.10, "novelty": 0.05}

主流程(第 177-244 行,节选):

def score_paper(paper, profile, seed_ids=None, cross_pairs=None, low_trust_venues=None, ...):
    topic, hit_title, hit_abs = _topic_score(paper, profile)
    citation = _citation_score(paper)
    seed, seed_reasons = _seed_score(paper, profile, seed_ids)
    ...
    parts = {"topic": topic, "citation": citation, "seed": seed,
             "author": author, "repro": repro, "novelty": novelty}
    score = sum(WEIGHTS[k] * v for k, v in parts.items())

    trust, trust_note = venue_trust(paper, low_trust_venues, low_trust_factor)
    score *= trust                                  # 无同行评审的平台打折
    ...
    reasons = []
    if hit_title: reasons.append(f"标题命中主题词:{hit_title[0]}")
    if hit_abs:   reasons.append(f"摘要命中主题词:{hit_abs[0]}")
    ...
    return {"score": round(score, 4), "score_detail": {...}, "reasons": reasons, ...}

来源可信度折扣的设计说明(第 162-174 行注释)写得很克制:

"""来源可信度:无同行评审的自存档平台打折。
不打折到 0 是因为 arXiv / bioRxiv 上也有真正重要的东西;
也不直接丢掉,是因为"忽略"比"标注后降权"更容易漏掉好东西。"""

设计亮点

  1. 加权求和:比"一串 if 打分"更可调、更可解释;每个维度的分都留在 score_detail 里
  2. 强制可解释:每个维度都要产出中文理由,写不出理由就不进最终结果
  3. 折扣而非丢弃:不确定的内容"标注 + 降权",把判断权交给用户(和第 15 课白名单同思路)
  4. 交叉命中特殊处理:只在"主题也命中"时才标"机会窗口",

否则降级为"主题关联弱,需人工确认"(防止宽词误伤)

  1. 权重即产品策略:调权重就能改推荐倾向,业务同学也能参与

可复用性评估

开源化建议

子类实现若干 dimension(paper) -> (value, reason),框架负责加权与理由汇总

对照开源

方案可解释成本稳定
规则加权(本功能)高零高
机器学习排序低需训练中
LLM 打分中高低(随机性)

相关课程

第 17 课(数据流水线)