구조화된 출력 채용 패킷을 위한 숨겨진 절단 케이스
요약
본 글은 구조화된 출력(structured-output)을 요구하는 AI 모델의 평가 패킷에 대해 논합니다. 핵심은 모델이 신뢰할 수 없는 텍스트와 안전한 도구 요청을 분리하고, 엄격하게 정의된 스키마를 준수하는지 측정하는 것입니다. 채점 과정은 고정된 테스트 환경과 공유 런타임에서 이루어져 공정한 평가가 가능함을 강조합니다.
핵심 포인트
- 평가는 모델의 신뢰성 및 도구 호출 안전성을 측정함.
- 도구 요청은 엄격한 스키마(name, call_id, args)를 준수해야 함.
- 채점 과정은 고정된 테스트 환경과 공유 런타임에서 진행됨.
- 모델 출력이 암기되거나 과장되지 않도록 설계가 중요함.
구조화된 출력(structured-output) 채용 패킷은 결정론적 검사기(deterministic checker)가 유효한 도구 호출(tool call)을 수락하고, 잘린(truncated) 또는 너무 광범위한 페이로드(over-broad payloads)를 거부할 때만 통과해야 합니다. 모델의 신뢰도, 성공적인 로컬 데모, 그리고 세련된 설명은 경계가 숨겨진 케이스에서도 유지된다는 증거가 아닙니다. 채점자는 어떤 모델 실행에 앞서 고정된 테스트 환경(fixtures)을 동결시키고, 지원자가 조용히 업그레이드할 수 없는 공유 런타임(shared runtime)에서 해당 케이스들을 실행합니다. 선택적인 초안 작성 도움(drafting help)은 추가 케이스를 제안할 수 있지만, 점수는 검사기와 고정된 테스트 환경 계약에 속합니다.
패킷이 측정하는 것
패킷은 지원자가 신뢰할 수 없는 모델 텍스트와 실행하기 안전한 도구 요청을 분리할 수 있는지 여부를 측정합니다. 이는 취향, 프롬프팅 속도, 또는 사후에 디버깅 이야기를 서술하는 능력을 측정하지 않습니다. 통과하는 제출물은 불완전한 JSON, 알 수 없는 도구 이름, 예상치 못한 키(keys), 그리고 할당된 작업 공간을 벗어나는 경로를 거부합니다. 실패하는 제출물이라도 검토자가 숨겨진 테스트 환경 결과 대신 산문(prose)을 채점할 때는 여전히 인상적으로 보일 수 있습니다.
세 가지 경계가 설계를 담당하며, 각각은 지원자 프롬프트와 루브릭에서 눈에 띄어야 합니다. 검사기가 수락 여부를 소유하고, 테스트 환경 파일이 예상되는 이유를 소유하며, 공유 런타임이 실행 환경을 소유합니다. 모델은 페이로드를 제안할 수 있지만, 스키마(schema)를 느슨하게 하거나, 실패 이유의 이름을 바꾸거나, 케이스를 건너뛸 수는 없습니다. 이 분리는 모델 출력이 한 코호트에서 다음 코호트로 변경될 때 채용 신호를 안정적으로 유지시킵니다.
전달할 프롬프트
지원자 프롬프트는 한 번에 읽을 수 있을 만큼 짧고, 회의 없이도 채점할 만큼 엄격해야 합니다. 이는 허용되는 도구들, 정확한 키 세트(key set), 그리고 추가 키가 힌트가 아니라 실패임을 명시하는 규칙을 명시합니다. 또한 이 프롬프트는 검사기가 해당 페이로드에 대한 수락 결정을 반환할 때까지 어떤 도구도 실행되지 않음을 명시합니다. 숨겨진 테스트 환경은 채점자에게 남아 있으며, 절단(truncation), 반복되는 호출 식별자(repeated call identifiers), 그리고 작업 공간을 벗어나는 경로를 다룹니다.
다음 프롬프트와 유사한 언어를 제공하고, 공개 테스트 파일(public fixture file)을 같은 아카이브에 첨부하세요. 어떤 검토자가 동봉된 설명을 읽기 전에 반드시 실행해야 하는 명령이 무엇인지 명시하십시오. 로컬에서 통과하는 실행이 암기된 스크립트로 변질되는 것을 막기 위해 숨겨진 행은 아카이브에서 제외해야 합니다.
Implement acceptToolCall(raw) for a hiring packet in Node.js.
Input is one string that claims to be a tool call from a model.
Accept only objects whose keys are exactly name, call_id, and args.
...
공개 테스트 파일 및 명령어 (Public fixtures and commands)
공개 테스트 파일에는 후보자가 계약(contract)을 확인할 수 있도록 최소한 하나의 허용 케이스(accept case)와 세 개의 거부 케이스(reject cases)가 포함되어야 합니다. 숨겨진 테스트 파일은 계약을 변경하지 않으면서 값을 변경해야 하며, 이는 샘플 문자열에 대한 하드코딩된 맵 생성을 방지합니다. 각 줄은 원시 페이로드(raw payload), 안정적인 ID(stable id), 그리고 예상되는 이유 코드(expected reason code)를 담는 하나의 JSON 객체입니다. 채점기는 예쁘게 출력된 객체가 아닌 이유 코드를 비교하므로, 우발적인 공백도 잘못된 결정을 구제할 수 없습니다.
절단 케이스(cut-off case)는 브레이스를 수동으로 편집하는 대신 코드에서 구현하여, 잘림이 명확하고 반복 가능하도록 해야 합니다. 아래 스니펫은 참조 패킷의 일부이며, 이 글을 작성하는 동안 실행되지 않았습니다. 독자들은 이 스니펫을 검증된 것으로 간주하기 전에 노트북이나 고정된 런타임(pinned runtime)에서 실행해야 합니다. 동일한 구조는 다른 식별자와 다른 상대 경로를 사용하여 숨겨진 파일에 포함되어야 합니다.
// fixtures/public-rows.js
const complete = JSON.stringify({
name: 'read_file',
...
공개 테스트 파일 (Public test file)
이 파일을 tests/public.test.js에 배치하여 require 경로가 한 디렉토리 위까지 도달할 수 있도록 해야 합니다. 이 파일은 하나의 허용 행과 하나의 잘린 행을 포함하며, 이는 명령어 배선(command wiring)을 증명하기에 충분합니다. 이것은 실행되지 않은 참조 파일이므로, 패널은 배선을 신뢰하기 전에 이를 실행해야 합니다. 숨겨진 케이스는 이 파일에 남아있지 않아야 하며, 그렇지 않으면 공개 명령어가 비공개 계약을 유출할 수 있습니다.
실제로 실행되는 grader 명령어
후보자와 채점자는 동일한 세 가지 명령어를 실행해야 하며, 숨겨진 테스트 케이스는 오직 grader 측에서만 마운트되어야 합니다. 공개 테스트 파일은 아카이브에 존재할 수 있지만, 숨겨진 파일은 채점 과정 중에만 추가되어야 합니다. 원시 페이로드를 출력하는 래퍼(wrapper)는 허용되지만, 도구로 셸아웃(shell out)하는 래퍼는 안 됩니다. 나중에 검토자가 어떤 이미지가 파일을 생성했는지 확인할 수 있도록 점수 옆에 실행 시간 식별자를 기록하십시오.
node --test tests/public.test.js
node bin/grade.js fixtures/public.jsonl
node bin/grade.js fixtures/hidden.jsonl
통과하는 공개 명령어만으로는 증명할 수 없는 것들
중요한 것은 세 번째 명령어입니다. 왜냐하면 이 명령만이 보지 못한 행(unseen rows)을 포함하여 실행되기 때문입니다. 공개 명령이 성공했다는 것은 후보자가 게시된 샘플을 이해했음을 보여줄 뿐입니다. 패킷은 package.json의 engines에 Node 메이저 버전을 문서화해야 하며, 해당 고정 값(pin)을 변경하는 트리는 거부해야 합니다. 두 실행에서 나온 grade.json을 모두 저장하고, 숨겨진 보고서가 공개 보고서로 덮어쓰여지지 않도록 하십시오.
채점 전에 JSONL 방출하기 (Emit)
fixture 모듈에서 publicRows를 내보낸 다음, grade 명령 이전에 한 줄에 하나의 JSON 객체를 작성하십시오. 아래의 라이터(writer)는 실행되지 않는 참조용 접착제(reference glue)이며, 패킷은 해당 파일을 bin/emit-public.js에 유지해야 합니다. fixture가 변경될 때 한 번 실행하고, 후보자가 라이터를 필요로 하지 않도록 JSONL을 커밋하십시오.
const fs = require('fs');
const { publicRows } = require('../fixtures/public-rows');
const newline = String.fromCharCode(10);
...
샘플 검사기 (Sample checker)
참조 accept 함수
아래 모듈은 측정된 프로덕션 구성 요소나 지연 시간 주장이 아니며, 실행되지 않은 참조 솔루션입니다. 이 모듈은 한 번 파싱하고, 비(非) 객체를 거부하며, 정확한 키 세트를 요구하고, 그 후에 도구별 인자 규칙을 적용합니다. 경로 검사는 가져가기 과제(take-home)의 초점이 전체 파일 시스템 샌드박스를 구축하는 것이 아니라 거부에 관한 것이므로 보수적으로 유지됩니다. 더 강력한 격리가 필요한 팀은 이 함수 내에 문자열 필터만 신뢰하기보다는 외부 운영체제 샌드박스를 추가해야 합니다.
// accept-tool-call.js
const ALLOWED = new Set(['read_file', 'list_dir', 'search_text']);
const KEYS = ['args', 'call_id', 'name'];
...
예시 채점기 (Illustrative grader)
작은 채점 스크립트는 사람이 검토자(human reviewer)가 모든 테스트 케이스 행마다 비교 루프에 개입하는 것을 막아줍니다. 이 스크립트는 JSONL을 읽고, 구현체를 호출하며, 다른 사람이 나중에 검토할 수 있는 점수 파일을 작성합니다. 아래 스크립트는 패킷용 예시 접착제(illustrative glue)이며, 체크 파일이 bin 디렉토리 옆에 위치한다고 가정합니다. 패널은 후보자들에게 샘플과 다른 파일 이름을 제출하도록 요청하는 경우 require 경로를 교체해야 합니다.
// bin/grade.js
const fs = require('fs');
const path = require('path');
...
채점 기준 (Rubric)
코딩 창이 닫힌 후에 발생하는 인터뷰 대화가 아니라 제출된 아티팩트(artifact)를 채점하세요. 아래 표는 패킷이 배포되기 전에 채용 패널이 수정할 수 있는 시작 채점 기준입니다. 점수는 후보자가 얼마나 자신감 있게 들렸는지에 대한 기억에서 나오는 것이 아니라, 채점 파일에서 할당되어야 합니다. 후보자들이 코드를 작성하기 전에 게이트(gates)를 볼 수 있도록 동일한 채점 기준을 프롬프트와 함께 게시하세요.
실패 모드 (Failure modes) 숨겨진 세트가 포착해야 할 것들
모델 출력을 이미 구조화되고 안전한 데이터로 취급할 때 여러 놓치는 부분이 자주 나타납니다. 이러한 놓치는 부분들을 평가 기준(rubric)에 명시함으로써 검토자들이 일주일 내내 제출된 작업물 전반에 걸쳐 일관성을 유지할 수 있게 합니다. 아래 목록은 후보자들로부터 영리한 페이로드(payloads)를 모으는 콘테스트라기보다는 채점 관행과 관련된 것입니다. 검토자들은 디브리핑(debriefing) 중에 새로운 이유를 지어내기보다, 등급 파일(grade file)에서 일치하는 행을 표시해야 합니다.
- JSON이 잘린 경우 중괄호({})를 추가하여 복구하는 파서는 데모에서는 통과하지만 제외(cut-off) 행에서는 실패할 것입니다.
- 알 수 없는 키(unknown keys)는 무시하는 스키마는 할당된 작업을 변경하려는 노트 필드도 받아들일 것입니다.
acceptToolCall이 반환되기 전에args.path를 읽는 핸들러는 이미 테스트 중인 안전 경계(safety boundary)를 넘은 상태입니다.- 네 개의 공개 문자열에 하드코딩된 솔루션은 숨겨진 식별자(hidden identifiers)가 변경되는 즉시 실패할 것입니다.
- 더 새로운 Node 릴리스에서 통과하는 실행 결과는 고정된 런타임(pinned runtime)과의 구문 또는 유니코드 차이를 숨길 수 있습니다.
- 비밀 정보(secrets)를 포함하여 테스트 케이스 행을 모델에 붙여넣는 작성물은 패킷이 금지해야 할 두 번째 누출(leak)을 만듭니다.
마지막 실수는 지원자 프롬프트와 채점 체크리스트에 서면 규칙으로 명시되어야 합니다. 지원자는 모델을 사용하여 케이스 형태를 브레인스토밍할 수 있지만, 숨겨진 고정값(hidden fixtures)이나 회사 코드를 업로드해서는 안 됩니다. 자격증 형태의 문자열은 브레인스토밍 프롬프트나 회사를 떠나는 고정값 아카이브 어느 쪽에도 속하지 않습니다. 채점자는 어떤 모델에게도 숨겨진 행에 대한 예상 이유를 다시 작성하도록 요청하는 제출물은 거부해야 합니다.
무료 모델 접근 및 무료 서버가 적합한 경우
공개: 이 문서는 MonkeyCode의 제품 홍보의 일환으로 작성되었습니다. 두 가지 가용성 주장(availability claims)은 운영자 제공 컨텍스트로만 사용됩니다. 즉, 무료 모델 접근과 무료 서버 옵션입니다. 본 문서는 모델 이름, 토큰 할당량, 하드웨어 크기, 시간 제한 또는 각 옵션의 영속성에 대해 언급하지 않습니다. 채용 패널이 이들 중 어느 것에 의존하기 전에 해당 용어들은 최신 제품 문서에서 확인해야 합니다.
무료 모델 접근은 채점자가 숨겨진 파일을 위해 추가 거부 케이스를 초안 작성할 때 유용합니다. 저자는 잘못된 형태(malformed shapes)를 요청하고, 유용한 것들을 보관한 다음, 수동으로 JSONL 파일에 고정시킬 수 있습니다. 나중에 답변이 더 자신감 있게 들리더라도 모델은 이 고정된 라인들의 심판자가 아닙니다. 일단 한 라인이 고정되면, 인간이 고정값을 편집하지 않는 한 어떤 어시스턴트도 그 예상 이유를 변경할 수 없습니다.
무료 서버 옵션은 모든 지원자와 채점자가 동일한 Node 런타임을 필요로 할 때 유용합니다. 실질적인 워크플로우는 간결하게 유지되어야 하며, 패킷은 팁보다는 필수 단계로 나열해야 합니다. 주요 버전을 고정하고(Pin the major version), 패킷을 복제하며(clone the packet), 공개 명령어를 실행하고(run the public command), 숨겨진 고정값은 채점자 계정에만 보관합니다. 만약 그 옵션이 이용 불가능하거나 문서화된 이미지와 다르다면, 수락하는 노트북 실행보다는 일시 중지해야 합니다.
가용성은 벤치마크 결과나 옵션이 변하지 않을 것이라는 약속이 아니라 운영상의 편의성일 뿐입니다. 이 문서는 특정 공급업체에 의존하지 않고 사용 가능합니다. 왜냐하면 모든 어시스턴트와 공유 러너(shared runner)가 고정된 테스트 케이스(fixtures)와 런타임 핀(runtime pin)을 보존할 수 있기 때문입니다. 중요한 것은 '동결 단계(freeze step)', 숨겨진 파일, 그리고 승인 전 실행 거부 여부입니다. 제품의 편의성이 채용 과정이나 점수 파일 내부에 검토되지 않은 의존성으로 변해서는 안 됩니다.
한 코호트(cohort)를 위한 단계
- 어시스턴트에게 샘플 페이로드(sample payloads)를 요청하기 전에 허용되는 도구 이름과 정확한 키 세트를 프롬프트에 동결합니다.
- 원하는 경우 어시스턴트와 함께 거부 형태(reject shapes) 초안을 작성한 다음, 인간이 검토한 줄만 숨겨진 JSONL 파일로 복사합니다.
- 핀된 런타임에서 공개 테스트 케이스 명령을 실행하고 코호트 노트 옆에 등급 파일을 저장합니다.
- 평가자 계정(grader account)에서 숨겨진 테스트 케이스를 실행하고, 실패한 게이트는 논쟁거리라기보다는 중단 신호로 간주합니다.
이 패킷을 건너뛰어야 하는 경우
이 패킷은 시각 디자인, 제품 카피라이팅, 또는 도구 경계(tool boundary) 없이 인프라 작업을 중심으로 하는 역할에는 적합하지 않습니다. 또한 회사가 숨겨진 테스트 케이스를 비공개로 유지할 수 없거나 공유 런타임을 제공할 수 없는 경우에도 적합하지 않습니다. 커뮤니케이션 스타일을 평가하고 싶은 패널은 별도의 연습을 사용해야 합니다. 왜냐하면 이 테스트는 의도적으로 해당 신호를 숨기기 때문입니다. 테스트 케이스를 새로 고칠 시간이 없는 팀은 후보자들이 이를 암기할 수 있으므로 하나의 공개 파일을 여러 코호트에 재사용해서는 안 됩니다.
문자열 경로 검사(string path checks)는 생산용 도구 러너에 대한 완전한 격리 스토리라기보다는 교육적 통제 장치입니다. 나중에 다른 서비스가 승인 결정을 무시하고 해당 경로를 실행한다면 여전히 피해를 줄 수 있습니다. 따라서 이 패킷은 평가 과정 내에서의 실행을 금지하며, 샌드박스 설계는 별도의 검토에 맡깁니다. 여기서 만점을 받는 것이 같은 기능을 프로덕션 자격 증명이나 고객 데이터에 연결할 수 있는 권한을 의미하지는 않습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기