SWE-QA: Can Language Models Answer Repository-level Code Questions?¶
会议: ACL 2026
arXiv: 2509.14635
代码: https://github.com/peng-weihan/SWE-QA-Bench
领域: 代码智能 / 仓库级问答
关键词: 仓库级代码理解, Code QA, RAG, 软件工程 Agent, SWE-Bench
一句话总结¶
SWE-QA 构建了一个覆盖 15 个真实 Python 仓库、720 个高质量问答对的仓库级代码问答基准,用 GitHub issue 归纳问题类型并用人工校验答案,实验显示单纯 LLM 直接回答很弱,RAG 与 OpenHands/SWE-agent 这类工具化 agent 才能接近真实开发问答需求。
研究背景与动机¶
领域现状:代码问答评测长期偏向函数、代码片段、API 注释或 StackOverflow 式局部问题,例如 CoSQA、CodeQA、CodeQueries 等基准更像是在考“给一段代码能不能解释”。近两年出现 CodeRepoQA、CoreQA、Spyder-CodeQA 等仓库级数据集,但覆盖的问题类型、跨文件依赖和人工验证仍不够系统。
现有痛点:真实软件开发里,开发者常问的并不是“这行代码什么意思”,而是“某个 feature 在哪里实现”“为什么这个类要延迟访问某个属性”“某个测试如何跨路由、配置和 request context 生效”。这类问题需要模型在多个文件、类、函数和控制流之间跳转,单靠参数记忆或一段检索片段很容易漏掉关键依赖。
核心矛盾:代码大模型越来越会写局部代码,但评测体系仍没有充分检验“仓库作为系统”的理解能力。片段级 benchmark 可以让模型看起来很强,却不能说明它能否回答真实维护者会问的系统设计、依赖追踪和功能定位问题。
本文目标:作者希望补上一个更贴近真实软件工程的评测切面:一方面从开发者 issue 中抽象出仓库级问题 taxonomy,另一方面构造可复用的 QA 生成与人工校验流水线,再用这个基准系统比较 direct prompting、RAG、agent 和商业代码助手。
切入角度:论文没有从手写模板凭空编题,而是先爬取 SWE-Bench 相关仓库的 GitHub issues,观察真实开发者如何提问,再把这些问题归纳为 What / Why / Where / How 四大类与 12 个细粒度意图。这让 benchmark 的问题分布更像真实开发环境,而不是单纯的学术任务拼接。
核心 idea:用 GitHub issue 驱动的问题 taxonomy 加上静态代码结构与人工校验,构造一个既可扩展又能考察跨文件、多跳、仓库级推理的代码问答基准。
方法详解¶
SWE-QA 本质上是一篇 benchmark 论文,但它的方法部分不只是“收集数据”,而是一条完整的仓库级问答生产线。作者先从真实 issue 中理解开发者问题,再把问题类型模板化;随后解析目标仓库,围绕具体类、函数或模块实例化问题;接着用 RAG 生成初始答案,最后由有经验的开发者逐条修订、交叉验证和过滤。
整体框架¶
输入是一批真实开源 Python 仓库,以及从 GitHub issues 中抽取出的开发者问题。输出是 720 个仓库级 QA 对,每个问题都绑定一个目标仓库、一个问题类型、一个需要多跳推理的上下文和一个人工校验过的长答案。
整个 pipeline 分四步:第一步,爬取并分析 GitHub issue,建立问题 taxonomy 与 seed templates;第二步,用 tree-sitter 解析仓库结构,围绕焦点代码元素实例化问题;第三步,用检索增强生成方式生成初始参考答案;第四步,由专家修订答案、过滤低质量样本并做类别平衡。
关键设计¶
-
从真实 issue 归纳仓库级问题 taxonomy:
- 功能:把真实开发者在 issue 中提出的问题压缩成可复用的问题类型体系。
- 核心思路:作者爬取 12 个 SWE-Bench 热门仓库的 77,100 个 GitHub issues,过滤出正文长度至少 1,000 字符的 41,955 个 issue,再用 LLM 从 issue 中抽取显式代码理解问题,得到 127,415 个问题。随后人工抽样 1,000 个问题做开放编码,形成 What、Why、Where、How 四大类和 12 个细粒度意图,例如 Architecture exploration、Dependency tracing、Design rationale、Feature Location、Algorithm Implementation 等。
- 设计动机:如果问题类型来自研究者主观设计,很容易偏向“容易标注”的局部问题;从 issue 中归纳 taxonomy 可以把真实维护工作中的系统性问题保留下来,也让后续问题模板更有开发场景感。
-
基于仓库结构的问题实例化与答案生成:
- 功能:把抽象 seed question 转成某个真实仓库里的具体、多跳问题。
- 核心思路:论文用 tree-sitter 解析仓库,提取类、函数、方法和依赖关系,围绕一个 focal element 选择紧凑子图,再套入 seed template。答案生成阶段会先构建代码元素索引,结合语义相似度和结构依赖检索相关代码、文档和架构信息,再让强模型在这些上下文上生成初始答案,并要求引用代码位置、避免脱离上下文发挥。
- 设计动机:仓库级问题难在上下文既长又稀疏。直接把整个仓库塞给模型不可行,只取单个函数又不够;用结构子图和检索上下文折中,能让问题真实、答案可追溯,同时控制生成成本。
-
双专家修订与类别平衡的数据验证:
- 功能:确保每个 QA 对既正确又覆盖完整,并且每个仓库的问题分布均衡。
- 核心思路:每个答案由两名有至少三年开发经验的专家独立检查事实、完整性和表述;若分歧较大,引入第三名专家共同讨论达成一致。最后过滤模糊问题、事实错误答案、无法用仓库内容支撑的答案,并强制每个仓库保留 48 个样本,What / Why / Where / How 四类均衡。
- 设计动机:仓库级答案通常很长,平均 266.64 个词,且涉及 8.71 个函数、3.19 个文件。仅靠 LLM 生成容易产生局部正确但整体漏链的答案,人工交叉验证是保证 benchmark 可信度的关键。
损失函数 / 训练策略¶
本文不训练新模型,因此没有传统损失函数。评测策略是把 SWE-QA 作为测试集,比较六个 LLM 在 direct prompting、Function Chunking RAG、Sliding Window RAG、SWE-agent、OpenHands 等上下文增强方式下的答案质量。自动评测使用 Claude Sonnet 4.5 作为 LLM-as-Judge,从 correctness、completeness、relevance、clarity、coherence 五个维度打分,每个维度 20 分,总分 100,并通过候选系统匿名化、答案顺序随机化和人工评估切片降低 judge 偏差。
实验关键数据¶
主实验¶
SWE-QA 包含 720 个问题,覆盖 15 个 Python 仓库、13,300 个文件、22,522 个类、142,404 个函数与超过 340 万行代码。平均每个问题需要 8.71 个函数、3.19 个文件、4.72 层 reasoning chain 和 2.96 层 dependency chain;90.9% 的问题 reasoning chain 深度大于 1,77.6% 需要跨文件知识。
| 系统 / 方法 | Overall | 关键信息 | 结论 |
|---|---|---|---|
| Qwen3-Coder-30B direct | 50.80 | 无仓库上下文 | 直接回答最弱 |
| Qwen3-Coder-30B + Sliding Window RAG | 64.86 | +14.06 | 检索上下文明显补强 |
| Qwen3-Coder-30B + OpenHands | 65.88 | +15.08 | 小模型使用 agent 有提升但不稳定 |
| GLM-4.6 + OpenHands | 70.15 | 接近最佳 | 强模型配 agent 很有竞争力 |
| GPT-5.1 direct | 61.41 | 基础能力最强 | 但仍低于工具化系统 |
| GPT-5.1 + OpenHands | 70.79 | 全表最佳 | agent 框架带来最高总分 |
| Cursor | 70.66 | 商业工具 | 接近最佳开放组合 |
| Tongyi Lingma | 69.07 | 商业工具 | 说明端到端工程化检索有效 |
消融实验¶
论文没有对数据构造模块做传统 ablation,但做了问题类型、仓库来源和评测协议分析,可以看成对 benchmark 难点的拆解。
| 分析维度 | 关键结果 | 说明 |
|---|---|---|
| Why 类问题 | 平均 69.77 | 设计理由、目的解释通常有注释或语义线索,模型更容易回答 |
| How 类问题 | 平均 69.13 | 系统设计和算法实现需要过程理解,但常可由结构化上下文支持 |
| Where 类问题 | 平均 66.76 | 需要精确定位代码位置,对检索召回和跨文件追踪要求更高 |
| What 类问题 | 平均 65.81 | Architecture exploration 仅 61.84,是最难子类之一 |
| SWE-Bench 仓库 | 平均 68.59 | 相比 SWE-Bench-Live 更容易 |
| SWE-Bench-Live 仓库 | 平均 64.98 | 低 3.61 分,可能更少受训练数据泄漏影响 |
| 人工评估 GPT-5.1 + OpenHands | 82.33 | 与 LLM-as-Judge 排序一致,支持自动评测可信度 |
关键发现¶
- 上下文获取方式几乎决定上限:direct prompting 对仓库级问题明显不够,RAG 能稳定提升,OpenHands/SWE-agent 这类 agent 在强模型上进一步提升。
- What 与 Where 问题更难,因为它们要求模型找准实现位置、重建架构关系和数据/控制流,而不是泛泛解释目的。
- Agent 的代价很高:OpenHands 平均每题约 87,045 个输入 token / 1,930 个输出 token,SWE-agent 更高,说明性能提升伴随显著成本。
- Pylint 等大型复杂仓库显著更难,Flask、Requests 等较小仓库得分更高,仓库规模和架构复杂度会直接影响 QA 难度。
亮点与洞察¶
- 这篇论文最好的地方是把“仓库级理解”具体化为可评测的数据结构,而不是停留在口号。它用 issue 归纳问题类型,说明真实开发者的问题并不只是 API 查询,而是大量跨文件定位、设计理由和系统行为解释。
- 数据统计很有说服力:平均一个问题涉及 3.19 个文件和 8.71 个函数,77.6% 需要跨文件信息,这些数字直接证明 SWE-QA 与传统片段级 Code QA 不是同一个难度层级。
- 对 RAG 与 agent 的比较很实用。结果并没有简单说“大模型最好”,而是显示 GPT-5.1 direct 也只有 61.41,必须配合检索和工具化执行才能到 70+,这对代码助手系统设计很有启发。
- 这个 benchmark 可以迁移到项目内文档问答、配置理解、测试失败解释等任务:先从真实 issue / ticket 归纳问题模板,再用结构化解析和人工校验构造组织内部评测集。
局限与展望¶
- 目前只覆盖 Python 仓库,且主要来自 SWE-Bench / SWE-Bench-Live,语言、工程栈和生态仍较窄;Java、TypeScript、C++ 项目的构建系统和依赖关系会带来不同挑战。
- QA 对规模为 720,质量很高但规模不大。如果要训练或微调仓库级 QA 模型,还需要更大规模、持续更新的数据。
- 自动评测依赖 LLM-as-Judge,即使有人类评估验证,复杂代码答案中的细粒度事实错误仍可能被 judge 漏掉。
- 问题答案以自然语言为主,还没有要求模型实际执行测试、运行静态分析或给出可验证 patch;未来可以把 QA 与仓库操作任务结合起来。
相关工作与启发¶
- vs CoSQA / CodeQA: 这些数据集更偏查询到代码片段或函数级问答,SWE-QA 则明确考察仓库级、多跳和跨文件推理,难度更接近真实软件维护。
- vs CodeRepoQA / CoreQA: 这些工作已经进入 repo-level,但 SWE-QA 更强调问题 taxonomy、模块级信息、multi-hop reasoning 与人工验证的组合,因此评测维度更完整。
- vs SWE-Bench: SWE-Bench 关注 issue resolution 和生成 patch,SWE-QA 关注回答仓库理解问题;两者可以互补,一个考“会不会改”,一个考“懂不懂系统”。
- 对代码助手的启发: 仅靠 embedding 检索函数块还不够,强代码助手需要结构索引、跨文件依赖追踪和可迭代工具调用,否则很难回答 Why / Where 类真实问题。
评分¶
- 新颖性: ⭐⭐⭐⭐☆ 从真实 issue 归纳仓库级 QA taxonomy 很扎实,benchmark 设计比普通 Code QA 更贴近软件工程。
- 实验充分度: ⭐⭐⭐⭐☆ 覆盖 6 个 LLM、5 类上下文增强、商业工具、问题类型和仓库分析,但缺少更多语言与动态执行设置。
- 写作质量: ⭐⭐⭐⭐☆ 构造流程、统计和评测维度写得清楚,表格信息密集,少量 pipeline 细节还可更形式化。
- 价值: ⭐⭐⭐⭐⭐ 对代码助手、repo-level RAG 和软件工程 agent 都很有参考价值,是一个可以直接复用的评测基准。