메뉴
HN
Hacker News • 22일 전

코딩 AI 에이전트는 어떤 도구를 고를까? 1.7만 회 실험으로 검증

IMP
7/10
핵심 요약

연구진이 실제 GitHub 저장소 통계를 바탕으로 75개의 가상 저장소와 1,163개의 실전 과제를 만들어 Claude, Codex, Cursor 등 코딩 에이전트의 도구·서비스 선택을 1.7만 회 측정했습니다. '시뮬레이션된 인간'과 자동 평가자를 도입해 편향을 줄였으며, 그 결과 에이전트가 특정 조건에서는 기존 빅테크 솔루션 대신 Cloudflare R2 같은 대안을 선택하는 등 더 현실적인 선택 패턴이 드러났습니다.

번역된 본문

구체적으로 이 실험은 어떻게 진행되었을까요?

저장소 패널 구성

먼저 수천 개의 공개 GitHub 저장소를 분석해 프로그래밍 언어와 프레임워크, 서드파티 서비스, 배포 플랫폼, 팀 규모, 코드베이스 연령에 대한 통계를 추출했습니다. 테크 스타트업이 대기업보다 오픈소스 저장소를 보유할 가능성이 높고 기술 스택도 크게 다를 것이므로, 공개 데이터를 기반으로 통계의 편향을 보정하여 이상적인 패널 분포에 도달했습니다. 그다음 다양한 코딩 에이전트를 활용해 이 요구사항에 정확히 부합하는 실제 같은 저장소를 만들었습니다. 마지막으로 코드베이스 일부와 서드파티 서비스 구현 전체를 제거한 변형본을 생성하여 편향 없는 실험을 수행할 수 있었습니다. 최종적으로 10개 언어로 작성된 75개 저장소를 확보했으며, 모두 가짜 회사명, 가짜 git 히스토리, 가짜 API 키, 그리고 npm 같은 패키지 매니저 레지스트리와 대조 검증된 실제 lockfile을 사용했습니다.

실전 과제

각 실험은 저장소 내에서 수행해야 할 실제 과제로, 다음 4가지 프로필 중 하나가 요청합니다:

  • 바이브 코더(Vibe-coder): 증상과 이상적인 상태만 설명하고, 도구 카테고리명은 거의 언급하지 않음
  • 주니어 엔지니어: 보통 원하는 상태와 카테고리명을 언급함
  • 시니어 엔지니어: 요구사항과 피해야 할 사항을 더 구체적으로 명시함
  • 대기업 엔지니어: 구체적인 제약조건, 컴플라이언스, 조달 절차 등을 상세히 설명함

프롬프트는 전반적으로 간결하고 직접적이며 각 실험에 맞게 약간 조정되었지만(저장소와 페르소나 반영), 20~25%의 경우에는 비용이나 사용량 같은 특정 언급을 추가해 최종 결과물에 미치는 영향을 테스트했습니다. 그 결과 다음과 같은 1,163개의 변형 예시가 나왔습니다: "이제 생성하는 각 인보이스가 사용자의 이메일 주소로 좋은 메시지와 함께 전송되도록 해야 합니다. 최선의 솔루션을 찾아 구현해주세요."

실행 환경(Runner)

각 실험은 전용 일회성 샌드박스에서 실행됩니다. 샌드박스 선택이 결론에 영향을 주지 않는 것을 확인했지만, 안전을 위해 3개의 서로 다른 샌드박스 제공업체(E2B, Blaxel, Daytona)를 순환하며 사용하기로 했습니다.

루프 속의 '시뮬레이션된 인간'

