可疑
使用 AI 捕获代码中的 bug,完全本地化的 CLI 应用。数据不会离开您的计算机。
🤔 概述 • 🪄 演示 • 🔧 安装 • 💻 用法 • 🧠 工作原理
概述
这是一个使用 AI 模型分析源代码文件的 CLI 应用程序。它会向您展示其中看起来可疑的部分。
它不像 linter 工具那样使用规则或静态分析。相反,模型会根据上下文生成自己的代码建议。查看 它的工作原理。
注意:所有处理均在您的硬件上完成,不会向互联网传输任何数据
示例输出:

演示
以下是应用程序在其自身源文件上运行的输出(颇具元意味)。
我见过这个吗?
Hacker News 上有一篇帖子 AI 在我的代码中发现了一个 bug,相当酷。我想在自己的代码上试试,于是着手构建了这个想法的实现。
安装
你可以通过 pip 或从源代码安装 sus。
Pip (MacOS, Linux, Windows)
pip3 install suspicious
来自源
git clone git@github.com:sturdy-dev/suspicious.git
cd suspicious
python -m pip install .
用法
你可以这样运行该程序:
sus /path/to/file.py
请注意,首次运行此操作时,应用程序需要下载一个模型(约 500 MB)—— 更多信息 章节。
这将生成并打开一个包含结果的 .html 文件。
grey表示预测结果与原始内容相同light grey表示模型有不同的预测,但置信度极低light red表示情况有点可疑red表示存在不同的预测且置信度较高
实际用法
不明确。你对一个文件运行 sus,然后快速浏览红色部分,也许它能发现你遗漏的东西。如果你用它发现了什么有趣的东西,请在 twitter 上联系我。
它是如何工作的?
简而言之,它将你的源代码文本的标记化表示输入到一个 Transformer 模型中,并要求该模型使用 Masked Language Modelling 一次预测一个 token。
关于 Transformer 模型的一般概述,请查看 Jay Alammar 撰写的 The Illustrated Transformer 文章,它帮助我理解了核心概念。
sus 使用了一个名为 UniXcoder 的模型,该模型在 CodeSearchNet 数据集上进行了训练。为了执行 MLM(masked language modelling),我们添加了一个 lm_head 层。
当 sus 处理你的代码时,它首先对文本进行标记化,其中 token 可以是特殊字符或编程语言关键字、英文单词或单词的一部分。
在将 token id 序列输入模型之前,一个或多个 token 会被替换为特殊的 <mask> token。在将输入通过网络处理后,我们仅提取被掩码位置的值。这种掩码操作针对每个 token 循环执行,以生成单独的预测。
由于该过程速度慢得不可行,因此,sus 不再每次掩码一个 token,而是掩码 10% 的 token,并确保被掩码的位置分布均匀(以便每个预测位置周围有充足的上下文)。
整个过程的输出是一个结构体列表,其中包含每个 token 的原始值和预测值。示例:
{
"idx": 0, // position in sequence
"original": "foo", // as originally written in the source file
"predicted": "bar", // what the model predicted
"cosine_similarity": 0.23, // how different the prediction is from the original in the vector space
"probability": 0.92, // how confident the model is in it's prediction
}
然后,它会被送入一个 html 模板,以便为用户进行渲染。简单又轻松。
模型
sus 使用了 UniXcoder 的解码器,具体是 unixcoder-base-nine 检查点。酷的是,它只有 500 MB 且约 1.2 亿参数,这意味着下载速度快,且足以在本地快速运行。
更大的模型能产生更高质量的输出,但你需要在服务器上运行推理。
支持的语言
你可以在任何源文件上尝试 sus,但使用以下语言时,你可以预期获得最佳结果:
- java
- ruby
- python
- php
- javascript
- go
- c
- c++
- c#
缺陷与限制
- 准确性 —
sus旨在本地执行(即不将代码发送到服务器),这对 AI 模型的大小施加了一些限制。更大的模型将产生更高质量的结果,但它们可能有几十 GB 的大小,并且如果没有强大的 GPU,生成输出可能需要很长时间。因此,sus使用了一个中等大小的模型。 - 大文件 — 模型 也对输入大小(分析的文件大小)施加了限制。
sus通过批量处理输入来绕过此问题,但因此,批次并不了解其他批次中的“上下文”/代码。文件被分割为 2500 个字符的批次,这非常粗糙,旨在对应约 1024 个 token。 - 掩码 是按 token 基础进行的。首先从代码生成语法树,然后对整个节点进行掩码可能会更有趣。
许可证
Semantic Code Search 在 AGPL-3.0-only 下分发。对于 Apache-2.0 例外 — kiril@codeball.ai