From 5890ee57f364650e6620a23803ce281e822e535d Mon Sep 17 00:00:00 2001 From: jmj Date: Thu, 2 Jul 2026 15:31:53 +0900 Subject: [PATCH] =?UTF-8?q?feat(ai):=20=EB=A9=B4=EC=A0=91=20=ED=92=88?= =?UTF-8?q?=EC=A7=88=20=ED=94=84=EB=A1=AC=ED=94=84=ED=8A=B8=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0=201=EC=B0=A8=20(=EC=A0=80=EB=A6=AC=EC=8A=A4=ED=81=AC?= =?UTF-8?q?=20=EB=A0=88=EB=B2=84=204=EA=B1=B4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 면접 품질 전문가 감사(29레버→13 검증 통과)에서 저리스크·고효과 프롬프트 레버만. - [L4 꼬리질문 답변-정합] followup_generation: 답변의 특정 대목(수치·주장·기술선택)을 인용/지목해 묻도록 강제, 대상 없는 범용 요청 금지. 기대 신호 미충족분을 최우선 재추궁. - [L2 generic 억제] question_generation: 모든 카테고리(CS_FUNDAMENTAL·BEHAVIORAL 포함)를 지원자 특정 발화·프로젝트·기술선택에 앵커링, 교과서식 일반 개념 문제 금지(good/bad 예시). - [L3 JD 요구역량 선행] question_generation: JOB_TAILORED에서 JD 핵심 역량 5~8개를 먼저 열거해 [검증됨/근거약함/부재]로 분류하고 갭 우선 질문화. - [L7 모범답안 날조 방지] answer_coaching: model_answer가 자료에 없는 경험·수치를 지어내지 않도록 가드(근거 없으면 구조·접근만 제시). 순수 프롬프트 변경(스키마·채점 집계·검색 파라미터 무영향). AI 300 passed, flake8 clean. 중간 리스크 레버(RAG 재질의·RRF·채점축·출력순서·채점 null)는 A/B 후 별도 반영 예정. Co-Authored-By: Claude Opus 4.8 --- ai/src/ai_server/chain/prompts/answer_coaching.py | 4 +++- ai/src/ai_server/chain/prompts/followup_generation.py | 5 +++++ ai/src/ai_server/chain/prompts/question_generation.py | 9 +++++++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/ai/src/ai_server/chain/prompts/answer_coaching.py b/ai/src/ai_server/chain/prompts/answer_coaching.py index 93dbc76e..b47fc196 100644 --- a/ai/src/ai_server/chain/prompts/answer_coaching.py +++ b/ai/src/ai_server/chain/prompts/answer_coaching.py @@ -6,7 +6,9 @@ "당신은 IT 면접 코치입니다. 면접관 질문 하나와 지원자의 실제 답변을 보고, 지원자가 " "**어떻게 더 잘 답할 수 있는지**를 구체적으로 코칭합니다.\n" "- **model_answer (모범 답안)**: 이 질문에 대한 강한 답변의 예시. 질문이 기대하는 핵심(기대 신호)을 " - "짚고, 가능하면 지원자의 실제 경험/자료(아래 컨텍스트)를 근거로 구체적으로. 1~2문단, 면접에서 말할 분량.\n" + "짚고, 가능하면 지원자의 실제 경험/자료(아래 컨텍스트)를 근거로 구체적으로. 1~2문단, 면접에서 말할 분량. " + "**단, 지원자 자료/컨텍스트에 없는 경험·프로젝트·수치는 지어내지 마세요. 근거가 없으면 가상의 실적을 " + "사실처럼 쓰지 말고 일반적인 모범 답변의 '구조·접근'만 제시**합니다.\n" "- **answer_rewrite (내 답변 리라이트)**: 지원자의 *실제 답변을 출발점으로* 더 좋게 고쳐 쓴 버전. " "없는 경험을 지어내지 말고, 있는 내용을 구조(두괄식·근거·결과)와 구체성으로 보강. 답변이 비었거나 " "'모르겠다'면 '이렇게 접근했다면' 식으로 짧게.\n" diff --git a/ai/src/ai_server/chain/prompts/followup_generation.py b/ai/src/ai_server/chain/prompts/followup_generation.py index 66ed35ac..2088d1b9 100644 --- a/ai/src/ai_server/chain/prompts/followup_generation.py +++ b/ai/src/ai_server/chain/prompts/followup_generation.py @@ -19,6 +19,11 @@ "(기대 신호를 정확히 충족하면 높게, 빗나가거나 누락하면 낮게). '(none)' 이면 무시.\n" "- 꼬리질문은 가장 약한 축을 겨냥합니다 (예: 구체성 낮음→수치/사례 요구, " "correctness 의심→자료와의 불일치 확인).\n" + "- **꼬리질문은 지원자 답변의 특정 대목에 조건부**여야 합니다. 답변에서 검증할 대상 1개" + "(수치·주장·기술 선택·경험 단정)를 골라 직접 인용/지목해 물으세요. '조금 더 구체적으로 말씀해 " + "주세요' 같은 대상 없는 범용 요청은 금지합니다.\n" + "- **기대 신호(expected_signal) 중 답변이 놓친 부분이 있으면, 그것을 다시 드러내게 하는 질문을 " + "최우선**으로 만드세요. 기대 신호를 이미 충분히 충족했을 때만 다음으로 약한 축으로 넘어갑니다.\n" "- 꼬리질문은 **한 문장으로 간결하게**(대략 60자 이내). 장황한 배경 설명 없이 " "핵심만 묻고, 면접관이 입으로 말할 길이여야 합니다. CLARIFICATION 재설명도 짧고 쉽게.\n" "- 매번 깊이 파고들 필요는 없습니다. 지원자가 특정 사실/선택을 말했을 때는 " diff --git a/ai/src/ai_server/chain/prompts/question_generation.py b/ai/src/ai_server/chain/prompts/question_generation.py index 52e08de8..a140a35c 100644 --- a/ai/src/ai_server/chain/prompts/question_generation.py +++ b/ai/src/ai_server/chain/prompts/question_generation.py @@ -9,13 +9,18 @@ "자기소개에서 언급된 키워드를 이력서/레포 자료와 교차로 연결해 구체적으로 질문하세요.\n" "- 사실에 근거한 질문만. 자료에 없는 내용은 추측하지 않습니다.\n" "- 자료에 명시된 기술 스택과 프로젝트 경험을 적극 인용하세요.\n" + "- **모든 카테고리(CS_FUNDAMENTAL·BEHAVIORAL 포함)를 지원자의 특정 발화·프로젝트·기술 " + "선택에 앵커링**하세요. 자료 없이 누구나 답할 수 있는 일반 개념·교과서 문제는 금지. " + "예) ✗ 'HTTP와 HTTPS의 차이는?' → ✓ '레포의 결제 API를 HTTPS로 전환할 때 인증서·핸드셰이크에서 " + "겪은 이슈는?'. 개념을 묻더라도 지원자가 실제 다룬 맥락에 붙여 묻습니다.\n" "- 카테고리는 다음 중에서 선택: CS_FUNDAMENTAL, PROJECT_DEEP_DIVE, TECH_CHOICE, " "BEHAVIORAL.\n" "- 한국어로 작성하되 기술 용어는 영문 원어를 그대로 둡니다.\n" "- 질문 문장은 **간결하게**: 한두 문장(대략 80자 이내)으로, 장황한 배경 설명이나 " "중복 수식 없이 핵심만 묻습니다. 면접관이 입으로 자연스럽게 말할 길이여야 합니다.\n" - "- **직무 맞춤(타깃 회사/JD 제공 시)**: 채용공고의 요구 역량·기술·책임을 출발점으로, " - "지원자 자료(이력서·레포)와 JD 요구사항의 **교집합·갭**을 겨냥해 질문하세요. " + "- **직무 맞춤(타깃 회사/JD 제공 시)**: 먼저 채용공고에서 **핵심 요구 역량 5~8개를 뽑아** " + "각각을 지원자 자료(이력서·레포·자소서) 대비 [검증됨 / 근거 약함 / 부재]로 분류하세요. " + "그런 다음 '근거 약함·부재' 항목을 **우선**으로 갭을 겨냥해 질문합니다. " "(1) JD가 요구하는 기술/경험을 지원자가 실제로 갖췄는지 검증하는 질문, " "(2) JD에 있으나 자료에서 근거가 약한 부분을 확인하는 질문, " "(3) 지원동기·해당 회사/직무 적합성(왜 이 회사·직무인지, 컬처핏) 질문을 적절히 섞습니다. "