flamehaven01/AI-SLOP-Detector

GitHub: flamehaven01/AI-SLOP-Detector

检测 AI 生成代码中的空函数、幻觉导入和虚假文档,在 CI/CD 中阻止劣质代码进入生产环境。

Stars: 11 | Forks: 3

AI-SLOP Detector Logo

AI-SLOP Detector

PyPI version PyPI downloads Python 3.8+ MIT License
CI Tests Coverage Black Issues

捕捉 AI 生成的“烂代码”——在它们进入生产环境之前。

问题不在于 AI 会写代码。
问题在于 AI 会引入一类特定的缺陷:
未实现的桩代码、断开的 pipeline、幻觉导入,以及充满流行术语的噪音。

代码本身会说话。

**导航:** [快速开始](#quick-start) • [v3.0.2 更新内容](#whats-new-in-v302) • [v3.0.0 更新内容](#whats-new-in-v300) • [检测内容](#what-it-detects) • [评分模型](#scoring-model) • [结构一致性](#structural-coherence) • [自校准](#self-calibration) • [历史追踪](#history-tracking) • [CI/CD](#cicd-integration) • [文档](docs/) • [更新日志](CHANGELOG.md) ## 快速开始 ``` pip install ai-slop-detector slop-detector mycode.py # single file slop-detector --project ./src # entire project slop-detector mycode.py --json # machine-readable output slop-detector --project . --ci-mode hard --ci-report # CI gate # 可选附加组件 pip install "ai-slop-detector[js]" # JS/TS tree-sitter analysis pip install "ai-slop-detector[ml]" # ML secondary signal pip install "ai-slop-detector[ml-data]" # real training data pipeline # uvx(无需安装) uvx ai-slop-detector mycode.py ```

CLI Output Example

## v3.0.2 更新内容 ### 幻觉导入误报消除 `PhantomImportPattern` 现在会在标记任何内容之前,先理解项目自身的包及其可选依赖项。之前的版本对自己扫描的项目一无所知 —— 每个 `src/` 布局的内部导入和每个被保护的可选依赖都会触发 CRITICAL 命中,这会通过 GQG 级联,导致每个文件的 `deficit_score → 100`。 三级分类(取代了原先的一刀切 CRITICAL): | 等级 | 条件 | 严重程度 | |---|---|---| | Internal | 模块解析为当前项目 | (跳过) | | Guarded | 位于 `try/except ImportError` / `Exception` 块内 | MEDIUM | | Hard phantom | 无法解析且无保护 | CRITICAL | 项目包会自动从 `pyproject.toml` 的 `[project.dependencies]`、`[project.optional-dependencies]` 以及 `src/` 目录布局中发现 —— 无需配置。 ### LDR 不再因空的 `__init__.py` 而崩溃 一个空的包初始化文件(`src/mypkg/__init__.py`,零内容行)之前会产生 `total_lines=0 → ldr_score=0.0 → GQG ln(1e-4) → deficit_score=100`。 v3.0.2 检测到这种情况并返回 `ldr_score=1.0, grade="N/A", is_packaging_init=True`。 `is_packaging_init` 标志已在 JSON 输出中暴露,供下游工具使用。 ### GodFunctionPattern:长但简单的路径降级为 LOW 超过行数阈值但圈复杂度较低(`cc ≤ 5`)的函数现在被标记为 LOW 而不是 HIGH。这消除了针对物理常数表、路由分发块和领域规则列表的误报 —— 这些代码故意写得冗长,但在结构上并不复杂。 只有超过复杂度阈值的函数才会被标记为 HIGH,无论其长度如何。 ### 占位符模式精度 - `NotImplementedPattern` —— 跳过带有 `@abstractmethod` 装饰器的方法(正确的 ABC 模式)。 - `EmptyExceptPattern` —— 3 级:裸 `except: pass` → CRITICAL;`except ImportError: pass` → LOW 并提示“可选依赖保护”;带类型的 `except X: pass` → MEDIUM。 - `InterfaceOnlyClassPattern` —— `return self` / `return cls` 方法链桩代码现在计入占位符阈值。 ## v3.0.0 更新内容 ### 几何平均数取代算术平均数进行评分 之前的评分模型在三个维度(LDR、inflation、DDC)上使用加权算术平均数。算术平均数允许一个维度的高分部分抵消另一个维度的低分。 v3.0.0 切换到加权几何平均数: ``` quality = exp( sum(w_i * ln(max(1e-4, v_i))) / sum(w_i) ) ``` 任何单一维度的近零值都会将结果显著拉低,无论其他维度如何。这更好地反映了质量实际上是如何下降的 —— 一个导入使用率为 5% 的文件是糟糕的,即使其逻辑密度很高。 增加了第四个维度:`purity = exp(-0.5 * n_critical_patterns)`。 这使得 CRITICAL 严重级别的模式命中(幻觉导入等)产生复合效应,而不是在指标分数上简单叠加。 | 维度 | 来源 | 权重 | |---|---|---| | `ldr` | Logic Density Ratio | 配置 (默认 0.40) | | `inflation_q` | `1 - normalized_inflation` | 配置 (默认 0.30) | | `ddc` | Import usage ratio | 配置 (默认 0.20) | | `purity` | `exp(-0.5 * n_critical_patterns)` | 固定 0.10 | ### 每个文件的 AST 节点类型分布 每个分析的文件现在都包含一个 `dcf` 字段:文件中每种 AST 节点类型的归一化频率。 ``` result = detector.analyze_file("mycode.py") print(result.dcf) # {'FunctionDef': 0.12, 'Return': 0.09, 'Call': 0.14, 'Pass': 0.002, ...} ``` 这是下述项目级结构距离指标的基础。 它也可以通过 `--json` 输出供外部工具使用。 ### 项目级结构距离指标 `analyze_project()` 现在计算文件之间在 AST 节点类型组成上的相似度。 ``` project = detector.analyze_project("./src") print(project.structural_coherence) # 0.0 - 1.0 print(project.coherence_level) # "vr_structural" | "none" ``` 该值为 `1 - d`,其中 `d` 是文件分布间成对 sqrt-JSD 距离的最小生成树中的最长边。接近 1.0 的值意味着文件在结构上相似;较低的值表示文件间差异较大。 这是一个实验性指标。请谨慎解读 —— 一个异构项目(工具类 + 模型 + 测试)自然会比统一项目得分更低,这并不是缺陷。 **在 JSON 输出中:** ``` { "structural_coherence": 0.91, "coherence_level": "vr_structural" } ``` ## v2.9.3 更新内容 ### 自校准 —— 工具学习您的代码库 默认权重(`ldr: 0.40, inflation: 0.30, ddc: 0.30`)是针对一个代码库调整的。它们可能不适合您的代码库。Django 项目的结构性样板代码比数据 pipeline 多。一个文档详尽的库其逻辑密度配置文件与微服务不同。 从 v2.9.3 开始,该工具会根据您的使用历史校准其自身的权重。 ``` slop-detector . --self-calibrate # see what your history suggests slop-detector . --self-calibrate --apply-calibration # write to .slopconfig.yaml ``` **一句话说明其工作原理:** 在得分不佳后您编辑过的文件被确认为真正的“烂代码”。尽管得分不佳但您忽略的文件可能是误报。引擎搜索能最大化前者并最小化后者的权重 —— 仅使用您自己的历史数据,无需外部数据。 **首次实时运行结果(Flamehaven 代码库,180 个文件,62 个已确认修复):** | 维度 | 默认值 | 校准后 | |---|---:|---:| | ldr | 0.40 | 0.10 | | inflation | 0.30 | 0.25 | | ddc | 0.30 | **0.65** | | 综合误差 | 1.1069 | **0.9985** | | 置信度差距 | — | 0.1088 | 解读:此代码库的风格倾向于重文档且依赖使用有意义 —— 这里 DDC 是比逻辑密度更强的质量信号。 工具已适应这一点。您的工具也会适应您的风格。 更多数据 = 更好的校准。您用得越多,工具就越准确。 [完整文档:自校准 →](docs/SELF_CALIBRATION.md) ## v2.9.1 更新内容 ### 自检补丁 —— 零亏损文件 v2.9.1 将工具应用于自身并修补发现的问题。 在其自己的代码库上运行 `slop-detector --project src/` 产生了三个亏损文件。这三个均已解决。 **之前 → 之后:** | 指标 | v2.9.0 | v2.9.1 | | :--- | ---: | ---: | | 亏损文件 | 3 | **0** | | 平均亏损分 | 11.65 | **9.57** | | 加权亏损分 | 15.88 | **12.42** | **修复内容:** **`cli.py` (53.5 → 29.1)** —— 巨型函数分解。 `print_rich_report`、`main`、`generate_markdown_report`、`generate_text_report` 和 `_handle_output` 都超过了 50 行 / 复杂度 10 的阈值。 提取了 9 个专注的辅助函数;每个函数现在都符合限制。 **`registry.py` (39.5 → 干净)** —— DDC 误报 + `global` 语句。 `BasePattern` 仅为了类型注解而被导入。 `UsageCollector`(按设计)跳过注解,因此 DDC 将其评为 0% 使用。 修复:将仅用于注解的导入移至 `if TYPE_CHECKING:` 下。 还将惰性 `global _global_registry` 单例替换为积极的模块级初始化,移除了模式检测器标记的 `global` 语句。 **`question_generator.py` (30.0 → 干净)** —— 同样的 DDC 误报。 `FileAnalysis` 仅用于注解。同样的 `TYPE_CHECKING` 保护修复。 将 Python 3.10+ 联合语法(`int | None`, `str | None`)转换为 `Optional[int]`、`Optional[str]` 以兼容 Python 3.8。 ## v2.9.0 更新内容 ### `phantom_import` —— 幻觉包检测 (CRITICAL) AI 模型有时会生成听起来合理但不存在的包名。 此功能在它们变成运行时 `ModuleNotFoundError` 之前捕捉它们。 ``` import tensorflow_magic # CRITICAL — does not exist from requests_async_v2 import get # CRITICAL — does not exist import numpy # OK — installed from os.path import join # OK — stdlib from . import utils # OK — relative, excluded by design ``` 解析顺序:`sys.builtin_module_names` → `sys.stdlib_module_names` → `importlib.metadata.packages_distributions()` → `importlib.util.find_spec` 完整规格:[docs/PHANTOM_IMPORT.md](docs/PHANTOM_IMPORT.md) ### 历史自动追踪 每次运行都会自动记录到 `~/.slop-detector/history.db`。 ``` slop-detector mycode.py --show-history # per-file trend slop-detector --history-trends # 7-day project aggregate slop-detector --export-history data.jsonl # ML training export slop-detector mycode.py --no-history # opt-out ``` ``` History: src/mymodule.py ---------------------------------------------------------------------- Timestamp Deficit LDR Patterns Grade ---------------------------------------------------------------------- 2026-03-06T09:12:43 42.0 0.631 7 suspicious 2026-03-07T11:03:21 18.0 0.812 3 clean 2026-03-08T14:55:09 0.0 1.000 0 clean ---------------------------------------------------------------------- Trend (3 runs): improved delta=-42.0 ``` 完整规格:[docs/HISTORY_TRACKING.md](docs/HISTORY_TRACKING.md) ## 检测内容 **5 个类别中的 25 种模式。** 完整目录:[docs/PATTERNS.md](docs/PATTERNS.md) | 类别 | 模式 | 信号 | |---|---|---| | **Placeholder** | `empty_except`, `not_implemented`, `pass_placeholder`, `ellipsis_placeholder`, `return_none_placeholder`, `todo_comment`, `fixme_comment`, `hack_comment`, `xxx_comment`, `interface_only_class` | 未完成 / 脚手架代码 | | **Structural** | `bare_except`, `mutable_default_arg`, `star_import`, `global_statement` | 反模式 | | **Cross-Language** | `js_push`, `java_equals`, `ruby_each`, `go_print`, `csharp_length`, `php_strlen` | 错误语言语法 | | **Python Advanced** | `god_function`, `dead_code`, `deep_nesting`, `lint_escape` | 结构复杂性 | | **Phantom** | `phantom_import` | 幻觉包 | 除了模式外,每个文件还计算三个指标轴: | 指标 | 衡量内容 | |---|---| | **LDR** (Logic Density Ratio) | `logic_lines / total_lines` —— 代码与空白/注释的比例 | | **ICR** (Inflation) | `jargon_density × complexity_modifier` —— 流行术语权重 | | **DDC** (Dependency Check) | `used_imports / total_imports` —— 导入利用率 | ## 评分模型 **v3.0.0:加权几何平均数** ``` purity = exp(-0.5 * n_critical_patterns) quality = exp( (w_ldr*ln(ldr) + w_inf*ln(1-inf) + w_ddc*ln(ddc) + w_pur*ln(purity)) / (w_ldr + w_inf + w_ddc + w_pur) ) deficit_score = 100 * (1 - quality) + pattern_penalty ``` | 分数 | 状态 | |---|---| | >= 70 | `CRITICAL_DEFICIT` | | >= 50 | `INFLATED_SIGNAL` | | >= 30 | `SUSPICIOUS` | | < 30 | `CLEAN` | 项目聚合使用 SR9 保守加权计算 LDR: `project_ldr = 0.6 × min(file_ldrs) + 0.4 × mean(file_ldrs)` 完整数学规格:[docs/MATH_MODELS.md](docs/MATH_MODELS.md) ## 结构一致性 ``` project = detector.analyze_project("./src") print(project.structural_coherence) # 0.0 - 1.0 ``` 报告文件在 AST 节点类型组成上的相似度。 `1.0` = 所有文件具有几乎相同的结构配置;较低的值 = 文件间差异较大。 这是一个实验性信号。异构项目(例如 CLI 代码 + 数据模型 + 测试)按设计会比统一项目得分更低。请将其用于同一项目内的纵向比较,而不是作为绝对的质量关卡。 ## 自校准 默认权重有效。校准后的权重效果更好 —— 对您而言。 ``` # 检查历史记录建议 slop-detector . --self-calibrate # 自动应用到 .slopconfig.yaml slop-detector . --self-calibrate --apply-calibration # 在信任结果前需要更多数据 slop-detector . --self-calibrate --min-history 50 ``` 引擎从您的历史数据库中提取两个信号: | 事件 | 定义 | 标签 | |---|---|---| | **Improvement** | 亏损分高 → 您编辑了文件 → 分数下降 | 真阳性 | | **FP** | 亏损分高 → 同一文件,无更改,下次运行仍然糟糕 | 可能是误报 | 然后它对 200 多种权重组合进行网格搜索,并找到能最大限度减少遗漏的真实“烂代码”和不必要警报的组合 —— 针对您的特定代码库。 至少需要 10 个标记事件(随着您使用工具自动积累)。 只有当前两名候选者之间的置信度差距超过 0.10 时,才会写入结果 —— 这与 Copilot Guardian 多假设选择中使用的模式相同。 | 状态 | 含义 | |---|---| | `ok` | 找到可信的获胜者 —— `--apply-calibration` 写入配置 | | `no_change` | 当前权重已接近最优 | | `insufficient_data` | 需要更多历史记录,或候选者太接近而无法判断 | [完整文档:自校准 →](docs/SELF_CALIBRATION.md) ## 历史追踪 历史数据库是纵向质量分析的基础。 在多次运行中从 `deficit=42` 提升到 `deficit=0` 的文件为 ML pipeline 提供独立的训练信号。 ``` from slop_detector.history import HistoryTracker tracker = HistoryTracker() regression = tracker.detect_regression("src/api.py", current_score=55.0) trends = tracker.get_project_trends(days=7) count = tracker.export_jsonl("training.jsonl") # → DatasetLoader.load_jsonl() ``` [完整文档 →](docs/HISTORY_TRACKING.md) ## CI/CD 集成 ``` # Soft — 提供信息,永不导致构建失败 slop-detector --project . --ci-mode soft --ci-report # Hard — 在 deficit_score >= 70 或 critical_patterns >= 3 时导致构建失败 slop-detector --project . --ci-mode hard --ci-report # Quarantine — 在 3 次违规后升级重复违规者 slop-detector --project . --ci-mode quarantine --ci-report ``` **GitHub Actions:** ``` - name: Slop Gate run: | pip install ai-slop-detector slop-detector --project . --ci-mode hard --ci-report ``` [CI/CD 集成指南 →](docs/CI_CD.md) ## 配置 ``` # .slopconfig.yaml weights: ldr: 0.40 inflation: 0.35 ddc: 0.25 thresholds: ldr: critical: 0.30 warning: 0.60 disabled_patterns: - lint_escape # opt-out specific patterns ``` [完整配置指南 →](docs/CONFIGURATION.md) ## VS Code 扩展 实时内联诊断、防抖输入时检查、状态栏中的 ML 分数。 从 [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=Flamehaven.vscode-slop-detector) 安装 或在本地构建:`cd vscode-extension && vsce package` ## 开发 ``` git clone https://github.com/flamehaven01/AI-SLOP-Detector.git cd AI-SLOP-Detector pip install -e ".[dev]" pytest tests/ -v --cov black src/ tests/ ruff check src/ tests/ ``` [开发指南 →](docs/DEVELOPMENT.md) ## 许可证 MIT —— 详见 [LICENSE](LICENSE)。

Flamehaven LabsIssuesDiscussions文档

标签:AIGC, AI代码检测, DevSecOps, DLL 劫持, 上游代理, 人工智能, 代码坏味道, 代码安全, 代码审查, 代码洁癖, 大语言模型, 威胁情报, 开发者工具, 技术债务, 数据管道, 漏洞枚举, 生产就绪, 用户模式Hook绕过, 空函数检测, 自动化payload嵌入, 虚假文档检测, 软件工程, 逆向工具, 错误基检测, 防范AI幻觉, 静态代码分析