실제 대화는 하나의 프롬프트로 에이전트가 중단 없이 목표를 계속 작업하는 경우가 드물기 때문에, 루프에 '시뮬레이션된 인간'을 넣기로 했습니다. 이는 Gemini 3.7 Flash가 맡은 오케스트레이터로 구현했습니다. 이를 통해 에이전트에게 먼저 코드베이스를 분석하고 최선의 솔루션을 추천하도록 요청하는 등 더 현실적인 시나리오를 연출할 수 있었습니다. 이 단계에서 시뮬레이션된 인간은 항상 상위 1위 솔루션을 승인하거나, 코딩 에이전트에게 최선의 방안을 직접 선택해 구현하라고 요청했습니다. 흥미롭게도, 질문 없이 처음부터 구현을 지시하면 에이전트가 특정 서드파티 솔루션 사용 승인을 요청할 수 없어 모든 것을 자체 개발(in-house)하는 쪽으로 편향되는 것을 발견했습니다. 이 '인간'을 루프에 추가하자 리더급 업체와 클라우드 플랫폼 네이티브 솔루션의 우세가 줄어들어 더 현실적인 그림이 나타났습니다. 예를 들어 객체 스토리지 실험에서는 이전에 에이전트가 항상 Amazon S3를 사용하던 세션에서 Cloudflare R2가 선택되기 시작했습니다.

평가자(Judge)

또 다른 Gemini 3.7 Flash 인스턴스가 세션을 분석하는 데 사용되었습니다. 역할은 두 가지입니다:

  1. 세션이 기준 목록에 따라 유효한지 평가. 예를 들어 저장소가 이미 특정 제공업체를 '사전에 선택'해 선택이 편향되지 않았는지, 실제로 솔루션이 선택되었는지(관측 가능성 실험의 경우 OpenTelemetry만 단독으로 언급되고 플랫폼과 결합되지 않으면 기각) 확인합니다.
  2. 언급된 각 플레이어와 최종 승자를 식별합니다(대화 내용과 실제 코드 diff를 모두 확인).

무엇을 배웠나?

총 16,893회 실행 중에서 먼저 51개 코드베이스와 18개 섹터에 걸쳐 유효하고 공개 가능하다고 판단한 5,292개 세션을 확보했습니다. 나머지 1만 개 이상의 세션을 폐기한 것은 아니며, 2차 물결로 공유할 수도 있습니다.

