HN 日本語サマリー

← 一覧へ戻る
プログラミング

Show HN: 埋め込みモデルで非厳密なコード重複を検出するCLIツール

Show HN: CLI tool for detecting non-exact code duplication with embedding models (github.com)

61 pointsby rkochanowski28 コメント

要約

Rafal-qa氏が開発した「Slopo」は、埋め込みモデルを使用してコードの非厳密な重複を検出する軽量なCLIツールです。特に、コードベースの離れた場所にあり、検出が困難で有害な類似コードに焦点を当てています。Python、TypeScript、Javaなど複数の言語をサポートし、コードの類似性をランク付けしてレポートを生成します。

全文翻訳

Slopo 埋め込みモデルを使用して非厳密なコード重複を検出する軽量なCLIツールです。 このツールは、コードベースの離れた場所にあり、検出が最も困難で有害な、類似したコードスニペットに焦点を当てています。正確なコピー&ペーストは他のツールで容易に発見でき、近くにある重複も人間やAIで容易に発見できます。問題のより高レベルな説明については、slopo.devを参照してください。 サポート言語 Python, TypeScript, JavaScript, Java, Kotlin, C#, Go, Rust 仕組み 一般的な重複検出とは異なるアプローチを取ります。各コードユニットに対して埋め込みを計算し、埋め込みが近いペアを探します。類似したコードが必ずしも重複であるとは限らないため、各ペアは確認すべき潜在的な重複となります。完全に異なる方法で実装された、同じことを行うコードは、埋め込みが離れており検出されません。 結果として、類似性でランク付けされた類似コードユニットのクラスターが得られます。これらのクラスターは、AIコーディングエージェントへの入力として意図されており、クラスターが実際の重複であるかを確認できます。レビュー済みのクラスターは無視するか、リファクタリングのために渡すことができます。 例レポート Slopoコード、srcディレクトリ、gitタグv0.2.0から生成されたdoc/example-reportを参照してください。この例では、各言語のコードパーサーに多くの重複があることが確認されました。一部は完全コピー、一部は類似バリアントです。リファクタリングが必要です。 クイックスタート インストール uv tool install slopo このコマンドは、uv(uvのインストール)を使用して、SlopoをPyPIから分離された仮想環境にインストールします。Pythonを別途取得する必要はありません。 セットアップ slopo initを実行して、さらに指示を含む設定ファイルテンプレートを作成します。分析対象のコードディレクトリと埋め込みモデルの設定のみが必要です。 埋め込みモデル 埋め込みは外部プロバイダーを使用して計算されます。最良の結果を得るには、コード専用のモデル(例: Voyage AI、低次元(512など)でもうまく機能します)を検討してください。LiteLLMと互換性のある任意のモデルプロバイダーを使用できます。詳細はここを参照してください。プロバイダーAPIキーは、セキュリティ向上のために環境変数として設定できます。 分析 slopo show-configを実行して設定を検証し、すべての設定可能なパラメータを表示します。ほとんどは sensible defaults が設定されています。これで、コードのインデックス作成、埋め込みの計算、レポートの生成の準備が整いました。 slopo index slopo embed slopo analyze 実際のワークフロー このセクションでは、Slopoを実際の開発ワークフローで使用する方法を示します。インクリメンタルな再インデックス作成(変更されたファイルのみでインデックスを更新)と、slopo.ignore.txtを使用して既にレビュー済みのクラスターを破棄します。 最初のアナリシスを作成し、結果を確認してください。index.mdには、すべてのクラスターのリストと、ファイルごとのクラスターの詳細が含まれていることに気づくでしょう。一部のディレクトリやファイルパターンを除外したい場合があります。通常、テストを除外するのは良い考えです。結果が大きすぎるか小さすぎる場合は、しきい値を調整することもできます。 アナリシス結果に満足したら、AIコーディングエージェントに、実際の重複ではないクラスターを除外するように依頼してください。類似したコードがすべて対処すべき重複であるとは限らないため、これは一般的なケースです。AIエージェントに、破棄されたクラスターハッシュをslopo.ignore.txtに追加するように依頼してください。 レビュー済みのクラスターを含まないレポートを生成するために、アナリシスを再実行します。これは、AIエージェントによって実行できるリファクタリングの基礎となります。ignoreファイルはGitリポジトリにコミットして、チーム間で再利用できます。新しく変更されたクラスターがレポートに再表示されます。APIキーなしの設定ファイルもコミットできます。slopo.dbはローカルデータなのでコミットしないでください。 設定 slopo --help および slopo show-config を実行して、いつでも自分で探索できます。ほとんどの設定は設定ファイルで行われますが、2つの例外があります。 設定ファイルの場所は、--configオプションで上書きできます。APIキーは、現在のディレクトリにある.envファイルからも取得されるSLOPO_EMBEDDING_API_KEY環境変数で設定できます。一部のパラメータは、最初のインデックス作成後に変更できないことに注意してください。slopo.dbとindex/embedを最初から削除する必要があります。source_dir、embedding_model、embedding_dimensions、body_node_count_threshold。 すべて設定可能なパラメータ source_dir: インデックス作成するコードを含むソースディレクトリ、絶対パスまたは相対パス。 source_dir_exclude: インデックス作成から除外する.gitignoreスタイルのパターン。 db_file: ツールデータを含むSQLiteデータベースファイル。 report_dir: 分析レポートの出力ディレクトリ。 ignore_file: 無視するクラスターのテキストファイル。 embedding_model: LiteLLM形式の埋め込みモデル名。 embedding_dimensions: 使用するモデルと互換性のある埋め込み次元。 embedding_api_key: 埋め込みプロバイダーのAPIキー。環境変数で設定されている場合はオプション。 embedding_batch_size および embedding_batch_chars: 埋め込みAPIへのリクエストは、パフォーマンスのためにバッチ処理されます。デフォルトはほとんどの場合問題ありません。 similarity_threshold: 埋め込み間の最小コサイン類似度を制御します。 rerank_threshold: コードベース内の距離を反映するブーストを適用した後の最小類似度を制御します。 body_node_count_threshold: 本体内のASTノード数(シグネチャとアノテーションを除く)。この値は、含まれるコードユニットの最小コード複雑性を反映しており、テキスト長よりも正確です。レポートで不要な、小さすぎるコードユニットに気づいた場合は増やしてください。 詳細 ランキングしきい値 類似コードユニットは2つのパスでフィルタリングされ、それぞれに独自の構成可能なしきい値があります。パイプラインは次のとおりです。 similarity_thresholdは、埋め込みが十分に類似していないコードユニットペアを除外します。計算される値は、-1から1の範囲のコサイン類似度であり、1は同一を意味します。類似したペアはクラスターにグループ化されます。クラスター内のユニットは、コードベース内の距離を反映するブーストを適用した後、再ランク付けされます。ブーストは、ペアの別のファイルに到達するために必要なディレクトリホップ数(最大15%)に基づいて計算されます。それらが同じファイル内にある場合、ブーストは行数に基づく距離(最大10%)に基づいて計算されます。 rerank_thresholdは、最高スコアのペアが高すぎないクラスターを除外します。 完全コピー重複 このツールの主な目的は非厳密なコード重複を検出することですが、完全コピー(複数のパスにわたる同一のコード)も報告されますが、単に類似したコードとは少し異なる方法で扱われます。 レポートはコードを一度表示し、それが現れるすべてのパスをリスト表示します。代わりに、同一のスニペットを繰り返すことはありません。analyzeコマンドは、「類似性比率」(類似としてフラグ付けされたコードユニットの割合)を2つのバリアントで報告します。完全コピーを含む場合と含まない場合です。