MakeFrog / TechTalk

AI 면접관과 함께하는 개발자 면접 준비
46 stars 14 forks source link

생성형 AI 모델 변경 및 프롬프트 로직 고도화 #106

Closed Xim-ya closed 2 months ago

Xim-ya commented 2 months ago

🚀 기능

기존 생성형 AI 모델을 ChatGPT에서 Gemini로 변경하면서 프롬프트 로직을 고도화합니다. Gemini로 변경했을 때 기존 ChatGPT 모델을 적용했을 때와 동일한 수준의 답변 정확도가 나오는지 중점적으로 살펴볼 필요가 있습니다.

기존 논의사항 #105


📸 상세

채팅 면접 페이지에서는 아래와 같은 단계로 면접 프로세스가 진행됩니다:

  1. 면접 질문 제시
  2. 면접 질문에 대한 유저의 답변
  3. 유저의 답변이 올바른지 판단 및 분석 🤖
  4. 피드백 메시지 출력 🤖

    3, 4단계에서 생성형 AI 모델이 사용되며 SetAiFeedbackUseCase 모듈에서 필요한 로직을 관리합니다.

SetAiFeedbackUseCase

해당 UseCase는 크게 3가지 단계로 나누어지며, Response의 타입은 Stream<String>입니다. (RxDart 사용 == BehaviorSubject)

aimed

1. Request 단계

프롬프트 설계 및 API 요청 프롬프트 로직을 설정하고 요청하는 단계입니다. 각 요구사항을 충족하는 데이터를 받기 위해 여러 프롬프트 로직들로 반환 값의 조건을 설정합니다.

2. Stream Response를 받는 단계

Response에 포함된 태그([c], [w])를 기반으로 정답 여부 상태값을 업데이트하는 콜백을 실행

[
c]
심야님의 답변은
틀렸습니다

설정된 프롬프트 로직에 따라 위와 같은 형태로 Stream한 문자열 값이 내려옵니다.

response += it.choices?.last.message?.content ?? '';

이렇게 내려온 문자열을 response 변수에 합친 뒤,

setCorrectnessIfNeeded(response, param.checkAnswer);

합쳐진 문자열 맨 앞에 [c] 또는 [w]가 포함되어 있는지 판단하고, 태그 값에 따라 정답 여부 상태를 업데이트해주는 콜백을 실행합니다. 여기서 실행되는 콜백은 UseCase Parameter로 전달받으며, 위 코드에서 param.checkAnswer로 표기되어 있습니다.

Response 값을 포맷팅

streamedFeedbackResponse.add(formatResponse(response));

또한 실시간 응답 단계에서 문자열을 포맷팅하는 로직이 필요합니다. [c], [w] 태그를 제거하며 불필요한 줄바꿈이 있는 경우 또한 제거합니다.

포맷팅된 문자열 값을 streamedFeedbackResponse라는 Stream 변수에 더하여, 실시간으로 반환되는 Response를 StreamBuilder 위젯 내부에 전달할 수 있도록 합니다.

3. Stream Response가 종료된 이후

요청이 완료되면, 요청이 완료되었다는 상태를 업데이트해주어야 합니다.

onDone: () {  
  /// 응답이 종료된 이후  
  /// 1) Stream 닫기  
  /// 2) 응답 진행 상태 초기화  
  /// 3) 완료 콜백 메소드 실행  
  state = FeedbackProgress.init;  
  streamedFeedbackResponse.close().then(  
        (_) => param.onFeedBackCompleted(  
      formatResponse(streamedFeedbackResponse.value),  
    ),  
  );  
},

UseCase 내부에 응답 진행 상태를 나타내는 state 변수에 FeedbackProgress.init 값으로 초기화시켜주며, streamedFeedbackResponse Stream 변수를 close해줍니다. 이후 useCase Param으로 전달받은 param.onFeedBackCompleted 콜백을 실행시킵니다.

param.onFeedBackCompleted 콜백이 실행된 이후 다음 면접 질문을 제시하는 로직이 순차적으로 실행됩니다.

📄 기능 명세


👷 작업자

@Yellowtoast, @Xim-ya


💬 기타

보시다시피 로직 및 단계가 복잡하고 개선이 필요한 부분이 많습니다. 작업을 진행하실 때 기존 로직들을 완전히 배제해주셔도 무방합니다.

영어로 프롬프트 로직을 설정하면 응답 정확도가 올라갈 수 있을 것 같습니다.

구글이 공식적으로 지원하는 https://pub.dev/packages/google_generative_ai 패키지를 활용하는 것을 권장드립니다.

퇴근하고 정신없이 이슈를 등록해서 내용이 장황합니다...ㅠ 사소한 부분이라도 이해가 안 가는 부분이 있으시면 바로 DM 주세요.

Xim-ya commented 2 months ago

https://github.com/MakeFrog/TechTalk/issues/112 와 중복된 이슈 / 해결완료