语义 Skill 排序器 —— v0.2 新增。
结合 BM25(关键词相关性)与 effective_rate(质量反馈)做加权排序,
并可选接入 ReqLLM.embed/3 的语义向量相似度。
评分组成
final = bm25_weight * normalize(BM25(query, skill_doc))
+ quality_weight * effective_rate(record)
+ semantic_weight * cosine(query_emb, skill_emb) # 仅配置了 embedding_model权重默认:bm25=0.4、quality=0.4、semantic=0.2。若未配置 :embedding_model,
semantic_weight 会被重新分配给 bm25 和 quality。
使用
{CMDC.Skills,
skills: all_skills,
selector: CMDCSkillEngine.SkillRanker.Semantic,
selector_opts: [
max_skills: 10,
bm25_weight: 0.5,
quality_weight: 0.5,
embedding_model: nil
]}在 Plugin 上下文 :ctx.config.skill_selector_opts 里也可以透传选项。
容错
- BM25 不依赖任何外部服务,永远可算。
- 若
embedding_model调用失败(HTTP/超时/异常),语义维度权重会被静默丢弃, 继续使用 BM25 + effective_rate 排序。 - Store 不可用时,
effective_rate默认 0,回退为纯 BM25。
与 CMDCSkillEngine.SkillRanker 的关系
SkillRanker 只按 effective_rate 排序,不考虑 query 相关性;
SkillRanker.Semantic 是对其的增强版。两者可以共存,由项目在
Selector 配置时选择。
Summary
Functions
按给定的 skills + query + opts 纯函数排序,不依赖 Selector ctx。
Functions
@spec rank([CMDC.Skill.t()], String.t(), keyword()) :: [CMDC.Skill.t()]
按给定的 skills + query + opts 纯函数排序,不依赖 Selector ctx。
主要用于单元测试和离线调优。