Skip to content

GPT 기반 면접 질문 생성 시 특정 주제 반복 문제 해결#28

Merged
sgn07124 merged 7 commits intomainfrom
fix/prompt
Aug 28, 2025
Merged

GPT 기반 면접 질문 생성 시 특정 주제 반복 문제 해결#28
sgn07124 merged 7 commits intomainfrom
fix/prompt

Conversation

@sgn07124
Copy link
Owner

@sgn07124 sgn07124 commented Aug 28, 2025

User description

관련 이슈 (Related Issues)


PR Type

Enhancement, Tests, Bug fix


Description

  • GPT 질문 중복 방지 로직 도입

  • 최근 토픽/키워드 저장·조회 캐시화

  • CORS에 PATCH 메서드 허용 추가

  • 테스트 케이스 대거 보강 및 수정


Diagram Walkthrough

flowchart LR
  UI["User"] -- 'createQuestion(category)' --> QS["QuestionServiceImpl"]
  QS -- "getLoginMemberId()" --> SEC["SecurityUtil"]
  QS -- "getRecent(TOPIC/KEYWORD)" --> RPF["RecentPromptFilterService"]
  QS -- "PromptFactory.forQuestionGeneration(...)" --> PF["PromptFactory"]
  QS -- "callOpenAI(prompt)" --> GPT["GptService"]
  GPT -- "GptQuestion(question, topic, keyword)" --> QS
  QS -- "insertQuestion" --> QM["QuestionMapper"]
  QS -- "record(TOPIC/KEYWORD)" --> RPF
  RPF -- "ZSET cache + TTL" --> Redis["Redis"]
  RPF -- "insert(ignore dup)" --> DB["recent_prompt_filters"]
Loading

File Walkthrough

Relevant files
Enhancement
9 files
QuestionResponse.java
GPT 질문 응답에 주제·키워드 필드 추가                                                                   
+2/-0     
ItemType.java
최근 필터 항목 타입 enum 추가                                                                           
+5/-0     
RecentPromptFilter.java
최근 프롬프트 필터 JPA 엔티티 추가                                                                       
+64/-0   
RecentPromptFilterMapper.java
최근 필터 저장·조회용 MyBatis 매퍼                                                                   
+18/-0   
RecentPromptFilterService.java
최근 필터 서비스 인터페이스 정의                                                                             
+11/-0   
QuestionServiceImpl.java
금지 토픽/키워드 반영한 질문 생성 흐름                                                                     
+31/-1   
RecentPromptFilterServiceImpl.java
Redis 캐시+DB 기록 기반 최근 필터 구현                                                             
+82/-0   
PromptFactory.java
금지 목록 주입·가드레일 강화 프롬프트                                                                       
+84/-5   
recent-prompt-filter-mapper.xml
최근 필터 insert/조회 SQL 추가                                                                     
+26/-0   
Configuration changes
4 files
CorsConfig.java
CORS 허용 메서드에 PATCH 추가                                                                       
+1/-1     
RedisConfig.java
StringRedisTemplate 빈 구성 추가                                                           
+15/-0   
WebConfig.java
웹 CORS 설정에 PATCH 허용                                                                           
+1/-1     
sql-map-config.xml
MyBatis 타입 alias에 최근 필터 등록                                                             
+1/-0     
Tests
6 files
CommentControllerTest.java
성공 코드 상수 변경에 따른 테스트 수정                                                                     
+5/-5     
PostControllerTest.java
엔드포인트/성공 코드 기대값 수정                                                                             
+3/-3     
CommentServiceImplTest.java
불필요 상호작용 제거로 검증 로직 수정                                                                       
+1/-3     
QuestionServiceImplTest.java
질문 생성 플로우 상호작용 순서 검증                                                                         
+33/-10 
RecentPromptFilterServiceImplTest.java
최근 필터 서비스 캐시/DB 동작 테스트                                                                     
+141/-0 
PromptFactoryTest.java
프롬프트 포맷·가드레일·금지목록 테스트                                                                       
+130/-9 