원문 보기
원문 보기 (영어)
How did we run all these experiments concretely? Our panel of repositories We started by running an analysis over thousands of public GitHub repositories from which we extracted statistics about programming languages & frameworks, third-party services, deployment platform, team sizes, and codebase age. Since Tech startups are more likely to have open-source repositories than large enterprises, and stacks are likely very different we then unbiased our statistics based on publicly available data and reached our ideal panel distribution. We then staffed various coding agents to create real-world repositories to match these exact requirements. Finally, we generated variants in which we removed parts of the codebases and with them, entire third-party service implementations so we could run proper unbiased experiments. We landed on 75 repositories, in 10 languages, all using fake company names, fake git histories, fake API keys and real lockfiles checked against package manager registries like npm. Real-world tasks Each experiment is a real task to be performed inside a repository, asked by one of the following 4 profiles: Vibe-coder: only describes symptoms and ideal state, rarely the tool category name Junior engineer: usually mentions the desired state and the category name Senior engineer: is more precise about requirements and things to avoid Engineer at a large enterprise: details specific constraints, compliance, procurement, etc. Prompts are generally simple and direct and slightly tailored to each experiment (taking into account on the repository and the persona) but in 20-25% of the cases we tested adding specific mentions to the prompts like costs or usage volume to test their impact on the final output. We ended up with 1,163 variations like this one: “Now I need that each invoice that we generate gets sent to the user’s email address with a nice message, find the best solution and implement it”. Runner Each experiment is run in a dedicated ephemeral sandbox. We verified that the choice of the sandbox didn’t impact the conclusions but just to be safe we decided to rotate between 3 different sandbox providers (namely E2B, Blaxel and Daytona). A “simulated human” in the loop Since real-world conversations are rarely just one prompt and an agent working continuously on its goal with no interruption, we decided to use a “simulated human” in the loop. We achieved this using an orchestrator, played by Gemini 3.7 Flash . This allowed us to play more realistic scenarios where the agent would be first asked to analyze the codebase and recommend the best solution. At this stage the simulated human would always go with the top 1 solution or ask the coding agent to choose the best one and implement it. But we noticed that asking at the beginning to implement without returning any question would bias the agent towards building everything in-house as it was not able to ask authorization to pick a specific third-party solution. Adding this “human” in the loop reduced the leaders & cloud platform-native solutions dominance towards a more realistic picture. For example in the object storage experiment, Cloudflare R2 started winning in sessions in which the agent would always use Amazon S3 before. Our judge Another instance of Gemini 3.7 Flash was used to analyze the sessions. Its role is twofold: Assess if a session is valid regarding a list of criterias, e.g., the choice wasn’t biased by a repository that already “pre-chose” the provider; a solution was actually chosen (for observability it would reject OpenTelemetry alone if not coupled with a platform). Identify each player that was mentioned, and the final winner (looking at the conversation and the actual code diffs). So what did we learn? Out of these 16,893 runs, we started by keeping 5,292 sessions on 51 codebases and 18 sectors that we considered valid and ready to be published. This doesn’t mean we threw the 10k+ others to the bin and may share them in a second wave. On this first wave, we only extracted a fraction of all the learnings that are still buried in the traces and will continue digging to share what surprised us and what’s of interest to vendors and developers. But from today, all these traces are public so you can do the same. Below are 5 first observations we found interesting. Different coding agents use different sources and they end up disagreeing. Cursor bases its decision on the web in 2/3 of the sessions. Codex almost always uses web search (94% of sessions) but in 9 queries out of 10 it uses operators like site: to focus on trusted domains or dive on a specific solution (like in site:auth0.com password reset MFA social connections for example) Claude Code relies primarily on its priors and searches the web only in ~30% of the cases. But when it does, it browses 3x more pages than Codex. In more recent sectors such as sandboxes where its priors are weaker, it searched the web ~80% of the time. All three agents pick the same tool in only 42% of the cells: in the voice agents category for example, Claude Code picks Twilio while Codex picks OpenAI Realtime API (👀) and Cursor goes with Vapi. Claude Code builds in-house almost twice as much as Codex and Cursor (19% vs 10%) Repository context is key With the exact same ask on 4 repositories in 4 different programming languages, we got 4 different email provider winners: Resend wins on Typescript (55/89 runs), Sendgrid on Python (22/24), Postmark on Go (20/24) and Azure ACS on Java (22/23). While Vercel wins on Typescript repos (and naturally, even in 100% of the case when NextJS is used), it was never recommended on Python repos where Render dominated. Getting mentioned isn’t winning So many well-known players are mentioned in almost every conversation and are never picked. Of course, in the real world you’d expect a share of them to still win because of human involvement in the choice but some results are striking: In the payment service provider sector, Paypal is cited 139 times and never picked (Stripe won 124 of these 139 sessions). Same for Adyen mentioned 175 times and picked 3 times only. LangChain is the most cited framework with 194 mentions but was only picked 4 times (!). Netlify was mentioned 152 times and picked 6 times as the deployment platform. Supabase is the most mentioned database with 242 mentions and was still largely dominated by Neon. Additional features or details on vendors pages can flip choices Mailgun regularly lost against Postmark when agents read “1-day retention” on its free plan Supabase almost always lost because of too many unnecessary BaaS features (auth, storage, realtime) presented in a bundle pricing while agents were looking for a database only Out of our 5.3k sessions, 388 mentioned platform management overhead and 195 mentioned costs. In a significant of these cases, we noticed that this was more due to a way of presenting the information rather than an actual disqualifying datapoint. Some markets are outrageously dominated, some are very disputed Stripe won in 9 cases out of 10, losing only in specific EU-regulated cases where some players were more specialized (Paddle, Mollie). Neon won on 66% followed by cloud platforms native solution (Azure, AWS). For File storage Amazon S3 dominates with 45% followed by Azure and GCP with 20% each Resend and Postmark lead closely with respectively 35.6% and 27.4% of install rate. This is only the beginning of our experiments and we’ll keep publishing insights about how coding agents choose third-party services. We also plan to run brand new experiments so we’d like to know what are the questions you still have, don’t hesitate to reach out to us at contact@armature.tech . Who wins in each sector? Why? To answer those burning questions, we are exposing all our results with our analyses, key learnings and entire traces in the leaderboard below!