Slopo:使用嵌入模型检测非精确代码重复

Slopo:使用嵌入模型检测非精确代码重复

Slopo 使用嵌入模型识别非精确代码重复

Slopo 是一个轻量级的 CLI 工具,旨在检测并非精确复制粘贴的代码重复。通过利用嵌入模型,它能够识别在代码库中相似编写但可能相距甚远、跨不同模块或在大型文件中分散的代码片段。这种方法针对的是“最难检测”的重复——语义相似但并非完全相同的代码,这类重复往往对可维护性危害最大。

基于嵌入的检测工作原理

Slopo 与传统的重复检测不同,它为每个代码单元计算一个嵌入向量。随后识别出嵌入在数学上相近(使用余弦相似度)的代码单元对,并将其标记为潜在重复。

检测流水线

相似的代码单元会通过两遍过滤过程以降低噪声:

  1. 相似度阈值:工具首先过滤掉嵌入相似度未达到最低余弦相似度(范围 -1 到 1)的配对。
  2. 重新排序与加权:相似配对被分组成簇,然后对这些簇重新排序。根据代码库中的距离会应用“加权”:
    • 跨文件:根据到达另一个文件所需的目录跳数加权(最高 15%)。
    • 同文件:根据行数距离加权(最高 10%)。

该排序系统确保位于代码库中相距较远的相似代码被优先处理,因为这些是对人类开发者最不明显的重复。

处理精确复制

虽然 Slopo 侧重于非精确重复,但它同样会检测到精确复制。为保持报告简洁,完全相同的代码只会显示一次,并附带出现该代码的所有路径列表,而不是多次重复相同片段。

支持的语言和技术要求

Slopo 支持多种流行编程语言,包括:

  • Python
  • TypeScript
  • JavaScript
  • Java
  • Kotlin
  • C#
  • Go
  • Rust

嵌入模型配置

嵌入通过兼容 LiteLLM 的外部提供商生成。为获得最佳效果,作者推荐专门用于代码的模型,例如 Voyage AI 的模型。工具允许灵活配置嵌入维度和批量大小,以优化性能。

集成到开发工作流中

Slopo 设计为可作为更大重构工作流的一部分使用,常与 AI 编码代理配合使用。

推荐工作流

  1. 初始分析:运行 slopo indexslopo embedslopo analyze 生成初始报告。
  2. 过滤:使用 AI 编码代理审查相似代码簇,判断它们是否是真正需要重构的重复。
  3. 忽略:被丢弃的簇会添加到 slopo.ignore.txt,该文件可提交到 Git 仓库,以确保团队共享相同的审查结果。
  4. 重构:剩余的已验证重复将作为重构的依据。

关键配置参数

用户可以通过以下参数调节工具的灵敏度:

  • similarity_threshold:调整第一遍过滤的最低余弦相似度。
  • rerank_threshold:在应用代码库距离加权后调整的最低相似度。
  • body_node_count_threshold:设置代码单元主体中 AST 节点的最小数量。此阈值确保仅分析一定复杂度的代码单元,防止报告被琐碎、小片段淹没。

社区洞见与使用案例

开发者的讨论表明 Slopo 方法有多种高价值的应用场景:

  • 预推送钩子:将工具集成到 pre‑push 钩子中,以在初次清理后保持代码库整洁。
  • 语义重复:识别语义层面的重复而非直接复制粘贴,这在大型重构前尤为有用。
  • 代码审查集成:在代码审查期间使用相似片段检测,提醒开发者仓库中已有可能实现相同功能的代码。

"我创建 Slopo 是为了解决一个特定问题:寻找其他工具、编码 AI 代理和人类最难检测的相似代码……有时检测到的大多数重复是误报,但剩下的往往是值得重构甚至是 bug 的强候选。"

— rkochanowski,Slopo 创作者

Sources