Slopo: 埋め込みモデルによる非正確コード重複検出
Slopo: 埋め込みモデルによる非正確コード重複検出
Slopo は埋め込みモデルを使って非正確なコード重複を検出します
Slopo は、正確なコピーペーストではないコードの重複を検出するために設計された軽量 CLI ツールです。埋め込みモデルを活用することで、コードベース内で遠く離れた場所にあったり、異なるモジュール間に散在したり、大きなファイル内で分離されている、書き方が似ているコードスニペットを特定します。このアプローチは、意味的に似ているが文字列としては一致しない「検出が最も難しい」重複を対象とし、保守性に最も悪影響を及ぼすケースを捕らえます。
埋め込みベースの検出の仕組み
Slopo は従来の重複検出とは異なり、すべてのコード単位に対して埋め込みベクトルを算出します。その後、埋め込みベクトルが数値的に近い(コサイン類似度を使用)コード単位のペアを潜在的な重複としてマークします。
検出パイプライン
類似コード単位は、ノイズを減らすために二段階のプロセスでフィルタリングされます。
- 類似度閾値: ツールはまず、コサイン類似度が最低基準(-1 から 1 の範囲)を満たさないペアを除外します。
- 再ランク付けとブースト: 類似ペアはクラスタにまとめられ、再ランク付けされます。コードベース内の距離に応じて「ブースト」が適用されます:
- クロスファイル: 他のファイルまでのディレクトリ階層の数に基づいてブーストが適用されます(最大 15%)。
- 同一ファイル: 行数の距離に基づいてブーストが適用されます(最大 10%。)
このランク付けシステムにより、コードベース内で遠く離れた場所にある類似コードが優先されます。これは人間の開発者にとって最も見落としやすい重複です。
正確なコピーの取り扱い
Slopo は非正確な重複に重点を置きますが、正確なコピーも検出します。レポートをすっきりさせるために、同一コードは一度だけ表示され、出現するすべてのパスがリストとして添付されます。同じスニペットが複数回表示されることはありません。
対応言語と技術要件
Slopo は以下のような主流プログラミング言語を幅広くサポートしています。
- Python
- TypeScript
- JavaScript
- Java
- Kotlin
- C#
- Go
- Rust
埋め込みモデルの設定
埋め込みは LiteLLM と互換性のある外部プロバイダーを通じて生成されます。最適な結果を得るために、作者は Voyage AI などコード専用にチューニングされたモデルの使用を推奨しています。ツールは埋め込み次元数やバッチサイズを柔軟に設定でき、パフォーマンスの最適化が可能です。
開発ワークフローへの統合
Slopo は大規模なリファクタリングワークフローの一部として、しばしば AI コーディングエージェントと併用して使用されます。
推奨ワークフロー
- 初期分析:
slopo index、slopo embed、slopo analyzeを実行し、初期レポートを生成します。 - フィルタリング: AI コーディングエージェントを使って類似コードのクラスタをレビューし、実際にリファクタリングが必要な真の重複かどうかを判断します。
- 除外: 除外したクラスタは
slopo.ignore.txtに追加します。このファイルは Git リポジトリにコミットでき、チーム全体で同じレビュー結果を共有できます。 - リファクタリング: 残った検証済みの重複を基にリファクタリングを行います。
主な設定パラメータ
ユーザーは以下のパラメータでツールの感度を調整できます。
similarity_threshold: 最初のパスで使用する最低コサイン類似度を調整します。rerank_threshold: コードベース距離ブースト適用後の最低類似度を調整します。body_node_count_threshold: コード単位の AST ノード数の最低数を設定します。これにより、一定以上の複雑さを持つコード単位のみが分析対象となり、レポートが些細な小片で埋め尽くされるのを防ぎます。
コミュニティの洞察と活用例
開発者間の議論から、Slopo のアプローチには以下のような高付加価値の活用シーンが挙げられています。
- プッシュ前フック: 初回のクリーンアップ後にコードベースの清浄性を保つため、プッシュ前フックにツールを組み込む。
- セマンティック重複: 直接的なコピーペーストではなく意味的に重複している箇所を特定。大規模リファクタリング前に特に有用。
- コードレビュー統合: コードレビュー時に類似スニペット検出を行い、リポジトリ内で同様の実装が既に存在することを開発者に警告する。
"Slopo を作ったのは、他のツールやコーディング AI エージェント、人間が最も検出しにくい類似コードを見つけるという、特定の問題を解決するためです…検出された重複の多くは偽陽性ですが、残ったものはリファクタリングやバグの候補として非常に有力です。"
— rkochanowski, Slopo の創作者