Skip to content

Commit

Permalink
Merge pull request #148 from SWM14-Architect/fix/question
Browse files Browse the repository at this point in the history
Refactor: Initial Question Prompt
  • Loading branch information
saebyeok0306 authored Nov 20, 2023
2 parents 2612b86 + 3921209 commit a7aeca0
Show file tree
Hide file tree
Showing 7 changed files with 196 additions and 114 deletions.
205 changes: 128 additions & 77 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,26 +14,26 @@

***

### API 명세서 (인증 / 인가 관련 명세서는 미포함)
### API 명세서

***

#### /interview/input

```
method : POST
request: json(면접자 이름, 회사, 직군, 모집공고, 자소서 문항, 자소서 답변)
response: json(초기 질문 n개에 대한 데이터{"objectId":id, ""}, 인터뷰 아이디)
description: 초기 질문 받아오는 API
GPT call: O
Method : POST
Request : json(이름, 회사, 직군, 모집공고, 자소서 문항, 자소서 답변)
Response : json(초기 질문 리스트, 인터뷰 아이디)
Description : 초기 질문 받아오는 API
```

request json
Request JSON

```json
{
"interviewee_name": "아무개",
"company_name": "아무개 회사",
"interviewee_name": "홍길동",
"company_name": "지원 회사 이름",
"job_group": "지원 직군",
"recruit_announcement": "모집 공고",
"cover_letter_questions": [
"자소서 문항 1",
Expand All @@ -47,7 +47,7 @@ request json

```

response json
Response JSON

```json
{
Expand All @@ -61,10 +61,7 @@ response json
"question_id": "초기 질문 id",
"content": "GPT 결과"
},
{
"question_id": "초기 질문 id",
"content": "GPT 결과"
}
...
],
"interview_id": "인터뷰 id"
}
Expand All @@ -76,26 +73,25 @@ response json
#### /interview/light

```
method : POST
request: json(면접자 이름, 회사, 직군, 직무면접 키워드)
response: json(초기 질문 n개에 대한 데이터{"objectId":id, ""}, 인터뷰 아이디)
description: 초기 질문 받아오는 API (light mode)
GPT call: O
Method : POST
Request : json(이름, 회사, 직군, 직무면접 키워드)
Response : json(초기 질문 리스트, 인터뷰 아이디)
Description : 초기 질문 받아오는 API (light mode)
```

request json
Request JSON

```json
{
"interviewee_name":"tester",
"company_name":"Facebook",
"job_group":"Backend",
"keyword":"아파치 카프카"
"interviewee_name":"홍길동",
"company_name":"지원 회사 이름",
"job_group":"지원 직군",
"keyword":"면접 키워드, ..."
}

```

response json
Response JSON

```json
{
Expand All @@ -109,10 +105,7 @@ response json
"question_id": "초기 질문 id",
"content": "GPT 결과"
},
{
"question_id": "초기 질문 id",
"content": "GPT 결과"
}
...
],
"interview_id": "인터뷰 id"
}
Expand All @@ -124,31 +117,31 @@ response json
#### /interview/answer

```
method : POST
request:cookie(세션id),json(인터뷰 id, 질문 id, 질문 내용, 사용자 답변)
response: json(출제할 질문, 출제 질문 id)
description:
GPT call: O (동기 처리)
Method : POST
Request : json(인터뷰 id, 질문 id, 질문 내용, 사용자 답변)
Response : json(꼬리 질문, 출제 질문 id)
Description : 꼬리질문을 생성하는 API
```

request json
Request JSON

```json
{
"user_id": "session_id일수도 있음 ",
"interview_id": "interview_id",
"interview_id": "인터뷰 id",
"question_id": "최근에 출제했던 질문 id",
"question_content": "최근에 출제했던 질문 내용",
"answer_content": "사용자 답변"
}
```

response json
Response JSON

```json
{
"question_content": "꼬리질문 내용 (Nullable)",
"question_id": "꼬리 질문 id (Nullable)"
"message": {
"question_content": "꼬리질문 내용 (Nullable)",
"question_id": "꼬리 질문 id (Nullable)"
}
}
```

Expand All @@ -157,62 +150,120 @@ response json
#### /interview/evaluation

```
method : POST
request: cookie(세션id), json(user_id, interview_id)
response: json(질문 내용, 답변 내용, 평가 내용)
description: 사용자가 답변했던 내용에 대한 평가 내역을 불러오는 api
GPT call: O
Method : POST
Request : json(인터뷰 id)
Response : json(질문 id, 질문 내용, 답변 내용, 평가 내용)
Description : 사용자가 답변했던 내용에 대한 평가를 생성하고 반환하는 API
```

response json
Request JSON
```json
{
"evaluations": [
{
"question_id": "질문 id. Question 엔티티의 _id.",
"question": "질문 내용. Question 엔티티 content 칼럼.",
"answer": "답변 내용. Answer 엔티티 content 칼럼.",
"evaluation": "평가 내용. Answer 엔티티 칼럼."
},
{
"question_id": "질문 id. Question 엔티티의 _id.",
"question": "질문 내용. Question 엔티티 content 칼럼.",
"answer": "답변 내용. Answer 엔티티 content 칼럼.",
"evaluation": "평가 내용. Answer 엔티티 칼럼."
}
]
"interview_id": "인터뷰 id"
}
```

