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 hook,以在完成初步清理後維持程式碼庫的整潔。
  • 語意重複:識別語意層面的重複,而非直接的複製貼上,這在大型重構前特別有用。
  • 程式碼審查整合:在程式碼審查時使用相似片段偵測,提醒開發者倉庫中已有相同功能的實作。

"我建立 Slopo 是為了解決一個特定問題:找出其他工具、程式碼 AI 代理與人類最難偵測的相似程式碼…有時候大部分偵測到的重複是誤報,但剩下的則是值得重構甚至可能是 bug 的強力候選。"

— rkochanowski,Slopo 創作者


摘要: Slopo 是一款 CLI 工具,利用嵌入模型在不同模組與檔案間識別非完全相同的程式碼重複,優先偵測那些傳統複製貼上偵測器常忽略的相似程式碼。

標題: Slopo:使用嵌入模型偵測非完全相同的程式碼重複

Sources