From 0120d434ffe97b15f7995191714f5d6afc350a8b Mon Sep 17 00:00:00 2001 From: Paul Gauthier Date: Fri, 31 May 2024 09:33:31 -0700 Subject: [PATCH] added draft article --- _posts/2024-05-31-both-swe-bench.md | 212 +++ assets/swe-bench.jpg | Bin 0 -> 50871 bytes assets/swe-bench.svg | 2212 +++++++++++++++++++++++++++ benchmark/swe-bench.txt | 7 + benchmark/swe_bench_lite.py | 4 +- 5 files changed, 2433 insertions(+), 2 deletions(-) create mode 100644 _posts/2024-05-31-both-swe-bench.md create mode 100644 assets/swe-bench.jpg create mode 100644 assets/swe-bench.svg create mode 100644 benchmark/swe-bench.txt diff --git a/_posts/2024-05-31-both-swe-bench.md b/_posts/2024-05-31-both-swe-bench.md new file mode 100644 index 000000000..7fec7475d --- /dev/null +++ b/_posts/2024-05-31-both-swe-bench.md @@ -0,0 +1,212 @@ +--- +title: Aider is SOTA for both the main SWE Bench and SWE Bench Lite +excerpt: Aider sets SOTA for the main SWE Bench, after recently setting SOTA for the Lite version. +highlight_image: /assets/swe_bench.jpg +draft: true +--- + +# Aider is SOTA for both the main SWE Bench and SWE Bench Lite + +Aider scored 18.8% +on the main +[SWE Bench benchmark](https://www.swebench.com), +achieving a state-of-the-art result. +The current top leaderboard entry is 13.8% +from Amazon Q Developer Agent. + +This is in addition to +[aider's SOTA result on the easier SWE Bench Lite](https://aider.chat/2024/05/22/swe-bench-lite.html) +that was reported last week. + +[![SWE Bench results](/assets/swe_bench.svg)](https://aider.chat/assets/swe_bench.svg) + +Aider was benchmarked on 570 of the 2294 SWE Bench problems. +These are the same [randomly selected 570 problems](https://github.com/CognitionAI/devin-swebench-results/tree/main/output_diffs) that +[Devin used in their evalulation](https://www.cognition.ai/post/swe-bench-technical-report). +Please see the [references](#references) +for more details on the data presented in this chart. + +## Interactive, not agentic + +Aider achieved this result mainly through its existing features that focus on static code analysis, reliable LLM code editing, and pragmatic UX for AI pair programming. +Aider intentionally has quite limited and narrow "agentic behavior" +to avoid long delays, high token costs +and the need for users to repeatedly code review incorrect solutions. +It's also worth noting that aider currently does not use +RAG, vector search, tools or give the LLM access to search the web +or unilaterally execute code. + +Aider is first and foremost an interactive tool for engineers to get real work done in +real code bases using a chat interface. +Aider provides a pair programming UX where users can ask for a change +and see the edits performed in real-time. +Aider can also offer additional help like fixing lint or test errors, +but the user is always in full interactive control. +This lets them quickly steer misunderstandings back on course and +avoid wasting time and token costs. + + +## Benchmark methodology + +For the benchmark, +aider with GPT-4o was launched in each problem's git repository +with the problem statement +submitted as the opening chat message from "the user." +After that aider runs as normal, with the following modifications: + +- Aider's suggestions were always accepted without user approval. +- A simple harness was used to retry the SWE Bench problem if aider produced code that wasn't *plausibly correct*. +Plausibly correct means that aider reported that it had successfully edited the repo +without causing syntax errors or breaking any *pre-existing* tests. +- If the solution isn't plausible, the harness launches aider to try again from scratch, +this time using Claude 3 Opus. +- If no plausible solution is found after those two tries, the harness picks the "most plausible" solution with the fewest edit/lint/test problems. + +It's important to be clear that +*aider and the benchmark harness +only had access to the pre-existing tests in each problem's repo*. +The held out "acceptance tests" were *only* used +after benchmarking to compute statistics on which problems aider +correctly resolved. + +This is the same methodology +that was used for [aider's recent SOTA result on SWE Bench Lite](https://aider.chat/2024/05/22/swe-bench-lite.html). +The only difference is that at most two tries were attempted instead of six, +due to the increased token costs involved in this benchmark. +The SWE Bench problems are more difficult and involve edits to +more than one source file, +which increased the cost of solving each problem. +Further, aider was benchmarked on 570 SWE Bench problems, +versus only 300 Lite problems, +adding another factor of ~two to the costs. + +For a detailed discussion of the methodology, please see the +[article about aider's SWE Bench Lite results](https://aider.chat/2024/05/22/swe-bench-lite.html). +The [aider SWE Bench repository on GitHub](https://github.com/paul-gauthier/aider-swe-bench) also contains +the harness and reporting code used for the benchmarks. + +The benchmarking process was similar to how a developer might use aider to +resolve a GitHub issue: + +- They could launch aider in their repo with the command below, which +tells aider they want to accept every suggestion +and to use pytest to run tests. + - `aider --yes --test-cmd pytest` +- They could start the chat by pasting in the URL or text of a GitHub issue. +Aider will pull in the URL's content and then try and solve the issue. +- If aider doesn't produce code that lints and tests clean, the user might decide to revert the changes and try again, maybe using aider with a different LLM this time. +[Aider is tightly integrated with git](https://aider.chat/docs/faq.html#how-does-aider-use-git), +so it's always easy to revert AI changes that don't pan out. + +## Aider with GPT-4o alone was SOTA + +Running the benchmark harness +only using aider with GPT-4o to find plausible solutions with a single attempt +achieved a score of 17.0%. +This was itself a state-of-the-art result, before being surpassed by the main +result being reported here +that used aider with both GPT-4o & Opus. + +## Aider with GPT-4o & Opus + +The benchmark harness started by running aider with GPT-4o once to try +and solve the problem. If +no plausible solution was found, it then used aider with Opus +once to try and solve the problem. + +The table below breaks down the proposed solutions that +were found for the 570 problems. +A proposed solution is either: + +- A plausible solution where +aider reported no outstanding errors from editing, linting and testing. +- Or, the "most plausible" solution generated by either attempt, with the +[fewest outstanding editing, linting or testing errors](https://aider.chat/2024/05/22/swe-bench-lite.html#finding-a-plausible-solution). + +The table also provides details on the 107 solutions that were ultimately +verified as correctly resolving their issue. + +| Attempt | Agent |Number of
proposed
solutions|Percent of
proposed
solutions| Number of
correctly
resolved
solutions | Percent of
correctly
resolved
solutions | Score on
SWE Bench
Lite | +|:--------:|------------|---------:|---------:|----:|---:|--:| +| 1 | Aider with GPT-4o | 419 | 73.5% | 87 | 81.3% | 15.3% | +| 2 | Aider with Opus | 151 | 26.5% | 20 | 18.7% | 3.5% | +| **Total** | | **570** | **100%** | **107** | **100%** | **18.8%** | + +If we break down the solutions solely by model, +we can see that aider with GPT-4o outperforms Opus. +This isn't a fair and direct comparison, because GPT-4o always took the first +turn and therefore got first crack at all the "easiest" problems. +Aider with Opus only ever saw problems that GPT-4o failed to +find proposed solutions for on its first try. + +Aider with GPT-4o was producing higher quality proposed solutions, +with a greater chance of going on to be accepted as resolving the issue. +Again, this is biased by the turn ordering. +But other anecdotal evidence from earlier runs of the benchmark +also supports the observation that aider with GPT-4o is significantly stronger than Opus +for this benchmark. + + +| Agent | Number of
proposed
solutions | Number of
correctly
resolved
solutions | Percent of
proposed
which
correctly
resolved
| +|------------|---------:|---------:|---:| +| Aider with GPT-4o | 419 | 87 |20.8% | +| Aider with Opus | 151 | 20 |13.2% | +| **Total** | **570** | **107** |**18.8%** | + + +## Computing the benchmark score + +After benchmarking, +a separate evaluation script was used to +test each of these solutions with the full test suite, +including the held out acceptance tests. +For this final acceptance testing, any edits that aider made to tests +were discarded. +This ensured that the correct, +unmodified test suite is used for acceptance testing. +The evaluation script compared the test results +with results from testing +the "gold" patch that was developed by a human to correctly solve the issue. +If they matched, the candidate solution correctly resolved the issue. + +These acceptance tests were only ever run outside of aider +and the benchmark harness, and only to compute the number of +correctly resolved instances. +They were never run, used, or even visible during aider's attempts to solve the problems. + +Aider correctly resolved 107 out of 570 SWE Bench instances that were benchmarked, +or 18.8%. + +## Acknowledgments + +Much thanks to the team behind the +[SWE Bench](https://www.swebench.com) +family of AI coding benchmarks. +Also thanks to Albert Örwall who has +[dockerized the SWE Bench evaluation scripts](https://github.com/aorwall/SWE-bench-docker) +making it faster, easier, and more reliable to run the acceptance tests. + + +## References + +Below are the references for the SWE-Bench results +displayed in the graph at the beginning of this article. + +- [13.9% Devin (benchmarked on 570 instances)](https://www.cognition.ai/post/swe-bench-technical-report) +- [13.8% Amazon Q Developer Agent (benchmarked on 2294 instances)](https://www.swebench.com) +- [12.5% SWE- Agent + GPT-4 (benchmarked on 2294 instances)](https://www.swebench.com) +- [10.6% AutoCode Rover (benchmarked on 2294 instances)](https://arxiv.org/pdf/2404.05427v2) +- [10.5% SWE- Agent + Opus (benchmarked on 2294 instances)](https://www.swebench.com) + +The graph contains average pass@1 results for AutoCodeRover. +The [AutoCodeRover GitHub page](https://github.com/nus-apr/auto-code-rover) +features their pass@3 results +without being clearly labeled. +Table 2 of their +[paper](https://arxiv.org/pdf/2404.05427v2) +reports an `ACR-avg` result of 10.59% which is an average pass@1 result. + +The [official SWE Bench Lite leaderboard](https://www.swebench.com) +only accepts pass@1 results. + + diff --git a/assets/swe-bench.jpg b/assets/swe-bench.jpg new file mode 100644 index 0000000000000000000000000000000000000000..37c2769ce88a0ac401bacbcf00c9d3ea9e7ee0f8 GIT binary patch literal 50871 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 literal 0 HcmV?d00001 diff --git a/assets/swe-bench.svg b/assets/swe-bench.svg new file mode 100644 index 000000000..3f5583403 --- /dev/null +++ b/assets/swe-bench.svg @@ -0,0 +1,2212 @@ + + + + + + + + 2024-05-31T09:30:46.920987 + image/svg+xml + + + Matplotlib v3.9.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/benchmark/swe-bench.txt b/benchmark/swe-bench.txt new file mode 100644 index 000000000..7d5f34ee2 --- /dev/null +++ b/benchmark/swe-bench.txt @@ -0,0 +1,7 @@ +18.8% Aider|GPT-4o|& Opus|(570) +17.0% Aider|GPT-4o|(570) +13.9% Devin|(570) +13.8% Amazon Q|Developer|Agent|(2294) +12.5% SWE-|Agent|+ GPT-4|(2294) +10.6% AutoCode|Rover|(2294) +10.5% SWE-|Agent|+ Opus|(2294) diff --git a/benchmark/swe_bench_lite.py b/benchmark/swe_bench_lite.py index 023f50d5f..64b2f044b 100644 --- a/benchmark/swe_bench_lite.py +++ b/benchmark/swe_bench_lite.py @@ -52,7 +52,7 @@ def plot_swe_bench_lite(data_file): for model, bar in zip(models, bars): yval = bar.get_height() - y = yval - 1.25 + y = yval - 1 va = "top" color = "#eee" if "Aider" in model else "#555" fontfamily = "Helvetica Bold" if "Aider" in model else "Helvetica" @@ -76,7 +76,7 @@ def plot_swe_bench_lite(data_file): ax.set_title(title, fontsize=20) # ax.set_ylim(0, 29.9) plt.xticks( - fontsize=16, + fontsize=17, color=font_color, )