- 질문 생성 시 같은 주제가 반복하는 경우가 발생함.
- 따라서, 주제 중복 방지 로직을 적용하여 최근 10개의 금지 키워드/주제를 프롬프트에 동적으로 주입하는 방식을 적용함.
@sgn07124 sgn07124 self-assigned this Aug 28, 2025
@sgn07124 sgn07124 added 🚑 Hotfix 긴급 수정사항 ⬆️ Dependencies 의존성 패키지 업데이트 labels Aug 28, 2025
@sgn07124 sgn07124 linked an issue Aug 28, 2025 that may be closed by this pull request
2 tasks
@sgn07124 sgn07124 added 🐛 Bug 버그 수정 및 오류 해결 ✅ Test 테스트 코드 추가 및 수정 labels Aug 28, 2025
@github-actions
Copy link

github-actions bot commented Aug 28, 2025

PR Reviewer Guide 🔍

(Review updated until commit 4367573)

Here are some key observations to aid the review process:

⏱️ Estimated effort to review: 3 🔵🔵🔵⚪⚪
🧪 PR contains tests
🔒 No security concerns identified
⚡ Recommended focus areas for review

Logic Bug

Redis ZSET trim 범위 계산에서 off-by-one 가능성이 있습니다. 현재 size > MAX_SIZE일 때 removeRange의 끝 인덱스를 size - MAX_SIZE - 1로 계산하는데, 기대 동작(정확히 MAX_SIZE만 유지)에 맞는지 확인이 필요합니다.

Long size = redis.opsForZSet().size(key);  // ZSet: 낮은 rank가 오래된 것
if (size != null && size > MAX_SIZE) {
    redis.opsForZSet().removeRange(key, 0, size - MAX_SIZE - 1);
}
DB Compatibility

ON CONFLICT 구문은 PostgreSQL 전용입니다. 운영 DB가 MySQL 등 다른 엔진일 경우 동작하지 않을 수 있으니 호환성 점검이 필요합니다.

    ON CONFLICT (member_id, category, item_type, item_value) DO NOTHING
</insert>
Prompt Robustness

모델이 JSON만 출력하지 않을 경우를 대비한 후처리나 파서 방어 로직이 서비스 계층에 필요할 수 있습니다. topic/keyword 필드가 누락되거나 포맷이 깨진 응답에 대한 처리 방안을 확인해 주세요.

String systemPrompt = """
        당신은 예리하고 경험 많은 소프트웨어 개발자 면접관입니다.
        지원자의 수준을 파악할 수 있는 깊이 있는 CS 면접 질문을 생성해야 합니다.
        질문은 실무와 밀접하게 연관되며, 개념 이해를 바탕으로 응답자의 사고력을 평가할 수 있어야 합니다.
        응답은 질문 하나로만 구성되어야 하며, 질문 외의 설명이나 해설은 포함하지 마세요.
        아래 JSON 형식을 지켜서 응답해 주세요. 단, JSON만 출력하되, 코드블록은 출력하지 마세요.
        {
          \\"question\\": \\"...\\",
          \\"topic\\": \\"...\\",     // 질문을 대표하는 짧은 주제 문구 (예: \\"volatile의 메모리 가시성\\")
          \\"keyword\\": \\"...\\"    // 중복 방지용 핵심 단어 (예: \\"volatile\\", \\"hashmap\\", \\"dijkstra\\")
        }
        """;

