---
title: "Grox 内容分类器"
description: "Grox 四个 flow 中的分类器全表：PTOS 安全策略、帖子统一注解、回复打分与垃圾回复，以及各自的输入、模型、输出与阈值"
---

> Documentation Index
> Fetch the complete documentation index at: https://x-algorithm.vergego.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Grox 内容分类器

## 这一页回答什么

本页列出 Grox 理解帖子所用的分类器。对每个分类器，本页说明它判定的内容、读取的输入、使用的模型、输出的标签或分数、阈值，以及结果的写入位置和读取方。进程与 Plan 的执行框架见 [Grox 服务架构](https://x-algorithm.vergego.ai/concepts/grox-architecture/)。

## 核心结论

1. **分类器不再共用基类**：旧版的 `ContentClassifier` 三段式基类已删除。每个 flow 自带分类器类。它们的共同做法是“渲染成对话 → 采样 → 用正则提取 `<json>...</json>` → Pydantic 校验”。
2. **配置直接写具体模型型号，并引入 Gemma**：旧版的 `VLM_PRIMARY`、`VLM_SAFETY` 等别名已删除。配置现在直接写 Grok 型号（`grok-4-mini-critical`、`grok-4-1-fast-hedgehog-critical` 等）、EAPI 推理模型（Grok 4.3、4.5、4.6）和 OpenAI 协议的 `oai-gemma4-26b` 系列（`grox/config/config.py:79-94`）。
3. **PTOS 采用多级判定**：分类器先判违规类别，再按类别判具体策略类型。儿童安全、暴力媒体、违法违规三类再由另一个模型交叉验证。成人内容另由非 LLM 图片分类器 safemodel 与 Grok 4.5 仲裁。
4. **PTOS 结果直接转为处置**：写入 Task 把策略类型映射成帖子安全标签（`NsfwHighPrecision`、`GoreAndViolenceHighPrecision`、`SpamHighRecall` 等）。它还能退回帖子、发送自伤求助信息、封禁儿童性剥削账号（`grox/flows/ptos/task_write_safety_post_annotations_result_sink.py:162-314`）。
5. **banger 质量分已删除**：旧版在 `quality_score >= 0.4` 时判为通过。现在分类器不再输出质量分，写入统一帖子注解时 `qualityScore` 固定为 `1.0`（`grox/flows/upa/task_write.py:177`）。
6. **回复按“线程粉丝数”分流**：根帖作者或被回复者的粉丝数 > 250,000 时，Grok 给回复打 0–3 分；否则 Gemma 判定是否为垃圾回复。得 0 分的回复会被打上 `RiskyHighVizReply` 标签（`grox/flows/reply_spam/constants.py:8`、`grox/flows/reply_spam/task_write.py:140-141`）。
7. **提示词不开源**：所有 `.j2` 提示词模板都不在仓库中，目的是降低被针对性规避的风险（`grox/flows/ptos/prompts.py:11`）。因此，读者无法读到分类器的判定标准。

## 分类器总表

| 分类器 | 所在 Plan | 判定内容 | 输入 | 模型 | 输出 | 关键阈值或门槛 |
|--------|-----------|--------|------|------|------|---------------|
| `SafetyPtosCategoryClassifier` | `safety_ptos` 等 | 帖子违反了哪些安全策略类别 | 作者资料 + 帖子（含被回复帖）+ 媒体帧 | 按模式选 Grok；标准、恢复、锚点模式优先用 Gemma | `SafetyPostAnnotations`：违规类别列表，每项带 `score` | 无数值阈值；模型给出类别即进入下一步 |
| `SafetyPtosPolicyClassifier` | 同上 | 某一类别下的具体策略类型 | 同上；暴力言论、自伤类改为渲染整条线程 | 按类别选 Gemma、Grok 或 EAPI 推理模型 | `SafetyPolicy`：`policyType`、`confidenceScore`、`reason` | DELUXE 模式下，赞数 ≥ 128 用 Grok 4.3，≥ 1024 用 Grok 4.6 |
| `SafetyPtosChildSafetyPolicyClassifier` | 同上 | 儿童安全策略类型 | 作者 + 帖子 + 帖子发布日期 | `oai-gemma4-26b` | `SafetyPolicy` | 采样或解析失败时一律判 `NoViolation` |
| `SafetyPtosPolicyCrossValidator` | 同上 | 复核前一步的违规结论 | 同上 | 儿童安全、暴力媒体用 Grok 4.5；违法违规用 Grok 4.1 fast | 修正后的 `SafetyPolicy` | 两个模型给出的类型不一致时，降级或改判无违规 |
| safemodel sex-and-nudity | 同上 | 图片或视频帧是否为成人内容 | 最多 12 张图片或帧，每个视频最多 8 帧 | 非 LLM 图片分类器（HTTP 服务） | 分级桶；`R` 或 `X` 视为阳性 | 任一张出错时，丢弃整条结论 |
| `SafetyPtosAdultContentCrossValidationJudge` | 同上 | PTOS 与 safemodel 意见不一致时仲裁 | 作者 + 帖子 + 成人策略提示词 | Grok 4.5（EAPI） | `SafetyPolicy` | 仲裁结果不是 Hard 时，改判 `AdultContentSexualSoft` |
| 红外伪装成人视频检测 | `safety_ptos_media_injected_adult_infrared_video_spam_detection` | 视频是否模仿已确认违规视频的手法 | 帖子视频分镜 + 参考包中的违规视频分镜 | `grok-4-1-fast-hedgehog-critical` | `violation` 布尔值 + 理由 | 赞数 ≥ 64 才进入；≥ 512 开启推理 |
| `BangerInitialScreenGemmaClassifier` | `banger_initial_screen` | 帖子主题、标签、安全布尔量、AI 套路化程度 | 作者 + 帖子 + Grok 话题表 | `oai-gemma4-26b-upa` | 摘要、标签、话题及分数、`tweet_bool_metadata`、`slop_score`、`has_minor_score` | 只处理非回复、非私密账号的帖子 |
| `PostSafetyDeluxeClassifier` | `post_safety` | 帖子安全布尔量 | 作者 + 帖子 | `grok-4-1-fast-hedgehog-critical`，开启推理 | `tweet_bool_metadata` | 只处理非回复、非私密账号的帖子 |
| `ReplyScorer` | `reply_ranking` | 回复对线程的价值 | 整条线程 + 互动信号 + 粉丝数 | `grok-4-mini-critical`，回退到 `grok-4-1-fast-hedgehog-critical` | `score` ∈ [0, 3] + `reason` | 线程粉丝数 > 250,000 才进入 |
| `SimpleReplyScorer` | `spam_comment` | 回复是否为垃圾回复 | 同上 | `oai-gemma4-26b-2`；线程粉丝数 > 125,000 时改用 `oai-gemma4-26b-reply-spam`；带引用帖时改用 `ReplyScorer` | `score` ∈ [0, 3]；0 视为垃圾 | 线程粉丝数 ≤ 250,000 才进入 |
| `CoordinatedSpamScorer` | `coordinated_spam` | 线程中是否有多个账号协同发布垃圾回复 | 整条线程，每帖最多 2 个媒体 | `oai-gemma4-26b-2` | 被判为垃圾的帖子 ID 列表 | 根帖粉丝 ≥ 180,000；线程至少 2 层；只标出 1 帖时作废 |
| `MultiStepReplySpamScorer` | `multi_step_reply_spam` | 同一账号是否分多步发布垃圾回复 | 线程（最多 10 帖，超出时取首尾各 5 帖） | `oai-gemma4-26b-2` | 被判为垃圾的帖子 ID 列表 | 根帖粉丝 ≥ 1,000；上一帖与本帖同作者；只标出 1 帖时作废 |

模型型号均来自代码中的配置键名（`grox/config/config.py:79-94`、`grox/flows/ptos/constants.py:22-23`、`grox/flows/upa/constants.py:11`、`grox/flows/reply_spam/constants.py:5-6`）。键名对应的实际端点和温度写在不开源的 YAML 中。`ModelConfig` 的温度开源默认值为 0.7，`EapiModelConfig` 为 0.0001（`grox/config/config.py:62`、`grox/config/config.py:74`）。旧页面写的 `temperature = 0.000001` 已不在代码中。

## PTOS：安全策略判定

PTOS 是 X 的平台安全策略体系。Grox 用 `SafetyPolicyCategory` 列出 14 个违规类别，用 `SafetyPolicyType` 列出 40 个具体策略类型（`grox/flows/ptos/state.py:11-80`）。

### 标准链路

`PlanSafetyPtos` 的任务顺序如下（`grox/flows/ptos/plan_safety_ptos.py:23-55`）：

```mermaid
flowchart LR
    F["过滤<br/>无作者则跳过"] --> RL["60 秒去重"]
    RL --> DD["最小热度去重<br/>已在处理或已有结果则跳过"]
    DD --> MH["媒体水合"]
    MH --> C["类别检测"]
    C --> P["策略判定<br/>+ 交叉验证"]
    P --> SM["safemodel<br/>成人图片分类"]
    P --> CV["成人内容仲裁"]
    SM --> CV
    CV --> W["写入结果<br/>打标签与处置"]
```

**模式**。生成器类型决定 `SafetyPtosMode`（`grox/flows/ptos/mode.py:13-26`）。`safety_ptos_deluxe`、特殊视频、前段帧、关键帧四类流属于 DELUXE；恢复流、回填流、集群锚点流各对应一种模式；其余流为 STANDARD。在回填模式下，分类出错会让整条任务失败；在其他模式下，分类出错只记日志，任务继续执行（`grox/flows/ptos/mode.py:31-32`）。

**类别检测**。各模式使用的模型如下（`grox/flows/ptos/task_safety_ptos_category.py:16-40`）：

| 模式 | Grok 模型 | 是否优先 Gemma |
|------|-----------|---------------|
| STANDARD | `critical-safety` | 是 |
| DELUXE | `grok-4-1-fast-hedgehog-critical`，开启推理 | 否 |
| RECOVERY | `grok-4-1-fast-hedgehog` | 是 |
| BACKFILL | `grok-x-algo-extra` | 否 |
| LIVE_CLUSTER_ANCHORS | `critical-safety` | 是 |

“优先 Gemma”指分类器按 `use_oai_gemma4_dial = 1.0` 的概率先调用 `oai-gemma4-26b`，失败后再回退到 Grok（`grox/flows/ptos/classifier.py:122`、`grox/flows/ptos/classifier.py:171-183`）。开源默认值 1.0 表示全部请求先调用 Gemma。

**策略判定**。`TaskSafetyPtosPolicyDetection` 对每个违规类别分别判定（`grox/flows/ptos/task_safety_ptos_policy.py:83-117`）：

| 类别 | 判定方式 |
|------|---------|
| `AdultContent` 且帖子此前已被 PTOS 标为 NSFW | 不再调用模型，直接记为 `AdultContentSexualHard` |
| `ChildSafety` | 专用 Gemma 分类器，再经 Grok 4.5 交叉验证 |
| `ViolentMedia`、`IllegalAndRegulatedBehaviors` | `SafetyPtosPolicyClassifier`，再交叉验证 |
| `Spam`、`HateOrAbuse`、`ViolentSpeech`、`SuicideOrSelfHarm`、`AgeGatingHarmfulText`、`AdultContent` | `SafetyPtosPolicyClassifier` |
| 其他类别（如 `TerrorismOrViolentExtremism`、`CivicIntegrity`） | 不在 `SUPPORTED_CATEGORIES` 中，返回空结果，不判定策略 |

`SafetyPtosPolicyClassifier` 内部再按类别选择采样路径（`grox/flows/ptos/classifier.py:576-669`）：

- `Spam`、`IllegalAndRegulatedBehaviors`、`AgeGatingHarmfulText` 先调用 Gemma，失败后回退到 Grok。
- `ViolentSpeech`、`SuicideOrSelfHarm` 总是开启推理。帖子有祖先帖时，分类器渲染整条线程。
- DELUXE 模式下，类别为 `AdultContent`、`ViolentMedia` 且赞数 ≥ `HIGH_FAV_THRESHOLD`（128）时：赞数 ≥ 1024 用 Grok 4.6 internal，否则用 Grok 4.3（`grox/flows/ptos/constants.py:25`、`grox/flows/ptos/classifier.py:630-640`）。两者都有熔断器：失败率 ≥ 0.5 时熔断 600 秒，并回退到普通 Grok（`grox/flows/ptos/classifier.py:70-102`）。
- `Spam` 类别额外渲染媒体中的 @标记。在集群锚点模式下，`Spam` 不渲染作者资料。

**交叉验证**。`SafetyPtosPolicyCrossValidator` 只复核已判为违规的结论（`grox/flows/ptos/classifier.py:235-246`）：

| 类别 | 复核模型 | 意见一致 | 意见不一致 | 复核失败 |
|------|---------|---------|-----------|---------|
| `ChildSafety` | Grok 4.5 | 保留 | 改判 `NoViolation` | 改判 `NoViolation` |
| `ViolentMedia` | Grok 4.5 | 保留 | 复核判无违规时改为 `NoViolation`；类型不同时降级为 `ViolentMediaGraphicMedia` | 降级为 `ViolentMediaGraphicMedia` |
| `IllegalAndRegulatedBehaviors` | Grok 4.1 fast | 保留，理由替换为复核理由 | 改判 `NoViolation` | 改判 `NoViolation` |

出处：`grox/flows/ptos/classifier.py:248-404`。三类的判定取向不同。儿童安全与违法违规要求两个模型一致才认定违规。暴力媒体保留“有暴力”的结论，只在细分类型上取最轻的一档。

**高热度成人复查**。部分帖子会以 `score=50` 补跑一次成人内容策略判定（`grox/flows/ptos/task_safety_ptos_policy.py:139-183`）。条件为：DELUXE 模式、赞数 ≥ 128、带媒体、类别检测未报成人内容、此前也未被标为 NSFW。

**safemodel 成人图片分类**。`TaskSafetyPtosSafemodelSexNudity` 调用一个独立的图片分类服务，`classifier_slug` 为 `sex-and-nudity`（`grox/flows/ptos/task_safety_ptos_safemodel_sex_nudity.py:22-33`）。开源默认值为：任务超时 15 秒，单次 HTTP 超时 5 秒，最多重试 3 次，每个视频最多 8 帧，每帖最多 12 张。返回桶为 `R` 或 `X` 时判为阳性。非 DELUXE 流只在类别检测已报成人内容时调用它；DELUXE 流对所有未标 NSFW 的带媒体帖子调用它（`grox/flows/ptos/task_safety_ptos_safemodel_sex_nudity.py:75-96`）。

**成人内容仲裁**。仲裁只在 DELUXE 流运行。它比较两个信号：safemodel 是否为阳性，PTOS 是否判为 `AdultContentSexualHard`。两者不一致时，Grok 4.5 仲裁。仲裁结果不是 Hard 时，结论改判为 `AdultContentSexualSoft`，并清除 safemodel 阳性（`grox/flows/ptos/task_safety_ptos_adult_content_cross_validation.py:67-152`）。仲裁调用失败时，特殊视频流与前段帧流“从严”改判 Soft，其他流保留原结论（`grox/flows/ptos/task_safety_ptos_adult_content_cross_validation.py:112-121`）。

### 写入：从策略类型到标签与处置

`TaskWriteSafetyPostAnnotationsResultSink` 先把本次注解追加到该帖已有的注解列表。随后它计算四个布尔量，并与已有值取逻辑或（`grox/flows/ptos/task_write_safety_post_annotations_result_sink.py:78-159`）：

| 布尔量 | 条件 |
|--------|------|
| `isGore` | `ViolentMedia` 判为任一违规类型 |
| `isNsfw` | `AdultContent` 判为 `AdultContentSexualHard` |
| `isSoftNsfw` | `AdultContent` 判为 `AdultContentSexualSoft` |
| `isSpam` | `Spam` 或 `IllegalAndRegulatedBehaviors` 判为任一违规类型 |

然后，写入 Task 对每条违规打标签或执行处置（`grox/flows/ptos/task_write_safety_post_annotations_result_sink.py:196-312`）。“高影响力作者”指 PageRank v2 高分用户或灰标（政府）认证用户：

| 违规 | 动作 | 高影响力作者豁免 |
|------|------|----------------|
| `ViolentMedia` 任一违规且帖子带媒体 | 打 `GoreAndViolenceHighPrecision` | 否 |
| `AdultContentSexualHard` | 打 `NsfwHighRecall`；带媒体时再打 `NsfwHighPrecision` | 否 |
| `AdultContentSexualSoft` | 打 `SoftNsfw` | 否 |
| `SpamEngagementBaiting`、`SpamEngagementFarming`、`SpamCardManipulation` | 打 `SpamHighRecall` | 否 |
| 其他 `Spam` 违规 | 打 `SpamHighRecall` | 是 |
| `IllegalAndRegulatedBehaviors` 任一违规 | 打 `SpamHighRecall` | 是 |
| `HateOrAbuseInsultsWithTarget` 且帖子语言为英语 | 打 `FosnrAbuseInsults` | 是 |
| `SuicideOrSelfHarmEncouraging`、`SuicideOrSelfHarmDepiction` | 退回帖子 | 是 |
| `SuicideOrSelfHarmExpressingDesire` | 向作者发送求助支持信息 | 否 |
| `ChildSafetySexualExploitation` | 封禁作者 | 是 |
| 全部 | 打 `PtosReviewed` | — |

对测试账号，写入 Task 只打 `PtosReviewed`，不执行其他动作（`grox/flows/ptos/task_write_safety_post_annotations_result_sink.py:179-186`）。

safemodel 为阳性而 PTOS 未判 Hard 时，写入 Task 追加一条 `identifier="safemodel-sex-nudity"` 的注解。该注解的策略类型记为 `AdultContentSexualHard`，置信度为 safemodel 置信度 × 100，并按上表打成人标签（`grox/flows/ptos/task_write_safety_post_annotations_result_sink.py:405-458`）。最后，写入 Task 调用 `grokPtosDeleteLabels` 清除不再成立的标签，并把结果写入 Manhattan 和 Kafka（`grox/flows/ptos/task_write_safety_post_annotations_result_sink.py:460-492`）。

[可见性过滤](https://x-algorithm.vergego.ai/concepts/visibility-filtering/) 的规则最终读取这些标签。例如，`NsfwHighPrecision`、`GoreAndViolenceHighPrecision`、`FosnrAbuseInsults` 都有对应规则（`visibility-filtering/rules/tweet_rules.rs:170`、`visibility-filtering/rules/tweet_rules.rs:457`、`visibility-filtering/rules/tweet_rules.rs:587`）。标签与规则的对应关系见 [标签规则](https://x-algorithm.vergego.ai/concepts/labeling-rules/)。

### PTOS 专项链路

| Plan | 准入条件 | 与标准链路的差别 | 出处 |
|------|---------|----------------|------|
| `safety_ptos_realtime_with_signals` | 正文与媒体中 @ 的账号合计 ≥ 2；作者不是高影响力作者；等待 10 秒后帖子仍无 `SpamHighRecall` | 只判定 `Spam` 一个类别，使用 `oai-gemma4-26b-ptos-realtime` | `grox/flows/ptos/task_filter.py:37-100`、`grox/flows/ptos/task_ptos_spam_detection.py:22-62` |
| `safety_ptos_special_video` | 带视频、赞数 ≥ 64 | 抽帧时开启“运动揭示”帧；检测不到这类手法时停止 | `grox/flows/ptos/task_safety_ptos_special_video_filter.py:16-50`、`grox/flows/ptos/task_special_video_screen.py:13-49` |
| `safety_ptos_adult_content_leading_frames` | 视频 ≥ 30 秒或带直播；已有 PTOS 结果且未标 NSFW；此前报过成人内容，或赞数 ≥ 512 | 只从视频前 10 秒抽帧重新判定 | `grox/flows/ptos/constants.py:31-33`、`grox/flows/ptos/task_safety_ptos_adult_content_leading_frames_filter.py:24-83` |
| `safety_ptos_key_frames` | 带视频、赞数 ≥ 128、未标 NSFW；此前报过成人内容，或赞数 ≥ 1024 | 用“裸露 vs 着装”两条查询给帧打嵌入分，挑选关键帧；跳过类别检测，只执行高热度成人复查 | `grox/flows/ptos/task_safety_ptos_key_frames_filter.py:23-90` |
| `safety_ptos_media_injected_adult_infrared_video_spam_detection` | 带视频、赞数 ≥ 64、未标 NSFW | 把帖子视频与参考包中已确认违规视频的分镜对比；命中时记为 `Spam` / `SpamManipulatedMedia`；单次超时 60 秒 | `grox/flows/ptos/task_safety_ptos_media_injected_adult_infrared_video_spam_detection.py:47-189` |
| `safety_ptos_live_cluster_anchors` | 消息只带锚点帖 ID 和集群 ID | 先补全帖子；不写安全注解，不打标签。判决写入 Manhattan 并发送到 Kafka；只有判出 `Spam` 违规时 `enforceDecision=true` | `grox/flows/ptos/task_write_live_cluster_anchor_verdict_sink.py:35-151` |

## 帖子统一注解（UPA）

**banger 初筛**。`TaskBangerScreen` 每 3600 秒刷新一次 Grok 话题表，并把话题表连同帖子交给 `BangerInitialScreenGemmaClassifier`（`grox/flows/upa/task_banger_screen.py:17-61`）。分类器输出以下字段（`grox/flows/upa/classifier_banger_initial_screen_gemma.py:44-51`）：

- `description`、`tags`：帖子摘要和标签。
- `taxonomy_categories`：话题名称与分数。名称必须能在输入话题表中找到，否则整次解析报错（`grox/flows/upa/classifier_banger_initial_screen_gemma.py:129-135`）。
- `tweet_bool_metadata`：`isHighQuality`、`isNsfw`、`isGore`、`isViolent`、`isSpam`、`isSoftNsfw`、`isAdult` 七个布尔量（`grox/flows/upa/models.py:13-20`）。
- `slop_score`、`has_minor_score`、`is_image_editable_by_grok`。

`TaskPublishUnifiedPostAnnotationsManhattan` 把这些字段写入统一帖子注解。话题按 entity domain 236 写入，每个话题只保留最高分（`grox/flows/upa/task_write.py:91-161`）。`qualityScore` 固定写为 1.0（`grox/flows/upa/task_write.py:177`）。

**帖子安全 deluxe**。`PostSafetyDeluxeClassifier` 只输出 `tweet_bool_metadata`（`grox/flows/upa/state_post_safety.py:8-9`）。`TaskUpsertTweetBoolMetadataToUnifiedPostAnnotation` 再把它补写进统一帖子注解。

两个 Plan 都调用 `grokUpaActionWithLabels`，由服务端把布尔量转换成安全标签（`grox/flows/upa/task_grok_upa_action_with_labels.py:22-63`）。布尔量与标签的映射在服务端，源码未包含。home-mixer 的品牌安全判定检查帖子是否带有 Grok 打的 `GROK_SFA` 或 `GROK_NSFA_LIMITED` 标签；两者都没有时，按中风险处理（`home-mixer/models/brand_safety.rs:116-120`）。源码未直接写明这两个标签是否由 `grokUpaActionWithLabels` 产生（推测是）。

## 回复打分与垃圾回复

四个 Plan 共享一个 Kafka 流，过滤器按线程分流（`grox/flows/reply_spam/task_filter.py:17-249`、`grox/flows/reply_spam/task_multi_step_reply_spam.py:25-125`）。“线程粉丝数”指根帖作者与被回复者粉丝数中的较大值：

| Plan | 准入 | 共同排除 |
|------|------|---------|
| `reply_ranking` | 线程粉丝数 > 250,000 | 非回复帖；回复自己或根帖作者的帖子 |
| `spam_comment` | 线程粉丝数 ≤ 250,000 | 同上，另外排除 Grok 官方账号的回复 |
| `coordinated_spam` | 根帖粉丝 ≥ 180,000，线程 ≥ 2 层，回复者不是高影响力作者 | 回复根帖作者本人的帖子 |
| `multi_step_reply_spam` | 根帖粉丝 ≥ 1,000，线程 ≥ 2 层，上一帖与本帖同作者，回复者不是高影响力作者 | 祖先帖已被删除 |

**`ReplyScorer`**。它先用 `grok-4-mini-critical` 带 JSON schema 采样。输出中找不到含 `score` 的 JSON 时，它改用 `grok-4-1-fast-hedgehog-critical` 并关闭推理重新采样（`grox/flows/reply_spam/classifier_reply_ranking.py:80-94`）。解析依次尝试 Pydantic、`json_repair`、正则。分数不在 0–3 之间时报错（`grox/flows/reply_spam/classifier_reply_ranking.py:109-172`）。

**`SimpleReplyScorer`**。它用更简短的提示词调用 Gemma，解析逻辑与 `ReplyScorer` 相同。回复带引用帖时，它直接把回复交给 `ReplyScorer`（`grox/flows/reply_spam/classifier_simple_reply_scorer.py:25-72`）。它取代了旧版的 `SpamEapiLowFollowerClassifier`。

**协同垃圾与多步垃圾**。两个分类器都让 Gemma 按序号列出线程中的垃圾帖，再执行三层后处理（`grox/flows/reply_spam/classifier_coordinated_spam.py:31-101`、`grox/flows/reply_spam/classifier_multi_step_reply_spam.py:32-89`）：

1. 最新一条回复不在名单中时，整份名单作废。
2. 协同垃圾：最新回复的作者此前被根帖作者回复过时，名单作废。多步垃圾：只保留与最新回复同作者的帖子。
3. 名单只剩 1 帖时，名单作废。

**写入**。`TaskWriteReplyRankingManhattan` 只在新分数低于已有分数时写入。分数为 0 时，它先打标签（`grox/flows/reply_spam/task_write.py:107-155`）。协同垃圾与多步垃圾对名单中的每个帖子写入 0 分并打标签。这些路径打的标签都是 `RiskyHighVizReply`。豁免条件为：作者 user cred 分 ≥ 66（没有该分时看作者是否为高 PageRank 账号）、灰标认证、测试账号（`grox/flows/reply_spam/constants.py:9`、`grox/flows/reply_spam/task_write.py:39-80`）。分数 ≤ 1.0 的回复还会写入两个机房的缓存（`grox/flows/reply_spam/strato_loader.py:20-46`）。

## 设计决策

| 决策 | 理由 |
|------|------|
| 每个 flow 自带分类器类 | 不同判定在输入渲染、采样回退、解析容错上差异大；共用基类反而需要处处覆写 |
| 低风险类别交给 Gemma | 垃圾、违法、年龄限制文本的量大，用较小模型降低成本；严重类别保留 Grok |
| 严重结论由两个模型复核 | 儿童安全、违法违规会触发封号等硬处置；两个模型一致才认定违规，可以降低误判 |
| 按赞数分档升级模型 | 热帖误判的影响面大；128、1024 两档逐级换用更强的推理模型 |
| 非 LLM 图片分类器加 LLM 仲裁 | 专用分类器负责召回成人图片；意见冲突时再由 Grok 4.5 判定 |
| 高影响力作者豁免部分标签 | 垃圾类和辱骂类标签误伤高 PageRank 账号、政府账号的代价高（推测） |
| 回复分只降不升 | 多次打分取最低值；垃圾回复一旦被识别，不会因后续重算而恢复高分 |
| 提示词不开源 | 降低被针对性规避的风险 |

## FAQ

**Q：“banger” 现在还代表质量分吗？**
A：不代表。`banger_initial_screen` 这个 Plan 名保留了，但它现在产出摘要、标签、话题、安全布尔量和 `slop_score`。旧版的 `quality_score` 与 0.4 阈值已删除，写入时 `qualityScore` 恒为 1.0。

**Q：帖子被 PTOS 判为违规后，多久生效？**
A：写入 Task 同步调用 Strato 打标签。标签写入后，读取方即时生效。Grox 处理本身有排队延迟：帖子达到一定互动后，最小热度流才把它写入 Kafka 主题。具体门槛不在 Grox 代码中。

## 源码锚点

- `grox/flows/ptos/state.py:11-136` —— 违规类别、策略类型与状态对象
- `grox/flows/ptos/classifier.py:105-781` —— 类别、策略、儿童安全、交叉验证、成人仲裁五个分类器
- `grox/flows/ptos/task_safety_ptos_policy.py:83-183` —— 按类别分派与高热度成人复查
- `grox/flows/ptos/task_safety_ptos_safemodel_sex_nudity.py:22-153` —— safemodel 调用与阳性判定
- `grox/flows/ptos/task_write_safety_post_annotations_result_sink.py:78-492` —— 布尔量、标签与处置
- `grox/flows/upa/classifier_banger_initial_screen_gemma.py:44-154` —— banger 初筛输出
- `grox/flows/upa/task_write.py:29-243` —— 统一帖子注解写入
- `grox/flows/reply_spam/task_filter.py:17-249` —— 回复分流
- `grox/flows/reply_spam/classifier_reply_ranking.py:30-172` —— 回复打分与容错
- `grox/flows/reply_spam/task_write.py:39-206` —— 回复分写入与 `RiskyHighVizReply`

## 相关页面

- [Grox 服务架构](https://x-algorithm.vergego.ai/concepts/grox-architecture/) —— Plan、Task 与 flows 注册
- [多模态帖子嵌入器](https://x-algorithm.vergego.ai/concepts/multimodal-embedders/) —— Grox 的另一类产出：内容嵌入
- [图片与视频模型](https://x-algorithm.vergego.ai/concepts/media-models/) —— Grox 之外的媒体分类模型
- [可见性过滤](https://x-algorithm.vergego.ai/concepts/visibility-filtering/) —— 读取 PTOS 标签的规则
- [标签规则](https://x-algorithm.vergego.ai/concepts/labeling-rules/) —— 其他打标签的规则系统
- [账号信号](https://x-algorithm.vergego.ai/concepts/account-signals/) —— 豁免判断用到的 PageRank 与 user cred
- [广告混排](https://x-algorithm.vergego.ai/concepts/ads-blending/) —— 品牌安全判定读取 Grok 标签

Source: https://x-algorithm.vergego.ai/concepts/grox-classifiers/index.mdx
