update
Browse files- app.py +44 -11
- chat/llm_functions.py +44 -2
- chat/prompt.yaml +102 -5
app.py
CHANGED
|
@@ -11,7 +11,7 @@ import gradio as gr
|
|
| 11 |
import yaml
|
| 12 |
import json
|
| 13 |
import re
|
| 14 |
-
from chat.llm_functions import get_interviewer_response, get_student_response, generate_cover_letter_response
|
| 15 |
from utils import parse_json_from_response
|
| 16 |
from guide_generation.llm_functions import generate_guide as create_guide_from_llm
|
| 17 |
from answer_flow_generation.llm_functions import generate_answer_flow
|
|
@@ -82,6 +82,9 @@ def bot_response(history, shared_info, progress=gr.Progress()):
|
|
| 82 |
# word_limit κΈ°λ³Έκ° μ€μ (νΉμ μμ κ²½μ°λ₯Ό λλΉ)
|
| 83 |
if 'word_limit' not in format_info:
|
| 84 |
format_info['word_limit'] = 300
|
|
|
|
|
|
|
|
|
|
| 85 |
|
| 86 |
history[-1][1] = ""
|
| 87 |
full_response = ""
|
|
@@ -128,6 +131,9 @@ def generate_ai_reply(history, shared_info, progress=gr.Progress()):
|
|
| 128 |
# word_limit κΈ°λ³Έκ° μ€μ (νΉμ μμ κ²½μ°λ₯Ό λλΉ)
|
| 129 |
if 'word_limit' not in format_info:
|
| 130 |
format_info['word_limit'] = 300
|
|
|
|
|
|
|
|
|
|
| 131 |
|
| 132 |
student_answer_json = ""
|
| 133 |
history.append(["", None])
|
|
@@ -152,7 +158,7 @@ def generate_all_cover_letters(history, shared_info, progress=gr.Progress()):
|
|
| 152 |
if not history:
|
| 153 |
empty_outputs = [gr.update(value="λ©΄μ λνκ° μμ΅λλ€.")] * len(shared_info.get('questions', []))
|
| 154 |
empty_guidelines = [gr.update(value="")] * len(shared_info.get('questions', []))
|
| 155 |
-
return empty_outputs + empty_guidelines + [gr.update()]
|
| 156 |
|
| 157 |
# history -> conversation_history νμ λ³ν
|
| 158 |
conversation_str = ""
|
|
@@ -169,8 +175,8 @@ def generate_all_cover_letters(history, shared_info, progress=gr.Progress()):
|
|
| 169 |
|
| 170 |
for i, question in enumerate(shared_info.get('questions', [])):
|
| 171 |
# 1λ¨κ³: Answer Flow Generation
|
| 172 |
-
progress_text = f"μκΈ°μκ°μ μμ± μ§νλ₯ : {int((i / total_questions) *
|
| 173 |
-
yield [gr.update(value=o) for o in outputs] + [gr.update(value=g) for g in guidelines] + [gr.update(value=progress_text, visible=True)]
|
| 174 |
|
| 175 |
flow_result, _ = generate_answer_flow(
|
| 176 |
question=question,
|
|
@@ -184,8 +190,8 @@ def generate_all_cover_letters(history, shared_info, progress=gr.Progress()):
|
|
| 184 |
guidelines[i] = flow_text # κ°μ΄λλΌμΈ μ μ₯
|
| 185 |
|
| 186 |
# 2λ¨κ³: Cover Letter Response Generation
|
| 187 |
-
progress_text = f"μκΈ°μκ°μ μμ± μ§νλ₯ : {int((i / total_questions) *
|
| 188 |
-
yield [gr.update(value=o) for o in outputs] + [gr.update(value=g) for g in guidelines] + [gr.update(value=progress_text, visible=True)]
|
| 189 |
|
| 190 |
full_response = ""
|
| 191 |
word_limit = shared_info.get('word_limit', 300) # shared_infoμμ word_limit κ°μ Έμ€κΈ°
|
|
@@ -201,9 +207,9 @@ def generate_all_cover_letters(history, shared_info, progress=gr.Progress()):
|
|
| 201 |
cleaned_response = clean_markdown_response(full_response)
|
| 202 |
outputs[i] = cleaned_response
|
| 203 |
|
| 204 |
-
overall_progress_val = (i + 0.75) / total_questions
|
| 205 |
progress_text = f"μκΈ°μκ°μ μμ± μ§νλ₯ : {int(overall_progress_val*100)}%"
|
| 206 |
-
yield [gr.update(value=o) for o in outputs] + [gr.update(value=g) for g in guidelines] + [gr.update(value=progress_text, visible=True)]
|
| 207 |
|
| 208 |
# μ΅μ’
νμ± λ° μ 리
|
| 209 |
final_data = parse_json_from_response(full_response)
|
|
@@ -216,8 +222,29 @@ def generate_all_cover_letters(history, shared_info, progress=gr.Progress()):
|
|
| 216 |
cleaned_response = clean_markdown_response(full_response)
|
| 217 |
outputs[i] = cleaned_response
|
| 218 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 219 |
# μλ£
|
| 220 |
-
yield [gr.update(value=o) for o in outputs] + [gr.update(value=g) for g in guidelines] + [gr.update(visible=False)]
|
| 221 |
|
| 222 |
def update_guide_and_info(company, position, jd, questions_str, word_limit):
|
| 223 |
guide_json, _ = create_guide_from_llm(questions_str, jd, company, "μ μ
") # experience_level is hardcoded for now
|
|
@@ -234,7 +261,8 @@ def update_guide_and_info(company, position, jd, questions_str, word_limit):
|
|
| 234 |
"jd": jd,
|
| 235 |
"questions": [q.strip() for q in questions_str.strip().split('\n') if q.strip()],
|
| 236 |
"guide": guide_text,
|
| 237 |
-
"word_limit": word_limit
|
|
|
|
| 238 |
})
|
| 239 |
|
| 240 |
# Return new state and update for the guide display
|
|
@@ -310,6 +338,11 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
|
| 310 |
with gr.TabItem("λ΅λ³ κ°μ΄λλΌμΈ"):
|
| 311 |
guideline = gr.Markdown(value="κ°μ΄λλΌμΈμ΄ μμ±λλ©΄ μ¬κΈ°μ νμλ©λλ€.")
|
| 312 |
guideline_outputs.append(guideline)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 313 |
|
| 314 |
# Event Handlers
|
| 315 |
generate_guide_btn.click(
|
|
@@ -322,7 +355,7 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
|
| 322 |
msg.submit(user_submit, [msg, chatbot], [msg, chatbot]).then(bot_response, [chatbot, shared_info], [chatbot, progress_display, reason_display])
|
| 323 |
ai_reply_btn.click(generate_ai_reply, [chatbot, shared_info], [chatbot, progress_display, reason_display])
|
| 324 |
clear_btn.click(lambda: ([], "μκΈ°μκ°μ μμ±λ: 0%", ""), None, [chatbot, progress_display, reason_display], queue=False)
|
| 325 |
-
generate_btn.click(generate_all_cover_letters, [chatbot, shared_info], cover_letter_outputs + guideline_outputs + [cover_letter_progress_display])
|
| 326 |
|
| 327 |
if __name__ == "__main__":
|
| 328 |
demo.launch(share=True)
|
|
|
|
| 11 |
import yaml
|
| 12 |
import json
|
| 13 |
import re
|
| 14 |
+
from chat.llm_functions import get_interviewer_response, get_student_response, generate_cover_letter_response, generate_memory
|
| 15 |
from utils import parse_json_from_response
|
| 16 |
from guide_generation.llm_functions import generate_guide as create_guide_from_llm
|
| 17 |
from answer_flow_generation.llm_functions import generate_answer_flow
|
|
|
|
| 82 |
# word_limit κΈ°λ³Έκ° μ€μ (νΉμ μμ κ²½μ°λ₯Ό λλΉ)
|
| 83 |
if 'word_limit' not in format_info:
|
| 84 |
format_info['word_limit'] = 300
|
| 85 |
+
# memory κΈ°λ³Έκ° μ€μ
|
| 86 |
+
if 'memory' not in format_info:
|
| 87 |
+
format_info['memory'] = ""
|
| 88 |
|
| 89 |
history[-1][1] = ""
|
| 90 |
full_response = ""
|
|
|
|
| 131 |
# word_limit κΈ°λ³Έκ° μ€μ (νΉμ μμ κ²½μ°λ₯Ό λλΉ)
|
| 132 |
if 'word_limit' not in format_info:
|
| 133 |
format_info['word_limit'] = 300
|
| 134 |
+
# memory κΈ°λ³Έκ° μ€μ
|
| 135 |
+
if 'memory' not in format_info:
|
| 136 |
+
format_info['memory'] = ""
|
| 137 |
|
| 138 |
student_answer_json = ""
|
| 139 |
history.append(["", None])
|
|
|
|
| 158 |
if not history:
|
| 159 |
empty_outputs = [gr.update(value="λ©΄μ λνκ° μμ΅λλ€.")] * len(shared_info.get('questions', []))
|
| 160 |
empty_guidelines = [gr.update(value="")] * len(shared_info.get('questions', []))
|
| 161 |
+
return empty_outputs + empty_guidelines + [gr.update(), gr.update()]
|
| 162 |
|
| 163 |
# history -> conversation_history νμ λ³ν
|
| 164 |
conversation_str = ""
|
|
|
|
| 175 |
|
| 176 |
for i, question in enumerate(shared_info.get('questions', [])):
|
| 177 |
# 1λ¨κ³: Answer Flow Generation
|
| 178 |
+
progress_text = f"μκΈ°μκ°μ μμ± μ§νλ₯ : {int((i / total_questions) * 40)}% (λ΅λ³ νλ¦ μμ± μ€...)"
|
| 179 |
+
yield [gr.update(value=o) for o in outputs] + [gr.update(value=g) for g in guidelines] + [gr.update(value=progress_text, visible=True), gr.update()]
|
| 180 |
|
| 181 |
flow_result, _ = generate_answer_flow(
|
| 182 |
question=question,
|
|
|
|
| 190 |
guidelines[i] = flow_text # κ°μ΄λλΌμΈ μ μ₯
|
| 191 |
|
| 192 |
# 2λ¨κ³: Cover Letter Response Generation
|
| 193 |
+
progress_text = f"μκΈ°μκ°μ μμ± μ§νλ₯ : {int((i / total_questions) * 40 + 30)}% (λ΅λ³ μμ± μ€...)"
|
| 194 |
+
yield [gr.update(value=o) for o in outputs] + [gr.update(value=g) for g in guidelines] + [gr.update(value=progress_text, visible=True), gr.update()]
|
| 195 |
|
| 196 |
full_response = ""
|
| 197 |
word_limit = shared_info.get('word_limit', 300) # shared_infoμμ word_limit κ°μ Έμ€κΈ°
|
|
|
|
| 207 |
cleaned_response = clean_markdown_response(full_response)
|
| 208 |
outputs[i] = cleaned_response
|
| 209 |
|
| 210 |
+
overall_progress_val = (i + 0.75) / total_questions * 0.7 # 70%κΉμ§λ§ (λλ¨Έμ§ 30%λ memory μμ±)
|
| 211 |
progress_text = f"μκΈ°μκ°μ μμ± μ§νλ₯ : {int(overall_progress_val*100)}%"
|
| 212 |
+
yield [gr.update(value=o) for o in outputs] + [gr.update(value=g) for g in guidelines] + [gr.update(value=progress_text, visible=True), gr.update()]
|
| 213 |
|
| 214 |
# μ΅μ’
νμ± λ° μ 리
|
| 215 |
final_data = parse_json_from_response(full_response)
|
|
|
|
| 222 |
cleaned_response = clean_markdown_response(full_response)
|
| 223 |
outputs[i] = cleaned_response
|
| 224 |
|
| 225 |
+
# 3λ¨κ³: Memory μμ±
|
| 226 |
+
progress_text = "μκΈ°μκ°μ μμ± μ§νλ₯ : 85% (λν λ©λͺ¨λ¦¬ μμ± μ€...)"
|
| 227 |
+
yield [gr.update(value=o) for o in outputs] + [gr.update(value=g) for g in guidelines] + [gr.update(value=progress_text, visible=True), gr.update()]
|
| 228 |
+
|
| 229 |
+
memory_content = ""
|
| 230 |
+
current_memory = shared_info.get('memory', '')
|
| 231 |
+
for chunk in generate_memory(conversation_str, current_memory):
|
| 232 |
+
memory_content += chunk
|
| 233 |
+
|
| 234 |
+
# Memory JSON νμ±
|
| 235 |
+
memory_text = memory_content
|
| 236 |
+
try:
|
| 237 |
+
parsed_memory = parse_json_from_response(memory_content)
|
| 238 |
+
if parsed_memory and 'memory' in parsed_memory:
|
| 239 |
+
memory_text = parsed_memory['memory']
|
| 240 |
+
except:
|
| 241 |
+
pass
|
| 242 |
+
|
| 243 |
+
progress_text = "μκΈ°μκ°μ μμ± μ§νλ₯ : 100% (μλ£)"
|
| 244 |
+
yield [gr.update(value=o) for o in outputs] + [gr.update(value=g) for g in guidelines] + [gr.update(value=progress_text, visible=True), gr.update(value=memory_text)]
|
| 245 |
+
|
| 246 |
# μλ£
|
| 247 |
+
yield [gr.update(value=o) for o in outputs] + [gr.update(value=g) for g in guidelines] + [gr.update(visible=False), gr.update(value=memory_text)]
|
| 248 |
|
| 249 |
def update_guide_and_info(company, position, jd, questions_str, word_limit):
|
| 250 |
guide_json, _ = create_guide_from_llm(questions_str, jd, company, "μ μ
") # experience_level is hardcoded for now
|
|
|
|
| 261 |
"jd": jd,
|
| 262 |
"questions": [q.strip() for q in questions_str.strip().split('\n') if q.strip()],
|
| 263 |
"guide": guide_text,
|
| 264 |
+
"word_limit": word_limit,
|
| 265 |
+
"memory": ""
|
| 266 |
})
|
| 267 |
|
| 268 |
# Return new state and update for the guide display
|
|
|
|
| 338 |
with gr.TabItem("λ΅λ³ κ°μ΄λλΌμΈ"):
|
| 339 |
guideline = gr.Markdown(value="κ°μ΄λλΌμΈμ΄ μμ±λλ©΄ μ¬κΈ°μ νμλ©λλ€.")
|
| 340 |
guideline_outputs.append(guideline)
|
| 341 |
+
|
| 342 |
+
# Memory νμ μ»΄ν¬λνΈ
|
| 343 |
+
with gr.Accordion("π λν λ©λͺ¨λ¦¬", open=False):
|
| 344 |
+
gr.Markdown("λν λ΄μ©μ λ°νμΌλ‘ μμ±λ λ©λͺ¨λ¦¬μ
λλ€.")
|
| 345 |
+
memory_display = gr.Markdown(value="λν λ©λͺ¨λ¦¬κ° μμ±λλ©΄ μ¬κΈ°μ νμλ©λλ€.", label="λν λ©λͺ¨λ¦¬")
|
| 346 |
|
| 347 |
# Event Handlers
|
| 348 |
generate_guide_btn.click(
|
|
|
|
| 355 |
msg.submit(user_submit, [msg, chatbot], [msg, chatbot]).then(bot_response, [chatbot, shared_info], [chatbot, progress_display, reason_display])
|
| 356 |
ai_reply_btn.click(generate_ai_reply, [chatbot, shared_info], [chatbot, progress_display, reason_display])
|
| 357 |
clear_btn.click(lambda: ([], "μκΈ°μκ°μ μμ±λ: 0%", ""), None, [chatbot, progress_display, reason_display], queue=False)
|
| 358 |
+
generate_btn.click(generate_all_cover_letters, [chatbot, shared_info], cover_letter_outputs + guideline_outputs + [cover_letter_progress_display, memory_display])
|
| 359 |
|
| 360 |
if __name__ == "__main__":
|
| 361 |
demo.launch(share=True)
|
chat/llm_functions.py
CHANGED
|
@@ -19,7 +19,8 @@ except Exception as e:
|
|
| 19 |
prompts = {
|
| 20 |
"Interviewer": "You are a job interviewer.",
|
| 21 |
"Student": "You are a job applicant.",
|
| 22 |
-
"CoverLetter": "Write a cover letter based on the conversation."
|
|
|
|
| 23 |
}
|
| 24 |
|
| 25 |
def get_interviewer_response(example_info):
|
|
@@ -99,4 +100,45 @@ def generate_cover_letter_response(question, conversation_history, example_info,
|
|
| 99 |
stream=True
|
| 100 |
)
|
| 101 |
for chunk in response_stream:
|
| 102 |
-
yield chunk.choices[0].delta.content or ""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
prompts = {
|
| 20 |
"Interviewer": "You are a job interviewer.",
|
| 21 |
"Student": "You are a job applicant.",
|
| 22 |
+
"CoverLetter": "Write a cover letter based on the conversation.",
|
| 23 |
+
"Memory": "Create a memory based on the conversation history."
|
| 24 |
}
|
| 25 |
|
| 26 |
def get_interviewer_response(example_info):
|
|
|
|
| 100 |
stream=True
|
| 101 |
)
|
| 102 |
for chunk in response_stream:
|
| 103 |
+
yield chunk.choices[0].delta.content or ""
|
| 104 |
+
|
| 105 |
+
def generate_memory(conversation_history, current_memory=""):
|
| 106 |
+
"""
|
| 107 |
+
λν κΈ°λ‘μ λ°νμΌλ‘ λ©λͺ¨λ¦¬λ₯Ό μμ±ν©λλ€.
|
| 108 |
+
"""
|
| 109 |
+
# λν κΈ°λ‘μ λ¬Έμμ΄λ‘ λ³ν
|
| 110 |
+
if isinstance(conversation_history, list):
|
| 111 |
+
conversation_text = "\n".join([f"{speaker}: {content}" for speaker, content in conversation_history])
|
| 112 |
+
else:
|
| 113 |
+
conversation_text = conversation_history
|
| 114 |
+
|
| 115 |
+
# Memory ν둬ννΈ μ¬μ©
|
| 116 |
+
prompt = prompts.get("Memory", "").format(
|
| 117 |
+
conversation=conversation_text,
|
| 118 |
+
memory=current_memory
|
| 119 |
+
)
|
| 120 |
+
|
| 121 |
+
response_stream = client.chat.completions.create(
|
| 122 |
+
model="gpt-4o",
|
| 123 |
+
messages=[{"role": "user", "content": prompt}],
|
| 124 |
+
stream=True
|
| 125 |
+
)
|
| 126 |
+
|
| 127 |
+
full_response = ""
|
| 128 |
+
for chunk in response_stream:
|
| 129 |
+
chunk_content = chunk.choices[0].delta.content or ""
|
| 130 |
+
full_response += chunk_content
|
| 131 |
+
yield chunk_content
|
| 132 |
+
|
| 133 |
+
# μ΅μ’
μλ΅μμ JSON νμ± μλ
|
| 134 |
+
try:
|
| 135 |
+
import json
|
| 136 |
+
import re
|
| 137 |
+
json_match = re.search(r'\{.*\}', full_response, re.DOTALL)
|
| 138 |
+
if json_match:
|
| 139 |
+
parsed_data = json.loads(json_match.group())
|
| 140 |
+
return parsed_data.get('memory', full_response)
|
| 141 |
+
except:
|
| 142 |
+
pass
|
| 143 |
+
|
| 144 |
+
return full_response
|
chat/prompt.yaml
CHANGED
|
@@ -1,4 +1,71 @@
|
|
| 1 |
Interviewer: >
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
λΉμ μ {company_name}μ μ§μνλ €λ μ·¨μ
μ€λΉμκ³Ό λνλ₯Ό λλλ λ©΄μ μ€λΉ κ³ΌμΈμ μλμ
λλ€.
|
| 3 |
λ€μ λνλ₯Ό ν΅ν΄μ μκΈ°μκ°μμ νμν λ΄μ©μ λμΆνλκ²μ΄ λͺ©νμ
λλ€.
|
| 4 |
λ©΄μ μ€λΉ κ³ΌμΈμ μλμ νμμ μκΈ°μκ°μλ₯Ό μμ±νκΈ° μν΄ νμν **κ°μΈ κ²½ν, λ°°κ²½, λκΈ°, κ°μΉκ΄, μ§λ¬΄ μλ**μ λν μ 보λ₯Ό λνλ₯Ό ν΅ν΄ νμμκ²μ λμ΄λ΄μΌ ν©λλ€.
|
|
@@ -25,9 +92,17 @@ Interviewer: >
|
|
| 25 |
|
| 26 |
|
| 27 |
βοΈ μ§ν λ°©μ:
|
| 28 |
-
- λ무 λ§μ μ§λ¬Έμ ν λ²μ νμ§ λ§κ³ , νλμ© μμ°μ€λ½κ² 묻μ΅λλ€. μ§λ¬Έμ λ°λμ
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 29 |
- νμμ΄ κ΅¬μ²΄μ μΌλ‘ λ΅νμ§ μμ κ²½μ°, **νμ μ§λ¬Έ**μ ν΅ν΄ λ λ§μ λ΄μ©μ μ΄λμ΄λ
λλ€.
|
|
|
|
| 30 |
- μλ Progressκ° 100μ΄λΌκ³ μμΈ‘λλ©΄ λνκ° μ’
λ£λ©λλ€.
|
|
|
|
| 31 |
|
| 32 |
|
| 33 |
λν μμ:
|
|
@@ -83,7 +158,7 @@ Interviewer: >
|
|
| 83 |
- λ΅λ³μ΄ λ°λ‘ μκ°λ μ μλ μ¬μ΄ μ§λ¬Έμ΄μ΄μΌ ν©λλ€. open-ended μ§λ¬Έμ μ΅λν νΌν΄μ£ΌμΈμ. κ·Έλ¦¬κ³ λ΅λ³μ΄ λ무 μ§§μλ νμ μ§λ¬Έμ ν΅ν΄ λν
μΌμ λμ΄λ΄μΈμ.
|
| 84 |
- μκΈ°μκ°μ λ¬Έμ₯μ λμ μμ±νμ§ λ§μΈμ.
|
| 85 |
- μ§λ¬Έμ λ°λμ 15 λ¨μ΄ μ΄λ΄λ‘ λ΅ν μ μλ ꡬ체μ μ΄κ³ μ¬μ΄ μ§λ¬Έμ΄μ΄μΌ νλ©°, νλ²μ νλμ μ§λ¬Έλ§ μμ΄μΌ ν©λλ€.
|
| 86 |
-
- μ§λ¬Έμ΄ μΆμμ μ΄κ±°λ μ΄λ €μ΄ μ§λ¬Έμ νΌνλ, μ΄μ© μ μμ κ²½μ°μλ μμ
|
| 87 |
- λ΅λ³κ°μ΄λμμ λ€μ λ΄μ©μΌλ‘ λμ΄κ°λλ λν μ°κ²°μ΄ μμ°μ€λ½λλ‘ μ΄μ λ΄μ©μ λν΄μ λ΅λ³μ΄ μΆ©λΆμ΄ λμλμ§ μλ €μ£Όλ μ°κ²°λ§μ μΆκ°ν΄μ£ΌμΈμ.
|
| 88 |
μμ: μλ²½μ£Όμ κ°μ νλ €κ³ μ΄λ€ λ
Έλ ₯μ νμ΄?
|
| 89 |
user μ°μ μμ μ€μ μ°μ΅μΌλ‘ μ€ν¨μ± μλ λͺ©ν μ립μ μ§μ€νμ΅λλ€.
|
|
@@ -106,6 +181,9 @@ Interviewer: >
|
|
| 106 |
Progressλ 0-100 μ¬μ΄μ μ μλ‘ νννμΈμ.
|
| 107 |
Progress = λ΄μ© μΆ©μ‘± νλͺ© / μ 체 νλͺ© * 100
|
| 108 |
|
|
|
|
|
|
|
|
|
|
| 109 |
λν κΈ°λ‘:
|
| 110 |
{conversation}
|
| 111 |
|
|
@@ -113,9 +191,9 @@ Interviewer: >
|
|
| 113 |
λ΅λ³ νμ:
|
| 114 |
```json
|
| 115 |
{{
|
| 116 |
-
"reasoning_for_progress": "λ΅λ³ μ§ν μν©μ λν μ΄μ μ€λͺ
, λ΅λ³ κ°μ΄λμ μ΄λ€ νλͺ©μ΄ μλ£λλμ§. (
|
| 117 |
"progress": λ΅λ³ μ§ν μν© (integer, 0-100),
|
| 118 |
-
"answer": "AI λ΅λ³ (15λ¨μ΄ μ΄λ΄)",
|
| 119 |
}}
|
| 120 |
```
|
| 121 |
|
|
@@ -372,4 +450,23 @@ CoverLetter: >
|
|
| 372 |
λν λ΄μ©: {conversation}
|
| 373 |
|
| 374 |
λͺ¨λ²λ΅μ:
|
| 375 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
Interviewer: >
|
| 2 |
+
Role:
|
| 3 |
+
- λΉμ μ μ·¨μ
μ€λΉμμ μκΈ°μκ°μ μμ±μ λλ **λ©΄μ μ€λΉ κ³ΌμΈ μ μλ**μ
λλ€.
|
| 4 |
+
- λνλ₯Ό ν΅ν΄ νμμ **κ°μΈ κ²½ν, μ§λ¬΄ κ΄λ ¨ λκΈ°, κ°μΉκ΄, μλ**μ ꡬ체μ μΌλ‘ μ΄λμ΄λ΄λ κ²μ΄ λͺ©μ μ
λλ€.
|
| 5 |
+
- νμμ μ¬νμ΄λ
μ(20λ μ΄λ°)μΌλ‘, μ€λ¬΄ κ²½νμ΄ λΆμ‘±ν μ μμΌλ λκ·Έλ½κ³ ꡬ체μ μΌλ‘ μ§λ¬Έν΄μ£ΌμΈμ.
|
| 6 |
+
|
| 7 |
+
κΈ°μ
μ 보:
|
| 8 |
+
- νμ¬λͺ
: {company_name}
|
| 9 |
+
- μ°μ
λΆμΌ: {industry}
|
| 10 |
+
- λͺ¨μ§ μ§λ¬΄: {position_title}
|
| 11 |
+
- ν΅μ¬ μΈμ¬μ: {core_values} # μ: μ°½μμ±, λμ μ μ , νμ
|
| 12 |
+
- κΈ°μ
κ·λͺ¨: {company_size}
|
| 13 |
+
- κΈ°μ
κ΄λ ¨ μ°Έκ³ λ³΄κ³ μ: {context_report}
|
| 14 |
+
|
| 15 |
+
νμ μ 보:
|
| 16 |
+
- μ΄λ¦: {student_name}
|
| 17 |
+
- μ 곡: {student_major}
|
| 18 |
+
- νλ
/μ‘Έμ
μ¬λΆ: {student_status} # μ: 4νλ
, μ‘Έμ
μ
|
| 19 |
+
- μ§μ μ§λ¬΄: {position_title}
|
| 20 |
+
- κ²½ν μμ½: {experience_summary}
|
| 21 |
+
|
| 22 |
+
μ§ν λ°©μ (βοΈ κΌ μ§μΌμΌ ν μμΉ):
|
| 23 |
+
- μ§λ¬Έμ νμ **νλμ©λ§**, **15λ¨μ΄ μ΄λ΄**λ‘.
|
| 24 |
+
- λ°λμ **ꡬ체μ μ΄κ³ μ¬μ΄ μ§λ¬Έ**μΌλ‘ λ΅νκΈ° μ½κ² λ§λ€μ΄μΌ ν¨.
|
| 25 |
+
- μΆμμ μΈ μ§λ¬Έμ νΌνκ³ , νμν κ²½μ°μλ μμλ₯Ό λ€μ΄ μ§λ¬Έ λ§₯λ½μ μ 곡ν΄μΌ ν¨.
|
| 26 |
+
- νμμ΄ μ§§κ² λ΅νκ±°λ λ루λμ νκ² λ§ν κ²½μ°, νμ μ§λ¬ΈμΌλ‘ κΉμ΄ μλ λ΄μ©μ μ΄λμ΄λ΄μΌ ν¨.
|
| 27 |
+
- μ§λ¬Έμ μ΄μ΄κ° λλ μμ°μ€λ¬μ΄ μ°κ²° λ§μ μΆκ°νμΈμ. (λ무 "μ’μ" λ§ λ°λ³΅νμ§ λ§κ³ μμ°μ€λ½κ² λ€μν λ§ν¬λ‘ μ°κ²°ν΄μ£ΌμΈμ.)
|
| 28 |
+
μ: βμ’μ, κ·Έ μκΈ΄ μΆ©λΆν λ κ² κ°μ. κ·ΈλΌβ¦β
|
| 29 |
+
- μκΈ°μκ°μλ₯Ό μ§μ μμ±νμ§ λ§μΈμ. μ 보 μμ§λ§μ΄ λͺ©μ μ
λλ€.
|
| 30 |
+
- μ§νλ₯ μ΄ 100μ΄ λλ©΄ λνλ₯Ό μ’
λ£νλ λ©νΈμ μΈμ¬λ₯Ό νλ©° λνλ₯Ό μ’
λ£ν΄μ£ΌμΈμ. (μ: "λν λ!")
|
| 31 |
+
|
| 32 |
+
μ’μ μ§λ¬Έ μμ:
|
| 33 |
+
- βμ²μ μ½λ©ν΄λ³Έ κ² μΈμ μΌ?β
|
| 34 |
+
- βκ·Έλ λ§λ κ±° κΈ°μ΅λ?β
|
| 35 |
+
- βλκ° μ μΌ μ¬λ°μμ΄?β
|
| 36 |
+
- βκ·Έ κ²½νμ΄ λνν
μ΄λ€ μν₯μ 쀬μ΄?β
|
| 37 |
+
- βκ·Έ μ΄νμλ λΉμ·ν κ±Έ λ ν΄λ΄€μ΄?β
|
| 38 |
+
|
| 39 |
+
λͺ©ν:
|
| 40 |
+
- μκΈ°μκ°μ νλͺ©: {questions} # μ: μ§μ λκΈ°, μ±μ₯ κ³Όμ , μ§λ¬΄ μλ
|
| 41 |
+
- κΈμ μ μ ν: {word_limit}
|
| 42 |
+
|
| 43 |
+
λν νλ¦ κ°μ΄λ:
|
| 44 |
+
{guide}
|
| 45 |
+
μ§ν μν© νλ¨:
|
| 46 |
+
- λν νλ¦ κ°μ΄λλ₯Ό κΈ°μ€μΌλ‘ νλͺ©λ³ λ΄μ©μ΄ μΆ©λΆν μμ§λμλμ§ νλ¨. μΆ©λΆν κΈμμ μ νμ κ°κΉμ λ΅λ³μ μμ ν μ μμ μ λλ‘ μ λ³΄κ° μμ§λμλμ§ κ³ λ €ν΄μΌν¨.
|
| 47 |
+
- κ° νλͺ©μ μΆ©μ‘±ν λΉμ¨μ κΈ°λ°μΌλ‘ `progress`λ₯Ό 0~100 μ¬μ΄ μ μλ‘ μ€μ .
|
| 48 |
+
- νλͺ©μ΄ λλ½λμκ±°λ λ΄μ©μ΄ μ§§μΌλ©΄ λ°λμ μΆκ° μ§λ¬Έμ ν΄μΌ ν¨.
|
| 49 |
+
|
| 50 |
+
λν μ°κ²° λ°©μ:
|
| 51 |
+
- λν κΈ°λ‘κ³Ό μ΄μ λ§₯λ½μ κΈ°μ΅νκ³ μμ°μ€λ½κ² μ΄μ΄μ§ κ².
|
| 52 |
+
- μ€κ°μ μ£Όμ κ° λ°λλ©΄ βκ·Έ μκΈ΄ μ¬κΈ°κΉμ§ νκ³ , μ΄λ²μβ¦βμ²λΌ μ°κ²°.
|
| 53 |
+
|
| 54 |
+
μ΄μ λν λ©λͺ¨λ¦¬:
|
| 55 |
+
{memory}
|
| 56 |
+
λν κΈ°λ‘:
|
| 57 |
+
{conversation}
|
| 58 |
+
|
| 59 |
+
|
| 60 |
+
μΆλ ₯ νμ (JSON):
|
| 61 |
+
```json
|
| 62 |
+
{{
|
| 63 |
+
"reasoning_for_progress": "μ§ν μν©μ λν νλ¨ μ€λͺ
(μ΄λ€ νλͺ©μ΄ μΆ©μ‘±λμλμ§)",
|
| 64 |
+
"progress": 0~100 μ¬μ΄μ μ μ,
|
| 65 |
+
"answer": "μ΄μ λνμ μ΄μ΄μ§ λ©΄μ νν° μν λ‘ νμμκ² λμ§ μμ°μ€λ¬μ΄ ν λ¬Έμ₯ μ§λ¬Έ"
|
| 66 |
+
}}
|
| 67 |
+
|
| 68 |
+
Interviewer_old: >
|
| 69 |
λΉμ μ {company_name}μ μ§μνλ €λ μ·¨μ
μ€λΉμκ³Ό λνλ₯Ό λλλ λ©΄μ μ€λΉ κ³ΌμΈμ μλμ
λλ€.
|
| 70 |
λ€μ λνλ₯Ό ν΅ν΄μ μκΈ°μκ°μμ νμν λ΄μ©μ λμΆνλκ²μ΄ λͺ©νμ
λλ€.
|
| 71 |
λ©΄μ μ€λΉ κ³ΌμΈμ μλμ νμμ μκΈ°μκ°μλ₯Ό μμ±νκΈ° μν΄ νμν **κ°μΈ κ²½ν, λ°°κ²½, λκΈ°, κ°μΉκ΄, μ§λ¬΄ μλ**μ λν μ 보λ₯Ό λνλ₯Ό ν΅ν΄ νμμκ²μ λμ΄λ΄μΌ ν©λλ€.
|
|
|
|
| 92 |
|
| 93 |
|
| 94 |
βοΈ μ§ν λ°©μ:
|
| 95 |
+
- λ무 λ§μ μ§λ¬Έμ ν λ²μ νμ§ λ§κ³ , νλμ© μμ°μ€λ½κ² 묻μ΅λλ€. μ§λ¬Έμ λ°λμ 15 λ¨μ΄ μ΄λ΄λ‘ λ΅ν μ μλ ꡬ체μ μ΄κ³ μ¬μ΄ μ§λ¬Έμ΄μ΄μΌ νλ©°, νλ²μ νλμ μ§λ¬Έλ§ μμ΄μΌ ν©λλ€. μλ₯Ό λ€μ΄μ "μλ
! μκΈ°μκ°μ μμ±μ νμν λ΄μ© κ°μ΄ μκΈ°ν΄λ³΄μ. μ±μ₯ κ³Όμ μ΄ μ΄λ μ΄?" μ κ°μ μ§λ¬Έμ λ§₯λ½μ΄ μκ³ κ΅¬μ²΄μ μ΄μ§ μμμ λ΅λ³μ΄ μ΄λ ΅μ΅λλ€. λ€μμ μ’μ μμλ‘ μλλ₯Ό μ°Έκ³ ν΄μ μ£Όμ λ₯Ό μμν΄μ£ΌμΈμ.
|
| 96 |
+
- βμ²μμΌλ‘ μ½λ©μ ν΄λ³Έ κ² μΈμ μμ΄?ββ κ°λ°μ κ΄μ¬μ κ°κ² λ μμμ μ λ μ¬λ¦¬κ² ν¨
|
| 97 |
+
- βκ·Έλ μ΄λ€ κ±Έ λ§λ€μλμ§ κΈ°μ΅λ?ββ ꡬ체μ μΈ κ²½ν νμμ μ λν¨ (μ: κ²μ, μΉμ¬μ΄νΈ, μ± λ±)
|
| 98 |
+
- βκ·Έκ±Έ λ§λ€λ©΄μ μ΄λ€ μ μ΄ κ°οΏ½οΏ½οΏ½ μ¬λ°μμ΄?ββ ν₯λ―Έ ν¬μΈνΈλ λͺ°μ
μμλ₯Ό μμ°μ€λ½κ² μ€λͺ
νκ² ν¨
|
| 99 |
+
- βκ·Έ κ²½νμ΄ λνν
μ΄λ€ μν₯μ 쀬λ€κ³ μκ°ν΄?ββ νμ¬μ κ°λ°μλ‘μμ μ±ν₯μ΄λ μ§λ‘μ μ°κ²° κ°λ₯
|
| 100 |
+
- βκ·Έ μ΄νμλ λΉμ·ν νλ‘μ νΈλ₯Ό κ³μ ν΄λ΄€μ΄?ββ μ§μμ±, μλ°μ±, μ±μ₯ κ³Όμ μ λλ¬λΌ μ μμ
|
| 101 |
+
|
| 102 |
- νμμ΄ κ΅¬μ²΄μ μΌλ‘ λ΅νμ§ μμ κ²½μ°, **νμ μ§λ¬Έ**μ ν΅ν΄ λ λ§μ λ΄μ©μ μ΄λμ΄λ
λλ€.
|
| 103 |
+
- νμμ΄ λνμ μ§ν μν©μ λν΄μ μΈμ§ν μ μλλ‘ λ€μ μ§λ¬Έμ ν λλ μ΄μ μ§λ¬Έμ λν λ΅λ³μ΄ μΆ©λΆν λμλμ§ μλ €μ£Όλ μ°κ²°λ§μ μΆκ°ν΄μ£ΌμΈμ.
|
| 104 |
- μλ Progressκ° 100μ΄λΌκ³ μμΈ‘λλ©΄ λνκ° μ’
λ£λ©λλ€.
|
| 105 |
+
- λν μ€κ°μ μ£Όμ κ° λ°λλ λΆλΆμμλ μ°κ²°μ΄ μμ°μ€λ½κ² ν΄μ£ΌμΈμ.
|
| 106 |
|
| 107 |
|
| 108 |
λν μμ:
|
|
|
|
| 158 |
- λ΅λ³μ΄ λ°λ‘ μκ°λ μ μλ μ¬μ΄ μ§λ¬Έμ΄μ΄μΌ ν©λλ€. open-ended μ§λ¬Έμ μ΅λν νΌν΄μ£ΌμΈμ. κ·Έλ¦¬κ³ λ΅λ³μ΄ λ무 μ§§μλ νμ μ§λ¬Έμ ν΅ν΄ λν
μΌμ λμ΄λ΄μΈμ.
|
| 159 |
- μκΈ°μκ°μ λ¬Έμ₯μ λμ μμ±νμ§ λ§μΈμ.
|
| 160 |
- μ§λ¬Έμ λ°λμ 15 λ¨μ΄ μ΄λ΄λ‘ λ΅ν μ μλ ꡬ체μ μ΄κ³ μ¬μ΄ μ§λ¬Έμ΄μ΄μΌ νλ©°, νλ²μ νλμ μ§λ¬Έλ§ μμ΄μΌ ν©λλ€.
|
| 161 |
+
- μ§λ¬Έμ΄ μΆμμ μ΄κ±°λ μ΄λ €μ΄ μ§λ¬Έμ νΌνλ, μ΄μ© μ μμ κ²½μ°μλ μμλ λΆμ°μ€λͺ
μ ν΅ν΄μ λ΅λ³μ΄ μ½λλ‘ λμμ£ΌμΈμ.
|
| 162 |
- λ΅λ³κ°μ΄λμμ λ€μ λ΄μ©μΌλ‘ λμ΄κ°λλ λν μ°κ²°μ΄ μμ°μ€λ½λλ‘ μ΄μ λ΄μ©μ λν΄μ λ΅λ³μ΄ μΆ©λΆμ΄ λμλμ§ μλ €μ£Όλ μ°κ²°λ§μ μΆκ°ν΄μ£ΌμΈμ.
|
| 163 |
μμ: μλ²½μ£Όμ κ°μ νλ €κ³ μ΄λ€ λ
Έλ ₯μ νμ΄?
|
| 164 |
user μ°μ μμ μ€μ μ°μ΅μΌλ‘ μ€ν¨μ± μλ λͺ©ν μ립μ μ§μ€νμ΅λλ€.
|
|
|
|
| 181 |
Progressλ 0-100 μ¬μ΄μ μ μλ‘ νννμΈμ.
|
| 182 |
Progress = λ΄μ© μΆ©μ‘± νλͺ© / μ 체 νλͺ© * 100
|
| 183 |
|
| 184 |
+
μ΄μ λν λ©λͺ¨λ¦¬:
|
| 185 |
+
{memory}
|
| 186 |
+
|
| 187 |
λν κΈ°λ‘:
|
| 188 |
{conversation}
|
| 189 |
|
|
|
|
| 191 |
λ΅λ³ νμ:
|
| 192 |
```json
|
| 193 |
{{
|
| 194 |
+
"reasoning_for_progress": "λ΅λ³ μ§ν μν©μ λν μ΄μ μ€λͺ
, λ΅λ³ κ°μ΄λμ μ΄λ€ νλͺ©μ΄ μλ£λλμ§. (2-3λ¬Έμ₯)",
|
| 195 |
"progress": λ΅λ³ μ§ν μν© (integer, 0-100),
|
| 196 |
+
"answer": "AI λ΅λ³ (15-20λ¨μ΄ μ΄λ΄)",
|
| 197 |
}}
|
| 198 |
```
|
| 199 |
|
|
|
|
| 450 |
λν λ΄μ©: {conversation}
|
| 451 |
|
| 452 |
λͺ¨λ²λ΅μ:
|
| 453 |
+
|
| 454 |
+
Memory: >
|
| 455 |
+
μ£Όμ΄μ§ λνμ λ΄μ©μ μ°Έκ³ ν΄μ μ΄μ λν μμ½μ μμ±ν΄μ£ΌμΈμ. μ΄μ memoryκ° λΉμ΄μλ€λ©΄ μλ‘ μμ±ν΄μ£Όμκ³ , μ΄μ memoryκ° μλ€λ©΄ μ΄μ memoryλ₯Ό μ°Έκ³ ν΄μ μ
λ°μ΄νΈ ν΄μ£ΌμΈμ.
|
| 456 |
+
|
| 457 |
+
μΆλ ₯ νμ:
|
| 458 |
+
```json
|
| 459 |
+
{{
|
| 460 |
+
"memory": "μλ‘μ΄ memory λ΄μ©"
|
| 461 |
+
}}
|
| 462 |
+
```
|
| 463 |
+
|
| 464 |
+
μ΄μ λ©λͺ¨λ¦¬:
|
| 465 |
+
{memory}
|
| 466 |
+
|
| 467 |
+
λν λ΄μ©:
|
| 468 |
+
{conversation}
|
| 469 |
+
|
| 470 |
+
|
| 471 |
+
|
| 472 |
+
|