ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

“选错目标”和“没有选中”要分开:VR任务错误分类设计

“选错目标”和“没有选中”要分开:VR任务错误分类设计

界面里一个红色提示,可能对应完全不同的事件:射线没有命中、命中了不可交互对象、输入属于旧题,或者确实选择了与规则不符的目标。如果日志把它们全部记成错误,后续既难复现,也容易误读参与过程。

分类应从产品规则与输入链路共同定义。本文给出一个小型判定顺序:先判断事件是否属于本轮,再确认是否允许作答,随后处理输入是否有效,最后比较任务目标。

先明确哪些是系统事件,哪些才是作答

没有有效目标不一定构成一次答案。有些任务允许空指向但不提交,有些任务则把超时独立记录。应在内容说明中确定,不能让开发者默认所有按键都进入正确率分母。

同样,“暂停期间按键被忽略”不是任务答错。技术日志可以记录被忽略的事件,面向课程的记录则应依据清楚的规则筛选,两者不必使用同一个计数器。

fromdataclassesimportdataclass@dataclass(frozen=True)classInput:round_id:inttarget:str|Noneinteractable:booldefclassify(event,*,round_id,phase,expected):ifevent.round_id!=round_id:return"stale_round"ifphase!="active":return"not_answering"ifevent.targetisNone:return"no_hit"ifnotevent.interactable:return"not_interactable"return"correct"ifevent.target==expectedelse"incorrect_target"defjudge(event,phase="active"):returnclassify(event,round_id=7,phase=phase,expected="apple")assertjudge(Input(6,"apple",True))=="stale_round"assertjudge(Input(7,"apple",True),"paused")=="not_answering"assertjudge(Input(7,None,False))=="no_hit"assertjudge(Input(7,"wall",False))=="not_interactable"assertjudge(Input(7,"pear",True))=="incorrect_target"assertjudge(Input(7,"apple",True))=="correct"

这个顺序是一项设计选择。若业务需要统计暂停期间的空间命中,可以另保留原始事件;但不能为得到更多诊断信息,改变“是否算作答”的定义。

分母应来自分类之后

设一段记录包含六类事件,只有correct与incorrect_target进入本例的作答统计。no_hit是否进入,必须由任务事先约定。不要一边统计所有按键,一边把结果称为答案正确率。

报告或界面展示时,还需说明是否包含重试、同一题多次选择如何处理、退出任务怎样计算。否则,即使分类函数没有bug,指标也可能因口径不同而无法比较。

原始输入可以记录目标标识、轮次、阶段和事件顺序,不需要加入姓名、联系方式或其他与复现无关的信息。若记录涉及真实使用者,应按实际权限与最小必要原则处理,示例不使用个人数据。

如何验证分类没有互相覆盖

先为每一类构造独立输入,再增加组合条件。例如旧轮次且无命中,按当前优先级应返回stale_round。这能确认分类结果由规则决定,而不是偶然取决于某个字段读取顺序。

其次,检查输入异常是否触发了不恰当的红色答错提示。日志分类正确,不代表UI映射就一定正确;每类结果还需要对应合适的反馈与后续动作。

最后,再检查一轮结束后的状态。结果提交以后如果继续接受输入,可能产生重复错误或改变分母。分类、封口与统计应各自有明确边界。

这套模型用于解释工程事件,不把操作结果当成能力判断。保留“没选中”和“选错”的差别,首先是让任务记录与实际过程对应,为开发与课程说明提供更清楚的信息。

作者说明:由维爱智项目内容整理;代码为独立Python教学示例,不代表生产软件已采用相同分类。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进