개발지식 먹는 하마 님의 블로그
CS25 개선 (1) - AI 피드백 기반 정답 판별 로직 개선 본문
문제 발견!
스터디에서 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();
}
위와 같이 테스트한 결과 두 개 모두 성공적으로 통과하였다.
'TIL' 카테고리의 다른 글
전략 패턴과 팩토리 메서드 패턴 - 메일 발송 방식 변경 (0) | 2025.07.22 |
---|---|
[사전캠프 20일차] _ 프로젝트 7일차 (0) | 2025.02.13 |
[사전캠프 19일차] _ 프로젝트 6일차 / 브라우저 보안 오류 (0) | 2025.02.12 |
[사전캠프 17일차] _ 프로젝트 5일차 / 웹 스토리지 (0) | 2025.02.10 |
[사전캠프 16일차] _ 스레드, 이분 탐색 (0) | 2025.02.07 |