2024년 3월 15일
| 작성자:
인지팀
SWE-벤치 기술 보고서
Cognition의 목표 중 하나는 소프트웨어 개발 전문 AI 에이전트인 Devin이 크고 복잡한 코드베이스에 코드를 성공적으로 기여할 수 있도록 하는 것입니다.
Devin을 평가하기 위해 GitHub 문제와 끌어오기 요청으로 구성된 소프트웨어 엔지니어링 시스템에 대한 자동화된 벤치마크인 SWE-bench를 사용합니다 . SWE-bench는 독립 실행형 기능으로 제한되는 HumanEval 과 같은 벤치마크와 달리 실제 코드베이스에서 문제를 해결하는 시스템의 능력을 결정론적으로 평가(단위 테스트를 통해)하기 때문에 훌륭한 선택이라고 생각합니다 .
SWE-벤치에서 Devin은 13.86%*의 문제를 성공적으로 해결했습니다. 이는 이전의 가장 높은 비지원 기준인 1.96%를 훨씬 초과하는 수치입니다. 편집할 정확한 파일이 제공되는 경우에도("지원") 최고의 이전 모델은 문제의 4.80%만 해결합니다.
https://github.com/CognitionAI/devin-swebench-results' target="_blank">https://github.com/CognitionAI/devin-swebench-results 에서 평가 도구와 Devin의 코드 편집 내용을 제공합니다 .
배경
SWE-bench는 GitHub의 인기 오픈 소스 Python 리포지토리에서 스크랩한 2,294개의 문제와 풀 요청으로 구성된 데이터세트입니다. 그 목표는 실제 코드를 작성하는 시스템의 능력을 테스트하는 것입니다.
각 SWE-bench 인스턴스는 GitHub 문제와 이를 해결한 풀 요청으로 구성됩니다. 풀 요청에는 코드 변경 전에 실패하고 이후에 통과하는 단위 테스트("통과 실패" 테스트라고 함)가 포함되어야 합니다. diff는 각각 코드 변경 사항과 테스트 변경 사항을 포함하는 patch와 test_patch라는 두 부분으로 나뉩니다.
그런 다음 평가 중인 시스템은 GitHub 문제 설명과 저장소(문제 발생 당시)를 바탕으로 차이점을 생성하도록 요청받습니다. 편집 내용을 패치한 후 모든 단위 테스트를 통과하면 예제는 성공한 것으로 간주됩니다.
출처: swebench.com
SWE-bench에서 LLM에는 편집할 올바른 파일 세트가 제공됩니다("지원"). 또는 별도의 시스템이 문제 텍스트와의 유사성을 기준으로 편집할 파일을 검색합니다("지원 없음"). 상담원으로서 Devin은 파일 목록을 받지 않고 대신 스스로 파일을 탐색합니다. 이는 "지원을 받지 않는" LLM에 더 가깝습니다.
SWE 벤치 예제를 올바르게 해결하는 것은 어렵습니다. 더 어려운 PR에는 수십 개의 파일 변경, 이전 버전과의 호환성 유지 및/또는 많은 복잡한 추론이 필요합니다. 도움을 받더라도 최고의 LLM은 4.80%의 성공률만을 달성합니다.
방법론
우리는 LLM에 대한 원래 평가보다 더 일반적인 설정인 에이전트를 평가하기 위해 SWE-벤치를 적용했습니다.
설정
GitHub 문제 설명만 제공된 코드를 편집하도록 요청하는 표준화된 프롬프트를 사용하여 에이전트를 엔드 투 엔드로 실행합니다. 실행 중에는 에이전트에 다른 사용자 입력을 제공하지 않습니다.
저장소가 에이전트 환경에 복제됩니다. 정보가 에이전트로 유출되는 것을 방지하기 위해 기본 커밋과 그 상위 커밋만 git 기록에 보관합니다. 특히, git pull이 작동하지 않도록 git Remote를 제거합니다.
테스트가 시작되기 전에 Python conda 환경을 설정합니다.
Devin은 대부분의 에이전트와 달리 무기한 실행이 가능하므로 런타임을 45분으로 제한합니다. 원하는 경우 더 일찍 종료하도록 선택할 수 있습니다.
평가
에이전트 실행이 종료되면 에이전트가 테스트를 수정한 경우 모든 테스트 파일을 원래 상태로 재설정합니다. 파일 시스템의 다른 모든 차이점을 가져와서 패치로 추출합니다.
어떤 파일이 테스트 파일인지 확인하기 위해 테스트 패치에서 수정된 모든 파일 세트를 가져옵니다.
에이전트의 패치를 리포지토리에 적용한 다음 테스트 패치를 적용합니다.
SWE-bench에서 제공하는 eval 명령을 실행하고 모든 테스트가 통과하는지 확인합니다.
https://github.com/CognitionAI/devin-swebench-results' target="_blank">https://github.com/CognitionAI/devin-swebench-results 에서 조정된 평가 하네스에 대한 코드를 찾을 수 있습니다 .
결과
우리는 SWE 벤치마크 테스트 세트 중 무작위로 선택된 25%(2,294개 중 570개)에 대해 Devin을 평가했습니다. 이는 벤치마크가 완료되는 데 걸리는 시간을 줄이기 위해 수행되었으며, 이는 작성자가 원본 논문에서 사용한 것과 동일한 전략입니다.
Devin은 570개 문제 중 79개를 성공적으로 해결하여 13.86%의 성공률을 기록했습니다. 이는 이전의 최고 보조 시스템(Claude 2)인 4.80%보다 훨씬 높은 수치입니다.
이 플롯의 기준선은 모델이 편집해야 하는 정확한 파일과 함께 제공되는 "지원" 설정에서 평가됩니다. 기준선은 별도의 검색 시스템이 편집할 LLM용 파일을 선택하는 "비지원" 설정에서 성능이 더 나쁩니다(가장 좋은 모델은 1.96%의 Claude 2 + BM25 검색입니다).
비지원이나 지원 모두 Devin에게 전체 저장소가 제공되고 파일을 자유롭게 탐색할 수 있는 에이전트 설정과 엄격히 비교할 수 있으므로 기준 비교를 위해 더 강한 숫자를 선택합니다. 우리는 에이전트를 엔드 투 엔드로 실행하는 것이 실제 소프트웨어 개발과 더 유사하기 때문에 SWE 벤치에 더 자연스러운 설정이라고 믿습니다. 앞으로 이 설정에서 더 많은 에이전트 결과가 나올 것으로 예상됩니다.
분석
다단계 계획
Devin은 환경으로부터 피드백을 받기 위해 다단계 계획을 실행할 수 있습니다. 통과한 테스트의 72%는 완료하는 데 10분 이상 걸리며, 이는 반복 능력이 Devin의 성공에 도움이 된다는 것을 의미합니다.
질적 사례
우리는 Devin의 결과에 대한 정성적 분석을 제공합니다. Devin에게는 문제 설명과 복제된 저장소만 입력으로 제공된다는 점을 기억하세요.
예시 1: ✅ scikit-learn__scikit-learn-10870
Devin은 처음에 설명 때문에 쫓겨나고 설명된 대로 문자 그대로 추가 self.lower_bound_ = max_lower_bound합니다 return self. 변수가 아직 정의되지 않았기 때문에 이는 실제로 잘못된 것입니다.
문제 설명에 제공된 테스트 코드에 따라 Devin은 테스트 파일을 업데이트합니다.
그러나 테스트를 실행하고 오류가 발생하면 Devin은 파일을 수정합니다.
이 수정 사항이 적용되면 Devin은 테스트를 다시 실행하여 테스트를 통과하고 성공적으로 종료합니다.
이 예는 몇 가지 이유로 흥미롭습니다.
Devin은 부정확함에도 불구하고 원래 문제의 지침을 매우 밀접하게 따릅니다. 이는 사용자의 기본 설정이 과도하게 정렬되었음을 나타냅니다.
해당 환경에서 테스트를 실행할 수 있는 능력이 주어지면 Devin은 실수를 바로잡을 수 있습니다. 소프트웨어 개발자가 반복할 수 있는 것은 매우 중요하며 에이전트도 동일한 작업을 수행할 수 있어야 합니다.
예시 2: ✅ django__django-10973
Devin은 올바른 파일을 식별 django/db/backends/postgresql/client.py하고 완전히 편집합니다.
여기서 Devin은 많은 양의 코드를 성공적으로 수정할 수 있습니다. SWE-bench의 성공적인 편집 중 다수는 단일 라인 diff로 구성되어 있지만 Devin은 한 번에 여러 라인을 처리할 수 있습니다.
예시 3: ❌ Sympy__sympy-17313
이는 양수 또는 음수로 지정될 수 있는 값과 관련하여 바닥 및 천장 개체의 비교 연산자를 올바르게 처리하도록 컴퓨터 대수학 시스템을 수정하는 것과 관련된 어려운 작업입니다. 복잡한 논리적 추론과 여러 추론 단계가 필요합니다.
Devin은 편집할 올바른 클래스를 놓치고 클래스와 클래스 frac가 아닌 클래스를 편집합니다. 게다가 Devin은 비교 연산자 중 하나인 , when , 및 수정이 필요한 경우만 편집합니다. 이 편집은 정확하지 않습니다.floorceiling__gt____lt____le____ge__
올바른 차이점은 https://github.com/sympy/sympy/pull/17313/files 에서 확인할 수 있습니다 . 차이점은 많은 엣지 케이스 처리와 많은 수의 단위 테스트로 인해 매우 복잡하며 Sympy 코드베이스에 대한 깊은 이해가 필요합니다. (SWE-벤치 인스턴스를 통과하려면 모든 단일 테스트를 통과해야 합니다.)
예시 4: ❌ scikit-learn__scikit-learn-10774
이 작업에는 저장소의 모든 데이터 세트에 추가 반환 옵션 기능을 추가하는 작업이 포함됩니다. Devin은 여러 데이터 세트에 대해 이러한 편집을 성공적으로 수행할 수 있습니다. 아래에 예가 나와 있습니다.
california_housing.pyDevin은 데이터 세트 , covtype.py, kddcup99.py및 mldata.py(원래 PR에서는 실제로 제외됨) 에 대해 유사한 편집을 수행했습니다 . 불행하게도 Devin은 두 개의 데이터 세트 lfw.py및 를 놓치 rcv1.py므로 테스트는 결국 실패합니다. 우리는 여러 파일을 편집하기 위한 Devin의 기능을 향상시킬 계획입니다.
테스트 기반 실험
우리는 Devin에게 문제 설명과 함께 최종 단위 테스트를 제공하는 추가 실험을 실행합니다. 이 "테스트 중심 개발" 설정에서는 성공적인 합격률이 100개의 샘플링 테스트 중 23%로 증가합니다. (테스트 자체에 대한 모든 변경 사항은 평가 전에 지워집니다.)
이 결과는 에이전트가 Ground Truth 테스트 패치에 액세스할 수 있었기 때문에 SWE-bench의 다른 결과와 비교할 수 없습니다. 그럼에도 불구하고 테스트 중심 개발은 소프트웨어 엔지니어링의 일반적인 패턴이므로 이 설정은 SWE-bench의 자연스러운 확장입니다. 인간이 에이전트에게 통과할 목표 테스트를 제공하는 것은 인간 엔지니어와 에이전트가 협업할 수 있는 자연스러운 방법이며, 앞으로 더 많은 테스트 기반 에이전트를 보게 될 것으로 예상됩니다.
Devin이 테스트를 통해 새로 해결한 문제의 예
✅ django__django-13321 : Devin은 함수 바로 앞에 print 문을 추가한 후 단위 테스트를 실행하고 print 문을 기반으로 파일을 편집하여 이 문제를 해결했습니다. 테스트 케이스가 있으면 Devin이 디버깅하기가 쉬워졌습니다.
✅ django__django-16983 : 새로운 단위 테스트에서는 "'filter_horizontal[0]'의 값은 [...]을 포함할 수 없습니다."라는 정확한 오류 메시지가 출력된다고 주장합니다. 오류의 정확한 문구를 아직 알지 못하면 테스트를 통과하는 것은 불가능합니다. 이는 벤치마크의 문제를 강조하고 테스트 패치 없이는 완벽한 점수를 얻을 수 없음을 보여줍니다.
주의사항
벤치마크에서 오픈 소스 저장소의 인기를 고려하면 Devin의 기본 모델에는 이러한 저장소의 데이터가 포함됩니다. 그러나 우리가 비교하는 기준선(Claude, GPT, Llama 등)도 유사한 데이터 오염 문제에 직면해 있습니다.
또한 상담원이 이러한 PR에 대한 외부 정보를 찾아 잠재적으로 차이점을 복사하는 것을 방지하기 위한 노력이 필요합니다. 테스트 설정 중에 에이전트가 직접 액세스할 수 없도록 Github 원격 커밋과 향후 모든 커밋을 리포지토리에서 제거합니다. 인터넷 접속이 가능한 에이전트는 잠재적으로 다른 방법을 통해 외부 정보를 찾을 수 있습니다. 이런 일이 발생하지 않았는지 확인하기 위해 Devin의 성공적인 실행을 수동으로 검사했습니다.
앞으로
에이전트는 아직 초기 단계이므로 개선할 여지가 많습니다. Cognition에서는 에이전트가 가까운 미래에 극적으로 향상될 것이라고 믿습니다. SWE-벤치의 진전과 데이터 분석, 정보 검색 등과 같은 작업에 대한 새로운 벤치마크를 보게 되어 기쁩니다.
추론과 계획의 한계를 뛰어넘을 수 있도록 도와주세요. 우리는 고용 중이다 !
이제 저 13퍼센트가 50퍼 60퍼 쭉쭉 성장할 일만 남았구나. 좆됐노
ㅋㅋㅋㅋ
본문내용 원본 :
https://www.cognition-labs.com/post/swe-bench-technical-report