Sandcorp샌드코프 · 웹·AI 제품 개발

새 프로젝트 받는 중 · 갱신 2026.11sandcorp.co.krGitHub

← 팁

테스트

어떤 입력이 AI 판정에 들어가면 안 된다면, 그 입력을 붙인 경우와 뗀 경우 프롬프트가 바이트 단위로 같은지 시험한다

「이 값은 판정에 쓰지 않는다」를 문구 검사로 지키면 새 경로로 다시 새어 들어옵니다. 같은 제출에 그 값을 붙였을 때와 뗐을 때 만든 프롬프트를 그대로 비교합니다.

AI 채점에서 제출자가 붙이는 안내 정보(예: 「이 기능은 여기서 보세요」)를 판정 입력에서 빼기로 했습니다. 프롬프트에서 해당 문단을 지우고, 시험으로 「프롬프트에 그 단어가 없다」를 확인했습니다. 그런데 이런 시험은 지운 문구만 지킵니다. 나중에 누가 같은 정보를 다른 이름의 칸으로, 혹은 요약 문장 안에 섞어 다시 넣어도 시험은 통과합니다.

원인은 시험이 「무엇이 없어야 하는가」를 나열하고 있다는 데 있습니다. 지키고 싶은 성질은 「이 입력은 판정 결과에 영향을 줄 수 없다」인데, 금지어 목록은 그 성질의 일부만 잡습니다.

해법은 성질을 그대로 시험하는 것입니다. 같은 제출을 두 벌 만들어 한쪽에만 그 입력을 붙이고, 각각 프롬프트를 만드는 함수를 불러 결과 문자열이 바이트 단위로 같은지 봅니다. 모델을 부를 필요가 없어 빠르고, 비결정적인 AI 응답에도 흔들리지 않습니다.

def test_check_locations_do_not_change_prompt(make_submission):
    bare = make_submission(source=SOURCE)
    with_hint = make_submission(source=SOURCE, hints=[
        {"kind": "file", "value": "src/login.py"},
        {"kind": "url", "value": "https://example.com/demo"},
    ])
    assert build_prompt(with_hint) == build_prompt(bare)
    assert "src/login.py" not in build_prompt(with_hint)

판정 프롬프트를 다른 채점(예: 품질 점수)이 다시 쓰고 있다면 그쪽 프롬프트도 같은 시험에 넣습니다. 그리고 가짜 채점기로 「그 입력이 없어도 자동 미달이 되지 않는다」를 한 건 더 확인하면, 프롬프트 바깥의 코드 경로에 남은 의존까지 잡힙니다.

문의 →