48시간 현장 기록: 응답을 실행 과정으로 취급하는 것을 멈추다
요약
AI 모델의 응답을 단순히 텍스트 결과로 취급하는 것을 넘어, 실제 실행 가능한 프로세스 기록으로 간주해야 한다는 주장을 담고 있습니다. 사용자는 채팅 로그가 아닌, 실제로 코드가 실행되고 종료 코드를 확인할 수 있는 환경의 중요성을 강조하며 AI 개발 워크플로우의 투명성과 신뢰도를 높이는 방법을 제시합니다.
핵심 포인트
- AI 응답은 결과물이 아닌 '실행 과정'으로 기록되어야 한다.
- 단순 채팅 로그는 실제 프로세스 실행 여부를 증명할 수 없다.
- 모델의 제안을 검증하려면, 외부 셸 환경과 허용 목록(allowlist) 기반의 테스트가 필수적이다.
- 작업 순서와 종료 코드를 명시하는 것이 가장 신뢰성 높은 기록 방식이다.
내 쪽에서 어떤 프로세스가 시작되기도 전에 다듬어진 응답이 계속 도착했기 때문에 새 노트북을 열었다. 그 텍스트는 완성된 것처럼 보였고, 명령어를 명시했으며, 내가 실제로 실행하지 않은 통과 검사까지 설명하고 있었다. 왜 나는 마치 관찰인 것처럼 이 문장을 로그에 복사할 준비가 되어 있었을까? 채팅 기록은 프로세스 테이블이 아니며, 어떤 바이너리가 실제로 실행되었는지 보여줄 수 없다.
그 간극이야말로 이 노트들의 전부이며, 제품 투어나 점수판이 아니다. 나는 모델에게 패치를 요청할 한 장소와, 내가 직접 종료 코드를 읽을 수 있는 좁은 명령어를 실행할 또 다른 장소를 원했다. 만약 이 두 기록이 서로 다르다면, 내 노트에서 녹색 표시를 받아야 할 것은 어느 쪽일까? 나는 또 다른 제안을 요청하기 전에 그 규칙을 적어두었다. 왜냐하면 유창한 단락이 결과인 척 위장할 수 있기 때문이다.
첫 12시간 동안 시도해 본 것들
나는 작업을 서로 점수를 매길 수 없는 두 개의 증인으로 나누는 것으로 시작했다. 첫 번째 증인은 무료 모델 세션으로, 유료 콘솔을 열지 않고 초안 명령어나 짧은 설명을 원할 때 유용하다. 두 번째 증인은 무료 서버 세션으로, 내 노트북도 아니고 모델의 상상력도 아닌 셸이 필요할 때 유용하다. 공개적으로 밝히자면: 이 글은 MonkeyCode의 제품 홍보 활동의 일환으로 작성되었다. 나는 단지 그 두 가지 사용 가능성 주장만을 이용하고 있으며, 마케팅 페이지를 측정된 실험실로 취급하지 않는다.
나는 모델 이름, 할당량(quota), 머신 크기 또는 다음 달에도 무료 옵션이 똑같을 것이라는 약속 같은 것을 기록하지 않았다. 그러한 세부 사항들은 변하기 때문에, 그것들을 지어내는 것은 이 노트들이 태연하게 거짓말을 하게 만들 것이다. 내가 반복할 수 있는 것은 작업 순서이며, 이는 의도적으로 지루하고 위조하기 어렵다. 요청하고, 캡처하고, 텍스트를 해시하며, 허용 목록에 오른 명령어를 실행한 다음, 그 옆에 종료 코드를 작성한다.
답변이 끝난 것처럼 들릴 때마다 계속 던지던 질문입니다. 채팅 외부에서 실제로 어떤 프로세스가 시작되었는지, 그리고 인용할 수 있는 코드로 완료되었는지를 말이죠. 만약 제가 그 답을 할 수 없다면, 문구가 아무리 깔끔해도 제안은 초안 폴더에 머물러 있습니다. 무료 서버가 여기서 마법이 될 수는 없기 때문입니다. 왜냐하면 무료 셸이라도 잘못된 트리가거나, 잘못된 사용자이거나, 아니면 큐에서 떠나지 않은 작업일 수 있기 때문입니다.
실제로 다시 실행할 노트북
아래의 아티팩트는 벤치마크가 아니며, 제가 특정 공급업체의 시간을 측정했다는 주장도 아닙니다. 저는 샘플 경로들을 예시로 표시했고, 붙여넣은 성공 사례를 신뢰하기보다는 주어진 어떤 호스트에서든 그것들을 실행할 것입니다. 이 파일을 서버에 올리고, 허용 목록(allowlist)을 지정한 다음, 명령이 0으로 종료되지 않으면 녹색 줄을 출력하는 것을 거부할 수 있습니다. 모델이 이 스크립트가 이미 통과했다고 말한다고 해서 패치를 병합할까요? 아닙니다. 그리고 그 스크립트는 그러한 게으름을 약간 더 어렵게 만들도록 작성되었습니다.
#!/usr/bin/env python3
"""제안 기록부. 녹화된 벤치마크가 아닌 예시 워크플로우."""
...
제가 노트에 실제로 원하는 명령어들은 지루하며, 그것은 부족한 야망이라기보다는 기능입니다. 저는 먼저 원본 답변을 저장하고, 그 다음에 컴파일하며, 마지막으로 이 호스트의 허용 목록에 단위 발견(unit discovery)이 있는지 여부를 결정합니다. 모델은 파이프 설치를 제안할 수 있지만, 이 기록기는 단지 문단이 긴급하게 들렸다는 이유만으로 새로운 키를 만들지 않을 것입니다. 왜 초안에게 자체 셸 히스토리를 발명할 권한을 주어야 할까요?
mkdir -p notes/day1
# 원본 완료 내용을 직접 저장하세요. 모델이 이 파일을 작성하게 두지 마세요.
cp reply.txt notes/day1/reply.txt
...
또한 서버와 제 노트북이 트리를 공유하지 않는 경우를 대비하여 두 번째 명령어를 유지합니다. 저는 0을 신뢰하기 전에 호스트, 사용자, 실행 파일을 출력합니다. 왜냐하면 잘못된 기계에서 나온 녹색 코드는 단지 다른 이야기일 뿐이기 때문입니다. 이 확인은 무료 박스가 얼마나 빨리 답변했는지에 대한 느낌이 아니라, 실행의 정체성(identity)에 관한 것입니다.
python3 - <<'PY'
import getpass, platform, sys
print(platform.node(), getpass.getuser(), sys.executable)
...
ssh 라인을 스케치로 표시해야 합니다. 호스트 별칭 free-host는 제가 측정한 호스트 이름이 아니라 자리 표시자이며, 사용자의 무료 서버 패널에서는 박스 이름을 다르게 지정할 수 있습니다. 만약 패널에서 셸을 제공하지 않는다면, 이 노트의 분기는 여기서 끝납니다. 무료 모델은 여전히 패치를 초안 작성할 수는 있지만, 누락된 종료 코드를 대체할 수는 없습니다.
응답이 스스로 등급을 매기게 했을 때 깨진 것들
첫 번째 균열은 기술적인 것이 아니라 사회적인 것이었고, 단락에서 검사가 이미 통과했다고 말하자마자 나타났습니다. 저는 서버 작업을 시작하지 않았는데도 제 손가락은 그 제안 해시 옆에 '검증됨(verified)'을 쓰고 싶어 했습니다. 제가 이 단어로 누구를 감동시키려 했던 걸까요? 미래의 독자인지, 아니면 저 자신의 조급함이었는지요? 저는 그 단어를 삭제하고 ledger_exit이 존재할 때까지 해시는 그대로 두었습니다.
두 번째 균열은 여전히 관련성이 있어 지친 노트를 속일 수 있는 불일치한 명령어였습니다. 응답은 unittest를 설명했지만, 제가 그 시간에 실행하려 했던 유일하게 허용된 작업은 py_compile이었으므로, 깨끗한 컴파일이 단락에서 주장했던 테스트가 아니었습니다. 컴파일러의 0(zero)이 테스트를 증명하지 못하며, 모델의 요약도 컴파일러가 실행되었음을 증명하지 못합니다. 저는 나중에 읽는 사람이 추측할 필요 없이 격차를 볼 수 있도록, 주장의 바로 같은 줄에 작업 키를 쓰기 시작했습니다.
세 번째 균열은 환경적인 것이었고, 제가 경고를 반복하고 싶은 부분입니다. 무료 서버는 다른 작업 디렉터리, 다른 사용자, 또는 제가 보냈다고 생각했던 명령어를 전송하지 않은 큐로 부팅될 수 있습니다. 레저 파일이 누락되었다면, 저는 침묵으로부터 성공을 추론하지 않습니다. 왜냐하면 침묵은 중단된 작업이 위장하는 방식이기 때문입니다. 프로세스가 시작되었고 끝났는지, 아니면 제가 단지 완료에 관한 문장만을 받았는지요?
내일 재사용할 수 있는 의사 결정 테이블
저는 모델의 품질을 측정하는 척자인 것처럼 보이는 점수는 원하지 않습니다. 왜냐하면 저는 그 실험을 설계한 적이 없고, 가짜 행(row)을 만들지 않을 것이기 때문입니다. 이 표는 단지 제 메모에 '실행됨(ran)'이라고 쓸 수 있는지, 아니면 '초안(draft)'이라고만 써야 하는지를 결정할 뿐입니다. 열(column)들은 제가 지적할 수 있는 증거이며, 문구의 자신감도 같은 느낌이 아닙니다.
| 보유 내용 | 응답만 | 서버 로그만 | 둘 다, 그리고 코드가 주장을 뒷받침함 |
|---|---|---|---|
| 메모 상태 | 초안 (draft) | 미완성 (incomplete) | 후보 (candidate) |
| ... |
후보(candidate)는 병합(merge)을 의미하지 않습니다. 이는 제가 허용 목록에 추가한 명령(allowlisted command)이 노트에서 이름을 붙일 수 있는 호스트(host) 상에서 좁은 주장(narrow claim)과 일치하는 방식으로 종료되었음을 의미합니다. 만약 응답이 테스트를 약속했지만 저는 컴파일만 했다면, 컴파일러가 만족했더라도 해당 행은 미완성으로 유지됩니다. 모델이 잘 부탁한다고 해서 세션 도중에 허용 목록을 넓힐까요? 아닙니다. 그 변경 사항은 제가 새로운 명령어를 읽은 후에 별도의 노트에 속합니다.
반복할 것과 반복하지 않을 것
저는 캡처 단계, 허용 목록(allowlist), 그리고 같은 폴더 내에서 ledger_exit 없이 검증된 내용을 작성하는 것을 거부한 점을 반복할 것입니다. 또한 호스트 라인도 반복할 것입니다. 왜냐하면 무료 서버는 제가 그것을 제 노트북이나 채팅과 구별할 수 있을 때만 유용하기 때문입니다. 무료 모델 접근은 특히 유료 좌석(paid seat)을 열기 전에 실패한 트레이스백(traceback)의 다른 문구를 원할 때 초안 작성에 사용할 부분입니다. 무료 서버 옵션은 실행(run)에 사용할 부분인데, 왜냐하면 쉘(shell)과 결코 만나지 않는 제안은 여전히 단지 제안일 뿐이기 때문입니다.
나는 그날 측정하지 않은 쿼터(quota), GPU 이름 또는 지연 시간(latency) 숫자를 인용하는 문장은 반복하지 않을 것이다. 모델 명령을 셸(shell)로 파이프하거나, 기록기가 응답 텍스트에서 임의의 인수를 받아들이도록 두지 않을 것이다. 나는 이 노트북을 사용해서 어떤 공급업체(vendor)가 최고인지 판단하지 않을 것이며, 가용성 스위치 두 개가 리더보드(leaderboard)는 아니다. 만약 당신의 작업이 사설 데이터셋(private dataset), 서명된 프로덕션 호스트(signed production host), 또는 온콜 오너(on-call owner)가 있는 변경 창(change window)을 필요로 한다면, 응답이 준비된 것처럼 보인다고 해서 무료 공유 서버에서 그 변경 사항을 리허설하지 마라.
이 접근 방식을 건너뛰어야 할 사람들은 이름 대기가 쉽고, 내가 모든 팀에 이 장부(ledger)가 맞는 척하는 것보다 그들을 지명하는 편이 낫겠다. 만약 당신이 서버 로그를 직접 읽을 수 없거나, 정책상 수정된 트레이스백(redacted traceback)조차 외부 모델로 보내는 것이 금지된다면 건너뛰어라. 패치(patch)가 자격 증명(credentials), 프로덕션 데이터 또는 다음 커피 시간 전에 롤백(roll back)할 수 없는 서비스를 건드린다면 건너뛰어라. 컴플라이언스 증명서(compliance attestation)가 필요하다면 건너뛰어라. 왜냐하면 필기장(field notebook)은 감사가 아니며, 무료 등급(free tier)은 내가 만들 의향이 있는 계약서가 아니기 때문이다.
노트에 남기는 한계점들
이 워크플로우는 모델이 코드를 이해했는지 증명하지 못하며, 서버가 프로덕션과 일치하는지 증명하지도 못한다. 예시의 120초 타임아웃(timeout)은 스케치에 대한 가드(guard)일 뿐, 내가 누구와 협상한 서비스 수준(service level)이 아니다. py_compile은 구문(syntax)을 포착할 뿐 행동(behavior)을 포착하지 못하며, unittest discover는 그러한 테스트가 이미 존재하고 이미 의미를 갖는 경우에만 도움이 된다. 해시값(hashes)은 텍스트가 바뀌었는지 여부를 알려줄 뿐, 그 텍스트가 현명했는지 여부는 알려주지 않는다.
또한 무료 모델 목록이나 무료 서버 버튼이 다음 주에도 같은 위치에, 같은 제한으로 남아있을 것이라고 말씀드릴 수는 없습니다. 실제로 가지고 있는 콘솔을 확인하고, 마치 이것들이 상태 페이지인 것처럼 메모를 복사하는 대신 눈에 보이는 것을 직접 적으십시오. 만약 무료 서버가 절대 셸(shell)을 제공하지 않는다면, 초안 작성 단계에서 멈추고 통제할 수 있는 다른 곳에서 허용 목록의 명령어를 실행하십시오. 증인이 누락된 것은 결과이며, 파일에서도 증인이 누락된 것처럼 보여야 합니다.
이미 MonkeyCode를 사용하고 있다면, 유용한 부분은 평범합니다. 초안이 필요할 때는 무료 모델 경로를 열고, 셸(shell)이 필요할 때는 무료 서버 경로를 열며, 그 출력물들을 별도의 파일에 보관하십시오. 저는 여전히 어떤 것도 적용하기 전에 diff를 직접 읽을 것입니다. 왜냐하면 종료 코드(exit code)에 대한 동의가 제가 원했던 변경 사항이라는 것에 대한 동의는 아니기 때문입니다. 이 노트북은 미래의 내가 무엇이 실행되었는지, 무엇이 시작되지 않았는지, 그리고 내가 완료라고 부르기를 거부한 것들을 볼 수 있도록 존재하는 것입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기