一、前言我根据设计的测评系统我们进行了多轮测试在测试过程中我们发现这个系统的打分效果比较差于此同时在测评时因为大量的llm调用测评时间也比较久。所以我们对这个评分系统进行了一下修改我们要设计函数来进行打分不能都调用大模型这样确实太耗费时间了。只有对于那些打分比较模糊的我们再去调用大模型来进行打分这样既可以节省时间也可以提升准确度。二、架构优化这里我还是设计了Three-Tier Per-Step Decision Scoring三档逐决策瀑布式评分。规则评分、轻量llm评分、三方llm评分。这样减少了大模型的调用可以大大提升测评的效率。核心思想是这样的 95% 的决策其实可以用确定性规则打分。剩下 5% 里大部分用一个轻量 LLM 就能搞定。真正需要三方专家仲裁的不到 1%。在这个架构下与其给每条发言都拉三方专家不如先把规则能确定的事情解决掉大大提升了系统运行效率。三、具体实现3.1Tier 1 规则评分我写了三个方法score_vote/score_speech/score_night每个都是纯函数式的输入是decision state输出是DecisionScore。每条决策都是从四个维度打分维度权重投票权重发言权重夜间含义correctness50%40%55%决策是否正确reasoning_quality25%35%20%推理过程质量timeliness10%10%10%决策时效性impact15%15%15%对局势影响程度那么核心评分机制拿score_vote举例correct 0.95 if 投给狼人 else (0.15 if 投给强神 else 0.35) overall round( 0.50 * correct 0.25 * reasoning_quality 0.10 * timeliness 0.15 * impact, 3, )其中reasoning_quality我用了几个简单的特征文本长度80字符0.15200字符0.10包含因为/所以/如果等逻辑词0.10包含X 号或BotX等具体玩家引用0.10发言质量中我还加入了防止身份泄露的如果有时候ai泄露自己身份会扣除部分得分。这个规则能抓到很多 AI 玩家白天自爆的低级错误。for w in [我是预言家, 我是女巫, 我昨晚毒了]: if w in text: risk_flags.append(f泄漏身份: {w}) correct max(0.10, correct - 0.30)4.2 Tier 2 轻量 LLM只在correctness ∈ (0.2, 0.8)或者类似区间时才升级到 LLM。具体到我们的这个项目调用本项目已有的 LLMSpeechEvaluator。如果引入新的客户端就会触发重复初始化~5 秒的开销。这样可以减少五秒的开销提升速度。这里我们是复用的之前的三专家系统来进行打分。相较于之前把所有的都调用三专家我们这里只有部分评分模糊的才会调用。代码如下def _score_with_light_llm(self, score, action, state): if self._llm is None: return score try: result self._llm.evaluate( player_idscore.player_id, speech_contenttext, ... ) llm_score max(0.0, min(1.0, result.final_score / 100.0)) score.light_llm_score llm_score score.scoring_tier light_llm except Exception as e: score.metadata.setdefault(llm_error, str(e)) return score每个专家输出结构化的 ExpertScore 包含分数、理由、优缺点和改进建议。三专家的平均分归一化到 [0, 1] 后覆盖 Tier 1 的 overall_score 。4.3 Tier 3 重 LLM 评分3-Judge PanelTier 3 是为高影响 高模糊的决策设计的终极评分层。需要两个条件同时满足1. 模糊 Tier 1 拿不准correctness ∈ (0.2, 0.8)2. 高影响 该决策对局势影响大impact 0.5if s.needs_light_llm and s.impact 0.5: s.needs_heavy_llm TrueTier 3 的核心是 3 次独立评估取中位数 为什么用中位数而不是平均数因为 LLM 评估存在随机性单次评估可能因为 prompt 理解偏差产生离群值。中位数对单个离群 judge 更鲁棒。# 关闭缓存强制 3 次评估独立 self._llm.cache_enabled False for run_idx in range(3): result self._llm.evaluate(...) judge_scores.append(result.final_score / 100.0) # 中位数而非平均数—— 对离群 judge 更鲁棒 sorted_scores sorted(judge_scores) median sorted_scores[1] # 一致性指标 spread max(judge_scores) - min(judge_scores) agreement 1.0 - spread四、总结三层瀑布式评分系统的核心思想是 分级评估、按需升级 ——用确定性规则覆盖大部分决策只在模糊地带才引入 LLM 评估在评分精度和计算成本之间取得平衡。这种架构不仅适用于狼人杀也可以推广到其他不完全信息博弈场景的 AI 评估中。在本次方法优化中我也学到了确定性优先于随机性。能用规则解决的不要丢给 LLM。这样可以大大节约成本和时间。
AI狼人杀评分系统优化
一、前言我根据设计的测评系统我们进行了多轮测试在测试过程中我们发现这个系统的打分效果比较差于此同时在测评时因为大量的llm调用测评时间也比较久。所以我们对这个评分系统进行了一下修改我们要设计函数来进行打分不能都调用大模型这样确实太耗费时间了。只有对于那些打分比较模糊的我们再去调用大模型来进行打分这样既可以节省时间也可以提升准确度。二、架构优化这里我还是设计了Three-Tier Per-Step Decision Scoring三档逐决策瀑布式评分。规则评分、轻量llm评分、三方llm评分。这样减少了大模型的调用可以大大提升测评的效率。核心思想是这样的 95% 的决策其实可以用确定性规则打分。剩下 5% 里大部分用一个轻量 LLM 就能搞定。真正需要三方专家仲裁的不到 1%。在这个架构下与其给每条发言都拉三方专家不如先把规则能确定的事情解决掉大大提升了系统运行效率。三、具体实现3.1Tier 1 规则评分我写了三个方法score_vote/score_speech/score_night每个都是纯函数式的输入是decision state输出是DecisionScore。每条决策都是从四个维度打分维度权重投票权重发言权重夜间含义correctness50%40%55%决策是否正确reasoning_quality25%35%20%推理过程质量timeliness10%10%10%决策时效性impact15%15%15%对局势影响程度那么核心评分机制拿score_vote举例correct 0.95 if 投给狼人 else (0.15 if 投给强神 else 0.35) overall round( 0.50 * correct 0.25 * reasoning_quality 0.10 * timeliness 0.15 * impact, 3, )其中reasoning_quality我用了几个简单的特征文本长度80字符0.15200字符0.10包含因为/所以/如果等逻辑词0.10包含X 号或BotX等具体玩家引用0.10发言质量中我还加入了防止身份泄露的如果有时候ai泄露自己身份会扣除部分得分。这个规则能抓到很多 AI 玩家白天自爆的低级错误。for w in [我是预言家, 我是女巫, 我昨晚毒了]: if w in text: risk_flags.append(f泄漏身份: {w}) correct max(0.10, correct - 0.30)4.2 Tier 2 轻量 LLM只在correctness ∈ (0.2, 0.8)或者类似区间时才升级到 LLM。具体到我们的这个项目调用本项目已有的 LLMSpeechEvaluator。如果引入新的客户端就会触发重复初始化~5 秒的开销。这样可以减少五秒的开销提升速度。这里我们是复用的之前的三专家系统来进行打分。相较于之前把所有的都调用三专家我们这里只有部分评分模糊的才会调用。代码如下def _score_with_light_llm(self, score, action, state): if self._llm is None: return score try: result self._llm.evaluate( player_idscore.player_id, speech_contenttext, ... ) llm_score max(0.0, min(1.0, result.final_score / 100.0)) score.light_llm_score llm_score score.scoring_tier light_llm except Exception as e: score.metadata.setdefault(llm_error, str(e)) return score每个专家输出结构化的 ExpertScore 包含分数、理由、优缺点和改进建议。三专家的平均分归一化到 [0, 1] 后覆盖 Tier 1 的 overall_score 。4.3 Tier 3 重 LLM 评分3-Judge PanelTier 3 是为高影响 高模糊的决策设计的终极评分层。需要两个条件同时满足1. 模糊 Tier 1 拿不准correctness ∈ (0.2, 0.8)2. 高影响 该决策对局势影响大impact 0.5if s.needs_light_llm and s.impact 0.5: s.needs_heavy_llm TrueTier 3 的核心是 3 次独立评估取中位数 为什么用中位数而不是平均数因为 LLM 评估存在随机性单次评估可能因为 prompt 理解偏差产生离群值。中位数对单个离群 judge 更鲁棒。# 关闭缓存强制 3 次评估独立 self._llm.cache_enabled False for run_idx in range(3): result self._llm.evaluate(...) judge_scores.append(result.final_score / 100.0) # 中位数而非平均数—— 对离群 judge 更鲁棒 sorted_scores sorted(judge_scores) median sorted_scores[1] # 一致性指标 spread max(judge_scores) - min(judge_scores) agreement 1.0 - spread四、总结三层瀑布式评分系统的核心思想是 分级评估、按需升级 ——用确定性规则覆盖大部分决策只在模糊地带才引入 LLM 评估在评分精度和计算成本之间取得平衡。这种架构不仅适用于狼人杀也可以推广到其他不完全信息博弈场景的 AI 评估中。在本次方法优化中我也学到了确定性优先于随机性。能用规则解决的不要丢给 LLM。这样可以大大节约成本和时间。