개발지식 먹는 하마 님의 블로그

CS25 개선 (1) - AI 피드백 기반 정답 판별 로직 개선 본문

TIL

CS25 개선 (1) - AI 피드백 기반 정답 판별 로직 개선

devhippo 2025. 7. 26. 21:34

문제 발견!

스터디에서 CS25 서비스 기반으로 CS 공부를 하는 도중 오류를 발견하였다!

서술형 문제 풀이 과정에서 분명히 정답이라는 결과가 나왔으나,
해당 문제가 틀린 문제 다시 보기 페이지에서 보인 것이다.

맞았는데 왜 틀린 문제에서 조회되는 거지?


원인 파악

AI가 정답을 채점할 때 우리는 분명 "정답"으로 시작해라고 프롬프트에 확실히 명시하였다.
그에 따라 AI가 사용자의 답안을 정답으로 판단했는지에 대한 여부를 아래의 코드처럼 확인한 것이다.

boolean isCorrect = feedback.startsWith("정답");

 

그런데 일부 피드백이 "- 정답 : " 형태로 구성되는 것을 확인하였다.
앞에 "-"와 공백이 붙으니 위의 코드를 기반으로 정답 여부를 판별할 때,
정답으로 시작하지 않으니 오답으로 판별한 것이다.


개선하기

public boolean isCorrect(String feedback){
    String prefix = feedback.length() > 6
        ? feedback.substring(0, 6)
        : feedback;

    int indexCorrect = prefix.indexOf("정답");
    int indexWrong = prefix.indexOf("오답");

    if (indexCorrect != -1 && (indexWrong == -1 || indexCorrect < indexWrong)) {
        return true;
    }

    return false;
}

1. 피드백의 앞부분만 잘라낸다.

2. 정답과 오답의 존재 여부를 확인한다.

3. '정답'이 존재하고, '오답이 없거나, 있는 경우 정답이 오답보다 앞에 있으면' 정답으로 판별한다!

✅ ":" 기호를 기준으로 앞부분을 검사하는 것이 아니라 앞의 6글자만 검사한 이유

AI가 ":"를 반드시 포함시킨다는 보장이 없기 때문이다.

✅ 정답이 오답보다 앞에 있는 경우를 고려한 이유

"오답: 정답은 ~~ 입니다."

이런 식으로 오답이지만 해설을 위한 글에 정답이 언급된다면?
정답의 존재 여부만으로 정답 여부를 판별하는 경우,
위와 같은 케이스에 대해서 오답인 답변을 정답이라고 잘못 판별할 가능성이 있다.

그래서 둘 다 존재하는 경우 정답이 앞에 오는지를 확인하는 로직을 추가한 것이다.


테스트 코드

    @Test
    @DisplayName("6글자 이내에 정답이 포함된 경우 true 반환")
    void testIfAiFeedbackIsCorrectThenReturnTrue(){
        assertThat(aiService.isCorrect("- 정답 : 당신의 답은 완벽합니다.")).isTrue();
        assertThat(aiService.isCorrect("정답 : 당신의 답은 완벽합니다.")).isTrue();
        assertThat(aiService.isCorrect("정답입니다. 당신의 답은 완벽합니다.")).isTrue();
    }

    @Test
    @DisplayName("오답인 경우 false 반환")
    void testIfAiFeedbackIsWrongThenReturnfalse(){
        assertThat(aiService.isCorrect("- 오답 : 당신의 답은 완벽합니다.")).isFalse();
        assertThat(aiService.isCorrect("오답 : 당신의 답은 완벽합니다.")).isFalse();
        assertThat(aiService.isCorrect("오답입니다. 당신의 답은 완벽합니다.")).isFalse();
        assertThat(aiService.isCorrect("오답: 정답이라고 하기에는 부족합니다.")).isFalse();
    }

위와 같이 테스트한 결과 두 개 모두 성공적으로 통과하였다.