大模型应用
当代码库疑似存在语义重复函数时…
适用于审计代码库中功能相同但命名或实现不同的函数,尤其是 LLM 生成、多人协作、自然增长的代码库。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
当代码库疑似存在语义重复函数时,用两阶段通用
解决思路
- 阶段1 提取函数目录:运行 `./scripts/extract-functions.sh src/ -o catalog.json` 提取函数清单;可用选项:`-o FILE` 指定输出文件(默认 stdout)、`-c N` 捕获上下文行数(默认 15)、`-t GLOB` 指定文件类型(默认 `*.ts,*.tsx,*.js,*.jsx`)、`--include-tests` 包含测试文件(默认排除 `*.test.*`、`*.spec.*`、`__tests__/**`,因为测试工具不太可能是合并候选)。
- 阶段2 按领域分类:使用 `scripts/categorize-prompt.md` 中的提示词派发一个 haiku 子代理,把 `catalog.json` 内容插入提示词模板指定位置,输出保存为 `categorized.json`。
- 阶段3 拆分为多个类别:运行 `./scripts/prepare-category-analysis.sh categorized.json ./categories`,为每个类别生成一个 JSON 文件;只有包含 3 个及以上函数的类别才值得分析。
- 阶段4 逐类别查找重复:对 `./categories/` 中每个类别文件,使用 `scripts/find-duplicates-prompt.md` 中的提示词派发一个 opus 子代理,每个输出保存为 `./duplicates/{category}.json`。
- 阶段5 生成报告:运行 `./scripts/generate-report.sh ./duplicates ./duplicates-report.md`,生成按置信度分组的优先级 markdown 报告。
- 阶段6 人工复核与合并:审阅报告,对高置信度重复项依次执行——1) 确认保留函数有测试覆盖;2) 更新调用方改用保留函数;3) 删除重复函数;4) 运行测试。
- 优先聚焦高风险重复区:`utils/`、`helpers/`、`lib/`(通用工具被反复实现)、校验代码(同样的检查多种写法)、错误格式化(错误转字符串)、路径处理(拼接、解析、规范化)、字符串格式化(大小写转换、截断、转义)、日期格式化(相同格式反复实现)、API 响应整形(不同端点的相似转换)。
- 避免常见错误:不要提取过多——聚焦导出函数和公共方法,内部辅助函数跨文件重复概率低;不要跳过分类步骤——直接对完整目录做重复检测会产生噪声,分类能聚焦比较;不要用 haiku 做重复检测——haiku 适合分类但会漏掉细微语义重复,实际重复分析要用 Opus;不要在无测试的情况下合并——删除重复前确保保留函数有覆盖被删函数所有用例的测试。
适用边界 · 注意事项
- 代码库很小或函数数量很少时,分类与逐类分析的开销不划算
- 已经用 jscpd 等工具处理完语法级重复之前,本方法针对的是语义重复,顺序上应先做语法去重
- 没有测试覆盖时不要直接删除重复函数,只能先标记待人工确认