String guardrails = switch (category.toLowerCase()) {
    case "algorithm" -> """
            [카테고리: 알고리즘(코딩테스트/기술면접용)]
            포함 예시: 시간복잡도/공간복잡도, 정렬, 탐색(Binary Search), 투포인터, 슬라이딩 윈도우, 스택/큐/우선순위큐/해시, 그래프(DFS/BFS), 최단경로(다익스트라/벨만-포드), 최소신장트리(크루스칼/프림),
            위상정렬, 동적계획법(LIS/LCS/Knapsack 등), 비트마스킹, 분할정복, 그리디, 유니온파인드, 세그먼트트리/펜윅트리 등.
            반드시 제외: 머신러닝/딥러닝/통계/확률/최적화(경사하강법, CNN/RNN/Transformer, SVM, KMeans 등)
            """;
    case "java" -> """
            [카테고리: Java]
            주제를 고르게 분산: 언어 기초(클래스/인터페이스/추상/상속/다형성), 제네릭/애너테이션/레코드, 예외/에러 처리, 컬렉션/동등성(equals/hashCode), 스트림/람다/함수형 인터페이스,
            동시성(스레드/락/volatile/Atomic/CompletableFuture), I/O/NIO, 모듈 시스템, JVM(클래스로더, 메모리 구조, JIT) 등. GC/volatile 등 특정 주제가 반복 출제되지 않도록 분산.
            프레임워크(Spring 등) 종속 질문은 피하고 순수 Java 중심으로.
            """;
    case "os" -> """
            [카테고리: 운영체제]
            프로세스/스레드/CPU 스케줄링, 동기화(뮤텍스/세마포어/모니터), 교착상태,
            메모리 관리(페이징/세그멘테이션/교체 알고리즘), 파일시스템, 시스템콜 등.
            """;
    case "network", "computer network" -> """
            [카테고리: 네트워크]
            OSI/TCP-IP, TCP/UDP 차이/흐름·혼잡제어, 3-way/4-way, HTTP/1.1 vs 2 vs 3, TLS/HTTPS,
            DNS/CDN/캐시, 프록시/로드밸런싱 등.
            """;
    case "db", "database" -> """
            [카테고리: 데이터베이스]
            정규화/인덱스/트랜잭션/격리수준, 쿼리 최적화, 조인 전략, 샤딩/리플리케이션, NoSQL vs RDB 등.
            """;
    case "spring" -> """
            [카테고리: Spring]
            DI/IoC, AOP, 트랜잭션 관리, MVC 구조, 빈 생명주기, 예외 처리, Validation 등(Java 일반보다 프레임워크 중심).
            """;
    default -> """
            [카테고리: 일반 CS]
            자료구조/알고리즘/OS/네트워크/DB/소프트웨어 공학 등 면접용 정통 CS 범위에서 출제.
            머신러닝/딥러닝/데이터사이언스 주제는 제외.
            """;
};

String diversityRules = """
        추가 지침:
        - 최근에 출제된 주제/키워드와 **중복 금지**. (아래 금지 목록을 반드시 피하세요)
        - 지나치게 광범위한 '모두 설명하라' 대신, 하나의 개념/기법/상황을 날카롭게 파고드는 질문으로.
        - 동일 카테고리 내에서도 하위 주제를 **순환**하며 다양성을 유지하세요.
        """;

String bannedSection = "";
if (bannedTopics != null && !bannedTopics.isEmpty()) {
    bannedSection += "금지 토픽(최근): " + String.join(", ", bannedTopics) + "\n";
}
if (bannedKeywords != null && !bannedKeywords.isEmpty()) {
    bannedSection += "금지 키워드(최근): " + String.join(", ", bannedKeywords) + "\n";
}
if (!bannedSection.isEmpty()) {
    bannedSection = "\n[중복 방지용 금지 목록]\n" + bannedSection;
}

String userPrompt = """
    다음 카테고리에 대한 CS 면접 질문 1개를 생성하세요.
    카테고리: %s

    %s

    %s
    %s

    출력 형식(JSON):
    { "question": "...", "topic": "...", "keyword": "..." }
""".formatted(category, guardrails, diversityRules, bannedSection);

return toMessages(systemPrompt, userPrompt);

@codecov
Copy link

codecov bot commented Aug 28, 2025

@github-actions
Copy link

Persistent review updated to latest commit 4367573

@sgn07124 sgn07124 merged commit 770f074 into main Aug 28, 2025
2 of 3 checks passed
@sgn07124 sgn07124 deleted the fix/prompt branch August 28, 2025 17:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🚑 Hotfix 긴급 수정사항 ⬆️ Dependencies 의존성 패키지 업데이트 🐛 Bug 버그 수정 및 오류 해결 Review effort 3/5 ✅ Test 테스트 코드 추가 및 수정

Projects

None yet

Development

Successfully merging this pull request may close these issues.

GPT 기반 면접 질문 생성 시 특정 주제 반복 문제

1 participant