"""意图门控的单一来源:根据分类结果、风险和澄清次数决定最终意图""" from app.schemas.decision import ChoiceResult from app.schemas.requirement import Intent # 会修改大屏的意图,判错的代价高,使用较严格的阈值;问答判错代价低,使用宽松阈值 ACTION_INTENTS = ("create_screen", "modify_screen") def resolve_intent( decision: ChoiceResult, *, action_min_probability: float, qa_min_probability: float, clarified_rounds: int, max_clarify_rounds: int, option_selected: bool, ) -> Intent: """按选中项自身的概率门控,confidence 只表示分布集中度,不作为判据 - 用户刚点选澄清选项时,选择本身已表达意图,直接沿用模型判断 - 模型判定 unclear 时始终澄清;仅因概率不足而存疑时,澄清次数用尽后退回问答 """ choice = decision.choice # 缺少该选项的概率时退回 confidence,避免因协议缺字段而误判 probability = decision.probabilities.get(choice, decision.confidence) minimum = action_min_probability if choice in ACTION_INTENTS else qa_min_probability # 模型明确判定语义不明时始终澄清,直到用户说清或取消 if choice == "unclear": return "unclear" if option_selected or probability >= minimum: return choice # type: ignore[return-value] # 只是把握不足时,澄清次数用尽后安全地退回问答,而不是继续追问 if clarified_rounds >= max_clarify_rounds: return "qa" return "unclear"