명령이 길어질수록 AI는 더 자주 틀린다

명령이 길어질수록 AI는 더 자주 틀린다

AI에게 터미널 작업을 맡기면 한 번에 맞을 때도 있고 같은 자리를 몇 번씩 되돌아갈 때도 있습니다. 어느 쪽이 얼마나 되는지는 느낌으로만 알고 있었는데 기록이 남아 있어서 세어 봤습니다. 8월 1일부터 9월 23일까지 쌓인 작업 세션 205개에서 AI가 실행한 셸 명령 72,912건을 꺼내 결과를 하나씩 맞춰 봤습니다. 오류 문구가 남은 것은 1,971건, 2.7%였습니다. 100번 시키면 97번은 그대로 지나간다는 뜻이라 생각보다 낮았습니다. 그런데 이 비율은 고르지 않았습니다. 80자 이하 짧은 명령은 0.9%인데 1,500자를 넘는 긴 명령은 6.3%였습니다. 같은 AI가 같은 날 같은 서버에 보낸 명령인데 길이에 따라 7배가 벌어졌습니다.

무엇을 셌는지 먼저

세션 기록에는 AI가 보낸 명령과 그 결과가 짝으로 남습니다. 이 짝을 전부 꺼내 결과 쪽에 오류 문구가 있는지 봤습니다. 대상은 로컬 셸과 SSH로 보낸 원격 명령 두 가지이고, 파일을 읽거나 쓰는 다른 작업은 뺐습니다.

항목 건수 비율
명령 짝 전체 72,912 100%
사람이 승인을 거부해 실행되지 않음 294 0.4%
실제로 실행된 것 72,618 99.6%
└ 오류 문구가 남은 것 1,971 2.7%
└ 종료 코드만 0이 아니고 출력은 정상 1,164 1.6%

마지막 두 줄을 나눈 것이 이 측정의 핵심입니다. 종료 코드가 0이 아니라고 전부 실패가 아닙니다. 찾는 것이 없을 때 1을 돌려주는 명령이 흔한데, 그건 질문에 “없다”고 답한 것이지 틀린 것이 아닙니다. 이 1,164건을 실패에 넣으면 실패율이 4.3%가 되니 숫자가 1.6배로 부풀려집니다. 그래서 결과 안에 오류 문구가 실제로 있는 것만 실패로 셌습니다.

길수록 틀린다

명령 글자 수로 나눠 보니 기울기가 한쪽으로 분명했습니다.

명령 길이 실행 실패 실패율
80자 이하 8,617 78 0.9%
81~200자 19,911 247 1.2%
201~500자 21,685 569 2.6%
501~1,500자 14,626 585 4.0%
1,500자 초과 7,779 492 6.3%
명령 길이 구간별 실패율 막대그래프. 80자 이하 0.9%, 81~200자 1.2%, 201~500자 2.6%, 501~1,500자 4.0%, 1,500자 초과 6.3%
구간을 건널 때마다 올라가고 다섯 구간에서 한 번도 뒤집히지 않았습니다.

구간을 건널 때마다 올라가고 한 번도 뒤집히지 않습니다. 눈에 띄는 것은 1,500자를 넘는 명령이 전체의 10.7%밖에 안 되는데 실패의 25.0%를 가져간다는 점입니다. 반대로 200자 이하 짧은 명령은 전체의 39.3%인데 실패는 16.5%입니다. 참고로 전체 명령의 길이는 중앙값 263자, 평균 635자입니다. 평균이 중앙값의 두 배가 넘는 것은 아주 긴 명령 몇 개가 끌어올리기 때문이고, 가장 긴 것은 28,514자였습니다.

무엇이 길이를 만드는가

길이 자체보다 길이를 만든 것이 원인일 수 있어서 두 가지를 더 나눠 봤습니다. 하나는 명령을 &&로 몇 번 이었는지이고, 다른 하나는 여러 줄 문자열을 통째로 넘기는 방식을 썼는지입니다.

이은 횟수 실행 실패 실패율
0회 36,397 644 1.8%
1회 22,405 707 3.2%
2회 6,443 259 4.0%
3회 3,372 136 4.0%
4회 이상 4,001 225 5.6%

하나만 이어도 1.8%에서 3.2%로 뜁니다. 한 번 잇는 순간 실패할 자리가 두 곳이 되고, 앞이 틀리면 뒤는 시작도 못 하니 한 번의 실패로 날아가는 일의 양도 같이 커집니다. 다만 2회와 3회가 똑같이 4.0%인 것을 보면 무한정 올라가지는 않습니다.

여러 줄 문자열 쪽은 차이가 더 컸습니다. 이 방식을 쓴 명령 19,246건의 실패율은 5.1%, 안 쓴 명령 53,372건은 1.8%로 2.8배였습니다. 따옴표와 줄바꿈과 들여쓰기가 한 덩어리로 셸을 통과해야 하는데, 여기서는 한 글자만 어긋나도 통째로 거부당합니다. 실제로 실패의 23.1%가 문법 오류였습니다. AI가 쓴 코드 블록을 재 봤을 때도 길이가 문제를 만드는 방식이 비슷했습니다. 그때는 화면 밖으로 넘치는 것이었고 이번에는 실행이 안 되는 것이지만, 원인은 둘 다 한 덩어리가 너무 크다는 것입니다.

무엇이 틀리는가

실패 1,971건을 오류 문구로 갈랐습니다.

유형 건수 비율
경로·파일 없음 584 29.6%
실행 중 예외 504 25.6%
문법 오류 456 23.1%
연결 실패 257 13.0%
명령 자체가 없음 92 4.7%
권한 부족 51 2.6%
옵션·인자 틀림 19 1.0%
없는 이름 참조 8 0.4%

