通过部分依赖图进行有效且高效的上下文检索以生成存储库级代码
Effective and Efficient Context Retrieval via Partial Dependency Graph for Repository-Level Code Generation
摘要
基于 LLM 的存储库级代码生成旨在使用软件存储库中可用的上下文生成代码,需要 LLM 对复杂的代码依赖关系进行推理。由于上下文窗口有限和对存储库特定的理解不足,LLM 通常依赖检索增强生成 (RAG) 来合并相关代码。早期的 RAG 方法主要采用基于相似性的检索,通常无法检索目标函数所依赖的代码片段。最近的工作引入了基于图的检索来对此类依赖关系进行建模,但通常依赖于手动设计的规则和静态全局图,导致灵活性有限以及构建和维护成本较高。相比之下,人类开发人员通过隐式构建部分依赖图并沿其迭代检查来收集有用的上下文。受这种行为的启发,我们提出了 DyRetriever,一种通过部分依赖图的高效上下文检索方法。 DyRetriever 使用 LLM 首先选择一组入口点函数,然后沿着代码依赖图执行多跳推理。在多跳推理过程中,它利用LLM的语义理解来验证函数是否可以帮助生成目标函数,从而消除手动设计的规则并实现跨场景的灵活性。 DyRetriever 不是静态构建全局依赖图,而是按需构建部分图并在使用后丢弃,从而降低构建和维护成本。我们将 DyRetriever 与基于相似性的代码 检索器 集成来构建 DyCoder 并在 CoderEval 和 DevEval 上对其进行评估。实验结果表明,与现有基于 RAG 的方法相比,DyCoder 在 CoderEval 和 DevEval 上分别实现了 25.63% 和 59.73% 的相对 Pass@1 改进,同时比基于静态依赖图构建的基线快 7.4 倍。