Response JSON
```json
{
"message": {
"evaluations": [
{
"question_id": "질문 id",
"question": "질문 내용",
"answer": "답변 내용",
"evaluation": "평가 내용"
},
...
]
}
}
```

***

#### /interview/feedback
#### /interview/tts

```
method : POST
request: cookie(세션id), json(각 답변분석에 대한 유저의 평가)
response: X
description: 유저의 서비스평가를 받고, 종료
GPT call: X (동기 처리)
Method : POST
Request : json(인터뷰 id, 내용)
Response : json(TTS 음성 내용 - base64)
Description : Text를 음성파일로 변환하는 API
```

request json
Request JSON
```json
{
"interview_id": "인터뷰 id",
"text": "TTS로 변환할 내용"
}
```

Response JSON
```json
{
"user_id": "session_id일수도 있음 ",
"interview_id": "interview_id",
"question_ids": [
"질문 id 1",
"질문 id 2"
],
"feedback_scores": [
"질문 id 1에 대한 피드백 점수",
"질문 id 2에 대한 피드백 점수"
]
"message": {
"audio_data": "TTS 음성 내용 - base64"
}
}
```

***

#### /interview/stt

```
Method : POST
Request : json(인터뷰 id, 오디오 데이터)
Response : json(음성을 텍스트로 변환한 내용)
Description : 음성파일을 Text로 변환하는 API
```

Request JSON
```json
{
"interview_id": "인터뷰 id",
"audio_data": "음성을 텍스트로 변환한 내용"
}
```

Response JSON
```json
{
"message": {
"text": "음성을 텍스트로 변환한 내용"
}
}
```

***

#### /slack/feedback

```
Method : POST
Request : json(이름, 피드백 내용, 생성 시간)
Response : json(성공적으로 전달했음을 알리는 메시지)
Description : 사용자의 피드백 내용을 개발자 Slack의 Feedback 채널로 보내주는 API
```

Request JSON
```json
{
"profile_nickname": "홍길동",
"user_message": "피드백 내용",
"created_at": "생성 시간"
}
```

Response JSON
```json
{
"message": "OK"
}
```


***

### 테스트 커버리지 (v2 기준)
Expand Down
6 changes: 3 additions & 3 deletions app.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,12 @@ def set_moview_config():
Flask App에 API 추가
"""
app.secret_key = ''.join(random.choice(string.ascii_letters) for i in range(20))
api = Api(app)
api = Api(app, version='3.2', title='Moview API', description='Moview API', doc='/docs')

app.config['JSON_AS_ASCII'] = False # 한글 깨짐 방지

# health check api
api.add_namespace(health_controller.api, '/')
api.add_namespace(input_data_controller.api, '/interview')
api.add_namespace(answer_controller.api, '/interview')
api.add_namespace(evaluation_controller.api, '/interview')
Expand All @@ -56,8 +58,6 @@ def set_moview_config():
# slack api
api.add_namespace(slack_controller.api, '/slack')

# health check api
api.add_namespace(health_controller.api, '/')


def set_jwt_config():
Expand Down
2 changes: 1 addition & 1 deletion moview/controller/health_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
api = Namespace('health', description='health api')


@api.route('/health')
@api.route('health')
class HealthChecker(Resource):

def get(self):
Expand Down
11 changes: 8 additions & 3 deletions moview/modules/input/initial_question_giver.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,11 @@ def __init__(self, prompt_loader: PromptLoader):

@async_retry()
async def give_initial_questions_by_input_data(
self, recruit_announcement: str, cover_letter: str, question_count: int, exclusion_list: List[str] = None
self, company_name, recruit_announcement: str, cover_letter: str, question_count: int, exclusion_list: List[str] = None
) -> List[str]:
"""
Args:
company_name: 회사 이름
recruit_announcement: 모집공고
cover_letter: 자기소개서
question_count: 출제할 질문 개수
Expand All @@ -34,6 +35,7 @@ async def give_initial_questions_by_input_data(
messages = [{
"role": "system",
"content": self.prompt["create_question_by_input_data"].format(
company_name=company_name,
exclusion_question=exclusion_question,
question_count=question_count)
}, {
Expand All @@ -55,10 +57,12 @@ async def give_initial_questions_by_input_data(
raise InitialQuestionParseError() # 파싱이 실패하면, InitialQuestionParseError를 발생시킵니다.

@async_retry()
async def give_initial_questions(self, job_group: str, question_count: int, exclusion_list: List[str] = None) -> \
List[str]:
async def give_initial_questions(
self, company_name:str, job_group: str, question_count: int, exclusion_list: List[str] = None
) -> List[str]:
"""
Args:
company_name: 회사 이름
job_group: 타겟 직군
question_count: 출제할 질문 개수
exclusion_list: 제외할 질문 리스트
Expand All @@ -71,6 +75,7 @@ async def give_initial_questions(self, job_group: str, question_count: int, excl
messages = [{
"role": "system",
"content": self.prompt["create_question"].format(
company_name=company_name,
exclusion_question=exclusion_question,
job_group=job_group,
question_count=question_count)
Expand Down
1 change: 1 addition & 0 deletions moview/service/answer/answer_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ def maybe_give_followup_question_about_latest_answer(self, interview_id: str, qu
saved_followup_question_id = self.__save_followup_question(interview_id=interview_id,
question_id=question_id,
followup_question_content=chosen_question)

return chosen_question, str(saved_followup_question_id)

else:
Expand Down
Loading

0 comments on commit a7aeca0

Please sign in to comment.