가장 많은 것이 경로·파일 없음이라는 점이 이 표에서 제일 중요합니다. 이건 명령을 못 써서 생긴 문제가 아니라 지금 어디에 무엇이 있는지 모르는 상태에서 명령을 보냈기 때문에 생긴 문제입니다. 문법 오류나 옵션 실수는 명령문 자체의 흠이지만 경로 문제는 서버의 현재 상태에 대한 오해입니다. 여기에 명령 자체가 없음 4.7%를 더하면 34.3%가 환경을 잘못 짐작한 경우입니다. 명령을 더 잘 쓰는 것으로는 줄지 않고, 먼저 확인하는 것으로만 줄어듭니다.

원격이 로컬보다 1.8배

실행 위치 실행 실패 실패율
로컬 셸 65,201 1,636 2.5%
SSH 원격 7,417 335 4.5%

원격이 더 자주 틀립니다. 이유 하나는 연결 실패 257건이 거의 전부 원격 쪽이라는 것이고, 다른 하나는 원격 서버의 상태를 로컬보다 덜 알기 때문입니다. 로컬은 방금 만든 파일이 어디 있는지 기억이 이어지는데 원격은 세션이 끊기면 그 기억이 사라집니다. 앞의 경로·파일 없음이 여기서도 작동합니다.

대부분은 한 번에 되돌아온다

실패가 났을 때 몇 번 만에 회복되는지도 봤습니다. 연속으로 실패한 묶음은 1,693개였습니다.

연속 실패 묶음 비율
1회로 끝 1,476 87.2%
2회 연속 165 9.7%
3회 연속 44 2.6%
4회 연속 7 0.4%
5회 연속 1 0.1%

열에 아홉은 한 번 틀리고 바로 고쳐집니다. 오류 문구가 무엇이 잘못됐는지 알려 주기 때문입니다. 경로가 없다는 말을 들으면 경로를 확인하는 명령을 먼저 보내는 식입니다. 세 번 이상 연달아 막힌 것은 52건으로 전체 묶음의 3.1%인데, 이런 경우는 대개 오류 문구가 원인을 안 가리키는 종류였습니다. 종료 코드만 1이고 아무 말이 없거나, 인코딩이 깨져서 메시지를 읽을 수 없는 경우입니다. 사람이 읽을 메시지가 없으면 AI도 읽을 것이 없습니다.

세션 단위로 보면 명령이 오간 198개 세션 중 79개, 39.9%는 실패가 한 건도 없었습니다. 짧은 작업은 대체로 걸리는 것 없이 끝난다는 뜻입니다.

그래서 바꾼 것

  1. 여러 단계를 &&로 잇지 않습니다. 한 번만 이어도 실패율이 1.8배가 되므로, 확인이 필요한 지점에서 끊어 보냅니다.
  2. 파일이나 폴더를 건드리기 전에 그것이 있는지부터 봅니다. 실패의 3분의 1이 여기서 나오는데 확인하는 명령은 대개 30자를 넘지 않습니다.
  3. 긴 스크립트는 명령줄에 직접 쓰지 않고 파일로 만들어 올린 뒤 실행합니다. 여러 줄 문자열을 셸에 통과시키는 방식이 2.8배 더 자주 실패합니다.
  4. 원격 작업은 세션이 살아 있는지부터 확인하고 시작합니다. 연결 실패는 명령을 아무리 잘 써도 막을 수 없습니다.

이 네 가지는 규칙 파일로 AI 코딩 실수를 줄이려 했을 때 적었던 것과 방향이 같습니다. 그때는 짐작으로 적었고 이번에는 숫자가 붙었다는 차이가 있습니다.

이 숫자를 믿을 때 주의할 점

측정 방법을 밝힙니다. 세션 기록 205개에서 명령과 결과의 짝을 꺼내고, 결과 앞부분 6,000자에서 오류 문구를 찾아 유형을 나눴습니다. 유형 판정은 정해 둔 문구 목록을 위에서부터 맞춰 보는 방식이라 한 결과에 두 종류가 섞여 있으면 먼저 걸린 쪽으로 들어갑니다. 길이는 보낸 명령의 글자 수이고 줄바꿈도 포함했습니다. 유형별·길이별·위치별 집계는 합계가 모두 1,971로 맞는 것을 확인했습니다.

한계가 셋 있습니다. 첫째, 오류 문구 없이 잘못된 결과를 낸 것은 셀 수 없습니다. 명령이 멀쩡히 돌았는데 답이 틀린 경우가 여기 안 잡힙니다. 이 측정이 잡는 것은 실행이 막힌 것이지 틀린 것 전부가 아닙니다. 둘째, 어디까지를 실패로 부를지에 따라 답이 달라집니다. 종료 코드만으로 세면 4.3%, 오류 문구로 세면 2.7%입니다. 어느 쪽도 거짓말은 아니고 세는 기준이 다를 뿐인데, 기준을 밝히지 않으면 같은 데이터로 다른 주장을 할 수 있습니다. 셋째, 기록은 한 사람의 작업이라 작업 종류가 치우쳐 있습니다. 서버 관리와 파일 정리가 많고 애플리케이션 빌드는 적습니다.

그래도 길이와 실패율의 관계는 다섯 구간에서 한 번도 뒤집히지 않았고 구간마다 표본이 7,779건 이상이라, 이 부분은 치우침만으로는 설명되지 않는다고 봅니다.

Similar Posts

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다