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 的方法有多項高價值的應用場景:
- 推送前掛鉤:將工具整合至 pre‑push hook,以在完成初步清理後維持程式碼庫的整潔。
- 語意重複:識別語意層面的重複,而非直接的複製貼上,這在大型重構前特別有用。
- 程式碼審查整合:在程式碼審查時使用相似片段偵測,提醒開發者倉庫中已有相同功能的實作。
"我建立 Slopo 是為了解決一個特定問題:找出其他工具、程式碼 AI 代理與人類最難偵測的相似程式碼…有時候大部分偵測到的重複是誤報,但剩下的則是值得重構甚至可能是 bug 的強力候選。"
— rkochanowski,Slopo 創作者
摘要: Slopo 是一款 CLI 工具,利用嵌入模型在不同模組與檔案間識別非完全相同的程式碼重複,優先偵測那些傳統複製貼上偵測器常忽略的相似程式碼。
標題: Slopo:使用嵌入模型偵測非完全相同的程式碼重複