返回

文章详情

展示 HN:用于检测非精确代码重复的 CLI 工具,采用嵌入模型

Hacker News2026年7月2日 14:19

这是一个轻量级的 CLI 工具,使用嵌入模型检测非精确代码重复。它专注于那些最难被检测和最有害的相似代码:在代码库中相距较远、经常分散在不同模块或大型文件中的相似代码片段。其它工具容易识别精确的复制粘贴,而人类或 AI 则可以轻松识别相近的重复项。有关问题的更高层次描述,请参阅 slopo.dev 。支持的语言包括 Python、TypeScript、JavaScript、Java、Kotlin、C#、Go 和 Rust。工作原理与典型的重复检测方法不同。对于每个代码单元,它计算一个嵌入,然后查找嵌入相近的对。相似代码未必是重复,因此每对都是需要确认的潜在重复项。执行相同功能但以完全不同方式实现的代码会产生遥远的嵌入,不会被检测到。结果是相似代码单元的聚类,按相似度和在代码库中的距离排序。这些聚类可以作为你的 AI 编码代理的输入,AI 可检查聚类是否为真实的重复项。经过审核的聚类可以标记为忽略或传递给重构。示例报告请参阅从 Slopo 代码生成的文档/example-report,src 目录,git 标签 v0.2.0 。该示例确认每种语言的代码解析器存在大量重复,其中一些是精确复制,有些是相似变体。这需要重构。快速入门安装 uv tool install slopo 该命令使用 uv(安装 uv),一个 Python 包管理器,从 PyPI 在一个隔离的虚拟环境中安装 Slopo。不需要单独获取 Python。设置运行 slopo init 创建一个包含进一步说明的配置文件模板。只需要分析代码的目录和嵌入模型配置。嵌入模型嵌入是使用外部提供者计算的。为了获得最佳效果,考虑使用专门针对代码的模型,例如 Voyage AI(它与像 512 这样低维度的模型效果良好)。你可以使用任何与 LiteLLM 兼容的模型提供者,详情见此处。提供者 API 密钥可以设置为环境变量以提高安全性。分析运行 slopo show-config 以验证你的配置并显示所有可配置参数,大多数是可选的,具有合理的默认值。现在你可以准备索引代码、计算嵌入并生成报告: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 随时自行探索。大部分配置通过配置文件完成,有两个例外:配置文件的位置可以通过 --config 选项覆盖。API 密钥可以通过环境变量 SLOPO_EMBEDDING_API_KEY 设置,也可以从当前目录中的 .env 文件中获取。请注意,某些参数在第一次索引后无法更改。你需要删除 slopo.db 并重新索引/嵌入以下内容: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:控制最小的余弦相似度阈值。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