- answer_flow_generation/__pycache__/llm_functions.cpython-312.pyc +0 -0
- answer_flow_generation/answer_flow_report_20250625_093159.html +0 -0
- answer_flow_generation/llm_functions.py +143 -0
- answer_flow_generation/prompt.yaml +224 -0
- answer_flow_generation/test.py +160 -0
- app.py +281 -0
- chat/.gradio/certificate.pem +31 -0
- chat/__init__.py +1 -0
- chat/__pycache__/__init__.cpython-312.pyc +0 -0
- chat/__pycache__/llm_functions.cpython-312.pyc +0 -0
- chat/__pycache__/main.cpython-312.pyc +0 -0
- chat/app.py +217 -0
- chat/example_info.json +19 -0
- chat/llm_functions.py +102 -0
- chat/prompt.yaml +368 -0
- example_info.json +19 -0
- guide_generation/__init__.py +1 -0
- guide_generation/__pycache__/__init__.cpython-312.pyc +0 -0
- guide_generation/__pycache__/llm_functions.cpython-312.pyc +0 -0
- guide_generation/guide_generation_report_20250625_090910.html +0 -0
- guide_generation/llm_functions.py +133 -0
- guide_generation/prompt.yaml +220 -0
- guide_generation/test.py +153 -0
- llm_functions.py +88 -0
answer_flow_generation/__pycache__/llm_functions.cpython-312.pyc
ADDED
|
Binary file (6.39 kB). View file
|
|
|
answer_flow_generation/answer_flow_report_20250625_093159.html
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
answer_flow_generation/llm_functions.py
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from openai import OpenAI
|
| 2 |
+
from dotenv import load_dotenv
|
| 3 |
+
import yaml
|
| 4 |
+
import os
|
| 5 |
+
import json
|
| 6 |
+
import re
|
| 7 |
+
|
| 8 |
+
load_dotenv()
|
| 9 |
+
|
| 10 |
+
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
|
| 11 |
+
|
| 12 |
+
# load prompt
|
| 13 |
+
try:
|
| 14 |
+
current_dir = os.path.dirname(os.path.abspath(__file__))
|
| 15 |
+
prompt_path = os.path.join(current_dir, 'prompt.yaml')
|
| 16 |
+
with open(prompt_path, "r", encoding='utf-8') as file:
|
| 17 |
+
prompt = yaml.safe_load(file)["prompt"]
|
| 18 |
+
except Exception as e:
|
| 19 |
+
print(f"Warning: prompt.yaml ๋ก๋ ์คํจ. ๊ธฐ๋ณธ ํ๋กฌํํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ค๋ฅ: {e}")
|
| 20 |
+
prompt = """
|
| 21 |
+
You are an expert resume consultant. Based on the provided guide and user's experiences, create a logical and persuasive story flow for a cover letter answer.
|
| 22 |
+
|
| 23 |
+
### Guide
|
| 24 |
+
{guide}
|
| 25 |
+
|
| 26 |
+
### User's Experiences
|
| 27 |
+
{user_experiences}
|
| 28 |
+
|
| 29 |
+
Please generate a step-by-step answer flow in JSON format, like {"answer_flow": ["Step 1:...", "Step 2:...", "Step 3:...", "Step 4:..."]}.
|
| 30 |
+
"""
|
| 31 |
+
|
| 32 |
+
def parse_markdown_table_from_response(text: str) -> str | None:
|
| 33 |
+
"""
|
| 34 |
+
LLM ์๋ต์์ markdown table์ ์ถ์ถํฉ๋๋ค.
|
| 35 |
+
|
| 36 |
+
Args:
|
| 37 |
+
text (str): LLM์ด ๋ฐํํ ์ ์ฒด ํ
์คํธ ์๋ต.
|
| 38 |
+
|
| 39 |
+
Returns:
|
| 40 |
+
str | None: ์ถ์ถ๋ markdown table ๋ฌธ์์ด, ๋๋ ์คํจ ์ None.
|
| 41 |
+
"""
|
| 42 |
+
if not text:
|
| 43 |
+
return None
|
| 44 |
+
|
| 45 |
+
# ```markdown ... ``` ํ์์ ์ฝ๋ ๋ธ๋ก์์ table ์ถ์ถ
|
| 46 |
+
markdown_match = re.search(r"```markdown\s*([\s\S]*?)\s*```", text)
|
| 47 |
+
if markdown_match:
|
| 48 |
+
table_content = markdown_match.group(1).strip()
|
| 49 |
+
return table_content
|
| 50 |
+
|
| 51 |
+
# ์ฝ๋ ๋ธ๋ก์ด ์๋ค๋ฉด, ์ ์ฒด ํ
์คํธ์์ table ์ฐพ๊ธฐ
|
| 52 |
+
lines = text.strip().split('\n')
|
| 53 |
+
table_lines = []
|
| 54 |
+
|
| 55 |
+
for line in lines:
|
| 56 |
+
line = line.strip()
|
| 57 |
+
if line.startswith('|') and line.endswith('|'):
|
| 58 |
+
table_lines.append(line)
|
| 59 |
+
|
| 60 |
+
if len(table_lines) >= 3: # header, separator, at least one row
|
| 61 |
+
return '\n'.join(table_lines)
|
| 62 |
+
|
| 63 |
+
return None
|
| 64 |
+
|
| 65 |
+
def parse_json_from_response(text: str) -> dict | None:
|
| 66 |
+
"""
|
| 67 |
+
Markdown ์ฝ๋ ๋ธ๋ก ์์ ํฌํจ๋ ์ ์๋ JSON ๋ฌธ์์ด์ ์ถ์ถํ๊ณ ํ์ฑํฉ๋๋ค.
|
| 68 |
+
(์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ํด ์ ์ง)
|
| 69 |
+
|
| 70 |
+
Args:
|
| 71 |
+
text (str): LLM์ด ๋ฐํํ ์ ์ฒด ํ
์คํธ ์๋ต.
|
| 72 |
+
|
| 73 |
+
Returns:
|
| 74 |
+
dict | None: ํ์ฑ๋ ๋์
๋๋ฆฌ ๊ฐ์ฒด, ๋๋ ์คํจ ์ None.
|
| 75 |
+
"""
|
| 76 |
+
if not text:
|
| 77 |
+
return None
|
| 78 |
+
|
| 79 |
+
# ```json ... ``` ๋๋ ``` ... ``` ํ์์ ์ฝ๋ ๋ธ๋ก์์ JSON ์ถ์ถ
|
| 80 |
+
match = re.search(r"```(?:json)?\s*([\s\S]*?)\s*```", text)
|
| 81 |
+
if match:
|
| 82 |
+
json_str = match.group(1)
|
| 83 |
+
else:
|
| 84 |
+
# ์ฝ๋ ๋ธ๋ก์ด ์๋ค๋ฉด, ์ ์ฒด ํ
์คํธ๋ฅผ JSON์ผ๋ก ๊ฐ์
|
| 85 |
+
json_str = text
|
| 86 |
+
|
| 87 |
+
try:
|
| 88 |
+
return json.loads(json_str)
|
| 89 |
+
except json.JSONDecodeError:
|
| 90 |
+
# ์ ์ฒด ํ์ฑ์ด ์คํจํ๋ฉด, ์ฒซ '{'์ ๋ง์ง๋ง '}'๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ค์ ์๋
|
| 91 |
+
start_index = json_str.find('{')
|
| 92 |
+
end_index = json_str.rfind('}')
|
| 93 |
+
if start_index != -1 and end_index != -1 and start_index < end_index:
|
| 94 |
+
potential_json = json_str[start_index:end_index+1]
|
| 95 |
+
try:
|
| 96 |
+
return json.loads(potential_json)
|
| 97 |
+
except json.JSONDecodeError:
|
| 98 |
+
pass # ์ด๋ง์ ๋ ์คํจํ๋ฉด ๊ทธ๋ฅ None ๋ฐํ
|
| 99 |
+
|
| 100 |
+
return None
|
| 101 |
+
|
| 102 |
+
def generate_answer_flow(question, jd, company_name, experience_level, conversation):
|
| 103 |
+
"""
|
| 104 |
+
๋ต๋ณ ํ๋ฆ(๊ฐ์)์ ์์ฑํ๊ณ , ํ์ฑ๋ ๊ฒฐ๊ณผ์ ์ ์ฒด ์๋ต ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํจ์
|
| 105 |
+
"""
|
| 106 |
+
try:
|
| 107 |
+
response = client.chat.completions.create(
|
| 108 |
+
model="gpt-4o-mini",
|
| 109 |
+
messages=[{"role": "user", "content": prompt.format(
|
| 110 |
+
question=question,
|
| 111 |
+
jd=jd,
|
| 112 |
+
company_name=company_name,
|
| 113 |
+
experience_level=experience_level,
|
| 114 |
+
conversation=conversation
|
| 115 |
+
)}],
|
| 116 |
+
# JSON ํํ๊ฐ ์๋๋ผ markdown table ํํ๋ก ์๋ต ๋ฐ๊ธฐ
|
| 117 |
+
)
|
| 118 |
+
|
| 119 |
+
# Markdown table ์๋ต ํ์ฑ
|
| 120 |
+
markdown_table = parse_markdown_table_from_response(response.choices[0].message.content)
|
| 121 |
+
|
| 122 |
+
if markdown_table:
|
| 123 |
+
parsed_content = {"flow": markdown_table}
|
| 124 |
+
else:
|
| 125 |
+
parsed_content = {"error": "Failed to parse markdown table"}
|
| 126 |
+
|
| 127 |
+
return parsed_content, response
|
| 128 |
+
|
| 129 |
+
except Exception as e:
|
| 130 |
+
print(f"๋ต๋ณ ํ๋ฆ ์์ฑ ๋๋ ํ์ฑ ์ค ์ค๋ฅ ๋ฐ์: {e}")
|
| 131 |
+
return {"error": f"Failed to generate or parse flow: {str(e)}"}, None
|
| 132 |
+
|
| 133 |
+
if __name__ == "__main__":
|
| 134 |
+
example_input = {
|
| 135 |
+
"question": "์ผ์ฑ์ ์๋ฅผ ์ง์ํ ์ด์ ์ ์
์ฌ ํ ์ด๋ฃจ๊ณ ์ถ์ ๊ฟ์ ๊ธฐ์ ํ์์ค.",
|
| 136 |
+
"jd": "์ผ์ฑ์ ์๋ ์ธ๊ณ์ ์ธ ๊ธฐ์ ๊ธฐ์
์ผ๋ก, ๋ค์ํ ๋ถ์ผ์์ ์ ๋์ ์ธ ๊ธฐ์ ์ ๊ฐ๋ฐํ๊ณ ์์ต๋๋ค. ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ก ์
์ฌํ๋ฉด ๋ค์ํ ํ๋ก์ ํธ์ ์ฐธ์ฌํ๋ฉฐ, ์ต์ ๊ธฐ์ ์ ์ ์ฉํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.",
|
| 137 |
+
"company_name": "์ผ์ฑ์ ์",
|
| 138 |
+
"experience_level": "์ ์
",
|
| 139 |
+
"conversation": "User: ์๋
ํ์ธ์, ์ผ์ฑ์ ์ ํ๋ก ํธ์๋ ๊ฐ๋ฐ ์ง๋ฌด์ ์ง์ํ๋ ค๊ณ ํฉ๋๋ค.\nAI: ๋ค, ์ด๋ค ์ ์ด ๊ถ๊ธํ์ ๊ฐ์?\nUser: ์๊ธฐ์๊ฐ์์ ์ด๋ค ๊ฒฝํ์ ๊ฐ์กฐํ๋ฉด ์ข์๊น์?\nAI: ํ๋ก์ ํธ ๊ฒฝํ์์ ์ฌ์ฉํ ๊ธฐ์ ์คํ๊ณผ ์ฑ๊ณผ๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ์์ฑํ๋ ๊ฒ์ด ์ข์ต๋๋ค."
|
| 140 |
+
}
|
| 141 |
+
|
| 142 |
+
flow_json, _ = generate_answer_flow(**example_input)
|
| 143 |
+
print(json.dumps(flow_json, indent=2, ensure_ascii=False))
|
answer_flow_generation/prompt.yaml
ADDED
|
@@ -0,0 +1,224 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
prompt: >
|
| 2 |
+
์งํ๋ ๋ํ๋ฅผ ๋ฐํ์ผ๋ก ์์์ ๋ต๋ณ ํ๋ฆ์ ์์ฑํ์์ค.
|
| 3 |
+
|
| 4 |
+
### ์ถ๋ ฅ ํ์
|
| 5 |
+
๋ฐ๋์ ๋ค์ markdown ํ์์ผ๋ก๋ง ์๋ตํ์ธ์:
|
| 6 |
+
|
| 7 |
+
```markdown
|
| 8 |
+
<๋ต๋ณ ํ๋ฆ table>
|
| 9 |
+
```
|
| 10 |
+
|
| 11 |
+
## ์์
|
| 12 |
+
|
| 13 |
+
### ์์ 1 - ๋์ธ๊ด๊ณ ๋ฐ ํ์
์ญ๋
|
| 14 |
+
์ง๋ฌธ: ํ์ ์ผ์์ผ๋ก์ ๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ํ๋ ฅํ์ฌ ์ฑ๊ณผ๋ฅผ ๋ธ ๊ฒฝํ์ ๋ํด ๊ธฐ์ ํด ์ฃผ์ญ์์ค.
|
| 15 |
+
|
| 16 |
+
๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ:
|
| 17 |
+
```markdown
|
| 18 |
+
| ๋จ๊ณ | ํญ๋ชฉ | ์ค๋ช
| ์ฒดํฌํฌ์ธํธ |
|
| 19 |
+
| --- | --- | --- | --- |
|
| 20 |
+
| โ ์์ฝ | ํ ๋ฌธ์ฅ ํต์ฌ ์์ฝ | ํ์
์ํฉ์์ ์๊ธด ๋ฌธ์ ๋ ๊ฐ๋ฑ์ ํด๊ฒฐํด ๊ณต๋ ์ฑ๊ณผ๋ฅผ ์ด๋ ๊ฒฝํ์ ํ ๋ฌธ์ฅ์ผ๋ก ์์ฝํ๋ค | - ๊ฐ๋ฑ or ์ํต ๋ฌธ์ + ํ์
์ฑ๊ณต ์์ ํฌํจ |
|
| 21 |
+
| โก ์ํฉ | ํ์
๋ฐฐ๊ฒฝ๊ณผ ๋์ ์ญํ | ์ด๋ค ๋งฅ๋ฝ์ ํ์
์ํฉ์ด์๊ณ , ๋ด๊ฐ ์ด๋ค ์ญํ ์ ๋งก์๋์ง ๊ตฌ์ฒด์ ์ผ๋ก ์ค๋ช
<br>(์ธ์ , ์ด๋์, ์ด๋ค ํ๋, ์ด๋ค ์ญํ ) | - ๊ธฐ๊ฐ/์ฅ์/ํ๋๋ช
<br>- ๋ด๊ฐ ์ฃผ๋ํ๋์ง, ์ผ์์ผ๋ก ์ฐธ์ฌํ๋์ง ๋ช
ํํ |
|
| 22 |
+
| โข ๋ฌธ์ ์ธ์ | ํ ๋ด ๊ฐ๋ฑ์ด๋ ์ํต ๋ฌธ์ ์ ๋ณธ์ง ์ธ์ | ํ์ํฌ๋ฅผ ์ ํดํ ๋ช
ํํ ๊ฐ๋ฑ or ์ํต ๋ฌธ์ ๋ฅผ ์ธ์ํ๊ณ , ๊ทธ๊ฒ์ด ์ ์ค์ํ ๋ฌธ์ ์ธ์ง ์์ | - ๋จ์ ์๊ฒฌ ์ฐจ์ด X โ ๊ตฌ์ฑ์ ๊ฐ ์ถฉ๋, ํผ๋ก๊ฐ, ์ ๋ฌ ์ค๋ฅ ๋ฑ ์ค์ ์ฅ์ ํฌํจ<br>- "๋ฌด์์ด ์ ๋ฌธ์ ์๋๊ฐ"๊ฐ ์ ๋ช
ํด์ผ ํจ |
|
| 23 |
+
| โฃ ํด๊ฒฐ ํ๋ | ๋ฌธ์ ํด๊ฒฐ์ ์ํ ๋ณธ์ธ์ ์ํต/์กฐ์จ ๋
ธ๋ ฅ | ์ํต ๋ฐฉ์, ์ค๋ ๊ณผ์ , ์์ด๋์ด ์ ์ ๋ฑ ๋ณธ์ธ์ ๊ตฌ์ฒด์ ์ธ ํ์
ํ๋์ ์ค์ฌ์ผ๋ก ์ค๋ช
| - ๋จ์ํ ์ฐธ์ฌ์ X โ ์๊ฒฌ ์กฐ์จ์, ๋ถ์๊ธฐ ๋ฐ์ ์, ์์ด๋์ด ์ ์์ ๋ฑ์ ์ญํ ๋ถ๊ฐ<br>- ๊ฐ์ ๊ด๋ฆฌ, ์ค์ฌ, ๋ถ์๊ธฐ ์กฐ์ฑ ๋
ธ๋ ฅ ํฌํจ |
|
| 24 |
+
| โค ๊ฒฐ๊ณผ | ํ์
์ฑ๊ณผ ๋ฐ ๊ด๊ณ ๋ณํ | ๋ฌธ์ ํด๊ฒฐ ํ ํ ์ฑ๊ณผ ๋๋ ๊ด๊ณ์ ๊ธ์ ์ ๋ณํ๊ฐ ์๊ธด ๋ชจ์ต์ ์ ๋/์ ์ฑ์ ์ผ๋ก ํํ | - ๊ฒฐ๊ณผ = ๋ชฉํ ๋ฌ์ฑ + ํ ๋ถ์๊ธฐ or ์ ๋๊ฐ ํ๋ณต ๋ฑ<br>- "์ฑ๊ณผ ์์น + ๋ถ์๊ธฐ ๋ฐ์ "์ด๋ฉด ๋ฒ ์คํธ |
|
| 25 |
+
| โฅ ๋๋ ์ | ํ์ํฌ์ ๋ํ ์ธ์ ๋ณํ | ํ์
์ ๋ณธ์ง, ์ํต ๋ฐฉ์, ์ฌ๋์ ๋ํ๋ ํ๋ ๋ฑ์์ ๋ฐฐ์ด ์ ์ ์ง์ํ๊ฒ ์์ฑ | - ๋ด๊ฐ ์ฌ๋๊ณผ ์ผํ๋ ๋ฐฉ์์ด ์ด๋ป๊ฒ ๋ฐ๋์๋๊ฐ? |
|
| 26 |
+
| โฆ ์ง๋ฌด ์ฐ๊ณ | ์กฐ์ง์ํ์์์ ํ์ํฌ ์ค์ฒ ํฌ๋ถ | ํ์
์ด ์ค์ํ ์กฐ์ง์์ ๋ณธ์ธ์ ์ํต ๋ฐฉ์์ด ์ด๋ค ๊ธฐ์ฌ๋ฅผ ํ ์ ์๋์ง ์ฐ๊ฒฐ | - ํ์
์ญ๋์ด ํ์ํ ์ง๋ฌด ํน์ฑ๊ณผ ์ฐ๊ฒฐ<br>- "๋ด๊ฐ ์ด๋ฐ ์ํฉ์์ ์ด๋ค ํ์์ด ๋ ๊ฒ์ด๋ค"๋ก ๊ตฌ์ฒดํ |
|
| 27 |
+
```
|
| 28 |
+
|
| 29 |
+
### ์์ 2 - ๋ชฉํ ๋ฌ์ฑ ๋ฐ ๋์ ๊ฒฝํ
|
| 30 |
+
์ง๋ฌธ: ์ค์ค๋ก ๋์ ๋ชฉํ๋ฅผ ์ธ์ฐ๊ณ ๋์ง๊ธฐ๊ฒ ๋
ธ๋ ฅํ์ฌ ์ฑ์ทจํ ๊ฒฝํ์ ๋ํด ์์ ํด ์ฃผ์ญ์์ค.
|
| 31 |
+
|
| 32 |
+
๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ:
|
| 33 |
+
```markdown
|
| 34 |
+
| ๋จ๊ณ | ํญ๋ชฉ | ์ค๋ช
| ์ฒดํฌํฌ์ธํธ |
|
| 35 |
+
| --- | --- | --- | --- |
|
| 36 |
+
| โ ์์ฝ | ํ ๋ฌธ์ฅ ํต์ฌ ์์ฝ | ์ด๋ค ๋ชฉํ/๋์ ์ ์ด๋ค ๋ฐฉ์์ผ๋ก ํด๊ฒฐํด ์ฑ๊ณผ๋ฅผ ๋๋์ง ํ ๋ฌธ์ฅ์ผ๋ก ๋ณด์ฌ์ค๋ค | - ์๊ธฐ/์ฅ์/ํ๋/์ฑ๊ณผ ํฌํจ |
|
| 37 |
+
| โก ์ํฉ | ๋ชฉํ ๋๋ ์คํจ ์ํฉ์ ๋ฐฐ๊ฒฝ | ์ด๋ค ๋ชฉํ๋ฅผ ์ถ๊ตฌํ๋์ง, ๋๋ ์ด๋ค ์คํจ ์ํฉ์ด ๋ฐ์ํ๋์ง ๊ตฌ์ฒด์ ๋งฅ๋ฝ์ ์ค๋ช
ํ๋ค | - ์๊ธฐ/์ฅ์/์ญํ <br>- ์ผ๋ฐ์ ์ธ ์ด๋ ค์์ด ์๋, ๋ช
ํํ ๋๊ด์ด ๋๋ฌ๋์ผ ํจ |
|
| 38 |
+
| โข ๋์ ์ ์ | ๋ด๊ฐ ๋ง๋ฅ๋จ๋ฆฐ ๋์ /๊ณผ์ | ์ด๋ค ์ ์ด ์ด๋ ค์ ๊ณ , ๋ฌด์์ ๊ทน๋ณตํด์ผ ํ๋์ง ํต์ฌ ๋ฌธ์ ๋ฅผ ์ ๋ช
ํ๊ฒ ๊ธฐ์ | - ๋ฌธ์ ์ ๋ณธ์ง์ ์ค์ค๋ก ์ธ์ํ๋์ง ๋ณด์ฌ์ค ๊ฒ<br>- ๋จ์ํ ์ํฉ ๋ฌ์ฌ์์ ๋๋์ง ์๊ธฐ |
|
| 39 |
+
| โฃ ํ๋ | ๋ชฉํ ๋ฌ์ฑ ๋๋ ์คํจ ๊ทน๋ณต์ ์ํ ๋์ ํ๋ | ๊ตฌ์ฒด์ ์ธ ์คํ ๋ด์ฉ์ ๋ฌ์ฌํ๊ณ , ํนํ ์ด๋ค ์ ๋ต์ ์ฌ์ฉํ๋์ง ์ค๋ช
| - ๋จ์ ๋
ธ๋ ฅ๋ณด๋ค ๊ณํ์ฑ, ์๋ฐ์ฑ, ์ง์์ฑ ๊ฐ์กฐ<br>- ํ๊ณผ ํ์
์, ๋ณธ์ธ์ ์ฃผ๋์ ์ญํ ๋ ๋๋ฌ๋ผ ๊ฒ |
|
| 40 |
+
| โค ๊ฒฐ๊ณผ | ๊ฒฐ๊ณผ ๋ฐ ๋ณํ | ๋ชฉํ ๋ฌ์ฑ ์ฌ๋ถ, ์คํจ ๊ทน๋ณต ๊ฒฐ๊ณผ๋ฅผ ์ ๋/์ ์ฑ ์งํ๋ก ๋ณด์ฌ์ค | - ์ซ์, ๋น๊ต ์์น, ๋ช
ํํ ๋ณํ ์์ <br>- ๋จ์ ์ฑ๊ณต๋ณด๋ค ์ด๋ค ์๋ฏธ ์๋ ๋ณํ๋ฅผ ๋ง๋ค์๋์ง ํฌํจ |
|
| 41 |
+
| โฅ ๋๋ ์ | ์คํจ์์์ ๊ตํ, ์ฑ๊ณต ์ดํ ๋ณํ | ์ด ๊ฒฝํ์ ํตํด ์๊ฐ๊ณผ ํ๋์ด ์ด๋ป๊ฒ ๋ฐ๋์๋์ง ์ค๋ช
| - ๋จ์ "์ด์ฌํ ํด์ผ ํ๋ค๋ ๊ฑธ ์์๋ค" X<br>- ๊ฐ์น๊ด/์ผํ๋ ๋ฐฉ์/ํ๋์ ๋ณํ ์ค์ฌ |
|
| 42 |
+
| โฆ ์ง๋ฌด ์ฐ๊ณ | ์ด ๊ฒฝํ์ด ์ง์์ง๋ฌด์ ์ด๋ค ๊ธฐ์ฌ๊ฐ ๋๋๊ฐ | ๊นจ๋ฌ์์ ๊ธฐ๋ฐ์ผ๋ก ์กฐ์ง/์ง๋ฌด์ ์ด๋ค ๊ธฐ์ฌ๋ฅผ ํ ์ ์๋์ง๋ฅผ ์ฐ๊ฒฐ | - ์ง๋ฌด์ ๋ง๋ ์ญ๋ ํค์๋๋ก ์ฐ๊ฒฐ<br>- "์์ผ๋ก ์ด๋ฐ ์ํฉ์ด ์๋ ์ด๋ ๊ฒ ๋์ํ๊ฒ ๋ค" ์์ ํฌ๋ถ ๊ฐ์กฐ |
|
| 43 |
+
```
|
| 44 |
+
|
| 45 |
+
### ์์ 3 - ๋ฌธ์ ํด๊ฒฐ ๋ฐ ์ฐฝ์์ฑ
|
| 46 |
+
์ง๋ฌธ: ๊ธฐ์กด ๋ฐฉ์์ ๋นํจ์จ์ฑ์ ๊ฐ์ ํ๊ธฐ ์ํด ์๋ก์ด ์์ด๋์ด๋ฅผ ์ ์ํ๊ณ ์ ์ฉํ๋ ๊ฒฝํ์ ์ฐ์์ค.
|
| 47 |
+
|
| 48 |
+
๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ:
|
| 49 |
+
```markdown
|
| 50 |
+
| ๋จ๊ณ | ํญ๋ชฉ | ์ค๋ช
| ์ฒดํฌํฌ์ธํธ |
|
| 51 |
+
| --- | --- | --- | --- |
|
| 52 |
+
| โ ์์ฝ | ํ ๋ฌธ์ฅ ์์ฝ | ์๋ ๋ด์ฉ์ ํ ๋ฌธ์ฅ์ผ๋ก ์์ถ ์์ฝ | "๋ฌธ์ ๋ฅผ ์ฐฝ์์ ์ผ๋ก ํด๊ฒฐํ์ฌ ์ฑ๊ณผ๋ฅผ ๋ธ ๊ฒฝํ"์ด ๋๋ฌ๋์ผ ํจ |
|
| 53 |
+
| โก ์ํฉ | ๋ฐฐ๊ฒฝ ์ค๋ช
| ์ธ์ , ์ด๋์, ์ด๋ค ๋งฅ๋ฝ์์ ๋ฐ์ํ ๋ฌธ์ ์ธ์ง ์ค๋ช
| ์กฐ์ง/ํ/์
๋ฌด ๋งฅ๋ฝ๊ณผ ๋ด ์ญํ ์ ๊ฐ๊ฒฐํ๊ฒ ์์ |
|
| 54 |
+
| โข ๋ฌธ์ ์ ์ | ๋ฌธ์ ๋ฐ ์์ธ ๋ถ์ | ๋จ์ํ ํ์ ๋์ด์ด ์๋, ์์ธ์ ๋ถ์ํ์ฌ ๋ณธ์ง์ ์ธ ๋ฌธ์ ๋ฅผ ์ ์ํจ | '์ ๋ฐ์ํ๋๊ฐ'๋ฅผ ๊ณ ๋ฏผํ ํ์ ์ด ๋๋ฌ๋์ผ ํจ (ex. ํ๋ก์ธ์ค/๊ตฌ์กฐ์ ๋ฌธ์ ๋ฑ) |
|
| 55 |
+
| โฃ ํด๊ฒฐ ํ๋ | ์ฐฝ์์ ํด๊ฒฐ๋ฐฉ์ ๋ฐ ์คํ | ๋ด๊ฐ ์ง์ ์ ์ํ๊ณ ์คํํ ์๋ก์ด ๋ฐฉ์ ๋๋ ๊ธฐ์กด ๋ฐฉ์์ ๊ฐ์ ์ | ๋จ์ ์คํ์ด ์๋๋ผ, ๊ธฐ์กด ํ์ '์ด๋ป๊ฒ ๋ค๋ฅด๊ฒ' ํ๋์ง๊ฐ ํต์ฌ |
|
| 56 |
+
| โค ๊ฒฐ๊ณผ | ๊ฐ์ ์ฑ๊ณผ | ํ๋ ์ดํ ๊ฐ์ ๋ ์์น์ /์ ์ฑ์ ๊ฒฐ๊ณผ ์ ์ + ํ์ธ์ ๋ฐ์ | "ํจ์จ ํฅ์", "์ฑ๊ณผ ์ฆ๊ฐ", "ํผ๋๋ฐฑ", "์ฌ์ฌ์ฉ๋ ๋ฐฉ์" ๋ฑ ์ ๋ยท์ ์ฑ ๊ท ํ |
|
| 57 |
+
| โฅ ๋๋ ์ | ํต์ฐฐ ๋ฐ ์ฑ์ฅ | ์ด ๊ฒฝํ์ ํตํด ๋ฌธ์ ํด๊ฒฐ๋ ฅ ๋๋ ์ฐฝ์์ ํ๋์ ๋ํด ๋ฌด์์ ๋ฐฐ์ ๋๊ฐ | "๋ฌธ์ ์ ๊ทผ ํ๋"๋ "์ฌ๊ณ ๋ฐฉ์์ ๋ณํ"๊ฐ ๋๋ฌ๋์ผ ํจ |
|
| 58 |
+
| โฆ ์ง๋ฌด ์ฐ๊ณ | ์ง๋ฌด ๊ธฐ์ฌ ๊ฐ๋ฅ์ฑ | ๋ด๊ฐ ์ง์ํ ์ง๋ฌด์์ ๋น์ทํ ๋ฌธ์ ์ ์ด๋ป๊ฒ ๊ธฐ์ฌํ ์ ์๋์ง ์ธ๊ธ | "์ง์ ๋ถ์ผ์์ ๋์ ์ฐฝ์์ฑ/๋ฌธ์ ํด๊ฒฐ๋ ฅ์ ์ด๋ ๊ฒ ์ฐ์ผ ์ ์๋ค"๋ก ๋ง๋ฌด๋ฆฌ |
|
| 59 |
+
```
|
| 60 |
+
|
| 61 |
+
### ์์ 4 - ์ง๋ฌด ๊ด๋ จ ๊ฒฝํ ๋ฐ ํ์ฉ/๊ธฐ์ฌ
|
| 62 |
+
์ง๋ฌธ: ์ง์ํ ์ง๋ฌด์ ๊ด๋ จ๋ ๊ฐ์ฅ ๋ํ์ ์ธ ํ๋ก์ ํธ ๊ฒฝํ์ ๋ณธ์ธ์ ์ญํ ๊ณผ ๊ธฐ์ฌ ์์ฃผ๋ก ๊ธฐ์ ํ์์ค.
|
| 63 |
+
|
| 64 |
+
๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ:
|
| 65 |
+
```markdown
|
| 66 |
+
| ๋จ๊ณ | ํญ๋ชฉ | ์ค๋ช
| ์ฒดํฌํฌ์ธํธ |
|
| 67 |
+
| --- | --- | --- | --- |
|
| 68 |
+
| โ ์์ฝ | ํ ๋ฌธ์ฅ ์์ฝ | ์ง๋ฌด ๊ด๋ จ ๊ฒฝํ ์ ์ฒด๋ฅผ ํ ๋ฌธ์ฅ์ผ๋ก ์์ฝ | ์ง๋ฌด๋ช
, ์ง๋ฌด์ญํ , ์ฑ๊ณผ๊ฐ ํ ๋ฌธ์ฅ์ ํฌํจ๋๋ฉด ์ข์ |
|
| 69 |
+
| โก ์ํฉ | ํ๋ ๋ฐฐ๊ฒฝ | ์ธ์ , ์ด๋ค ํ๋ก์ ํธ/์
๋ฌด์์ ์ด๋ค ์ญํ ์ ๋งก์๋์ง ์ค๋ช
| ์ง๋ฌด ๊ด๋ จ ๋งฅ๋ฝ์ ๋ช
ํํ! (ex. ์ธํด, ์ฐํ, ๊ต๋ดํ๋ก์ ํธ ๋ฑ) |
|
| 70 |
+
| โข ๊ณผ์ ์ ์ | ๋ฌธ์ ์ธ์ ๋ฐ ๋ถ์ | ํ๋ก์ ํธ ์ค ์ด๋ค ํต์ฌ ๊ณผ์ /๋ฌธ์ ๊ฐ ์์๊ณ , ๋ด๊ฐ ๊ทธ๊ฒ์ ์ด๋ป๊ฒ ์ ์ํ๋์ง | ๊ณผ์ ๊ฐ '๋ด๊ฐ ํ์ด์ผ ํ ์ง๋ฌด์ ๋ฌธ์ '๋ก ์ ์๋์๋์ง ํ์ธ |
|
| 71 |
+
| โฃ ํด๊ฒฐ ํ๋ | ๊ธฐ์ /์ง์ ์ ์ฉ ๋ฐ ์คํ | ์ง๋ฌด ์ญ๋(์ง์ยท๊ธฐ์ )์ ๋ฐํ์ผ๋ก ์ค์ ์ด๋ค ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ๋์ง ์์ | ๋จ์ ์ํ์ด ์๋๋ผ '์ง๋ฌด ์ญ๋์ ํ์ฉํ ๊ธฐ์ฌ' ๊ฐ์กฐ |
|
| 72 |
+
| โค ๊ฒฐ๊ณผ | ์ฑ๊ณผ ๋ฐ ํ๊ฐ | ๊ฒฐ๊ณผ์ ์ผ๋ก ์ด๋ค ๋ณํ๊ฐ ์์๋์ง ์์น/ํผ๋๋ฐฑ ๋ฑ์ผ๋ก ์ ๋ฆฌ | ๊ตฌ์ฒด์ ์งํ + ํ์ธ์ ์ธ์ (๋ฆฌ๋, ๊ณ ๊ฐ, ์ฌ์ฉ์ ๋ฑ) |
|
| 73 |
+
| โฅ ๋๋ ์ | ์ฑ์ฅ ๋ฐ ํต์ฐฐ | ์ด ๊ฒฝํ์ ํตํด ์ง๋ฌด์ ๋ํด ๋ฌด์์ ๋ฐฐ์ฐ๊ณ ์ฑ์ฅํ๋๊ฐ | ์ง๋ฌด ์ดํด๋/ํ๋/๊ธฐ์ ์ ํต์ฐฐ ๋ฑ ์ฑ์ฅ ํฌ์ธํธ๊ฐ ๋๋ฌ๋์ผ ํจ |
|
| 74 |
+
| โฆ ์ง๋ฌด ์ฐ๊ณ | ํฅํ ๊ธฐ์ฌ ๋ฐ ํฌ๋ถ | ๋ณธ ๊ฒฝํ์ ๋ฐํ์ผ๋ก ๋ด๊ฐ ํด๋น ์ง๋ฌด์ ์ด๋ค ๊ธฐ์ฌ๋ฅผ ํ ์ ์๋์ง | "๋๋ ์ด ์ง๋ฌด์์ ์ด๋ ๊ฒ ์ผํ ๊ฒ์ด๋ค"๋ก ๋ง๋ฌด๋ฆฌ |
|
| 75 |
+
```
|
| 76 |
+
|
| 77 |
+
### ์์ 5 - ์ง์ ๋๊ธฐ
|
| 78 |
+
์ง๋ฌธ: ํ๋์๋์ฐจ์ ์ง์ํ๊ฒ ๋ ๋๊ธฐ์ ํด๋น ์ง๋ฌด์ ๋ณธ์ธ์ด ์ ํฉํ๋ค๊ณ ์๊ฐํ๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
|
| 79 |
+
|
| 80 |
+
๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ:
|
| 81 |
+
```markdown
|
| 82 |
+
| ๋จ๊ณ | ํญ๋ชฉ | ์ค๋ช
| ์ฒดํฌํฌ์ธํธ |
|
| 83 |
+
| --- | --- | --- | --- |
|
| 84 |
+
| โ ์ง๋ฌด ๊ด์ฌ ๊ณ๊ธฐ | ํด๋น ์ง๋ฌด์ ๊ด์ฌ์ ๊ฐ๊ฒ ๋ ์ฒซ ๊ณ๊ธฐ | ์์
, ํ๋, ์ฌ๋, ์ฌ๊ฑด ๋ฑ ํตํด ์ง๋ฌด์ ํฅ๋ฏธ๋ฅผ ๋๋ผ๊ฒ ๋ ๊ตฌ์ฒด์ ์ถ๋ฐ์ ์ ์ | ๋จ์ํ ํฅ๋ฏธ X / ๊ตฌ์ฒด์ ์ธ ํ๋์ด๋ ๊ฒฝํ์ ๋ฐํ์ผ๋ก ์์ |
|
| 85 |
+
| โก ํ์ฌ ์ ํ ์ด์ | ์ฌ๋ฌ ํ์ฌ ์ค ์ด ํ์ฌ๋ฅผ ์ ํํ ์ด์ | ๊ธฐ์
์ ์ ํ, ์๋น์ค, ์ฐ์
, ์กฐ์ง๋ฌธํ, ๊ฒฝ์์ฒ ํ ๋ฑ๊ณผ ๋ณธ์ธ์ ์ฐ๊ฒฐ๊ณ ๋ฆฌ ์ค๋ช
| "์ง๋ฌด๋ง"์ด ์๋๋ผ "์ด ํ์ฌ์์" ํ๊ณ ์ถ์ ์ด์ ์ฌ์ผ ์ค๋๋ ฅ ์์ |
|
| 86 |
+
| โข ํ์ฌ์ ๋ํด ๋๋ ์ | ํ์ฌ/์กฐ์ง์ ์ ํ๊ฑฐ๋ ์กฐ์ฌํ๋ฉด์ ๋๋ ๊ตฌ์ฒด์ ์ธ ์ธ์ | ์ฒดํ, ์ค์ต, ๊ธฐ์ฌ, ๋ฆฌ์์น, ์ฌ๋๊ณผ์ ์ ์ ์ ํตํด ๋๋ ์ธ์, ๋ถ์๊ธฐ, ๊ฐ์ ๋ฑ | ๋จ์ํ ์นญ์ฐฌ X / ๋ณธ์ธ์ ๊ธฐ์ค์ผ๋ก ํด์ํ ๊ด์ฐฐ๊ณผ ์ธ์ ์ค์ฌ |
|
| 87 |
+
| โฃ ์
์ฌ ํ ๊ณํ | ์
์ฌ ์งํ 1~3๋
๋ด ํ๊ณ ์ถ์ ์ผ, ์ญ๋ ์ฑ์ฅ ๊ณํ | ๋งก๊ฒ ๋ ์ง๋ฌด์์ ์ด๋ค ๋ฐฉ์์ผ๋ก ๊ธฐ์ฌํ๊ณ ์ถ์ผ๋ฉฐ, ์ด๋ค ๋ถ๋ถ์ ์ฑ์ฅ์ํฌ ๊ฒ์ธ์ง | "์ผ๋จ ์ด์ฌํ ํ๊ฒ ๋ค" ์์ ๋ง์ฐํ ์์ง๊ฐ ์๋ ๊ตฌ์ฒด์ ์ธ ํ๋๊ณผ ๋ชฉํ ์ค์ฌ |
|
| 88 |
+
| โค ์ฅ๊ธฐ์ ์ธ ๋ชฉํ | ์ปค๋ฆฌ์ด ๊ด์ ์์์ ์ค์ฅ๊ธฐ์ ์ฑ์ฅ ๋ฐฉํฅ | ์ง๋ฌด ์ ๋ฌธ๊ฐ๋ก์ ๋๋ ๋ฆฌ๋๋ก์ ์ด๋ค ๋ชจ์ต์ผ๋ก ์ฑ์ฅํ๊ณ ์ถ์์ง | ํ์ฌ๊ฐ ๊ทธ ์ฑ์ฅ์ ๋ฐฐ๊ฒฝ์ด ๋์ด์ผ ํจ (ex. ํ์ฌ์ ์ฅ์ ๊ณผ ์ฐ๊ฒฐ) |
|
| 89 |
+
| โฅ ํ์ฌ์์ ๊ธฐ์ฌ | ๋ณธ์ธ์ ์ฑ์ฅ๊ณผ ํ์ฌ์ ๋ฐฉํฅ์ด ๋ง๋๋ ์ง์ | ๋ณธ์ธ์ ์ญ๋๊ณผ ํ์ฌ์ ๋น์ /๋ฐฉํฅ์ด ๋ง๋ฟ๋ ์ ์ ์ ๊ฐ์กฐ | "๋์ ์ฑ์ฅ = ํ์ฌ์ ๊ธฐ์ฌ"๋ผ๋ ๊ตฌ๋๊ฐ ์์ฐ์ค๋ฝ๊ฒ ๋ณด์ฌ์ ธ์ผ ํจ |
|
| 90 |
+
```
|
| 91 |
+
|
| 92 |
+
### ์์ 6 - ์
์ฌ ํ ๋น์
|
| 93 |
+
์ง๋ฌธ: ์
์ฌ ํ 5๋
, 10๋
๋ค ์ด๋ฃจ๊ณ ์ถ์ ๋ชฉํ๋ ๋ฌด์์ด๋ฉฐ, ์ด๋ฅผ ์ํด ์ด๋ค ๋
ธ๋ ฅ์ ํ ๊ฒ์ธ์ง ๊ธฐ์ ํ์์ค.
|
| 94 |
+
|
| 95 |
+
๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ:
|
| 96 |
+
```markdown
|
| 97 |
+
| ๋จ๊ณ | ํญ๋ชฉ | ์ค๋ช
| ์ฒดํฌํฌ์ธํธ |
|
| 98 |
+
| --- | --- | --- | --- |
|
| 99 |
+
| โ ๋น์ ์์ฝ | ์
์ฌ ํ ๊ถ๊ทน์ ์ผ๋ก ์งํฅํ๋ ๋ชจ์ต | ์ง๋ฌด ์ ๋ฌธ์ฑ๊ณผ ์กฐ์ง ๊ธฐ์ฌ๊ฐ ๋์์ ๋๋ฌ๋์ผ ํจ | ์ง๋ฌด ์ญํ + ์กฐ์ง ๋ด ์ํฅ๋ ฅ์ด ๋ด๊ธด ๊ตฌ์ฒด์ ํฌ์ง์
|
|
| 100 |
+
| โก ๋จ๊ธฐ ๊ณํ | ์
์ฌ ์ด๊ธฐ ๋จ๊ณ์์ ์ฐ์ ์ ์ผ๋ก ์ตํ ์ญ๋๊ณผ ๋งก๊ณ ์ถ์ ์
๋ฌด | ํ์ฌ/์ง๋ฌด์ ๋น ๋ฅด๊ฒ ์ ์ํ๊ณ ์ค๋ฌด์ ๊ธฐ์ฌํ ์ ์๋ ๋ฐฉํฅ ์ ์ | ๋ช
ํํ ๊ธฐ๊ฐ ์ธ๊ธ(1~2๋
) + ์ค๋ฌด ์ค์ฌ ํค์๋ ํ์ฉ |
|
| 101 |
+
| โข ์ค์ฅ๊ธฐ ๋ชฉํ | ์ผ์ ๊ธฐ๊ฐ ๋ด ๋ฌ์ฑํ๊ณ ์ถ์ ์ฑ๊ณผ์ ์ฑ์ฅ ๋ชจ์ต | ์ง๋ฌด์์์ ์ฑ์ฅ ๊ฒฝ๋ก ๋๋ ์ฑ
์ ์๋ ์ญํ ์ ์ | ๋ชฉํ ๋ฌ์ฑ ์์ (3~5๋
), ๊ตฌ์ฒด์ ์ธ ์ญํ /์ฑ๊ณผ ์ค์ฌ |
|
| 102 |
+
| โฃ ์คํ ์ ๋ต | ์์ ๋ชฉํ๋ค์ ์คํํ๊ธฐ ์ํ ์ค์ฒ ๊ณํ | ์ด๋ค ๋ฐฉ์์ผ๋ก ์ฑ์ฅํ ๊ฒ์ธ์ง ๊ตฌ์ฒด์ ์ธ ์คํ ๋ฐฉ์ ํฌํจ | ํ์ต ๋ฃจํด, ํ์
๋ฐฉ๋ฒ, ํผ๋๋ฐฑ ํ์ฉ ๋ฑ์ ๊ตฌ์ฒด์ฑ ํ์ |
|
| 103 |
+
| โค ์กฐ์ง ๊ธฐ์ฌ | ๊ฐ์ธ ์ฑ์ฅ์ด ์กฐ์ง์ ๋ฏธ์น๋ ๊ธ์ ์ ์ํฅ | ๋น์ ๋ฌ์ฑ์ด ํ์ฌ์ ๊ฐ์น, ์ฑ๊ณผ์ ์ด๋ป๊ฒ ๊ธฐ์ฌ๋๋์ง ์ฐ๊ฒฐ | ํ์ฌ์ ๋ฐฉํฅ์ฑ๊ณผ ์ฐ๊ณ๋๋ฉด ์ค๋๋ ฅ ๊ฐํ |
|
| 104 |
+
```
|
| 105 |
+
|
| 106 |
+
### ์์ 7 - ์กฐ์ง ์ดํด ๋ฐ ์ ์ธ
|
| 107 |
+
์ง๋ฌธ: ๋น์ฌ ์๋น์ค์ ์ฅ๋จ์ ์ ๋ถ์ํ๊ณ , ๊ฐ์ ๋ฐฉ์์ ์ ์ํด ์ฃผ์ญ์์ค.
|
| 108 |
+
|
| 109 |
+
๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ:
|
| 110 |
+
```markdown
|
| 111 |
+
| ๋จ๊ณ | ํญ๋ชฉ | ์ค๋ช
| ์ฒดํฌํฌ์ธํธ |
|
| 112 |
+
| --- | --- | --- | --- |
|
| 113 |
+
| โ ํ๊ฒฝ ์ธ์ | ์ฐ์
/๊ธฐ์ ๋ณํ ํ๋ฆ ์์์ ํ์ฌ์ ํ์ฌ ์์น๋ฅผ ์ธ์ | ์ฐ์
ยท์์ฅยท๊ณ ๊ฐ์ ๋ณํ ํ๋ฆ์ ๋ํ ํต์ฐฐ์ ๋ณด์ฌ์ค | ๋๋ฌด ์ผ๋ฐ์ X โ ํด๋น ํ์ฌ์ ํ์ฌ ์ํฉ๊ณผ ๋งฅ๋ฝ์ด ๋ฐ์๋ผ์ผ ํจ |
|
| 114 |
+
| โก ํ์ฌ ๊ฐ์ /์ฐจ๋ณ์ | ํ์ฌ(๋๋ ๋ํ ์๋น์ค)์ ๊ฐ์ ๋ฐ ์ฐจ๋ณํ ํฌ์ธํธ๋ฅผ ์ ์ | "์ ์ด ํ์ฌ๊ฐ ๊ฒฝ์ ์ฐ์์ ์๋๊ฐ"์ ๋ํ ๋๋ง์ ์๊ฐ | ๋จ์ ๋์ด X โ ํตํฉ์ ํด์ O |
|
| 115 |
+
| โข ํต์ฌ ์ ์ | ํ์ฌ๊ฐ ๋์๊ฐ์ผ ํ ๋ฐฉํฅ์ฑ ๋๋ ํค์๋๋ฅผ ์ ์ | ๋ธ๋๋ ๊ฐ์น, ๊ธฐ์ ์ ๋ต, ๊ณ ๊ฐ ์ค์ฌ ์ฒ ํ ๋ฑ ๋ช
ํํ ์ ์ | ์ฌ๋ก๊ฑด์ด๋ ๋ฌธ์ฅ์ผ๋ก ์์ถ ๊ฐ๋ฅํ๋ฉด ๋ ์ธ์์ |
|
| 116 |
+
| โฃ ์คํ ์ ๋ต | ์ ์์ ์คํํ๊ธฐ ์ํ ์คํ ๋ฐฉํฅ ๋๋ ๊ตฌ์ฒด์ ๋ฐฉ์ ์ ์ | ์๋น์ค ๊ฐ์ ์, ๊ธฐ์ ์ ์ฉ, ๊ณ ๊ฐ๊ฒฝํ ๊ฐํ ๋ฐฉ์ ๋ฑ | ํ์ค์ ์ธ ์์ค์ ์คํ์์ด ํฌํจ๋ผ์ผ ์ค๋๋ ฅ โ |
|
| 117 |
+
| โค ๊ธฐ๋ ํจ๊ณผ | ์คํ ์ ํ์ฌ ๋๋ ๊ณ ๊ฐ์๊ฒ ์ด๋ค ๊ธ์ ์ ๋ณํ๊ฐ ์๋์ง ์ค๋ช
| ๋ธ๋๋ ๊ฐํ, ๊ณ ๊ฐ๊ฒฝํ ๊ฐ์ , ์์ต์ฑ ํฅ์ ๋ฑ ๊ตฌ์ฒดํ | ํํฉ๋ ๋ฏธ๋ ์์ธก X โ ํ์ค ๊ธฐ๋ฐ ๊ฐ์น ์ ๋ฌ O |
|
| 118 |
+
```
|
| 119 |
+
|
| 120 |
+
### ์์ 8 - ๊ฐ์ธ์ ๋ด์ ํน์ฑ
|
| 121 |
+
์ง๋ฌธ: ๋ณธ์ธ์ ๊ฐ์ ๊ณผ ์ฝ์ ์ ์ค๋ช
ํ๊ณ , ์ฝ์ ์ ๋ณด์ํ๊ธฐ ์ํด ์ด๋ค ๋
ธ๋ ฅ์ ํ๋์ง ๊ธฐ์ ํ์์ค.
|
| 122 |
+
|
| 123 |
+
๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ:
|
| 124 |
+
```markdown
|
| 125 |
+
| ๋จ๊ณ | ํญ๋ชฉ | ์ค๋ช
| ์ฒดํฌํฌ์ธํธ |
|
| 126 |
+
| --- | --- | --- | --- |
|
| 127 |
+
| โ ์ฅ์ ์ ์ | ์ง๋ฌด์ ์ฐ๊ฒฐ๋๋ ํต์ฌ ์ฑ๊ฒฉ ๊ฐ์ ์ ํ๋ ์ ํ | ์ง๋์น๊ฒ ์ผ๋ฐ์ ์ธ ์ฅ์ (X), ์ง๋ฌด์ ์ฐ๊ด์ฑ ์๋ ์ฅ์ (O) | ์ฌ๋ฌ ๊ฐ ๋์ดํ์ง ๋ง๊ณ ํ๋์ ์ง์ค, ์ง๋ฌด์ ํฉ์ฑ๊ณผ ์ฐ๊ฒฐ๋ ๊ฒ |
|
| 128 |
+
| โก ์ฅ์ ๊ทผ๊ฑฐ ์ฌ๋ก | ํด๋น ์ฅ์ ์ด ๋๋ฌ๋ ๊ฒฝํ์ ๊ตฌ์ฒด์ ์ผ๋ก ์์ | ์ํฉ-ํ๋-๊ฒฐ๊ณผ์ ๊ตฌ์กฐ๋ก ๊ฐ๋จํ๊ฒ ์ค๋ช
| ์ฃผ๋ณ์ ํ๊ฐ๊ฐ ํฌํจ๋๋ฉด ์ค๋๋ ฅ ์์น |
|
| 129 |
+
| โข ๋จ์ ์ ์ | ์กฐ์ง์ด ์์ฉ ๊ฐ๋ฅํ ์์ค์ ๋จ์ ์ ์ ์ | ์
๋ฌด์ ์ง์ ์ถฉ๋ํ์ง ์๋ ๋จ์ , ๋๋ฌด ์์งํ๊ฑฐ๋ ์น๋ช
์ ์ธ ๋จ์ (X) | ๊ฐ์ ์ /์ฌ์ํ์ ๋จ์ ์ ํผํ ๊ฒ |
|
| 130 |
+
| โฃ ๋ณด์ ๋
ธ๋ ฅ | ๋จ์ ์ ์ธ์ํ๊ณ ๋ณด์ํ๊ธฐ ์ํด ํด์จ ๋
ธ๋ ฅ | ์ค์ง์ ์ธ ํ๋, ๋ฃจํด, ์์คํ
์ด ์์ผ๋ฉด ์ข์ | "๋
ธ๋ ฅํ๊ฒ ๋ค"๋ ๋ค์ง๋ณด๋ค๋ ๊ตฌ์ฒด์ ์คํ ์ค์ฌ |
|
| 131 |
+
| โค ๋ณํ ๋ฐ ํจ๊ณผ | ๊ทธ ๋
ธ๋ ฅ์ ๊ฒฐ๊ณผ ๋ณํ๋ ์ | ์ค์ง์ ์ผ๋ก ๋ณํํ ํ๋๋ ์ฑ๊ณผ ์ค์ฌ | ์ฅ์ ํ๋ ๋จ์ ์ด ์๋๋ผ ๋ณํ ๊ณผ์ ์ ์ง์ค |
|
| 132 |
+
```
|
| 133 |
+
|
| 134 |
+
### ์์ 9 - ์ฑ์ฅ ๊ณผ์
|
| 135 |
+
์ง๋ฌธ: ํ์ฌ์ ์์ ์๊ฒ ๊ฐ์ฅ ํฐ ์ํฅ์ ๋ฏธ์น ์ฌ๊ฑด์ด๋ ์ธ๋ฌผ์ ํฌํจํ์ฌ ์ฑ์ฅ๊ณผ์ ์ ๊ธฐ์ ํ์์ค.
|
| 136 |
+
|
| 137 |
+
๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ:
|
| 138 |
+
```markdown
|
| 139 |
+
| ๋จ๊ณ | ํญ๋ชฉ | ์ค๋ช
| ์ฒดํฌํฌ์ธํธ |
|
| 140 |
+
| --- | --- | --- | --- |
|
| 141 |
+
| โ ์ด๊ธฐ ๋ฐฐ๊ฒฝ | ์ฑ์ฅ ํ๊ฒฝ ๋๋ ์ ๋
๊ธฐ ํน์ง | ์ด๋ฆฐ ์์ ํน์ ํ์ฐฝ ์์ ์ ๊ฐ์น๊ด ํ์ฑ ๋ฐฐ๊ฒฝ์ด ๋๋ ์ฌ๊ฑด์ด๋ ํ๊ฒฝ์ ์๊ฐ | ๋จ์ํ ์ฑ๊ฒฉ ๋ฌ์ฌ๋ณด๋ค๋ ํ๋/์ฌ๊ณ ์ ๊ทผ๊ฑฐ๊ฐ ๋ ์ฌ๊ฑด์ด ์ข์ |
|
| 142 |
+
| โก ๊ฐ์น๊ด ํ์ฑ ์ฌ๊ฑด | ๋์๊ฒ ์ํฅ์ ์ค ์ฌ๊ฑด ๋๋ ์ธ๋ฌผ | ํ์ฌ์ ์ฌ๊ณ ๋ฐฉ์์ด๋ ํ๋ ๋ฐฉ์์ ํ์ฑํ๊ฒ ๋ง๋ ์ฃผ์ ์ฌ๊ฑด์ด๋ ์ธ๋ฌผ ์๊ฐ | ๋จ์ ์๊ฐ X โ ๊ตฌ์ฒด์ ์ธ ์ํฉ ๋ฌ์ฌ + ๋์๊ฒ ์ค ๋ณํ |
|
| 143 |
+
| โข ๋ณํ์ ๊ฒฐ๊ณผ | ์ฌ๊ณ ๋ฐฉ์, ํ๋ ๋ณํ ๋ฐ ์ฑ๊ณผ | ์ ์ฌ๊ฑด/์ธ๋ฌผ๋ก ์ธํด ์๊ธด ๋ณํ๊ฐ ์ค์ ํ๋์ด๋ ์ฑ๊ณผ๋ก ์ด์ด์ก์์ ์์ | ์๊ฐ๋ง ๋ณํ ๊ฒ ์๋๋ผ, ํ๋๊ณผ ๊ฒฐ๊ณผ๊ฐ ์์๋์ง ๋ณด์ฌ์ค ๊ฒ |
|
| 144 |
+
| โฃ ์ง๋ฌด์์ ์ฐ๊ฒฐ | ์ง๋ฌด์ ์ฐ๊ฒฐ๋ ๊ฐ์น๊ด ์ ๋ฆฝ ๋ฐ ์ ํฉ์ฑ ์ดํ | ์ ๊ณผ์ ์์ ํ์ฑ๋ ๊ฐ์น๊ด์ด๋ ์ญ๋์ด ์ง์ ์ง๋ฌด์ ์ ํฉํจ์ ์ค๋ช
| '๊ทธ๋์ ์ง๊ธ ์ด ์ง๋ฌด์ ์ ์ ํฉํ๊ฐ?'๋ฅผ ๋ช
ํํ๊ฒ ์ฐ๊ฒฐ |
|
| 145 |
+
```
|
| 146 |
+
|
| 147 |
+
### ์์ 10 - ๊ฐ์น๊ด ๋ฐ ์ ๋
|
| 148 |
+
์ง๋ฌธ: '์ง์
'์ ์ ํํ ๋ ๊ฐ์ฅ ์ค์ํ๊ฒ ์๊ฐํ๋ ๊ธฐ์ค์ ๋ฌด์์ด๋ฉฐ, ๊ทธ ์ด์ ๋ ๋ฌด์์
๋๊น?
|
| 149 |
+
|
| 150 |
+
๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ:
|
| 151 |
+
```markdown
|
| 152 |
+
| ๋จ๊ณ | ํญ๋ชฉ | ์ค๋ช
| ์ฒดํฌํฌ์ธํธ |
|
| 153 |
+
| --- | --- | --- | --- |
|
| 154 |
+
| โ ์ ์ฒด์ฑ ์ ์ | ๋๋ฅผ ๋ํํ๋ ํค์๋ ๋๋ ํต์ฌ ์ฑํฅ ์๊ฐ | ํ๋ ๊ฐ์ ๋จ์ด(์: ๊ด์ฐฐ, ์ง์ฌ, ์ ๋ขฐ ๋ฑ)๋ก ๋์ ํ๋ยท์ ๋
ยท๊ฐ์น๊ด์ ์์ฝ | ํด์ํ๊ทธ๋ ์ง๊ด์ ์ธ ๋ฌธ์ฅ ์ฌ์ฉ โ ์ฃผ์ ๋ฅผ ๋ช
ํํ ์ธ์ํ๊ฒ ํ ๊ฒ |
|
| 155 |
+
| โก ๊ฐ์น๊ด ์ค๋ช
| ํด๋น ํค์๋์ ๋ํ ๋ณธ์ธ์ ์ฒ ํ์ด๋ ๋ฏฟ์ ์ค๋ช
| ์ ๊ทธ ๊ฐ์น๊ด์ ์ค์ํ๊ฒ ์ฌ๊ธฐ๋์ง, ์ด๋ค ๋ฐฐ๊ฒฝ์์ ์๊ฒผ๋์ง๋ฅผ ์ค๋ช
| ๋จ์ ์ค๋ช
X โ ์ฌ๊ณ ๋ฐฉ์์ด ์ ๋๋ฌ๋๋ ๋ฌธ์ฅ์ด๋ฉด ์ข์ |
|
| 156 |
+
| โข ๊ฒฝํ ์ฌ๋ก | ์ค์ ๋ก ๊ทธ ๊ฐ์น๊ด์ด ๋๋ฌ๋ ์ฌ๊ฑด ์๊ฐ | ๊ฐ์น๊ด์ด ๋จ์ง ์๊ฐ์ ๋จธ๋ฌผ์ง ์๊ณ ํ๋๊ณผ ๊ฒฐ๊ณผ๋ก ์ด์ด์ก์์ ๋ณด์ฌ์ค | ์ง๋ฌด ๊ด๋ จ ๊ฒฝํ์ด๋ฉด ๋ ์ข๊ณ , ์ฑ๊ณผ๋ ํจ๊ป ์ ์๋๋ฉด ์ค๋๋ ฅโ |
|
| 157 |
+
| โฃ ์ง๋ฌด ์ฐ๊ฒฐ | ํด๋น ๊ฐ์น๊ด์ด ์ง๋ฌด ์ํ์ ์ด๋ค ์ํฅ์ ์ค ์ ์๋์ง ์ค๋ช
| ์ด ๊ฐ์น๊ด์ ๊ฐ์ง ์ฌ๋์ด ๊ทธ ์ง๋ฌด์์ ์ด๋ค ์ญํ ์ ํ ์ ์์์ง ์ฐ๊ฒฐ | "๊ทธ๋์ ์ด ์ฌ๋์ด ์ ์ ํฉํ๊ฐ"์ ๋ํ ๋๋ต์ด ๋๋๋ก |
|
| 158 |
+
| โค ์ฑ์ฅ ๋ฐฉํฅ | ์ด ๊ฐ์น๊ด์ ๋ฐํ์ผ๋ก ํฅํ ์ด๋ค ์ ๋ฌธ๊ฐ๋ก ์ฑ์ฅํ๊ณ ์ถ์์ง | ์ถ์์ ์ธ ์ธ์ฌ์ X โ ์ค๋ฌด ์ฅ๋ฉด์ ์์ํ ์ ์๋ ๊ตฌ์ฒด์ ์ฑ์ฅ ๋ฐฉํฅ ์ ์ | "๊ณ ๊ฐ๊ณผ์ ๊ณต๊ฐ ๊ธฐ๋ฐ ๋ง์ผํ
์ ๋ฌธ๊ฐ๋ก ์ฑ์ฅ"์ฒ๋ผ ๋ช
๋ฃํ๊ฒ |
|
| 159 |
+
```
|
| 160 |
+
|
| 161 |
+
### ์์ 11 - ์ธ์ฌ์ ๋ฐ ์กฐ์ง์ ํฉ์ฑ
|
| 162 |
+
์ง๋ฌธ: ๋น์ฌ์ ํต์ฌ๊ฐ์น(๋์ , ํ๋ ฅ, ์ ๋ขฐ) ์ค ๋ณธ์ธ์ ๊ฐ์ฅ ์ ๋ํ๋ด๋ ๊ฐ์น์ ๊ทธ ์ด์ ๋ฅผ ๊ฒฝํ์ ๋ค์ด ์ค๋ช
ํ์์ค.
|
| 163 |
+
|
| 164 |
+
๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ:
|
| 165 |
+
```markdown
|
| 166 |
+
| ๋จ๊ณ | ํญ๋ชฉ | ์ค๋ช
| ์ฒดํฌํฌ์ธํธ |
|
| 167 |
+
| --- | --- | --- | --- |
|
| 168 |
+
| โ ์ธ์ฌ์ ์ ํ | ํ์ฌ์ ์ธ์ฌ์/ํต์ฌ๊ฐ์น ์ค ํ ๊ฐ์ง๋ฅผ ์ ํํด ๋ฐํ๋ค | ํํ์ด์ง, ์ฑ์ฉ์๋ด์ ๋ฑ์ ์ฐธ๊ณ ํด ๋ช
ํํ๊ฒ ์ธ๊ธ | ํต์ฌ ํค์๋๋ ๋ฌธ์ฅ ์๋ถ๋ถ์ ๋
ธ์ถ๋๋๋ก |
|
| 169 |
+
| โก ๊ฐ์ธ์ ํด์ | ํด๋น ์ธ์ฌ์์ ๋ณธ์ธ๋ง์ ์๊ฐ์ผ๋ก ํด์ํ๋ค | ๊ทธ ๊ฐ์น๊ฐ ์ ์ค์ํ์ง, ์ด๋ค ์๋ฏธ๋ก ๋ฐ์๋ค์ด๋์ง๋ฅผ ๋ณธ์ธ์ ์ธ์ด๋ก ์ค๋ช
| ๋จ์ ๋ณต๋ถ X โ '๋ด๊ฐ ๊ทธ๋ ๊ฒ ์๊ฐํ๋ ์ด์ '๊ฐ ๋๋ฌ๋์ผ ์ค๋๋ ฅโ |
|
| 170 |
+
| โข ๊ฒฝํ ์ฌ๋ก | ํด๋น ์ธ์ฌ์์ด ์ค์ ๋ก ๋๋ฌ๋ ๊ฒฝํ์ ์์ ํ๋ค | ๋จ์ํ ๋์ด์ด ์๋, ๊ทธ ๊ฐ์น์ ๊ธฐ๋ฐํ ํ๋๊ณผ ๋งฅ๋ฝ์ ์ค์ฌ์ผ๋ก ๊ตฌ์ฑ | ํ๋ โ ๋ฌธ์ ์ธ์ โ ์๋ โ ๋ณํ๋ก ํ๋ฆ์ด ๋์์ผ ์ข์ |
|
| 171 |
+
| โฃ ์ฑ๊ณผ ์ ์ | ํด๋น ๊ฐ์น๊ด ๊ธฐ๋ฐ์ ํ๋์ด ๋ณ์ ๊ฒฐ๊ณผ๋ฅผ ์์ ํ๋ค | ์์น์ ์ฑ๊ณผ or ๋ณํ๋ ํ๊ฐ, ์ํฅ๋ ฅ ๋ฑ์ผ๋ก ๊ตฌ์ฒดํ | "๊ทธ๋์ ๋ฌด์จ ๊ฒฐ๊ณผ๊ฐ ์์๋๊ฐ?"๊ฐ ๋ฐ๋์ ๋ค์ด๊ฐ์ผ ํจ |
|
| 172 |
+
| โค ์ฐ๊ฒฐ ๋ฐ ๋ง๋ฌด๋ฆฌ | ์ด ๊ฐ์น๊ด์ด ํ์ฌ์์์ ์ผ๊ณผ ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋ ์ง๋ฅผ ์ค๋ช
ํ๋ค | ๋ด๊ฐ ์ด ๊ฐ์น๋ฅผ ์ค์ฒํ๋ ์ฌ๋์์ ๊ฐ์กฐํ๊ณ , ๊ทธ๊ฒ ์ด๋ป๊ฒ ํ์ฌ์ ๋์ ๋๋์ง ๋ฐํ | "์ด ๊ฐ์น๊ด์ ๊ฐ์ถ ๋ด๊ฐ, ์ ์ด ์ง๋ฌด์์ ์ ๋ง๋์ง"๋ฅผ ์์ฐ์ค๋ฝ๊ฒ ์ฐ๊ฒฐ |
|
| 173 |
+
```
|
| 174 |
+
|
| 175 |
+
### ์์ 12 - ๋ณด์ ์ง์ ๋ฐ ๊ธฐ์ (๋ฌธ์ -ํด๊ฒฐ๋ฐฉ์)
|
| 176 |
+
์ง๋ฌธ: ๋ณด์ ํ ๊ธฐ์ ์คํ(Language, Framework, DB ๋ฑ)์ ๋ํด ์๋ จ๋๋ฅผ ํฌํจํ์ฌ ์์ธํ ๊ธฐ์ ํ์์ค.
|
| 177 |
+
|
| 178 |
+
๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ:
|
| 179 |
+
```markdown
|
| 180 |
+
| ๋จ๊ณ | ํญ๋ชฉ | ์ค๋ช
| ์ฒดํฌํฌ์ธํธ |
|
| 181 |
+
| --- | --- | --- | --- |
|
| 182 |
+
| โ ์์ฝ ํ ๋ฌธ์ฅ | ์ ์ฒด ๋ต๋ณ์ ์์ฝํ๋ ํต์ฌ ๋ฉ์์ง๋ฅผ ์ ์ | ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉฐ ํน์ ๊ธฐ์ ์ญ๋์ ๊ฐ์ถ๊ฒ ๋ ๊ณ๊ธฐ | ํต์ฌ ๊ธฐ์ ์ญ๋ + ๋ฌธ์ ํด๊ฒฐ ๊ฒฝํ์ด ํจ๊ป ๋๋ฌ๋์ผ ํจ |
|
| 183 |
+
| โก ๋ฌธ์ ์ํฉ | ์ง๋ฌด ์ํ ์ค ๋ง์ฃผํ ๊ตฌ์ฒด์ ์ธ ๊ธฐ์ ์ ๋ฌธ์ ๋ ๋ณ๋ชฉ ํ์ | ์ค์ ํ๋ก์ ํธ๋ ํ์
์ํฉ์์ ๋ฐ์ํ ๋ฌธ์ ์ฌ์ผ ํจ | ๋จ์ํ ๋ถํธํจ X โ ๊ธฐ๋ฅ ์ค๋จ, ์ค๋ฅ ๋ฑ ๋ช
ํํ ๋ฌธ์ |
|
| 184 |
+
| โข ์์ธ ๋ถ์ ๋ฐ ๊ณผ์ ์ ์ | ๋ฌธ์ ์ ์์ธ์ ๊ธฐ์ ์ ์ผ๋ก ๋ถ์ํ๊ณ ๊ฐ์ ๊ณผ์ ๋ฅผ ์ค์ค๋ก ์ ์ | ๋
ผ๋ฆฌ์ ๋ถ์๊ณผ ๊ธฐ์ ์ ํต์ฐฐ์ด ๋๋ฌ๋์ผ ํจ | "์ ๋ฐ์ํ๋๊ฐ?" + "์ด๋ค ๋ฅ๋ ฅ์ด ํ์ํ๋๊ฐ?" |
|
| 185 |
+
| โฃ ํด๊ฒฐ ๊ณผ์ (๋์ ์ก์
) | ๊ธฐ์ ์ ์กฐ์น๋ฅผ ์ทจํ๊ณ , ํ์
ํ๋ฉฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ตฌ์ฒด์ ์คํ | ์ด๋ค ๊ธฐ์ ์ ์ด๋ป๊ฒ ์ ์ฉํ๋์ง๋ฅผ ์ค์ฌ์ผ๋ก | ๊ธฐ์ ๋จ์ ๋์ด X โ ๊ตฌ์กฐ ๋ณ๊ฒฝ, ์ค์ , ๋๊ตฌ ํ์ฉ ๋ฑ ์์ธํ |
|
| 186 |
+
| โค ์ฑ๊ณผ ๋ฐ ํ๊ฐ | ๋ฌธ์ ํด๊ฒฐ ๊ฒฐ๊ณผ, ์ฑ๋ฅ ๊ฐ์ ๋ฐ ํ์ธ์ ํ๊ฐ ๋ฑ ์ฑ๊ณผ ์ ์ | ์์น/๋น๊ต/ํผ๋๋ฐฑ ๋ฑ ์ธ๋ถ ์งํ ๊ฐ์กฐ | "๊ทธ๋์ ๋ญ๊ฐ ๋ฌ๋ผ์ก๋๊ฐ?"์ ๋ถ๋ช
ํ ๋ตํด์ผ ํจ |
|
| 187 |
+
| โฅ ๊นจ๋ฌ์ ๋ฐ ์ง๋ฌด ์ฐ๊ณ | ์ด ๊ฒฝํ์ด ๊ธฐ์ ์ญ๋๊ณผ ์ง๋ฌด ์ ํฉ์ฑ์ ์ด๋ค ์ํฅ์ ์ฃผ์๋์ง | ๊ธฐ์ ์ ์ฑ์ฅ๊ณผ ์ค๋ฌด ์ ์ฉ ๊ฐ๋ฅ์ฑ์ ๋๋ฌ๋ด์ผ ํจ | ์ง๋ฌด ๊ธฐ์ฌ ์์ง๊น์ง ์์ฐ์ค๋ฝ๊ฒ ์ฐ๊ฒฐ๋๋ฉด ์ข์ |
|
| 188 |
+
```
|
| 189 |
+
|
| 190 |
+
### ์์ 13 - ์ญ๋ ๊ฐ๋ฐ ๊ณผ์
|
| 191 |
+
์ง๋ฌธ: ์ง์ ์ง๋ฌด์ ์ ๋ฌธ์ฑ์ ํค์ฐ๊ธฐ ์ํด ๋จ๋ค๊ณผ ๋ฌ๋ฆฌ ํน๋ณํ ๋
ธ๋ ฅ์ ๊ธฐ์ธ์ธ ๊ฒฝํ์ด ์๋ค๋ฉด ์์ ํ์์ค.
|
| 192 |
+
|
| 193 |
+
๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ:
|
| 194 |
+
```markdown
|
| 195 |
+
| ๋จ๊ณ | ํญ๋ชฉ | ์ค๋ช
| ์ฒดํฌํฌ์ธํธ |
|
| 196 |
+
| --- | --- | --- | --- |
|
| 197 |
+
| โ ๊ณ๊ธฐ ๋ฐ ๋ฐฐ๊ฒฝ | ์ ๋ฌธ์ฑ์ ํค์ฐ๊ธฐ ์ํด ํ์ต์ด ํ์ํ๋ค๊ณ ๋๋ ๊ณ๊ธฐ | ์ค์ ๊ฒฝํ์ด๋ ์คํจ, ํ๊ณ๋ฅผ ๊ฒช์ผ๋ฉฐ ๋๋ 'ํ์ต์ ํ์์ฑ' | ๋จ์ ํธ๊ธฐ์ฌ X โ ๋ฌธ์ ์ธ์ ๋๋ ํ์ ์์ ๊ธฐ๋ฐ |
|
| 198 |
+
| โก ํ์ต ํ๋ | ํ์ต์ ์ํด ์ด๋ค ๋
ธ๋ ฅ์ ํ๋์ง ๊ตฌ์ฒด์ ํ๋ ์์ | ๊ต์ก ์ด์, ํ๋ก์ ํธ ์ฐธ์ฌ, ๋๊ตฌ ํ์ต, ํผ๋๋ฐฑ ๋ฑ | ์ค์ค๋ก ์ ํํ๊ณ ๋ชฐ์
ํ ๊ฒฝํ์ด๋ฉด ๋ ์ข์ |
|
| 199 |
+
| โข ์ ์ฉ ๋ฐ ์ค์ฒ | ํ์ตํ ๋ด์ฉ์ ์ค์ ๊ฒฝํ์ ์ ์ฉํ ๊ณผ์ | ํ์ต-์คํ ์ฐ๊ฒฐ๊ณ ๋ฆฌ ๋ช
ํํ ์ค๋ช
| ๊ฒฐ๊ณผ๊ฐ ๋์ค์ง ์์๋ ์คํ์ด ์ค์ |
|
| 200 |
+
| โฃ ์ฑ๊ณผ | ์คํ ํ ์ด๋ค ๋ณํ๋ ์ฑ๊ณผ๊ฐ ์์๋์ง | ์์น, ๋น๊ต, ํ์ธ์ ํ๊ฐ ๋ฑ์ผ๋ก ์ค๋๋ ฅ ๊ฐํ | "๊ทธ๋์ ์ด๋ค ํจ๊ณผ๊ฐ ์์๋๊ฐ?"์ ๋ตํด์ผ ํจ |
|
| 201 |
+
| โค ์ฑ์ฅ ๋ฐ ์ฐ๊ณ | ํ์ต์ด ์ด๋ป๊ฒ ๋ด ์ฌ๊ณ ๋ฐฉ์/์ญ๋์ ์ํฅ์ ๋ฏธ์ณค๋์ง | ๋ง์ธ๋์
๋ณํ, ์ดํ ํ๋์ ๋ณํ | ์ง๋ฌด ์ ํฉ์ฑ๊ณผ ์ฐ๊ฒฐ๋๋๋ก ๋ง๋ฌด๋ฆฌ |
|
| 202 |
+
```
|
| 203 |
+
|
| 204 |
+
### ์์ 14 - ์ง๋ฌด ๋ฐ ์ฐ์
์ดํด๋
|
| 205 |
+
์ง๋ฌธ: ์ง์ํ ๋ถ์ผ์ ์ต์ ๊ธฐ์ ํธ๋ ๋ ์ค ๊ฐ์ฅ ์ค์ํ๋ค๊ณ ์๊ฐํ๋ ๊ฒ๊ณผ ๊ทธ ์ด์ ๋ ๋ฌด์์
๋๊น?
|
| 206 |
+
|
| 207 |
+
๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ:
|
| 208 |
+
```markdown
|
| 209 |
+
| ๋จ๊ณ | ํญ๋ชฉ | ์ค๋ช
| ์ฒดํฌํฌ์ธํธ |
|
| 210 |
+
| --- | --- | --- | --- |
|
| 211 |
+
| โ ์ฃผ์ ํธ๋ ๋ ์ ์ | ๋ด๊ฐ ์ฃผ๋ชฉํ ์ฐ์
ยท๊ธฐ์ ํธ๋ ๋๋ฅผ ๋ช
ํํ ์ธ๊ธ | ์ต์ ์ฑ & ๊ฐ์ธ์ ๊ด์ฌ์ด ๋๋ฌ๋๋ ํค์๋<br>๋๋ฌด ๋์ง ์๊ณ ์ง๋ฌด์ ์ฐ๊ฒฐ๋ ํธ๋ ๋ | ๋จ์ ์ ํ X โ ์ค์ง์ ๋ณํ๋ฅผ ๊ฐ์ ธ์ฌ ๊ธฐ์ |
|
| 212 |
+
| โก ํธ๋ ๋์ ์ค์์ฑ ๋ถ์ | ์ ์ด ํธ๋ ๋๊ฐ ์ค์ํ์ง ์์ ์ ๊ฒฌํด ์ ์ | ์์ฅ ๋ณํ๋ ์ฌ์ฉ์ ๊ฒฝํ ๊ด์ ์์ ์ค์์ฑ์ ์์ <br>๊ธฐ์ ์ ์ดํด๋๋ ๊ฐ๊ฒฐํ๊ฒ ํฌํจ | ๋จ์ ์ค๋ช
X โ ํต์ฐฐ๋ ฅ ์๋ ๋ถ์ O |
|
| 213 |
+
| โข ํ์ต ๋ฐ ์ค์ฒ ๊ฒฝํ | ์ด ํธ๋ ๋์ ๊ด๋ จํด ๋ด๊ฐ ์ด๋ค ๋
ธ๋ ฅ์ ํด์๋์ง | ์์
, ํ๋ก์ ํธ, ๊ฐ์ธํ์ต, ์ฌ์ด๋ ์์
๋ฑ ์ค์ฒ ์ค์ฌ<br>๊ด์ฌ์ 'ํ๋'์ผ๋ก ์ด์ด๊ฐ ์ ๊ฐ์กฐ | ์ด๋ก ๋ง X โ ์ค์ ์ ์ฉ์ด๋ ์ฒดํ ๊ฒฝํ ์ค์ฌ |
|
| 214 |
+
| โฃ ์ธ์ฌ์ดํธ ๋ฐ ๊ด์ ํ์ฅ | ์ด ํธ๋ ๋๋ฅผ ๋ฐ๋ผ๋ณด๋ ๋๋ง์ ๊ด์ ์ ์ | ๋จ์ ๊ธฐ์ ์ค๋ช
์ ๋์ด ๊ฐ์น ์ฌํด์<br>๊ณ ๊ฐ, ์์ฅ, ์ง์๊ฐ๋ฅ์ฑ ๋ฑ ๋์ ์์ผ ๊ฐ์กฐ | ๋จ๋ค๊ณผ ๋ค๋ฅธ ์๊ฐ์ด๋ ๊น์ด ์๋ ํต์ฐฐ |
|
| 215 |
+
| โค ๊ธฐ์
๋ฐ ์ง๋ฌด์์ ์ฐ๊ณ | ํด๋น ํ์ฌยท์ง๋ฌด์ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ฐ๊ฒฐ๋๋์ง | ํ์ฌ์ ๋ฐฉํฅ์ฑ๊ณผ ํธ๋ ๋ ๊ฐ ์ฐ๊ฒฐ<br>๋ด๊ฐ ์ด๋ค ๋ฐฉ์์ผ๋ก ๊ธฐ์ฌํ ์ ์์์ง ์ ์ | "์ด ํ์ฌ์์ ์ด ํธ๋ ๋๋ฅผ ์ด๋ป๊ฒ ํ์ฉํ ๊ฒ์ธ๊ฐ" |
|
| 216 |
+
```
|
| 217 |
+
|
| 218 |
+
### ์ถ๋ก
|
| 219 |
+
์ง๋ฌธ: {question}
|
| 220 |
+
Job Description: {jd}
|
| 221 |
+
ํ์ฌ ์ด๋ฆ: {company_name}
|
| 222 |
+
๊ฒฝ๋ ฅ ์์ค: {experience_level}
|
| 223 |
+
๋ํ ๋ด์ฉ: {conversation}
|
| 224 |
+
๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ:
|
answer_flow_generation/test.py
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import random
|
| 3 |
+
import datetime
|
| 4 |
+
import json
|
| 5 |
+
import multiprocessing
|
| 6 |
+
import sys
|
| 7 |
+
from tqdm import tqdm
|
| 8 |
+
|
| 9 |
+
# ์์ ๋๋ ํ ๋ฆฌ์ utils.py๋ฅผ importํ๊ธฐ ์ํด ๊ฒฝ๋ก ์ถ๊ฐ
|
| 10 |
+
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
| 11 |
+
from utils import track_api_cost
|
| 12 |
+
from llm_functions import generate_answer_flow
|
| 13 |
+
|
| 14 |
+
# ํ
์คํธ๋ฅผ ์ํ ํ๊ฒฝ ๋ณ์ ๋ก๋ (ํ์์)
|
| 15 |
+
try:
|
| 16 |
+
from dotenv import load_dotenv
|
| 17 |
+
load_dotenv()
|
| 18 |
+
except ImportError:
|
| 19 |
+
pass
|
| 20 |
+
|
| 21 |
+
# ์์ ๋ฐ์ดํฐ
|
| 22 |
+
example_companies = ["์ผ์ฑ์ ์", "์นด์นด์ค", "๋ค์ด๋ฒ", "์ฟ ํก", "ํ ์ค", "ํ๋์๋์ฐจ", "CJ์ ์ผ์ ๋น", "ํ์ด๋ธ"]
|
| 23 |
+
example_jobs_jds = {
|
| 24 |
+
"๋ฐฑ์๋ ๊ฐ๋ฐ์": "Spring Boot, JPA, MySQL ๊ฒฝํ์. MSA ํ๊ฒฝ ๊ฒฝํ ์ฐ๋. ํด๋ผ์ฐ๋(AWS) ํ๊ฒฝ ๋ฐฐํฌ ๋ฐ ์ด์ ๊ฒฝํ์.",
|
| 25 |
+
"ํ๋ก ํธ์๋ ๊ฐ๋ฐ์": "React, TypeScript, Redux ์ฌ์ฉ. ๋ฐ์ํ ์น ๊ฐ๋ฐ ๊ฒฝํ ํ์. UI/UX์ ๋ํ ์ดํด๋๊ฐ ๋์ ๋ถ.",
|
| 26 |
+
"๋ฐ์ดํฐ ๋ถ์๊ฐ": "SQL, Python(Pandas, Scikit-learn) ํ์ฉ ๋ฅ๋ ฅ. ํต๊ณ์ ์ง์๊ณผ ๋ฐ์ดํฐ ์๊ฐํ(Tableau ๋ฑ) ๋ฅ๋ ฅ.",
|
| 27 |
+
"ํ๋ก๋ํธ ๋งค๋์ (PM)": "IT ํ๋ก๋ํธ ๊ธฐํ ๋ฐ ๊ด๋ฆฌ ๊ฒฝํ. ์ฌ์ฉ์ ์คํ ๋ฆฌ ์์ฑ, ๋ฐฑ๋ก๊ทธ ๊ด๋ฆฌ. ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์์ฌ๊ฒฐ์ ๋ฅ๋ ฅ.",
|
| 28 |
+
"๋ง์ผํฐ": "๋์งํธ ๋ง์ผํ
(SA, DA, SEO) ๊ฒฝํ. ์ฝํ
์ธ ๊ธฐํ ๋ฐ ์ ์, ์ฑ๊ณผ ๋ถ์. SNS ์ฑ๋ ์ด์ ๊ฒฝํ."
|
| 29 |
+
}
|
| 30 |
+
example_questions = {
|
| 31 |
+
"์ง์๋๊ธฐ": "{company_name}์ ์ง์ํ ๋๊ธฐ์ ๋ํด ๊ธฐ์ ํด์ฃผ์ญ์์ค.",
|
| 32 |
+
"์ฑ์ฅ๊ณผ์ ": "๋ณธ์ธ์ ์ฑ์ฅ๊ณผ์ ์ ๊ฐ๋ตํ ๊ธฐ์ ํ๋ ํ์ฌ์ ์์ ์๊ฒ ๊ฐ์ฅ ํฐ ์ํฅ์ ๋ผ์น ์ฌ๊ฑด, ์ธ๋ฌผ ๋ฑ์ ํฌํจํ์ฌ ๊ธฐ์ ํด์ฃผ์ญ์์ค.",
|
| 33 |
+
"์ง๋ฌด์ญ๋": "{job_title} ์ง๋ฌด ์ํ์ ํ์ํ ์ญ๋์ ๋ฌด์์ด๋ผ๊ณ ์๊ฐํ๋ฉฐ, ์ด๋ฅผ ๊ฐ์ถ๊ธฐ ์ํด ์ด๋ค ๋
ธ๋ ฅ์ ํด์๋์ง ๊ธฐ์ ํด์ฃผ์ญ์์ค.",
|
| 34 |
+
"์
์ฌํํฌ๋ถ": "์
์ฌ ํ 10๋
๋์์ ํ์ฌ์ํ ์๋๋ฆฌ์ค์ ๊ทธ๊ฒ์ ์ถ๊ตฌํ๋ ์ด์ ๋ฅผ ๊ธฐ์ ํด์ฃผ์ญ์์ค."
|
| 35 |
+
}
|
| 36 |
+
experience_levels = ["์ ์
", "๊ฒฝ๋ ฅ", "์ธํด"]
|
| 37 |
+
example_conversations = [
|
| 38 |
+
"User: ์๋
ํ์ธ์, ์๊ธฐ์๊ฐ์ ์ปจ์คํ
์ ๋ฐ๊ณ ์ถ์ต๋๋ค.\nAI: ๋ค, ์ด๋ค ์ง๋ฌด์ ํ์ฌ์ ์ง์ํ์๋์?\nUser: ์ฟ ํก์ PM ์ง๋ฌด์
๋๋ค. ์ ๊ฐ์ ์ ๋ฐ์ดํฐ ๋ถ์ ๋ฅ๋ ฅ์
๋๋ค.",
|
| 39 |
+
"User: ์ฑ์ฅ๊ณผ์ ํญ๋ชฉ์ ์ด๋ป๊ฒ ์ฐ๋ ๊ฒ ์ข์๊น์?\nAI: ์ง๋ฌด์ ๊ด๋ จ๋ ๊ฒฝํ์ ์ค์ฌ์ผ๋ก, ๊ทธ ๊ฒฝํ์ ํตํด ๋ฌด์์ ๋ฐฐ์ฐ๊ณ ์ด๋ป๊ฒ ์ฑ์ฅํ๋์ง ๊ตฌ์ฒด์ ์ธ ์ฌ๋ก๋ฅผ ๋ค์ด ์์ฑํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.",
|
| 40 |
+
"User: ์ ๊ฒฝํ ์ค ์ด๋ค ๊ฒ์ ๊ฐ์กฐํด์ผ ํ ์ง ๋ชจ๋ฅด๊ฒ ์ด์.\nAI: ์ง์ํ์๋ ์ง๋ฌด์ JD(์ง๋ฌด๊ธฐ์ ์)๋ฅผ ๋ณด๋ฉด ์ด๋ค ์ญ๋์ ์ค์ํ๊ฒ ์๊ฐํ๋์ง ์ ์ ์์ต๋๋ค. ๊ทธ์ ๊ด๋ จ๋ ๊ฒฝํ์ ์ฐ์ ์ ์ผ๋ก ์ดํํด๋ณด์ธ์."
|
| 41 |
+
]
|
| 42 |
+
|
| 43 |
+
NUM_TESTS = 100
|
| 44 |
+
NUM_PROCESSES = 10
|
| 45 |
+
MODEL_NAME = "gpt-4o-mini"
|
| 46 |
+
|
| 47 |
+
def run_test(test_input_with_id):
|
| 48 |
+
"""๊ฐ๋ณ ํ
์คํธ ์ผ์ด์ค๋ฅผ ์คํํ๋ ์์ปค ํจ์"""
|
| 49 |
+
test_id, test_input = test_input_with_id
|
| 50 |
+
total_cost = 0
|
| 51 |
+
error_message = ""
|
| 52 |
+
status = "โ
Success"
|
| 53 |
+
|
| 54 |
+
try:
|
| 55 |
+
parsed_flow, response = generate_answer_flow(**test_input)
|
| 56 |
+
|
| 57 |
+
if response and hasattr(response, 'usage'):
|
| 58 |
+
total_cost = track_api_cost(response, MODEL_NAME, None)
|
| 59 |
+
|
| 60 |
+
if "error" in parsed_flow or "flow" not in parsed_flow or not parsed_flow["flow"]:
|
| 61 |
+
status = "โ Failure"
|
| 62 |
+
error_message = str(parsed_flow.get("error", "Invalid flow format"))
|
| 63 |
+
|
| 64 |
+
return {
|
| 65 |
+
"id": test_id,
|
| 66 |
+
"input": test_input,
|
| 67 |
+
"parsed_result": parsed_flow,
|
| 68 |
+
"error": error_message,
|
| 69 |
+
"cost": total_cost,
|
| 70 |
+
"status": status,
|
| 71 |
+
}
|
| 72 |
+
except Exception as e:
|
| 73 |
+
return {
|
| 74 |
+
"id": test_id,
|
| 75 |
+
"input": test_input,
|
| 76 |
+
"parsed_result": {},
|
| 77 |
+
"error": f"Exception: {str(e)}",
|
| 78 |
+
"cost": total_cost,
|
| 79 |
+
"status": "โ Error"
|
| 80 |
+
}
|
| 81 |
+
|
| 82 |
+
def main():
|
| 83 |
+
"""ํ
์คํธ๋ฅผ ์ค๋น, ์คํํ๊ณ ๋ณด๊ณ ์๋ฅผ ์์ฑํ๋ ๋ฉ์ธ ํจ์"""
|
| 84 |
+
print(f"์ด {NUM_TESTS}๊ฐ์ ํ
์คํธ๋ฅผ {NUM_PROCESSES}๊ฐ ํ๋ก์ธ์ค๋ก ๋ณ๋ ฌ ์คํํฉ๋๋ค...")
|
| 85 |
+
|
| 86 |
+
test_inputs = []
|
| 87 |
+
for i in range(NUM_TESTS):
|
| 88 |
+
company = random.choice(example_companies)
|
| 89 |
+
job_title, jd = random.choice(list(example_jobs_jds.items()))
|
| 90 |
+
question_template = random.choice(list(example_questions.values()))
|
| 91 |
+
question = question_template.format(company_name=company, job_title=job_title)
|
| 92 |
+
experience = random.choice(experience_levels)
|
| 93 |
+
conversation = random.choice(example_conversations)
|
| 94 |
+
|
| 95 |
+
test_input = {
|
| 96 |
+
"company_name": company,
|
| 97 |
+
"jd": jd,
|
| 98 |
+
"question": question,
|
| 99 |
+
"experience_level": experience,
|
| 100 |
+
"conversation": conversation
|
| 101 |
+
}
|
| 102 |
+
test_inputs.append((i + 1, test_input))
|
| 103 |
+
|
| 104 |
+
results = []
|
| 105 |
+
with multiprocessing.Pool(processes=NUM_PROCESSES) as pool:
|
| 106 |
+
with tqdm(total=NUM_TESTS, desc="๋ต๋ณ ํ๋ฆ ์์ฑ ํ
์คํธ") as pbar:
|
| 107 |
+
for result in pool.imap_unordered(run_test, test_inputs):
|
| 108 |
+
results.append(result)
|
| 109 |
+
pbar.update()
|
| 110 |
+
|
| 111 |
+
results.sort(key=lambda x: x['id'])
|
| 112 |
+
print("๋ชจ๋ ํ
์คํธ๊ฐ ์๋ฃ๋์์ต๋๋ค.")
|
| 113 |
+
|
| 114 |
+
now = datetime.datetime.now()
|
| 115 |
+
report_filename = f"answer_flow_report_{now.strftime('%Y%m%d_%H%M%S')}.html"
|
| 116 |
+
|
| 117 |
+
failure_count = sum(1 for r in results if "Success" not in r["status"])
|
| 118 |
+
total_cost = sum(r['cost'] for r in results)
|
| 119 |
+
failure_rate = (failure_count / NUM_TESTS) * 100 if NUM_TESTS > 0 else 0
|
| 120 |
+
|
| 121 |
+
html_template = """
|
| 122 |
+
<!DOCTYPE html><html lang="ko"><head><meta charset="UTF-8"><title>๋ต๋ณ ํ๋ฆ ์์ฑ ํ
์คํธ ๋ณด๊ณ ์</title>
|
| 123 |
+
<style>body{{font-family:sans-serif;margin:20px;}} h1,h2{{text-align:center;}} .summary{{border:1px solid #ddd;padding:20px;margin-bottom:20px;}} table{{width:100%;border-collapse:collapse;}} th,td{{border:1px solid #ddd;padding:8px;text-align:left;vertical-align:top;}} th{{background-color:#f2f2f2;}} .status-success{{color:green;font-weight:bold;}} .status-failure{{color:red;font-weight:bold;}} pre{{white-space:pre-wrap;word-wrap:break-word;background-color:#f9f9f9;padding:10px;border:1px solid #ddd;}} .container{{max-width:1400px;margin:auto;}}</style>
|
| 124 |
+
</head><body><div class="container"><h1>๋ต๋ณ ํ๋ฆ ์์ฑ ํ
์คํธ ๋ณด๊ณ ์</h1><div class="summary"><h2>์์ฝ</h2><p><strong>ํ
์คํธ ์๊ฐ:</strong> {now}</p><p><strong>์ด ํ
์คํธ ์:</strong> {total_tests}</p><p><strong>์ฑ๊ณต:</strong> {success_count}</p><p><strong>์คํจ/์๋ฌ:</strong> {failure_count}</p><p><strong>์คํจ์จ:</strong> <span class="{status_class}">{failure_rate:.2f}%</span></p><p><strong>์ด ์์ ๋น์ฉ:</strong> ${total_cost:.6f}</p></div>
|
| 125 |
+
<h2>์์ธ ๊ฒฐ๊ณผ</h2><table><thead><tr><th>ID</th><th>์
๋ ฅ (Input)</th><th>ํ์ฑ ๊ฒฐ๊ณผ (Parsed)</th><th>์๋ฌ</th><th>๋น์ฉ</th><th>์ํ</th></tr></thead><tbody>{table_rows}</tbody></table></div></body></html>
|
| 126 |
+
"""
|
| 127 |
+
|
| 128 |
+
table_rows_html = ""
|
| 129 |
+
for res in results:
|
| 130 |
+
status_class = "status-success" if "Success" in res["status"] else "status-failure"
|
| 131 |
+
table_rows_html += f"""
|
| 132 |
+
<tr>
|
| 133 |
+
<td>{res['id']}</td>
|
| 134 |
+
<td><pre>{json.dumps(res['input'], indent=2, ensure_ascii=False)}</pre></td>
|
| 135 |
+
<td><pre>{json.dumps(res['parsed_result'], indent=2, ensure_ascii=False)}</pre></td>
|
| 136 |
+
<td><pre>{res['error']}</pre></td>
|
| 137 |
+
<td>${res['cost']:.6f}</td>
|
| 138 |
+
<td class="{status_class}">{res['status']}</td>
|
| 139 |
+
</tr>
|
| 140 |
+
"""
|
| 141 |
+
|
| 142 |
+
final_html = html_template.format(
|
| 143 |
+
now=now.strftime('%Y-%m-%d %H:%M:%S'),
|
| 144 |
+
total_tests=NUM_TESTS,
|
| 145 |
+
success_count=NUM_TESTS - failure_count,
|
| 146 |
+
failure_count=failure_count,
|
| 147 |
+
status_class="status-success" if failure_rate < 10 else "status-failure",
|
| 148 |
+
failure_rate=failure_rate,
|
| 149 |
+
total_cost=total_cost,
|
| 150 |
+
table_rows=table_rows_html
|
| 151 |
+
)
|
| 152 |
+
|
| 153 |
+
with open(report_filename, "w", encoding="utf-8") as f:
|
| 154 |
+
f.write(final_html)
|
| 155 |
+
|
| 156 |
+
print(f"'{report_filename}' ํ์ผ๋ก ๋ณด๊ณ ์๊ฐ ์ ์ฅ๋์์ต๋๋ค.")
|
| 157 |
+
print(f"์ด ์์ ๋น์ฉ: ${total_cost:.6f}")
|
| 158 |
+
|
| 159 |
+
if __name__ == "__main__":
|
| 160 |
+
main()
|
app.py
ADDED
|
@@ -0,0 +1,281 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import sys
|
| 3 |
+
|
| 4 |
+
# Force the project root onto the path
|
| 5 |
+
project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
|
| 6 |
+
if project_root not in sys.path:
|
| 7 |
+
sys.path.insert(0, project_root)
|
| 8 |
+
|
| 9 |
+
from dotenv import load_dotenv
|
| 10 |
+
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
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
# Load environment variables and initial data
|
| 21 |
+
load_dotenv()
|
| 22 |
+
|
| 23 |
+
# with open("prompt.yaml", "r", encoding='utf-8') as f:
|
| 24 |
+
# prompts = yaml.safe_load(f)
|
| 25 |
+
|
| 26 |
+
with open("example_info.json", "r", encoding='utf-8') as f:
|
| 27 |
+
# This now serves as the default values for the UI
|
| 28 |
+
default_info = json.load(f)
|
| 29 |
+
# word_limit ๊ธฐ๋ณธ๊ฐ ์ถ๊ฐ
|
| 30 |
+
if 'word_limit' not in default_info:
|
| 31 |
+
default_info['word_limit'] = 300
|
| 32 |
+
|
| 33 |
+
def user_submit(message, history):
|
| 34 |
+
"""์ฌ์ฉ์ ์
๋ ฅ์ ์ฒ๋ฆฌํ๊ณ , ์ฑ๋ด ๊ธฐ๋ก์ ์
๋ฐ์ดํธํฉ๋๋ค."""
|
| 35 |
+
if not message.strip():
|
| 36 |
+
return "", history
|
| 37 |
+
history.append([message, None])
|
| 38 |
+
return "", history
|
| 39 |
+
|
| 40 |
+
def bot_response(history, shared_info, progress=gr.Progress()):
|
| 41 |
+
"""๋ฉด์ ๊ด์ ์๋ต์ ์์ฑํ๊ณ ์งํ๋ฅ ์ ์
๋ฐ์ดํธํฉ๋๋ค."""
|
| 42 |
+
if not history or history[-1][1] is not None:
|
| 43 |
+
return history, gr.update(), gr.update()
|
| 44 |
+
|
| 45 |
+
conversation_str = ""
|
| 46 |
+
for h in history:
|
| 47 |
+
conversation_str += f"ํ์: {h[0]}\n"
|
| 48 |
+
if h[1]:
|
| 49 |
+
conversation_str += f"AI: {h[1]}\n"
|
| 50 |
+
|
| 51 |
+
format_info = shared_info.copy()
|
| 52 |
+
format_info['conversation'] = conversation_str
|
| 53 |
+
# word_limit ๊ธฐ๋ณธ๊ฐ ์ค์ (ํน์ ์์ ๊ฒฝ์ฐ๋ฅผ ๋๋น)
|
| 54 |
+
if 'word_limit' not in format_info:
|
| 55 |
+
format_info['word_limit'] = 300
|
| 56 |
+
|
| 57 |
+
history[-1][1] = ""
|
| 58 |
+
full_response = ""
|
| 59 |
+
for chunk in get_interviewer_response(format_info):
|
| 60 |
+
full_response += chunk
|
| 61 |
+
history[-1][1] = full_response
|
| 62 |
+
yield history, gr.update(), gr.update()
|
| 63 |
+
|
| 64 |
+
final_data = parse_json_from_response(full_response)
|
| 65 |
+
final_progress_update = gr.update()
|
| 66 |
+
final_reason_update = gr.update()
|
| 67 |
+
if final_data:
|
| 68 |
+
history[-1][1] = final_data.get("answer", "์๋ต์ ์ฒ๋ฆฌํ๋ ๋ฐ ์คํจํ์ต๋๋ค.")
|
| 69 |
+
final_progress = final_data.get("progress", 0)
|
| 70 |
+
reasoning = final_data.get("reasoning_for_progress", "")
|
| 71 |
+
|
| 72 |
+
if isinstance(final_progress, int) and 0 <= final_progress <= 100:
|
| 73 |
+
progress(final_progress / 100)
|
| 74 |
+
final_progress_update = f"์๊ธฐ์๊ฐ์ ์์ฑ๋: {final_progress}%"
|
| 75 |
+
if reasoning:
|
| 76 |
+
final_reason_update = gr.update(value=f"**์งํ ์ํฉ ๋ถ์:** {reasoning}", visible=True)
|
| 77 |
+
else:
|
| 78 |
+
final_reason_update = gr.update(visible=False)
|
| 79 |
+
|
| 80 |
+
if final_progress >= 100:
|
| 81 |
+
history.append([None, "๋ฉด์ ์ด ์ข
๋ฃ๋์์ต๋๋ค. ์๊ธฐ์๊ฐ์ ์์ฑ ํญ์ผ๋ก ์ด๋ํ์ธ์."])
|
| 82 |
+
|
| 83 |
+
yield history, final_progress_update, final_reason_update
|
| 84 |
+
|
| 85 |
+
|
| 86 |
+
def generate_ai_reply(history, shared_info, progress=gr.Progress()):
|
| 87 |
+
"""ํ์์ AI ๋ต๋ณ์ ์์ฑํ๊ณ , ๊ทธ์ ๋ํ ๋ฉด์ ๊ด์ ํ์ ์ง๋ฌธ์ ๋ฐ์ต๋๋ค."""
|
| 88 |
+
if not history or not history[-1][1]:
|
| 89 |
+
return history, gr.update(), gr.update()
|
| 90 |
+
|
| 91 |
+
conversation_str = ""
|
| 92 |
+
for h in history:
|
| 93 |
+
conversation_str += f"ํ์: {h[0]}\n"
|
| 94 |
+
if h[1]:
|
| 95 |
+
conversation_str += f"AI: {h[1]}\n"
|
| 96 |
+
|
| 97 |
+
format_info = shared_info.copy()
|
| 98 |
+
format_info['conversation'] = conversation_str
|
| 99 |
+
# word_limit ๊ธฐ๋ณธ๊ฐ ์ค์ (ํน์ ์์ ๊ฒฝ์ฐ๋ฅผ ๋๋น)
|
| 100 |
+
if 'word_limit' not in format_info:
|
| 101 |
+
format_info['word_limit'] = 300
|
| 102 |
+
|
| 103 |
+
student_answer_json = ""
|
| 104 |
+
history.append(["", None])
|
| 105 |
+
for chunk in get_student_response(format_info):
|
| 106 |
+
student_answer_json += chunk
|
| 107 |
+
parsed_data = parse_json_from_response(student_answer_json)
|
| 108 |
+
if parsed_data:
|
| 109 |
+
history[-1][0] = parsed_data.get("answer", "")
|
| 110 |
+
else:
|
| 111 |
+
history[-1][0] = student_answer_json
|
| 112 |
+
yield history, gr.update(), gr.update()
|
| 113 |
+
|
| 114 |
+
final_data = parse_json_from_response(student_answer_json)
|
| 115 |
+
if final_data:
|
| 116 |
+
history[-1][0] = final_data.get("answer", "์๋ต์ ์ฒ๋ฆฌํ๋ ๋ฐ ์คํจํ์ต๋๋ค.")
|
| 117 |
+
yield history, gr.update(), gr.update()
|
| 118 |
+
|
| 119 |
+
yield from bot_response(history, shared_info, progress=progress)
|
| 120 |
+
|
| 121 |
+
def generate_all_cover_letters(history, shared_info, progress=gr.Progress()):
|
| 122 |
+
"""๋ชจ๋ ์๊ธฐ์๊ฐ์ ๋ฌธํญ์ ๋ํ ๋ต๋ณ์ ์์ฑํ๊ณ ์งํ๋ฅ ์ ํ์ํฉ๋๋ค."""
|
| 123 |
+
if not history:
|
| 124 |
+
empty_outputs = [gr.update(value="๋ฉด์ ๋ํ๊ฐ ์์ต๋๋ค.")] * len(shared_info.get('questions', []))
|
| 125 |
+
empty_guidelines = [gr.update(value="")] * len(shared_info.get('questions', []))
|
| 126 |
+
return empty_outputs + empty_guidelines + [gr.update()]
|
| 127 |
+
|
| 128 |
+
# history -> conversation_history ํ์ ๋ณํ
|
| 129 |
+
conversation_str = ""
|
| 130 |
+
for h in history:
|
| 131 |
+
if h[0]: conversation_str += f"ํ์: {h[0]}\n"
|
| 132 |
+
if h[1]: conversation_str += f"AI: {h[1]}\n"
|
| 133 |
+
|
| 134 |
+
total_questions = len(shared_info.get('questions', []))
|
| 135 |
+
outputs = [""] * total_questions
|
| 136 |
+
guidelines = [""] * total_questions
|
| 137 |
+
|
| 138 |
+
format_info = shared_info.copy()
|
| 139 |
+
format_info['conversation'] = conversation_str
|
| 140 |
+
|
| 141 |
+
for i, question in enumerate(shared_info.get('questions', [])):
|
| 142 |
+
# 1๋จ๊ณ: Answer Flow Generation
|
| 143 |
+
progress_text = f"์๊ธฐ์๊ฐ์ ์์ฑ ์งํ๋ฅ : {int((i / total_questions) * 50)}% (๋ต๋ณ ํ๋ฆ ์์ฑ ์ค...)"
|
| 144 |
+
yield [gr.update(value=o) for o in outputs] + [gr.update(value=g) for g in guidelines] + [gr.update(value=progress_text, visible=True)]
|
| 145 |
+
|
| 146 |
+
flow_result, _ = generate_answer_flow(
|
| 147 |
+
question=question,
|
| 148 |
+
jd=format_info.get('jd', ''),
|
| 149 |
+
company_name=format_info.get('company_name', ''),
|
| 150 |
+
experience_level=format_info.get('experience_level', '์ ์
'),
|
| 151 |
+
conversation=conversation_str
|
| 152 |
+
)
|
| 153 |
+
|
| 154 |
+
flow_text = flow_result.get('flow', '') if flow_result else ''
|
| 155 |
+
guidelines[i] = flow_text # ๊ฐ์ด๋๋ผ์ธ ์ ์ฅ
|
| 156 |
+
|
| 157 |
+
# 2๋จ๊ณ: Cover Letter Response Generation
|
| 158 |
+
progress_text = f"์๊ธฐ์๊ฐ์ ์์ฑ ์งํ๋ฅ : {int((i / total_questions) * 50 + 25)}% (๋ต๋ณ ์์ฑ ์ค...)"
|
| 159 |
+
yield [gr.update(value=o) for o in outputs] + [gr.update(value=g) for g in guidelines] + [gr.update(value=progress_text, visible=True)]
|
| 160 |
+
|
| 161 |
+
full_response = ""
|
| 162 |
+
word_limit = shared_info.get('word_limit', 300) # shared_info์์ word_limit ๊ฐ์ ธ์ค๊ธฐ
|
| 163 |
+
for chunk in generate_cover_letter_response(question, [], format_info, flow_text, word_limit):
|
| 164 |
+
full_response += chunk
|
| 165 |
+
parsed_data = parse_json_from_response(full_response)
|
| 166 |
+
if parsed_data and 'answer' in parsed_data:
|
| 167 |
+
outputs[i] = parsed_data['answer']
|
| 168 |
+
else:
|
| 169 |
+
outputs[i] = full_response
|
| 170 |
+
|
| 171 |
+
overall_progress_val = (i + 0.75) / total_questions
|
| 172 |
+
progress_text = f"์๊ธฐ์๊ฐ์ ์์ฑ ์งํ๋ฅ : {int(overall_progress_val*100)}%"
|
| 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 |
+
# ์ต์ข
ํ์ฑ
|
| 176 |
+
final_data = parse_json_from_response(full_response)
|
| 177 |
+
if final_data and 'answer' in final_data:
|
| 178 |
+
outputs[i] = final_data['answer']
|
| 179 |
+
|
| 180 |
+
# ์๋ฃ
|
| 181 |
+
yield [gr.update(value=o) for o in outputs] + [gr.update(value=g) for g in guidelines] + [gr.update(visible=False)]
|
| 182 |
+
|
| 183 |
+
def update_guide_and_info(company, position, jd, questions_str, word_limit):
|
| 184 |
+
guide_json, _ = create_guide_from_llm(questions_str, jd, company, "์ ์
") # experience_level is hardcoded for now
|
| 185 |
+
|
| 186 |
+
if guide_json and "guide" in guide_json:
|
| 187 |
+
guide_text = guide_json["guide"]
|
| 188 |
+
else:
|
| 189 |
+
guide_text = "๊ฐ์ด๋ ์์ฑ์ ์คํจํ์ต๋๋ค. ์
๋ ฅ๊ฐ์ ํ์ธํด์ฃผ์ธ์."
|
| 190 |
+
|
| 191 |
+
new_info = default_info.copy()
|
| 192 |
+
new_info.update({
|
| 193 |
+
"company_name": company,
|
| 194 |
+
"position_title": position,
|
| 195 |
+
"jd": jd,
|
| 196 |
+
"questions": [q.strip() for q in questions_str.strip().split('\n') if q.strip()],
|
| 197 |
+
"guide": guide_text,
|
| 198 |
+
"word_limit": word_limit
|
| 199 |
+
})
|
| 200 |
+
|
| 201 |
+
# Return new state and update for the guide display
|
| 202 |
+
return new_info, guide_text
|
| 203 |
+
|
| 204 |
+
# --- Gradio UI ---
|
| 205 |
+
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
| 206 |
+
shared_info = gr.State(default_info)
|
| 207 |
+
|
| 208 |
+
with gr.Tabs() as tabs:
|
| 209 |
+
with gr.TabItem("๊ฐ์ด๋ ์์ฑ", id=0):
|
| 210 |
+
gr.Markdown("## ๐ ์๊ธฐ์๊ฐ์ ์ ๋ณด ์
๋ ฅ")
|
| 211 |
+
gr.Markdown("๋ฉด์ ์๋ฎฌ๋ ์ด์
์ ํ์ํ ์ ๋ณด๋ฅผ ์
๋ ฅํ๊ณ '๊ฐ์ด๋ ์์ฑ' ๋ฒํผ์ ๋๋ฌ์ฃผ์ธ์.")
|
| 212 |
+
with gr.Row():
|
| 213 |
+
company_name_input = gr.Textbox(label="ํ์ฌ๋ช
", value=default_info.get("company_name"))
|
| 214 |
+
position_title_input = gr.Textbox(label="์ง๋ฌด๋ช
", value=default_info.get("position_title"))
|
| 215 |
+
jd_input = gr.Textbox(label="Job Description (JD)", lines=5, value=default_info.get("jd"))
|
| 216 |
+
questions_input = gr.Textbox(label="์๊ธฐ์๊ฐ์ ์ง๋ฌธ (ํ ์ค์ ํ ๊ฐ์ฉ)", lines=3, value="\n".join(default_info.get("questions", [])))
|
| 217 |
+
|
| 218 |
+
with gr.Row():
|
| 219 |
+
word_limit_input = gr.Number(
|
| 220 |
+
label="์๊ธฐ์๊ฐ์ ๊ธ์์ ์ ํ",
|
| 221 |
+
value=300,
|
| 222 |
+
minimum=100,
|
| 223 |
+
maximum=1000,
|
| 224 |
+
step=50,
|
| 225 |
+
info="์๊ธฐ์๊ฐ์ ๊ฐ ๋ฌธํญ๋ณ ๊ธ์์ ์ ํ์ ์ค์ ํ์ธ์."
|
| 226 |
+
)
|
| 227 |
+
|
| 228 |
+
generate_guide_btn = gr.Button("๊ฐ์ด๋ ์์ฑ", variant="primary")
|
| 229 |
+
guide_output = gr.Markdown(label="์์ฑ๋ ๏ฟฝ๏ฟฝ์ด๋", value=f"**๊ฐ์ด๋:**\n{default_info.get('guide')}")
|
| 230 |
+
|
| 231 |
+
with gr.TabItem("๋ฉด์ ๋ํ", id=1):
|
| 232 |
+
gr.Markdown("## ๐ฌ ๋ฉด์ ์๋ฎฌ๋ ์ด์
")
|
| 233 |
+
gr.Markdown("๋ฉด์ ๊ด์ ์ง๋ฌธ์ ๋ต๋ณํ๊ฑฐ๋, 'AI ๋ต๋ณ ์์ฑ' ๋ฒํผ์ ๋๋ฌ๋ณด์ธ์. ๋ฉด์ ๊ด์ด ํ๋จํ๋ ์๊ธฐ์๊ฐ์ ์์ฑ๋๊ฐ 100%๊ฐ ๋๋ฉด ๋ฉด์ ์ด ์ข
๋ฃ๋ฉ๋๋ค.")
|
| 234 |
+
|
| 235 |
+
with gr.Row():
|
| 236 |
+
progress_display = gr.Markdown("์๊ธฐ์๊ฐ์ ์์ฑ๋: 0%")
|
| 237 |
+
reason_display = gr.Markdown("", visible=False)
|
| 238 |
+
chatbot = gr.Chatbot(label="๋ฉด์ ๋ํ", bubble_full_width=False, avatar_images=("๐ค", "๐"), height=500)
|
| 239 |
+
msg = gr.Textbox(label="๋ฉ์์ง ์
๋ ฅ", placeholder="๋ฉ์์ง๋ฅผ ์
๋ ฅํ์ธ์...", lines=2)
|
| 240 |
+
with gr.Row():
|
| 241 |
+
submit_btn = gr.Button("์ ์ก", variant="primary")
|
| 242 |
+
ai_reply_btn = gr.Button("AI ๋ต๋ณ ์์ฑ", variant="secondary")
|
| 243 |
+
clear_btn = gr.Button("์ด๊ธฐํ")
|
| 244 |
+
|
| 245 |
+
with gr.TabItem("์๊ธฐ์๊ฐ์ ์์ฑ", id=2):
|
| 246 |
+
gr.Markdown("## ๐ ์๊ธฐ์๊ฐ์ ๋ต๋ณ ์์ฑ")
|
| 247 |
+
gr.Markdown("๋ฉด์ ์ด ์๋ฃ๋๋ฉด ๋ํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์๊ธฐ์๊ฐ์ ๋ต๋ณ์ ์์ฑํฉ๋๋ค.")
|
| 248 |
+
|
| 249 |
+
generate_btn = gr.Button("์๊ธฐ์๊ฐ์ ์์ฑ ์์", variant="primary", size="lg")
|
| 250 |
+
cover_letter_progress_display = gr.Markdown("", visible=False)
|
| 251 |
+
|
| 252 |
+
cover_letter_outputs = []
|
| 253 |
+
guideline_outputs = []
|
| 254 |
+
for i, question in enumerate(default_info.get('questions', [])):
|
| 255 |
+
with gr.Accordion(f"๋ฌธํญ {i+1}: {question[:50]}...", open=True):
|
| 256 |
+
gr.Markdown(f"**{question}**")
|
| 257 |
+
|
| 258 |
+
with gr.Tabs():
|
| 259 |
+
with gr.TabItem("์์ฑ๋ ๋ต๋ณ"):
|
| 260 |
+
output = gr.Textbox(label=f"๋ต๋ณ {i+1}", lines=8, interactive=False)
|
| 261 |
+
cover_letter_outputs.append(output)
|
| 262 |
+
|
| 263 |
+
with gr.TabItem("๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ"):
|
| 264 |
+
guideline = gr.Markdown(value="๊ฐ์ด๋๋ผ์ธ์ด ์์ฑ๋๋ฉด ์ฌ๊ธฐ์ ํ์๋ฉ๋๋ค.")
|
| 265 |
+
guideline_outputs.append(guideline)
|
| 266 |
+
|
| 267 |
+
# Event Handlers
|
| 268 |
+
generate_guide_btn.click(
|
| 269 |
+
fn=update_guide_and_info,
|
| 270 |
+
inputs=[company_name_input, position_title_input, jd_input, questions_input, word_limit_input],
|
| 271 |
+
outputs=[shared_info, guide_output]
|
| 272 |
+
)
|
| 273 |
+
|
| 274 |
+
submit_btn.click(user_submit, [msg, chatbot], [msg, chatbot]).then(bot_response, [chatbot, shared_info], [chatbot, progress_display, reason_display])
|
| 275 |
+
msg.submit(user_submit, [msg, chatbot], [msg, chatbot]).then(bot_response, [chatbot, shared_info], [chatbot, progress_display, reason_display])
|
| 276 |
+
ai_reply_btn.click(generate_ai_reply, [chatbot, shared_info], [chatbot, progress_display, reason_display])
|
| 277 |
+
clear_btn.click(lambda: ([], "์๊ธฐ์๊ฐ์ ์์ฑ๋: 0%", ""), None, [chatbot, progress_display, reason_display], queue=False)
|
| 278 |
+
generate_btn.click(generate_all_cover_letters, [chatbot, shared_info], cover_letter_outputs + guideline_outputs + [cover_letter_progress_display])
|
| 279 |
+
|
| 280 |
+
if __name__ == "__main__":
|
| 281 |
+
demo.launch(share=True)
|
chat/.gradio/certificate.pem
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
-----BEGIN CERTIFICATE-----
|
| 2 |
+
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
|
| 3 |
+
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
|
| 4 |
+
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
|
| 5 |
+
WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
|
| 6 |
+
ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
|
| 7 |
+
MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
|
| 8 |
+
h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
|
| 9 |
+
0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
|
| 10 |
+
A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
|
| 11 |
+
T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
|
| 12 |
+
B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
|
| 13 |
+
B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
|
| 14 |
+
KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
|
| 15 |
+
OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
|
| 16 |
+
jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
|
| 17 |
+
qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
|
| 18 |
+
rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
|
| 19 |
+
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
|
| 20 |
+
hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
|
| 21 |
+
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
|
| 22 |
+
3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
|
| 23 |
+
NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
|
| 24 |
+
ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
|
| 25 |
+
TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
|
| 26 |
+
jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
|
| 27 |
+
oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
|
| 28 |
+
4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
|
| 29 |
+
mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
|
| 30 |
+
emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
|
| 31 |
+
-----END CERTIFICATE-----
|
chat/__init__.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
# This file can be empty. It marks the directory as a Python package.
|
chat/__pycache__/__init__.cpython-312.pyc
ADDED
|
Binary file (149 Bytes). View file
|
|
|
chat/__pycache__/llm_functions.cpython-312.pyc
ADDED
|
Binary file (4.9 kB). View file
|
|
|
chat/__pycache__/main.cpython-312.pyc
ADDED
|
Binary file (13.4 kB). View file
|
|
|
chat/app.py
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import sys
|
| 3 |
+
|
| 4 |
+
# Force the project root onto the path
|
| 5 |
+
project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
|
| 6 |
+
if project_root not in sys.path:
|
| 7 |
+
sys.path.insert(0, project_root)
|
| 8 |
+
|
| 9 |
+
from dotenv import load_dotenv
|
| 10 |
+
import gradio as gr
|
| 11 |
+
import yaml
|
| 12 |
+
import json
|
| 13 |
+
import re
|
| 14 |
+
from 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 |
+
|
| 18 |
+
|
| 19 |
+
# Load environment variables and initial data
|
| 20 |
+
load_dotenv()
|
| 21 |
+
|
| 22 |
+
with open("prompt.yaml", "r", encoding='utf-8') as f:
|
| 23 |
+
prompts = yaml.safe_load(f)
|
| 24 |
+
|
| 25 |
+
with open("example_info.json", "r", encoding='utf-8') as f:
|
| 26 |
+
# This now serves as the default values for the UI
|
| 27 |
+
default_info = json.load(f)
|
| 28 |
+
|
| 29 |
+
def user_submit(message, history):
|
| 30 |
+
"""์ฌ์ฉ์ ์
๋ ฅ์ ์ฒ๋ฆฌํ๊ณ , ์ฑ๋ด ๊ธฐ๋ก์ ์
๋ฐ์ดํธํฉ๋๋ค."""
|
| 31 |
+
if not message.strip():
|
| 32 |
+
return "", history
|
| 33 |
+
history.append([message, None])
|
| 34 |
+
return "", history
|
| 35 |
+
|
| 36 |
+
def bot_response(history, shared_info, progress=gr.Progress()):
|
| 37 |
+
"""๋ฉด์ ๊ด์ ์๋ต์ ์์ฑํ๊ณ ์งํ๋ฅ ์ ์
๋ฐ์ดํธํฉ๋๋ค."""
|
| 38 |
+
if not history or history[-1][1] is not None:
|
| 39 |
+
return history, gr.update()
|
| 40 |
+
|
| 41 |
+
conversation_str = ""
|
| 42 |
+
for h in history:
|
| 43 |
+
conversation_str += f"ํ์: {h[0]}\n"
|
| 44 |
+
if h[1]:
|
| 45 |
+
conversation_str += f"AI: {h[1]}\n"
|
| 46 |
+
|
| 47 |
+
format_info = shared_info.copy()
|
| 48 |
+
format_info['conversation'] = conversation_str
|
| 49 |
+
|
| 50 |
+
history[-1][1] = ""
|
| 51 |
+
full_response = ""
|
| 52 |
+
for chunk in get_interviewer_response(format_info):
|
| 53 |
+
full_response += chunk
|
| 54 |
+
history[-1][1] = full_response
|
| 55 |
+
yield history, gr.update()
|
| 56 |
+
|
| 57 |
+
final_data = parse_json_from_response(full_response)
|
| 58 |
+
final_progress_update = gr.update()
|
| 59 |
+
if final_data:
|
| 60 |
+
history[-1][1] = final_data.get("answer", "์๋ต์ ์ฒ๋ฆฌํ๋ ๋ฐ ์คํจํ์ต๋๋ค.")
|
| 61 |
+
final_progress = final_data.get("progress", 0)
|
| 62 |
+
if isinstance(final_progress, int) and 0 <= final_progress <= 100:
|
| 63 |
+
progress(final_progress / 100)
|
| 64 |
+
final_progress_update = f"์๊ธฐ์๊ฐ์ ์์ฑ๋: {final_progress}%"
|
| 65 |
+
|
| 66 |
+
if final_progress >= 100:
|
| 67 |
+
history.append([None, "๋ฉด์ ์ด ์ข
๋ฃ๋์์ต๋๋ค. ์๊ธฐ์๊ฐ์ ์์ฑ ํญ์ผ๋ก ์ด๋ํ์ธ์."])
|
| 68 |
+
|
| 69 |
+
yield history, final_progress_update
|
| 70 |
+
|
| 71 |
+
|
| 72 |
+
def generate_ai_reply(history, shared_info, progress=gr.Progress()):
|
| 73 |
+
"""ํ์์ AI ๋ต๋ณ์ ์์ฑํ๊ณ , ๊ทธ์ ๋ํ ๋ฉด์ ๊ด์ ํ์ ์ง๋ฌธ์ ๋ฐ์ต๋๋ค."""
|
| 74 |
+
if not history or not history[-1][1]:
|
| 75 |
+
return history, gr.update()
|
| 76 |
+
|
| 77 |
+
conversation_str = ""
|
| 78 |
+
for h in history:
|
| 79 |
+
conversation_str += f"ํ์: {h[0]}\n"
|
| 80 |
+
if h[1]:
|
| 81 |
+
conversation_str += f"AI: {h[1]}\n"
|
| 82 |
+
|
| 83 |
+
format_info = shared_info.copy()
|
| 84 |
+
format_info['conversation'] = conversation_str
|
| 85 |
+
|
| 86 |
+
student_answer_json = ""
|
| 87 |
+
history.append(["", None])
|
| 88 |
+
for chunk in get_student_response(format_info):
|
| 89 |
+
student_answer_json += chunk
|
| 90 |
+
parsed_data = parse_json_from_response(student_answer_json)
|
| 91 |
+
if parsed_data:
|
| 92 |
+
history[-1][0] = parsed_data.get("answer", "")
|
| 93 |
+
else:
|
| 94 |
+
history[-1][0] = student_answer_json
|
| 95 |
+
yield history, gr.update()
|
| 96 |
+
|
| 97 |
+
final_data = parse_json_from_response(student_answer_json)
|
| 98 |
+
if final_data:
|
| 99 |
+
history[-1][0] = final_data.get("answer", "์๋ต์ ์ฒ๋ฆฌํ๋ ๋ฐ ์คํจํ์ต๋๋ค.")
|
| 100 |
+
yield history, gr.update()
|
| 101 |
+
|
| 102 |
+
yield from bot_response(history, shared_info, progress=progress)
|
| 103 |
+
|
| 104 |
+
def generate_all_cover_letters(history, shared_info, word_limit, progress=gr.Progress()):
|
| 105 |
+
"""๋ชจ๋ ์๊ธฐ์๊ฐ์ ๋ฌธํญ์ ๋ํ ๋ต๋ณ์ ์์ฑํ๊ณ ์งํ๋ฅ ์ ํ์ํฉ๋๋ค."""
|
| 106 |
+
if not history:
|
| 107 |
+
yield [gr.update(value="๋ฉด์ ๋ํ๊ฐ ์์ต๋๋ค.")] * len(shared_info.get('questions', [])) + [gr.update()]
|
| 108 |
+
return
|
| 109 |
+
|
| 110 |
+
conversation_str = ""
|
| 111 |
+
for h in history:
|
| 112 |
+
if h[0]: conversation_str += f"ํ์: {h[0]}\n"
|
| 113 |
+
if h[1]: conversation_str += f"AI: {h[1]}\n"
|
| 114 |
+
|
| 115 |
+
total_questions = len(shared_info.get('questions', []))
|
| 116 |
+
outputs = [""] * total_questions
|
| 117 |
+
|
| 118 |
+
format_info = shared_info.copy()
|
| 119 |
+
format_info['conversation'] = conversation_str
|
| 120 |
+
|
| 121 |
+
for i, question in enumerate(shared_info.get('questions', [])):
|
| 122 |
+
full_response = ""
|
| 123 |
+
flow = shared_info.get('guide', '')
|
| 124 |
+
for chunk in generate_cover_letter_response(question, [], format_info, flow, word_limit):
|
| 125 |
+
full_response += chunk
|
| 126 |
+
parsed_data = parse_json_from_response(full_response)
|
| 127 |
+
if parsed_data and 'answer' in parsed_data:
|
| 128 |
+
outputs[i] = parsed_data['answer']
|
| 129 |
+
else:
|
| 130 |
+
outputs[i] = full_response # Fallback to full response
|
| 131 |
+
|
| 132 |
+
overall_progress_val = (i + 1) / total_questions
|
| 133 |
+
progress(overall_progress_val)
|
| 134 |
+
progress_text = f"์๊ธฐ์๊ฐ์ ์์ฑ ์งํ๋ฅ : {int(overall_progress_val*100)}%"
|
| 135 |
+
yield [gr.update(value=o) for o in outputs] + [gr.update(value=progress_text, visible=True)]
|
| 136 |
+
|
| 137 |
+
final_outputs = []
|
| 138 |
+
for o in outputs:
|
| 139 |
+
final_data = parse_json_from_response(o)
|
| 140 |
+
if final_data and 'answer' in final_data:
|
| 141 |
+
final_outputs.append(gr.update(value=final_data['answer']))
|
| 142 |
+
else:
|
| 143 |
+
final_outputs.append(gr.update(value=o))
|
| 144 |
+
|
| 145 |
+
yield final_outputs + [gr.update(visible=False)]
|
| 146 |
+
|
| 147 |
+
def update_guide_and_info(company, position, jd, questions_str):
|
| 148 |
+
guide_json, _ = create_guide_from_llm(questions_str, jd, company, "์ ์
") # experience_level is hardcoded for now
|
| 149 |
+
|
| 150 |
+
if guide_json and "guide" in guide_json:
|
| 151 |
+
guide_text = guide_json["guide"]
|
| 152 |
+
else:
|
| 153 |
+
guide_text = "๊ฐ์ด๋ ์์ฑ์ ์คํจํ์ต๋๋ค. ์
๋ ฅ๊ฐ์ ํ์ธํด์ฃผ์ธ์."
|
| 154 |
+
|
| 155 |
+
new_info = default_info.copy()
|
| 156 |
+
new_info.update({
|
| 157 |
+
"company_name": company,
|
| 158 |
+
"position_title": position,
|
| 159 |
+
"jd": jd,
|
| 160 |
+
"questions": [q.strip() for q in questions_str.strip().split('\n') if q.strip()],
|
| 161 |
+
"guide": guide_text
|
| 162 |
+
})
|
| 163 |
+
|
| 164 |
+
# Return new state and update for the guide display
|
| 165 |
+
return new_info, guide_text
|
| 166 |
+
|
| 167 |
+
# --- Gradio UI ---
|
| 168 |
+
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
| 169 |
+
shared_info = gr.State(default_info)
|
| 170 |
+
|
| 171 |
+
with gr.Tabs() as tabs:
|
| 172 |
+
with gr.TabItem("๊ฐ์ด๋ ์์ฑ", id=0):
|
| 173 |
+
gr.Markdown("## ๐ ์๊ธฐ์๊ฐ์ ์ ๋ณด ์
๋ ฅ")
|
| 174 |
+
gr.Markdown("๋ฉด์ ์๋ฎฌ๋ ์ด์
์ ํ์ํ ์ ๋ณด๋ฅผ ์
๋ ฅํ๊ณ '๊ฐ์ด๋ ์์ฑ' ๋ฒํผ์ ๋๋ฌ์ฃผ์ธ์.")
|
| 175 |
+
with gr.Row():
|
| 176 |
+
company_name_input = gr.Textbox(label="ํ์ฌ๋ช
", value=default_info.get("company_name"))
|
| 177 |
+
position_title_input = gr.Textbox(label="์ง๋ฌด๋ช
", value=default_info.get("position_title"))
|
| 178 |
+
jd_input = gr.Textbox(label="Job Description (JD)", lines=5, value=default_info.get("jd"))
|
| 179 |
+
questions_input = gr.Textbox(label="์๊ธฐ์๊ฐ์ ์ง๋ฌธ (ํ ์ค์ ํ ๊ฐ์ฉ)", lines=3, value="\n".join(default_info.get("questions", [])))
|
| 180 |
+
|
| 181 |
+
generate_guide_btn = gr.Button("๊ฐ์ด๋ ์์ฑ", variant="primary")
|
| 182 |
+
guide_output = gr.Markdown(label="์์ฑ๋ ๊ฐ์ด๋", value=f"**๊ฐ์ด๋:**\n{default_info.get('guide')}")
|
| 183 |
+
|
| 184 |
+
with gr.TabItem("๋ฉด์ ๋ํ", id=1):
|
| 185 |
+
gr.Markdown("## ๐ฌ ๋ฉด์ ์๋ฎฌ๋ ์ด์
")
|
| 186 |
+
gr.Markdown("๋ฉด์ ๊ด์ ์ง๋ฌธ์ ๋ต๋ณํ๊ฑฐ๋, 'AI ๋ต๋ณ ์์ฑ' ๋ฒํผ์ ๋๋ฌ๋ณด์ธ์. ๋ฉด์ ๊ด์ด ํ๋จํ๋ ์๊ธฐ์๊ฐ์ ์์ฑ๋๊ฐ 100%๊ฐ ๋๋ฉด ๋ฉด์ ์ด ์ข
๋ฃ๋ฉ๋๋ค.")
|
| 187 |
+
progress_display = gr.Markdown("์๊ธฐ์๊ฐ์ ์์ฑ๋: 0%")
|
| 188 |
+
chatbot = gr.Chatbot(label="๋ฉด์ ๋ํ", bubble_full_width=False, avatar_images=("๐ค", "๐"), height=500)
|
| 189 |
+
msg = gr.Textbox(label="๋ฉ์์ง ์
๋ ฅ", placeholder="๋ฉ์์ง๋ฅผ ์
๋ ฅํ์ธ์...", lines=2)
|
| 190 |
+
with gr.Row():
|
| 191 |
+
submit_btn = gr.Button("์ ์ก", variant="primary")
|
| 192 |
+
ai_reply_btn = gr.Button("AI ๋ต๋ณ ์์ฑ", variant="secondary")
|
| 193 |
+
clear_btn = gr.Button("์ด๊ธฐํ")
|
| 194 |
+
|
| 195 |
+
with gr.TabItem("์๊ธฐ์๊ฐ์ ์์ฑ", id=2):
|
| 196 |
+
gr.Markdown("## ๐ ์๊ธฐ์๊ฐ์ ๋ต๋ณ ์์ฑ")
|
| 197 |
+
gr.Markdown("๋ฉด์ ์ด ์๋ฃ๋๋ฉด ๋ํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์๊ธฐ์๊ฐ์ ๋ต๋ณ์ ์์ฑํฉ๋๋ค.")
|
| 198 |
+
word_limit_input = gr.Number(label="๋จ์ด ์ ์ ํ", value=500)
|
| 199 |
+
generate_btn = gr.Button("์๊ธฐ์๊ฐ์ ์์ฑ ์์", variant="primary", size="lg")
|
| 200 |
+
cover_letter_progress_display = gr.Markdown("", visible=False)
|
| 201 |
+
cover_letter_outputs = [gr.Textbox(label=f"๋ต๋ณ {i+1}", lines=8, interactive=False) for i, q in enumerate(default_info.get('questions',[]))]
|
| 202 |
+
|
| 203 |
+
# Event Handlers
|
| 204 |
+
generate_guide_btn.click(
|
| 205 |
+
fn=update_guide_and_info,
|
| 206 |
+
inputs=[company_name_input, position_title_input, jd_input, questions_input],
|
| 207 |
+
outputs=[shared_info, guide_output]
|
| 208 |
+
)
|
| 209 |
+
|
| 210 |
+
submit_btn.click(user_submit, [msg, chatbot], [msg, chatbot]).then(bot_response, [chatbot, shared_info], [chatbot, progress_display])
|
| 211 |
+
msg.submit(user_submit, [msg, chatbot], [msg, chatbot]).then(bot_response, [chatbot, shared_info], [chatbot, progress_display])
|
| 212 |
+
ai_reply_btn.click(generate_ai_reply, [chatbot, shared_info], [chatbot, progress_display])
|
| 213 |
+
clear_btn.click(lambda: ([], "์๊ธฐ์๊ฐ์ ์์ฑ๋: 0%"), None, [chatbot, progress_display], queue=False)
|
| 214 |
+
generate_btn.click(generate_all_cover_letters, [chatbot, shared_info, word_limit_input], cover_letter_outputs + [cover_letter_progress_display])
|
| 215 |
+
|
| 216 |
+
if __name__ == "__main__":
|
| 217 |
+
demo.launch(share=True)
|
chat/example_info.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"company_name": "์นด์นด์ค",
|
| 3 |
+
"industry": "IT/์ํํธ์จ์ด",
|
| 4 |
+
"position_title": "๋ฐฑ์๋ ๊ฐ๋ฐ์",
|
| 5 |
+
"core_values": "ํ์ ์ฑ, ํ์
๋ฅ๋ ฅ, ๋์ ์ ์ ",
|
| 6 |
+
"company_size": "๋๊ธฐ์
",
|
| 7 |
+
"context_report": "์นด์นด์ค๋ ์ต๊ทผ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ
์ฒ๋ก์ ์ ํ์ ์งํ ์ค์ด๋ฉฐ, ํ์ ๊ณผ ํ์
์ ์ค์ํ๋ ๊ธฐ์
๋ฌธํ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.",
|
| 8 |
+
"jd": "๋ฐฑ์๋ ๊ฐ๋ฐ์๋ก์ ๋๊ท๋ชจ ํธ๋ํฝ ์ฒ๋ฆฌ, ๋ง์ดํฌ๋ก์๋น์ค ์ค๊ณ ๋ฐ ์ด์, RESTful API ๊ฐ๋ฐ ๊ฒฝํ์ด ์๊ตฌ๋ฉ๋๋ค.",
|
| 9 |
+
"recent_issue": "ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ
์ฒ๋ก์ ์ ํ ์งํ ์ค",
|
| 10 |
+
"student_name": "๊น์ฒ ์",
|
| 11 |
+
"student_major": "์ปดํจํฐ๊ณตํ๊ณผ",
|
| 12 |
+
"student_status": "4ํ๋
",
|
| 13 |
+
"experience_summary": "ํ๋ถ ์์ ๋ค์ํ ํ ํ๋ก์ ํธ์ ์ธํด ๊ฒฝํ์ ํตํด ํ์
๊ณผ ๋ฌธ์ ํด๊ฒฐ ๋ฅ๋ ฅ์ ํค์ ์ผ๋ฉฐ, ๋ฐฑ์๋ ๊ฐ๋ฐ ๊ด๋ จ ํ๋ก์ ํธ๋ฅผ ๋ค์ ์ํํ์์ต๋๋ค.",
|
| 14 |
+
"guide": "- ์ฑ์ฅ ๊ณผ์ : ์ง์์์ ๊ฐ์น๊ด์ ์ํฅ์ ๋ฏธ์น ๊ฒฐ์ ์ ์ธ ๊ฒฝํ์ด๋ ์ฌ๊ฑด์ ๋ํด ์ง๋ฌธํ์ฌ, ์ถ์ ํ๋์ ์ ๋
์ ํ์
ํฉ๋๋ค.\\n- ๊ฐ์ : ์ง๋ฌด์ ๊ด๋ จ๋ ํต์ฌ ๊ฐ์ ์ ์ ์ ํ๊ณ , ๊ทธ ๊ฐ์ ์ ์ฆ๋ช
ํ ์ ์๋ ๊ตฌ์ฒด์ ์ธ ๊ฒฝํ๊ณผ ์ฌ๋ก๋ฅผ ๋ค์ด ์ค๋ช
ํ๋๋ก ์ ๋ํฉ๋๋ค.\\n- ๋จ์ : ์์งํ์ง๋ง ์น๋ช
์ ์ด์ง ์์ ๋จ์ ์ ์ธ๊ธํ๊ณ , ์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ์ด๋ค ๋
ธ๋ ฅ์ ํ๊ณ ์๋์ง ๊ตฌ์ฒด์ ์ผ๋ก ์ค๋ช
ํ๋๋ก ์ ๋ํฉ๋๋ค.",
|
| 15 |
+
"questions": [
|
| 16 |
+
"๋ณธ์ธ์ ์ฑ์ฅ ๊ณผ์ ๊ณผ ์ฑ๊ฒฉ์ ์ฅ๋จ์ ์ ๋ํด ์์ ํ์์ค."
|
| 17 |
+
]
|
| 18 |
+
}
|
| 19 |
+
|
chat/llm_functions.py
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from openai import OpenAI
|
| 2 |
+
import yaml
|
| 3 |
+
import os
|
| 4 |
+
import json
|
| 5 |
+
from dotenv import load_dotenv
|
| 6 |
+
|
| 7 |
+
load_dotenv()
|
| 8 |
+
|
| 9 |
+
# ํด๋ผ์ด์ธํธ ๋ฐ ํ๋กฌํํธ ์ด๊ธฐํ
|
| 10 |
+
client = OpenAI()
|
| 11 |
+
|
| 12 |
+
try:
|
| 13 |
+
current_dir = os.path.dirname(os.path.abspath(__file__))
|
| 14 |
+
prompt_path = os.path.join(current_dir, 'prompt.yaml')
|
| 15 |
+
with open(prompt_path, "r", encoding='utf-8') as file:
|
| 16 |
+
prompts = yaml.safe_load(file)
|
| 17 |
+
except Exception as e:
|
| 18 |
+
print(f"Warning: prompt.yaml ๋ก๋ ์คํจ. ๊ธฐ๋ณธ ํ๋กฌํํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ค๋ฅ: {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):
|
| 26 |
+
"""
|
| 27 |
+
์งํ๋ฅ (progress)์ ํฌํจํ ๋ฉด์ ๊ด์ ์๋ต์ ์คํธ๋ฆฌ๋ฐ์ผ๋ก ์์ฑํฉ๋๋ค.
|
| 28 |
+
"""
|
| 29 |
+
# ํ๋กฌํํธ ํฌ๋งคํ
์ ํ์ํ ๋ชจ๋ ๋ณ์๋ฅผ kwargs๋ก ๋ฌถ๊ธฐ
|
| 30 |
+
format_kwargs = {
|
| 31 |
+
**example_info
|
| 32 |
+
}
|
| 33 |
+
system_prompt = prompts.get("Interviewer", "").format(**format_kwargs)
|
| 34 |
+
|
| 35 |
+
with open("system_prompt.txt", "w", encoding='utf-8') as f:
|
| 36 |
+
f.write(system_prompt)
|
| 37 |
+
conversation = [{"role": "system", "content": "You must generate the response in json format."}, {"role": "user", "content": system_prompt}]
|
| 38 |
+
# for role, content in messages:
|
| 39 |
+
# conversation.append({"role": role, "content": content})
|
| 40 |
+
|
| 41 |
+
response_stream = client.chat.completions.create(
|
| 42 |
+
model="gpt-4o",
|
| 43 |
+
messages=conversation,
|
| 44 |
+
stream=True
|
| 45 |
+
)
|
| 46 |
+
for chunk in response_stream:
|
| 47 |
+
yield chunk.choices[0].delta.content or ""
|
| 48 |
+
|
| 49 |
+
def get_student_response(example_info):
|
| 50 |
+
"""ํ์์ AI ๋ต๋ณ์ ์คํธ๋ฆฌ๋ฐ์ผ๋ก ์์ฑํฉ๋๋ค."""
|
| 51 |
+
system_prompt = prompts.get("Student", "").format(**example_info)
|
| 52 |
+
|
| 53 |
+
conversation = [{"role": "system", "content": "You must generate the response in json format."}]
|
| 54 |
+
|
| 55 |
+
with open("student_input.txt", "w", encoding='utf-8') as f:
|
| 56 |
+
f.write(system_prompt)
|
| 57 |
+
# for speaker, content in history:
|
| 58 |
+
# conversation.append({"role": "user", "content": f"{speaker}: {content}"})
|
| 59 |
+
|
| 60 |
+
conversation.append({"role": "user", "content": f"{system_prompt}"})
|
| 61 |
+
|
| 62 |
+
response_stream = client.chat.completions.create(
|
| 63 |
+
model="gpt-4o",
|
| 64 |
+
messages=conversation,
|
| 65 |
+
stream=True
|
| 66 |
+
)
|
| 67 |
+
for chunk in response_stream:
|
| 68 |
+
yield chunk.choices[0].delta.content or ""
|
| 69 |
+
|
| 70 |
+
def generate_cover_letter_response(question, conversation_history, example_info, flow, word_limit):
|
| 71 |
+
"""
|
| 72 |
+
์งํ๋ฅ ์ ํฌํจํ์ฌ ์๊ธฐ์๊ฐ์ ๋ต๋ณ์ ์คํธ๋ฆฌ๋ฐ์ผ๋ก ์์ฑํฉ๋๋ค.
|
| 73 |
+
"""
|
| 74 |
+
# conversation_history๊ฐ ๋น์ด์์ผ๋ฉด example_info์ conversation์ ์ฌ์ฉ
|
| 75 |
+
if conversation_history:
|
| 76 |
+
conversation_text = "\n".join([f"{speaker}: {content}" for speaker, content in conversation_history])
|
| 77 |
+
else:
|
| 78 |
+
conversation_text = example_info.get('conversation', '')
|
| 79 |
+
|
| 80 |
+
# ํ์ํ ๋ณ์๋ค ์ถ์ถ
|
| 81 |
+
company_name = example_info.get('company_name', 'ํ์ฌ')
|
| 82 |
+
job_position = example_info.get('job_position', 'ํด๋น ์ง๋ฌด')
|
| 83 |
+
experience_level = example_info.get('experience_level', '์ ์
')
|
| 84 |
+
|
| 85 |
+
# ์งํ๋ฅ ํ์๋ฅผ ์์ฒญํ๋ ํ๋กฌํํธ
|
| 86 |
+
prompt = prompts.get("CoverLetter", "").format(
|
| 87 |
+
question=question,
|
| 88 |
+
guideline=flow,
|
| 89 |
+
company_name=company_name,
|
| 90 |
+
job_position=job_position,
|
| 91 |
+
experience_level=experience_level,
|
| 92 |
+
word_limit=word_limit,
|
| 93 |
+
conversation=conversation_text
|
| 94 |
+
)
|
| 95 |
+
|
| 96 |
+
response_stream = client.chat.completions.create(
|
| 97 |
+
model="gpt-4o",
|
| 98 |
+
messages=[{"role": "user", "content": prompt}],
|
| 99 |
+
stream=True
|
| 100 |
+
)
|
| 101 |
+
for chunk in response_stream:
|
| 102 |
+
yield chunk.choices[0].delta.content or ""
|
chat/prompt.yaml
ADDED
|
@@ -0,0 +1,368 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Interviewer: >
|
| 2 |
+
๋น์ ์ {company_name}์ ์ง์ํ๋ ค๋ ์ทจ์
์ค๋น์๊ณผ ๋ํ๋ฅผ ๋๋๋ ๋ฉด์ ์ค๋น ๊ณผ์ธ์ ์๋์
๋๋ค.
|
| 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 |
+
Job Description: {jd}
|
| 16 |
+
|
| 17 |
+
|
| 18 |
+
๐ ํ์ ์ ๋ณด:
|
| 19 |
+
- ์ด๋ฆ: {student_name}
|
| 20 |
+
- ์ ๊ณต: {student_major}
|
| 21 |
+
- ํ๋
/์กธ์
์ฌ๋ถ: {student_status} (์: 4ํ๋
, ์กธ์
์ ๋ฑ)
|
| 22 |
+
- ์ง์ ์ง๋ฌด: {position_title}
|
| 23 |
+
- ๊ฒฝํ ์ ๋ฆฌ: {experience_summary}
|
| 24 |
+
|
| 25 |
+
|
| 26 |
+
|
| 27 |
+
โ๏ธ ์งํ ๋ฐฉ์:
|
| 28 |
+
- ๋๋ฌด ๋ง์ ์ง๋ฌธ์ ํ ๋ฒ์ ํ์ง ๋ง๊ณ , ํ๋์ฉ ์์ฐ์ค๋ฝ๊ฒ ๋ฌป์ต๋๋ค. ์ง๋ฌธ์ ๋ฐ๋์ 10-15 ๋จ์ด ์ด๋ด๋ก ๋ตํ ์ ์๋ ๊ตฌ์ฒด์ ์ด๊ณ ์ฌ์ด ์ง๋ฌธ์ด์ด์ผ ํ๋ฉฐ, ํ๋ฒ์ ํ๋์ ์ง๋ฌธ๋ง ์์ด์ผ ํฉ๋๋ค.
|
| 29 |
+
- ํ์์ด ๊ตฌ์ฒด์ ์ผ๋ก ๋ตํ์ง ์์ ๊ฒฝ์ฐ, **ํ์ ์ง๋ฌธ**์ ํตํด ๋ ๋ง์ ๋ด์ฉ์ ์ด๋์ด๋
๋๋ค.
|
| 30 |
+
- ์๋ Progress๊ฐ 100์ด๋ผ๊ณ ์์ธก๋๋ฉด ๋ํ๊ฐ ์ข
๋ฃ๋ฉ๋๋ค.
|
| 31 |
+
|
| 32 |
+
|
| 33 |
+
๋ํ ์์:
|
| 34 |
+
AI: ์ ๊ณต ๊ณต๋ถํ๋ค๊ฐ '์, ํ๋ก ์ค๊ณ ์ข ์ฌ๋ฐ๋ค' ์ด๋ฐ ์๊ฐ ์์์ด?"
|
| 35 |
+
|
| 36 |
+
ํ์: ์โฆ ์บก์คํค ํ ๋?
|
| 37 |
+
|
| 38 |
+
AI: ์ค, ์บก์คํค ๋ ์ด๋ค ๊ฑฐ ํ์์ด?
|
| 39 |
+
|
| 40 |
+
ํ์: ์ ์ ๋ ฅ ํ๋ก ์ชฝโฆ ํ์์ด. SoC ๊ธฐ๋ฐ์ผ๋ก.
|
| 41 |
+
|
| 42 |
+
AI: ๊ทธ๋ ๋ญ๊ฐ ์ ์ผ ๊ธฐ์ต์ ๋จ์์ด?
|
| 43 |
+
|
| 44 |
+
ํ์: ์ค๊ณ ์กฐ๊ธ๋ง ๋ฐ๊ฟจ๋๋ฐ ์ฑ๋ฅ์ด ํ ๋ฌ๋ผ์ก๋ ๊ฑฐ?
|
| 45 |
+
๋๊ฒ ์ ๊ธฐํ์ด.
|
| 46 |
+
|
| 47 |
+
AI: ์ค, ๊ทธ๋ "ํ๋ก ์ค๊ณ๊ฐ ๋๊ฒ ์ค์ํ๊ตฌ๋" ๊ทธ๋ฐ ์๊ฐ๋ ๋ค์์ด?
|
| 48 |
+
|
| 49 |
+
ํ์: ์โฆ ๊ธฐ์ ์ด ์๋๋ผ ์ข ํต์ฌ ๊ฐ์์ด.
|
| 50 |
+
|
| 51 |
+
AI: ์ข์! ํน์ ์ผ์ฑ์ ์์์ ์ค์ต์ด๋ ์ธํด ๊ฐ์ ๊ฑฐ ํด๋ณธ ์ ์์ด?
|
| 52 |
+
|
| 53 |
+
ํ์: ์ดโฆ ์ฅ๊ธฐํ์ฅ์ค์ต ํ์์ด.
|
| 54 |
+
|
| 55 |
+
AI: ์ค ์ข๋ค. ๋ฌด์จ ํ์ด์์ด? ๋ญ ํ๋์ง ๊ธฐ์ต๋?
|
| 56 |
+
|
| 57 |
+
ํ์: SoC Integration ํ์ด์๊ณ โฆ ์๋ฃ ๋ง๋ค๊ณ , ํ์ ๋ค์ด๊ฐ๊ณ ๊ทธ๋ฌ์ด.
|
| 58 |
+
|
| 59 |
+
AI: ๊ทธ๋ ํ์ฌ ๋ถ์๊ธฐ ์ด๋ ์ด? ๊ธฐ์ต๋๋ ์ฅ๋ฉด ์์ด?
|
| 60 |
+
|
| 61 |
+
ํ์: ๋ค ๊ฐ์ด ๋ฌธ์ ํด๊ฒฐํ๋ ๋ถ์๊ธฐ?
|
| 62 |
+
์์ง๋์ด๋ถ๋ค ๋ฉ์์์ด.
|
| 63 |
+
|
| 64 |
+
AI: ๊ทธ๋ "๋๋ ์ ๊ธฐ์ ์ผํด๋ณด๊ณ ์ถ๋ค" ์ด๋ฐ ์๊ฐ๋ ํ์ด?
|
| 65 |
+
|
| 66 |
+
ํ์: ์.
|
| 67 |
+
|
| 68 |
+
AI: ์ข์, ์ ์ ์ค๊ณฝ์ด ๋ณด์ธ๋ค!
|
| 69 |
+
์
์ฌํ๋ฉด ์ด๋ค ์ผ ํด๋ณด๊ณ ์ถ์ด?
|
| 70 |
+
|
| 71 |
+
ํ์: ์ ์ ๋ ฅ ํ๋ก ์ชฝ ๊ณ์ ํด๋ณด๊ณ ์ถ๊ณ โฆ ํผํฉ ์ ํธ ํ๋ก๋ ๊ด์ฌ ์์ด.
|
| 72 |
+
|
| 73 |
+
AI: ๋์ค์ ์ด๋ค ์์ง๋์ด ๋๊ณ ์ถ์ด?
|
| 74 |
+
|
| 75 |
+
ํ์: ์โฆ ํ์ง์ ์ํฅ ์ฃผ๋ ๊ทธ๋ฐ ํ๋ก ์ค๊ณ์?
|
| 76 |
+
|
| 77 |
+
AI: ์์ ์ข์! ๋ฏผ์ง๊ฐ ๋งํด์ค ๊ฑฐ ๋ค ์ ๋ฆฌํด์ ์์์ ์ด์ ๋ง๋ค์ด๋ณผ๊ฒ :)
|
| 78 |
+
์ ๊น๋ง ๊ธฐ๋ค๋ ค์ค โ๏ธ
|
| 79 |
+
|
| 80 |
+
โ ์ฃผ์:
|
| 81 |
+
- ์ AI ๋ต๋ณ ์์์ ์คํ์ผ์ **๋ฐ๋์** ๋ฐ๋ผ์ฃผ์ธ์. ๋ฐ๋ง์ ์ฌ์ฉํด์ ์น๊ทผ๊ฐ์ ์ฃผ์ธ์.
|
| 82 |
+
- ๋ต๋ณ์ด ๋ฐ๋ก ์๊ฐ๋ ์ ์๋ ์ฌ์ด ์ง๋ฌธ์ด์ด์ผ ํฉ๋๋ค. open-ended ์ง๋ฌธ์ ์ต๋ํ ํผํด์ฃผ์ธ์. ๊ทธ๋ฆฌ๊ณ ๋ต๋ณ์ด ๋๋ฌด ์งง์๋ ํ์ ์ง๋ฌธ์ ํตํด ๋ํ
์ผ์ ๋์ด๋ด์ธ์.
|
| 83 |
+
- ์๊ธฐ์๊ฐ์ ๋ฌธ์ฅ์ ๋์ ์์ฑํ์ง ๋ง์ธ์.
|
| 84 |
+
- ์ง๋ฌธ์ ๋ฐ๋์ 10-15 ๋จ์ด ์ด๋ด๋ก ๋ตํ ์ ์๋ ๊ตฌ์ฒด์ ์ด๊ณ ์ฌ์ด ์ง๋ฌธ์ด์ด์ผ ํ๋ฉฐ, ํ๋ฒ์ ํ๋์ ์ง๋ฌธ๋ง ์์ด์ผ ํฉ๋๋ค.
|
| 85 |
+
- ์ ๋ณด ์์ง์ด ์ถฉ๋ถํ์ง ์์ ์ํ์์ ์ข
๋ฃํ์ง ๋ง์ธ์.
|
| 86 |
+
- ์ง๋ฌธ์ ํ๋ฒ์ ๋๋ฌด ๋ง์ด ํ์ง ๋ง๊ณ ๋ฐ๋์ ๋์ด์ ํ๋์ฉ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ํํด๋๊ฐ๋๋ก ํฉ๋๋ค.
|
| 87 |
+
- "answer"๋ฅผ ๋น์์ ์์ฑํ์ง ๋ง์ธ์. ์ด์ ๋ํ๊ฐ ์๋ค๋ฉด ๋ํ๋ฅผ ์์ํด์ฃผ์ธ์.
|
| 88 |
+
- ํ์์ ๋ต๋ณ์ ์ ๋๋ก ์์ฑํ์ง ๋ง์ธ์.
|
| 89 |
+
- progress๊ฐ 100์ด ๋๋ฉด ๋ง๋ฌด๋ฆฌ ์ธ์ฌ๋ฅผ ํ๊ณ ๋ํ๋ฅผ ์ข
๋ฃํด์ฃผ์ธ์.
|
| 90 |
+
|
| 91 |
+
๐ฏ ๋ชฉํ:
|
| 92 |
+
- ์๊ธฐ์๊ฐ์ ์ง๋ฌธ: {questions}
|
| 93 |
+
- ๊ธ์์ ์ ํ: {word_limit}
|
| 94 |
+
|
| 95 |
+
- ๋ต๋ณ ๊ฐ์ด๋:
|
| 96 |
+
{guide}
|
| 97 |
+
- Progress ํ๋จ:
|
| 98 |
+
์ ๋ต๋ณ ๊ฐ์ด๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ํ ๋ด์ฉ์ด ํญ๋ชฉ๋ณ๋ก ์ถฉ๋ถํ๋ค๊ณ ์๊ฐ๋๋์ง ํ๋จํ์ธ์. ์ด ํ๋จ์๋ ๊ธ์์ ์ ํ์ ๊ณ ๋ คํ์ธ์. ํ์ํ ๋ด์ฉ์ด ์ถฉ๋ถํ์ง ์๋ค๋ฉด ํ์ ์ง๋ฌธ์ ํตํด ๋ ๋ง์ ๋ด์ฉ์ ์ด๋์ด๋ด์ธ์.
|
| 99 |
+
Progress๋ 0-100 ์ฌ์ด์ ์ ์๋ก ํํํ์ธ์.
|
| 100 |
+
Progress = ๋ด์ฉ ์ถฉ์กฑ ํญ๋ชฉ / ์ ์ฒด ํญ๋ชฉ * 100
|
| 101 |
+
|
| 102 |
+
๋ํ ๊ธฐ๋ก:
|
| 103 |
+
{conversation}
|
| 104 |
+
|
| 105 |
+
๐ฌ ๋ต๋ณ ํ์:
|
| 106 |
+
๋ต๋ณ ํ์:
|
| 107 |
+
```json
|
| 108 |
+
{{
|
| 109 |
+
"reasoning_for_progress": "๋ต๋ณ ์งํ ์ํฉ์ ๋ํ ์ด์ ์ค๋ช
, ๋ต๋ณ ๊ฐ์ด๋์ ์ด๋ค ํญ๋ชฉ์ด ์๋ฃ๋๋์ง. (1-2๋ฌธ์ฅ)",
|
| 110 |
+
"progress": ๋ต๋ณ ์งํ ์๏ฟฝ๏ฟฝ๏ฟฝ (integer, 0-100),
|
| 111 |
+
"answer": "AI ๋ต๋ณ (15๋จ์ด ์ด๋ด)",
|
| 112 |
+
}}
|
| 113 |
+
```
|
| 114 |
+
|
| 115 |
+
|
| 116 |
+
๋ต๋ณ (json ํ์):
|
| 117 |
+
|
| 118 |
+
Student: >
|
| 119 |
+
๋น์ ์ {company_name}์ ์ง์ํ๋ {student_name}์
๋๋ค.
|
| 120 |
+
|
| 121 |
+
๐ ์ง์์ ์ ๋ณด:
|
| 122 |
+
- ์ด๋ฆ: {student_name}
|
| 123 |
+
- ์ ๊ณต: {student_major}
|
| 124 |
+
- ํ๋
/์กธ์
์ฌ๋ถ: {student_status}
|
| 125 |
+
- ์ง์ ์ง๋ฌด: {position_title}
|
| 126 |
+
|
| 127 |
+
๐ฏ ๋น์ ์ ์ญํ :
|
| 128 |
+
{company_name}์ {position_title} ์ง๋ฌด์ ์ง์ํ ์ด์ ์ ์ธ ์ง์์๋ก์, ๋ฉด์ ๊ณผ์ธ์ ์๋์ ์ง๋ฌธ์ ์ฑ์คํ๊ณ ๊ตฌ์ฒด์ ์ผ๋ก ๋ต๋ณํด์ผ ํฉ๋๋ค.
|
| 129 |
+
|
| 130 |
+
๐ก ๋ต๋ณ ๋ฐฉ์:
|
| 131 |
+
- ๊ตฌ์ฒด์ ์ธ ๊ฒฝํ๊ณผ ์์๋ฅผ ๋ค์ด ์ค๋ช
ํฉ๋๋ค.
|
| 132 |
+
- ํ์ฌ์ ์ธ์ฌ์({core_values})๊ณผ ์ฐ๊ณํ์ฌ ๋ต๋ณํฉ๋๋ค.
|
| 133 |
+
- ์ต๊ทผ ํ์ฌ ์ด์({recent_issue})์ ๋ํ ์ดํด๋ฅผ ๋ณด์ฌ์ค๋๋ค.
|
| 134 |
+
- ์ ๊ณต ์ง์๊ณผ ํ๋ก์ ํธ ๊ฒฝํ์ ์ ์ ํ ํ์ฉํฉ๋๋ค.
|
| 135 |
+
|
| 136 |
+
โญ ํต์ฌ ์ญ๋:
|
| 137 |
+
- ๊ธฐ์ ์ ์ญ๋: {student_major} ์ ๊ณต ์ง์, ๊ด๋ จ ํ๋ก์ ํธ ๊ฒฝํ
|
| 138 |
+
- ์ํํธ ์คํฌ: ํ์ํฌ, ์์ฌ์ํต, ๋ฌธ์ ํด๊ฒฐ ๋ฅ๋ ฅ
|
| 139 |
+
- ์ง๋ฌด ์ดํด: {industry} ์ฐ์
๊ณผ {position_title} ์ง๋ฌด์ ๋ํ ์ดํด
|
| 140 |
+
|
| 141 |
+
โ ์ฃผ์์ฌํญ:
|
| 142 |
+
- ๊ตฌ์ฒด์ ์ด๊ณ ์ง์ ์ฑ ์๋ ๋ต๋ณ์ ์ ์ํ์ธ์.
|
| 143 |
+
- ๋๋ฌด ํ๋ฒ์ ์๋ฒฝํ ๋ต๋ณ์ ๋ด๋์ ํ์๋ ์์ต๋๋ค. ๋๋ฌด ๋ง์ ๋ต๋ณ์ ํ์ง ๋ง์ธ์.
|
| 144 |
+
- ๊ณผ์ฅ๋๊ฑฐ๋ ๊ฑฐ์ง๋ ๋ด์ฉ์ ํฌํจํ์ง ๋ง์ธ์.
|
| 145 |
+
- ํ์ฌ์ ์ง๋ฌด์ ๋ํ ์ง์ ํ ๊ด์ฌ์ ๋ณด์ฌ์ฃผ์ธ์.
|
| 146 |
+
- ๋ฉด์ ๊ณผ์ธ์ ์๋์ ์ง๋ฌธ ์๋๋ฅผ ์ ํํ ํ์
ํ๊ณ ๋ต๋ณํ์ธ์.
|
| 147 |
+
- "ํ์:" ํ๊ทธ๋ฅผ ์์ฑํ์ง ๋ง์ธ์.
|
| 148 |
+
|
| 149 |
+
- ๋ํ ๊ธฐ๋ก:
|
| 150 |
+
{conversation}
|
| 151 |
+
|
| 152 |
+
- ๋ต๋ณ ํ์:
|
| 153 |
+
```json
|
| 154 |
+
{{
|
| 155 |
+
"answer": "๋ต๋ณ (10๋จ์ด ์ด๋ด)",
|
| 156 |
+
}}
|
| 157 |
+
```
|
| 158 |
+
|
| 159 |
+
|
| 160 |
+
CoverLetter: >
|
| 161 |
+
์ฃผ์ด์ง ์ง๋ฌธ๊ณผ ๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ์ ๋ฐํ์ผ๋ก ์์์ ๋ชจ๋ฒ๋ต์์ ์์ฑํ์์ค.
|
| 162 |
+
|
| 163 |
+
### ์ถ๋ ฅ ํ์
|
| 164 |
+
๋ฐ๋์ ๋ค์ markdown ํ์์ผ๋ก๋ง ์๋ตํ์ธ์:
|
| 165 |
+
|
| 166 |
+
```markdown
|
| 167 |
+
[์ ๋ชฉ]
|
| 168 |
+
|
| 169 |
+
๋ชจ๋ฒ๋ต์ ๋ด์ฉ...
|
| 170 |
+
```
|
| 171 |
+
|
| 172 |
+
## ์์
|
| 173 |
+
|
| 174 |
+
### ์์ 1 - ๋์ธ๊ด๊ณ ๋ฐ ํ์
์ญ๋
|
| 175 |
+
์ง๋ฌธ: ๊ณต๋์ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด ํ์ธ๊ณผ ํ์ ํฉ์ณ ๋
ธ๋ ฅํ๋ ๊ฒฝํ์ ๊ธฐ์ ํด์ฃผ์ธ์.
|
| 176 |
+
|
| 177 |
+
๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ:
|
| 178 |
+
| ๋จ๊ณ | ํญ๋ชฉ | ์ค๋ช
| ์ฒดํฌํฌ์ธํธ |
|
| 179 |
+
| --- | --- | --- | --- |
|
| 180 |
+
| โ ์์ฝ | ํ ๋ฌธ์ฅ ํต์ฌ ์์ฝ | ํ์
์ํฉ์์ ์๊ธด ๋ฌธ์ ๋ ๊ฐ๋ฑ์ ํด๊ฒฐํด ๊ณต๋ ์ฑ๊ณผ๋ฅผ ์ด๋ ๊ฒฝํ์ ํ ๋ฌธ์ฅ์ผ๋ก ์์ฝํ๋ค | - ๊ฐ๋ฑ or ์ํต ๋ฌธ์ + ํ์
์ฑ๊ณต ์์ ํฌํจ |
|
| 181 |
+
| โก ์ํฉ | ํ์
๋ฐฐ๊ฒฝ๊ณผ ๋์ ์ญํ | ์ด๋ค ๋งฅ๋ฝ์ ํ์
์ํฉ์ด์๊ณ , ๋ด๊ฐ ์ด๋ค ์ญํ ์ ๋งก์๋์ง ๊ตฌ์ฒด์ ์ผ๋ก ์ค๋ช
| - ๊ธฐ๊ฐ/์ฅ์/ํ๋๋ช
<br>- ๋ด๊ฐ ์ฃผ๋ํ๋์ง, ์ผ์์ผ๋ก ์ฐธ์ฌํ๋์ง ๋ช
ํํ |
|
| 182 |
+
| โข ๋ฌธ์ ์ธ์ | ํ ๋ด ๊ฐ๋ฑ์ด๋ ์ํต ๋ฌธ์ ์ ๋ณธ์ง ์ธ์ | ํ์ํฌ๋ฅผ ์ ํดํ ๋ช
ํํ ๊ฐ๋ฑ or ์ํต ๋ฌธ์ ๋ฅผ ์ธ์ํ๊ณ , ๊ทธ๊ฒ์ด ์ ์ค์ํ ๋ฌธ์ ์ธ์ง ์์ | - ๋จ์ ์๊ฒฌ ์ฐจ์ด X โ ๊ตฌ์ฑ์ ๊ฐ ์ถฉ๋, ํผ๋ก๊ฐ, ์ ๋ฌ ์ค๋ฅ ๋ฑ ์ค์ ์ฅ์ ํฌํจ |
|
| 183 |
+
| โฃ ํด๊ฒฐ ํ๋ | ๋ฌธ์ ํด๊ฒฐ์ ์ํ ๋ณธ์ธ์ ์ํต/์กฐ์จ ๋
ธ๋ ฅ | ์ํต ๋ฐฉ์, ์ค๋ ๊ณผ์ , ์์ด๋์ด ์ ์ ๋ฑ ๋ณธ์ธ์ ๊ตฌ์ฒด์ ์ธ ํ์
ํ๋์ ์ค์ฌ์ผ๋ก ์ค๋ช
| - ๋จ์ํ ์ฐธ์ฌ์ X โ ์๊ฒฌ ์กฐ์จ์, ๋ถ์๊ธฐ ๋ฐ์ ์, ์์ด๋์ด ์ ์์ ๋ฑ์ ์ญํ ๋ถ๊ฐ |
|
| 184 |
+
| โค ๊ฒฐ๊ณผ | ํ์
์ฑ๊ณผ ๋ฐ ๊ด๊ณ ๋ณํ | ๋ฌธ์ ํด๊ฒฐ ํ ํ ์ฑ๊ณผ ๋๋ ๊ด๊ณ์ ๊ธ์ ์ ๋ณํ๊ฐ ์๊ธด ๋ชจ์ต์ ์ ๋/์ ์ฑ์ ์ผ๋ก ํํ | - ๊ฒฐ๊ณผ = ๋ชฉํ ๋ฌ์ฑ + ํ ๋ถ์๊ธฐ or ์ ๋๊ฐ ํ๋ณต ๋ฑ |
|
| 185 |
+
| โฅ ๋๋ ์ | ํ์ํฌ์ ๋ํ ์ธ์ ๋ณํ | ํ์
์ ๋ณธ์ง, ์ํต ๋ฐฉ์, ์ฌ๋์ ๋ํ๋ ํ๋ ๋ฑ์์ ๋ฐฐ์ด ์ ์ ์ง์ํ๊ฒ ์์ฑ | - ๋ด๊ฐ ์ฌ๋๊ณผ ์ผํ๋ ๋ฐฉ์์ด ์ด๋ป๊ฒ ๋ฐ๋์๋๊ฐ? |
|
| 186 |
+
| โฆ ์ง๋ฌด ์ฐ๊ณ | ์กฐ์ง์ํ์์์ ํ์ํฌ ์ค์ฒ ํฌ๋ถ | ํ์
์ด ์ค์ํ ์กฐ์ง์์ ๋ณธ์ธ์ ์ํต ๋ฐฉ์์ด ์ด๋ค ๊ธฐ์ฌ๋ฅผ ํ ์ ์๋์ง ์ฐ๊ฒฐ | - ํ์
์ญ๋์ด ํ์ํ ์ง๋ฌด ํน์ฑ๊ณผ ์ฐ๊ฒฐ |
|
| 187 |
+
|
| 188 |
+
๋ชจ๋ฒ๋ต์:
|
| 189 |
+
```markdown
|
| 190 |
+
[ํ๊ณผ ํ์ ์ ๋ฅผ ํตํด ํ์ตํ '์กฐ์จ'๊ณผ '์ํต'์ ์ค์์ฑ]
|
| 191 |
+
|
| 192 |
+
ํ๊ณผ ํ์ ์ ์ค๋น์์์ผ๋ก ํ๋ํ๋ฉฐ ๊ณต๋์ ๋ชฉํ๋ฌ์ฑ์ ์ํด '์กฐ์จ'๊ณผ '์ํต'์ ์ค์์ฑ์ ๋ฐฐ์ ์ต๋๋ค. ์ด์ํ์ ์ํด ์๋ ์ ๋ ํนํ ํ ๋ณ ํ์ ์ผ์ ์ ์กฐ์จํ๊ณ ์ฅ์ ์ญ์ธ ํ๋ณด๋ฅผ ๊ณต์ ํ๋ ์ผ์ ๋งก์์ต๋๋ค.
|
| 193 |
+
|
| 194 |
+
(๋ฌธ์ ์ธ์)ํ์ ๊ธฐํ, ํ๋ณด, ์ด์ํ ์ธ ๊ฐ ๋ฟ์ด์์ง๋ง, ์ธ์์ด ๋ง๋ค ๋ณด๋ ๊ฐ ํ์์ ๋์จ ์๊ฒฌ์ ์ทจํฉํ๊ฑฐ๋, ์ทจํฉ ๋ ์๊ฒฌ์ ๊ณต์งํ๋ ์ผ๋ ๋ง๋ง์น ์์์ต๋๋ค. ๋, ์ฌ์ฉํ ์ ์๋ ํ์์ค์ 1๊ฐ ๋ฟ์ธ๋ฐ, ํ์ 3๊ฐ๋ผ ํ์์ค ์ฌ์ฉ๋ ์ฝ์ง ์์์ต๋๋ค. (์๋ฃจ์
) ๋๋ฌธ์ ๊ฐ ํ ๋ณ ํ์ ๋ด์ฉ์ ์์ฝํ ํ์๋ก์ ์์ฑํด ์จ๋ผ์ธ ๋ฌธ์๋ก ๊ณต์ ํ๊ณ , ํ์์ค ์ฌ์ฉ์ ์ํ ์์ฝ์ ๊ตฌ๊ธ ์บ๋ฆฐ๋๋ฅผ ํ์ฉํ์๊ณ ์ ์ํ์ต๋๋ค. ์ด ์ ์์ ๋ฐ์๋ค์ฌ, ๋ค๋ฅธ ํ์์๋ ๊ฐ์ ์๋ก ์ข์ ํ์๋ก ์ํ์ ๏ฟฝ๏ฟฝ์ ํ๋ฉฐ ์๊ฒฌ์ ์ ์ํ์ต๋๋ค. ๊ฒฐ๊ตญ ๊ฐ์ฅ ๋ณด๊ธฐ ํธํ ํ์๋ก ํ
ํ๋ฆฟ์ ๋ง๋ค์ด ๊ฐ ํ์ ์งํ ์ํฉ๊ณผ ์์ฒญ ์ฌํญ์ ๋ช
ํํ ์ ๋ฆฌํ์ฌ ๋ชจ๋ ํ์์ด ํจ๊ป ๋ณผ ์ ์๋๋ก ํ์ต๋๋ค.
|
| 195 |
+
|
| 196 |
+
(๊ฐ์ ํํฉ) ๋๊ตฌ๋ ํ ์ ์๋ ์ ์์ด์์ง๋ง, ๋ชจ๋๊ฐ ๋์ฐธํด์ฃผ์ด ์
๋ฌด ํ๋ฆ์ด ๋งค๋๋ฌ์์ก๊ณ , ๊ฐ ํ์ด 'ํจ๊ป ํ๋ค'๋ ๋๋์ ๋ฐ์ ์ ์์์ต๋๋ค. ์ต์ข
์ ์ผ๋ก ํ์ฌ๋ ์์ ๋๋ก ๋ฌด๋ฆฌ ์์ด ์งํ๋์๊ณ , ๊ตฌ์ฑ์๋ค ๊ฐ์ ์ ๋๊ฐ๋ ๋ ๊น์ด์ก์ต๋๋ค.
|
| 197 |
+
|
| 198 |
+
(๊นจ๋ฌ์) ์ด ๊ฒฝํ์ ํตํด ๊ณต๋์ ๋ชฉํ ๋ฌ์ฑ์ ์ํ '์ํต'๊ณผ '์กฐ์จ'์ด ์ผ๋ง๋ ์ค์ํ์ง ๊น์ด ๊นจ๋ฌ์์ต๋๋ค. (ํฌ๋ถ) ์์ผ๋ก ํ์ ์
๋ฌด๋ฅผ ํ๋๋ฐ ์์ด์๋ '๋ด ํ, '๋ค ํ'์ด ์๋, ๋ค์ํ ์ดํด๊ด๊ณ์ ๊ฐ ์ํต๊ณผ ์กฐ์จ์ ํตํด ํ๋ ฅํ์ฌ ์กฐ์ง์ ๋ชฉํ๋ฌ์ฑ์ ๊ธฐ์ฌํ๊ฒ ์ต๋๋ค.
|
| 199 |
+
```
|
| 200 |
+
|
| 201 |
+
### ์์ 2 - ๋ชฉํ ๋ฌ์ฑ ๋ฐ ๋์ ๊ฒฝํ
|
| 202 |
+
์ง๋ฌธ: ๋์ ์ ํตํ ์ฑ์ทจ ๊ฒฝํ์ ์์ ํด์ฃผ์ธ์.
|
| 203 |
+
|
| 204 |
+
๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ:
|
| 205 |
+
| ๋จ๊ณ | ํญ๋ชฉ | ์ค๋ช
| ์ฒดํฌํฌ์ธํธ |
|
| 206 |
+
| --- | --- | --- | --- |
|
| 207 |
+
| โ ์์ฝ | ํ ๋ฌธ์ฅ ํต์ฌ ์์ฝ | ์ด๋ค ๋ชฉํ/๋์ ์ ์ด๋ค ๋ฐฉ์์ผ๋ก ํด๊ฒฐํด ์ฑ๊ณผ๋ฅผ ๋๋์ง ํ ๋ฌธ์ฅ์ผ๋ก ๋ณด์ฌ์ค๋ค | - ์๊ธฐ/์ฅ์/ํ๋/์ฑ๊ณผ ํฌํจ |
|
| 208 |
+
| โก ์ํฉ | ๋ชฉํ ๋๋ ์คํจ ์ํฉ์ ๋ฐฐ๊ฒฝ | ์ด๋ค ๋ชฉํ๋ฅผ ์ถ๊ตฌํ๋์ง, ๋๋ ์ด๋ค ์คํจ ์ํฉ์ด ๋ฐ์ํ๋์ง ๊ตฌ์ฒด์ ๋งฅ๋ฝ์ ์ค๋ช
ํ๋ค | - ์๊ธฐ/์ฅ์/์ญํ <br>- ์ผ๋ฐ์ ์ธ ์ด๋ ค์์ด ์๋, ๋ช
ํํ ๋๊ด์ด ๋๋ฌ๋์ผ ํจ |
|
| 209 |
+
| โข ๋์ ์ ์ | ๋ด๊ฐ ๋ง๋ฅ๋จ๋ฆฐ ๋์ /๊ณผ์ | ์ด๋ค ์ ์ด ์ด๋ ค์ ๊ณ , ๋ฌด์์ ๊ทน๋ณตํด์ผ ํ๋์ง ํต์ฌ ๋ฌธ์ ๋ฅผ ์ ๋ช
ํ๊ฒ ๊ธฐ์ | - ๋ฌธ์ ์ ๋ณธ์ง์ ์ค์ค๋ก ์ธ์ํ๋์ง ๋ณด์ฌ์ค ๊ฒ |
|
| 210 |
+
| โฃ ํ๋ | ๋ชฉํ ๋ฌ์ฑ ๋๋ ์คํจ ๊ทน๋ณต์ ์ํ ๋์ ํ๋ | ๊ตฌ์ฒด์ ์ธ ์คํ ๋ด์ฉ์ ๋ฌ์ฌํ๊ณ , ํนํ ์ด๋ค ์ ๋ต์ ์ฌ์ฉํ๋์ง ์ค๋ช
| - ๋จ์ ๋
ธ๋ ฅ๋ณด๋ค ๊ณํ์ฑ, ์๋ฐ์ฑ, ์ง์์ฑ ๊ฐ์กฐ |
|
| 211 |
+
| โค ๊ฒฐ๊ณผ | ๊ฒฐ๊ณผ ๋ฐ ๋ณํ | ๋ชฉํ ๋ฌ์ฑ ์ฌ๋ถ, ์คํจ ๊ทน๋ณต ๊ฒฐ๊ณผ๋ฅผ ์ ๋/์ ์ฑ ์งํ๋ก ๋ณด์ฌ์ค | - ์ซ์, ๋น๊ต ์์น, ๋ช
ํํ ๋ณํ ์์ |
|
| 212 |
+
| โฅ ๋๋ ์ | ์คํจ์์์ ๊ตํ, ์ฑ๊ณต ์ดํ ๋ณํ | ์ด ๊ฒฝํ์ ํตํด ์๊ฐ๊ณผ ํ๋์ด ์ด๋ป๊ฒ ๋ฐ๋์๋์ง ์ค๋ช
| - ๊ฐ์น๊ด/์ผํ๋ ๋ฐฉ์/ํ๋์ ๋ณํ ์ค์ฌ |
|
| 213 |
+
| โฆ ์ง๋ฌด ์ฐ๊ณ | ์ด ๊ฒฝํ์ด ์ง์์ง๋ฌด์ ์ด๋ค ๊ธฐ์ฌ๊ฐ ๋๋๊ฐ | ๊นจ๋ฌ์์ ๊ธฐ๋ฐ์ผ๋ก ์กฐ์ง/์ง๋ฌด์ ์ด๋ค ๊ธฐ์ฌ๋ฅผ ํ ์ ์๋์ง๋ฅผ ์ฐ๊ฒฐ | - ์ง๋ฌด์ ๋ง๋ ์ญ๋ ํค์๋๋ก ์ฐ๊ฒฐ |
|
| 214 |
+
|
| 215 |
+
๋ชจ๋ฒ๋ต์:
|
| 216 |
+
```markdown
|
| 217 |
+
[ํ ์ ์๋ ๋ชจ๋ ๋ฐฉ๋ฒ์ ๋คํด๋ณด์]
|
| 218 |
+
|
| 219 |
+
๋์คํ ๋จ์ฅ์ผ๋ก์ ์ฝ๋ก๋19 ํฌ๋ฐ๋ฏน์ผ๋ก ์ธํ ํ ํด์ฒด ์๊ธฐ๋ฅผ ๊ทน๋ณตํ ๊ฒฝํ์ด ์์ต๋๋ค. ๋น์ ์์ ๋์ด ์๋ ๊ณต์ฐ๋ค์ด ์ ๋ฉด ์ทจ์๋๋ฉด์, ๊ณต์ฐ์ ์๊ณ๋ก ์ผ๋ ์ ํฌ ํ์ ์์
์ด ์์ ํ ๋๊ฒผ์ต๋๋ค. ์ผ๋ถ ๋จ์์ ์๊ณ๋ฅผ ์ํด ํ์ ๋ ๋ ๊ณ ๋ฏผ๊น์ง ํ ์ ๋๋ก, ์ ์ฒด์ ๋ช
์ ์๊ธฐ์์ต๋๋ค. ๋จ์ฅ์ผ๋ก์ ์ ๋ ์ด๋๋ก ๋ฌด๋์ง์ง ์๊ธฐ ์ํด, ์ธ๋ถ์์ ํ์
์ ํตํ ์๋ก์ด ๋ํ๊ตฌ ๋ง๋ จ์ด ํ์ํ๋ค๊ณ ํ๋จํ์ต๋๋ค.
|
| 220 |
+
|
| 221 |
+
์ฒซ์งธ๋ก, ํ์ **์จ๋ผ์ธ ํ๋ณด ์ ๋ต์ ์ ๋ฉด ๊ฐํ**ํ์ต๋๋ค. ํ์๋ค์ ๊ฐ๋ณ ํ๋กํ๊ณผ SNS ์ฝํ
์ธ ๋ฅผ ๊ธฐํํ์ฌ ์ฃผ 3ํ ์ด์ ์
๋ก๋ํ๊ณ , ๊ณผ๊ฑฐ ๊ณต์ฐ ์ค ๊ธ์ ์ ๋ฐ์์ด ๋์๋ ์์์ ์ฌํธ์งํ์ฌ ํ์ฐ์์ผฐ์ต๋๋ค. ์ด๋ฅผ ํตํด 2๊ฐ์ ๋ง์ ํ SNS ํ๋ก์ ์๊ฐ ์ฝ 60% ์ฆ๊ฐํ์ต๋๋ค.
|
| 222 |
+
|
| 223 |
+
๋์งธ๋ก, ๊ณผ๊ฑฐ ํ์ฌ ์ ์์ด๋ ๋ฌธ์๊ฐ ์์๋ ์
์ฒด ์ฝ 40๊ณณ์ ๋ฆฌ์คํธ์
ํ๊ณ , ๊ทธ ์ค 15๊ฐ ์
์ฒด์ ์ ํฌ ํ์ ๊ฐ์ ๊ณผ ๊ธฐ์กด ๋ฌด๋ ์์, SNS ์์น๋ฅผ ๋ด์ ๋ง์ถคํ ์ ์์๋ฅผ ์ ๋ฌํ์ต๋๋ค.
|
| 224 |
+
|
| 225 |
+
๊ทธ ๊ฒฐ๊ณผ, ํ ์คํฌ์ธ ๊ตฌ๋จ ์น์ด๋ฆฌ๋ํ์์ ๋ฏธํ
์ ์์ ๋ฐ๊ฒ ๋์์ต๋๋ค. ํ์ง๋ง ์๋ ์ธก์ ์ ํฌ๊ฐ ๋น์ ๋ฌธ ํ์ด๊ธฐ์ ์ค๋ ฅ์ ๋ํ ์ฐ๋ ค๋ฅผ ๊ฐ๊ณ ์์๊ณ , ์๊ตฌ ์์ค๋ ๋์์ต๋๋ค. ์ ๋ ์ด ๊ธฐํ๋ฅผ ๋ฐ๋์ ์ฑ์ฌ์ํค๊ธฐ ์ํด, ํ์๋ค๊ณผ ํจ๊ป ์๋ฌด ํ
์คํธ ์๊ตฌ์ฌํญ์ ๋ถ์ํ๊ณ ์ฐ์ต ์ผ์ ์ ์กฐ์จํด ์ต๋จ๊ธฐ๊ฐ ๋ด ํ
์คํธ๋ฅผ ํต๊ณผํ์ต๋๋ค. ๋์์, ํ์ด ์ธํ๋ฃจ์ธ์ ๊ธฐ๋ฐ์ผ๋ก ์ด์๋๋ ๋งํผ ํ๋ณด ํจ๊ณผ์์๋ ์ฅ์ ์ ์ค ์ ์๋ค๋ ์ ์ ์ ๊ทน ์ดํํ์ต๋๋ค.
|
| 226 |
+
|
| 227 |
+
๊ฒฐ๊ตญ, ๊ตฌ๋จ๊ณผ์ ๊ณ์ฝ์ ์ฒด๊ฒฐํ๋ ๋ฐ ์ฑ๊ณตํ๊ณ , ํ์ ๋ค์ ์์ต ๊ธฐ๋ฐ์ ํ๋ณดํด 1๋
์ด์ ์์ ์ ์ผ๋ก ํ๋์ ์ด์ด๊ฐ ์ ์์์ต๋๋ค. ์ ๋ ์ด ๊ฒฝํ์ ํตํด ์๊ธฐ ์์์๋ ์ฃผ๋์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ , ํ์ ์ด๋๋ ๋ฆฌ๋์ญ๊ณผ ์ ๋ต์ ์ฌ๊ณ ์ ์ค์์ฑ์ ๋ฐฐ์ ์ต๋๋ค.
|
| 228 |
+
|
| 229 |
+
์ดํ์๋ ๋ณํ์ ์ ์ฐํ๊ฒ ๋์ํ๋ฉฐ ํ์ํฌ๋ฅผ ๋ฐํ์ผ๋ก ์ฑ๊ณผ๋ฅผ ๋ง๋๋ ์ต๊ด์ ๊ฐ๊ฒ ๋์๊ณ , ์ด๋ฌํ ๊ฒฝํ์ ๊ธ๋ณํ๋ ์ ์ฝ ์์ฅ ํ๊ฒฝ์์๋ ์ ๋ต์ ์ผ๋ก ๋์ํ๋ ๋ฐ ๊ฐ์ ์ด ๋ ๊ฒ์
๋๋ค. ๊ณ ๊ฐ๊ณผ ํ์ฅ์ ๋์ฆ๋ฅผ ์ดํดํ๊ณ , ์ด๋ฅผ ์คํํ๋ ์ค๏ฟฝ๏ฟฝ๋ ฅ์ ๋ฐํ์ผ๋ก ๊ด๋์ ์ฝ์ ์ฑ์ฅ์ ๊ธฐ์ฌํ๊ฒ ์ต๋๋ค.
|
| 230 |
+
```
|
| 231 |
+
|
| 232 |
+
### ์์ 3 - ๋ฌธ์ ํด๊ฒฐ ๋ฐ ์ฐฝ์์ฑ
|
| 233 |
+
์ง๋ฌธ: ๊ธฐ์กด ๋ฐฉ์์์ ๋ฒ์ด๋ ๋ ํจ์จ์ ์ธ ํ๋ก์ธ์ค๋ฅผ ๋์
ํ๋ ๊ฒฝํ์ ์ ์ํ๊ณ , ํด๋น ๊ฒฝํ์ด ๋ํ์์ ์ด๋ ํ ๊ธ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์์์ง ๊ธฐ์ ํ์์ค.
|
| 234 |
+
|
| 235 |
+
๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ:
|
| 236 |
+
| ๋จ๊ณ | ํญ๋ชฉ | ์ค๋ช
| ์ฒดํฌํฌ์ธํธ |
|
| 237 |
+
| --- | --- | --- | --- |
|
| 238 |
+
| โ ์์ฝ | ํ ๋ฌธ์ฅ ์์ฝ | ์๋ ๋ด์ฉ์ ํ ๋ฌธ์ฅ์ผ๋ก ์์ถ ์์ฝ | "๋ฌธ์ ๋ฅผ ์ฐฝ์์ ์ผ๋ก ํด๊ฒฐํ์ฌ ์ฑ๊ณผ๋ฅผ ๋ธ ๊ฒฝํ"์ด ๋๋ฌ๋์ผ ํจ |
|
| 239 |
+
| โก ์ํฉ | ๋ฐฐ๊ฒฝ ์ค๋ช
| ์ธ์ , ์ด๋์, ์ด๋ค ๋งฅ๋ฝ์์ ๋ฐ์ํ ๋ฌธ์ ์ธ์ง ์ค๋ช
| ์กฐ์ง/ํ/์
๋ฌด ๋งฅ๋ฝ๊ณผ ๋ด ์ญํ ์ ๊ฐ๊ฒฐํ๊ฒ ์์ |
|
| 240 |
+
| โข ๋ฌธ์ ์ ์ | ๋ฌธ์ ๋ฐ ์์ธ ๋ถ์ | ๋จ์ํ ํ์ ๋์ด์ด ์๋, ์์ธ์ ๋ถ์ํ์ฌ ๋ณธ์ง์ ์ธ ๋ฌธ์ ๋ฅผ ์ ์ํจ | '์ ๋ฐ์ํ๋๊ฐ'๋ฅผ ๊ณ ๋ฏผํ ํ์ ์ด ๋๋ฌ๋์ผ ํจ |
|
| 241 |
+
| โฃ ํด๊ฒฐ ํ๋ | ์ฐฝ์์ ํด๊ฒฐ๋ฐฉ์ ๋ฐ ์คํ | ๋ด๊ฐ ์ง์ ์ ์ํ๊ณ ์คํํ ์๋ก์ด ๋ฐฉ์ ๋๋ ๊ธฐ์กด ๋ฐฉ์์ ๊ฐ์ ์ | ๋จ์ ์คํ์ด ์๋๋ผ, ๊ธฐ์กด ํ์ '์ด๋ป๊ฒ ๋ค๋ฅด๊ฒ' ํ๋์ง๊ฐ ํต์ฌ |
|
| 242 |
+
| โค ๊ฒฐ๊ณผ | ๊ฐ์ ์ฑ๊ณผ | ํ๋ ์ดํ ๊ฐ์ ๋ ์์น์ /์ ์ฑ์ ๊ฒฐ๊ณผ ์ ์ + ํ์ธ์ ๋ฐ์ | "ํจ์จ ํฅ์", "์ฑ๊ณผ ์ฆ๊ฐ", "ํผ๋๋ฐฑ", "์ฌ์ฌ์ฉ๋ ๋ฐฉ์" ๋ฑ ์ ๋ยท์ ์ฑ ๊ท ํ |
|
| 243 |
+
| โฅ ๋๋ ์ | ํต์ฐฐ ๋ฐ ์ฑ์ฅ | ์ด ๊ฒฝํ์ ํตํด ๋ฌธ์ ํด๊ฒฐ๋ ฅ ๋๋ ์ฐฝ์์ ํ๋์ ๋ํด ๋ฌด์์ ๋ฐฐ์ ๋๊ฐ | "๋ฌธ์ ์ ๊ทผ ํ๋"๋ "์ฌ๊ณ ๋ฐฉ์์ ๋ณํ"๊ฐ ๋๋ฌ๋์ผ ํจ |
|
| 244 |
+
| โฆ ์ง๋ฌด ์ฐ๊ณ | ์ง๋ฌด ๊ธฐ์ฌ ๊ฐ๋ฅ์ฑ | ๋ด๊ฐ ์ง์ํ ์ง๋ฌด์์ ๋น์ทํ ๋ฌธ์ ์ ์ด๋ป๊ฒ ๊ธฐ์ฌํ ์ ์๋์ง ์ธ๊ธ | "์ง์ ๋ถ์ผ์์ ๋์ ์ฐฝ์์ฑ/๋ฌธ์ ํด๊ฒฐ๋ ฅ์ ์ด๋ ๊ฒ ์ฐ์ผ ์ ์๋ค"๋ก ๋ง๋ฌด๋ฆฌ |
|
| 245 |
+
|
| 246 |
+
๋ชจ๋ฒ๋ต์:
|
| 247 |
+
```markdown
|
| 248 |
+
์ํ๊ด ์ ์ ๊ทผ๋ฌด ์, ๊ณ ๊ฐ ์๋ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ ํ์ฌ ์
๋ฌด ํจ์จ๊ณผ ๊ณ ๊ฐ ๋ง์กฑ๋๋ฅผ ๋์์ ๋์ธ ๊ฒฝํ์ด ์์ต๋๋ค. ๋น์ ์ค์ฅ๋
์ธต ๊ณ ๊ฐ์ ์ฆ๊ฐ๋ก ์์ฌ ์ฑ ์ค์น ๋ฐ ์ฟ ํฐ ์ฌ์ฉ๋ฒ์ ๋ํ ์๋ด๊ฐ ๋น๋ฒํ์ง๋ง, ์ง์๋ง๋ค ์ค๋ช
๋ฐฉ์์ด ๋ฌ๋ผ ์๋ ์ง์ฐ๊ณผ ๊ณ ๊ฐ ๋ถ๋ง์ด ๋ฐ์ํ์ต๋๋ค. ํนํ, ํผ์ก ์๊ฐ๋์๋ ์๋๊ฐ ๊ธธ์ด์ ธ ๋ถํธ์ ์ด๋ํ๊ณ , ์ ๊ท ์ง์๋ค์ ๋งค๋ด์ผ์ด ๋ณต์กํด ๋นํฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ต๋๋ค.
|
| 249 |
+
|
| 250 |
+
์ด์ ์ ๋ ํผ์ ์ ์์ธ์ ๊ธฐ์กด ๋งค๋ด์ผ์ ๋ถ์คํ ๊ตฌ์ฑ๊ณผ ์ ๋ณด ์ ๊ทผ์ฑ ๋ถ์กฑ์ผ๋ก ๋ณด๊ณ , ๋ฐ๋ณต์ ์ผ๋ก ์ ์๋ ๋ฌธ์ ์ฌํญ์ ์ ๋ฆฌํด ๊ฐ์ฅ ๋น๋๊ฐ ๋์ '์ฑ ์ค์น'์ '์ฟ ํฐ ์ฌ์ฉ ์ ์ฐจ'๋ฅผ ์ค์ฌ์ผ๋ก ๊ฐ์ ์์ ๊ธฐํํ์ต๋๋ค. ๋ณต์กํ ํ
์คํธ ์์ฃผ์ ์ค๋ช
๋์ , ์ค์ ํ๋ฉด ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋จ๊ณ๋ณ ์ ์ฐจ๋ฅผ ์๊ฐ์ ์ผ๋ก ์ ๋ฆฌํ๊ณ , ํ์ฅ์์ ๊ณง๋ฐ๋ก ์ฐธ๊ณ ํ ์ ์๋๋ก ์ฃผ์ ์๋ ์ง์ ์ ๋ถ์ฐฉํ์ต๋๋ค.
|
| 251 |
+
|
| 252 |
+
๊ทธ ๊ฒฐ๊ณผ, ์ ๊ท ์ง์๋ค์ ์๋ ์๊ฐ์ ํ๊ท 30% ์ด์ ๋จ์ถ๋์๊ณ , ๊ณ ๊ฐ ๋ง์กฑ๋ ์กฐ์ฌ์์ "์๋๊ฐ ๋นจ๋ผ์ก๋ค"๋ ๊ธ์ ์ ํผ๋๋ฐฑ์ด ๋์์ต๋๋ค. ์ด ๊ฒฝํ์ ํตํด, ๊ธฐ์กด์ ์ต์ํ ๋ฐฉ์์ด๋ผ๋ ํ์ฅ์ ๋ณํ์ ๋ฐ๋ผ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ ํ๋ ํ๋๊ฐ ์ค์ํ๋ค๋ ๊ฒ์ ๋ฐฐ์ ์ต๋๋ค.
|
| 253 |
+
|
| 254 |
+
๋ํ์์๋ ์ด๋ฌํ ๋ฌธ์ ํด๊ฒฐ๋ ฅ๊ณผ ์คํ๋ ฅ์ ๋ฐํ์ผ๋ก, ๊ณ ๊ฐ ๋ถํธ์ ์ ์ ์ ์ผ๋ก ํด์ํ๊ณ ํ์ฅ ์ค์ฌ์ ์๋น์ค ํ์ง ํฅ์์ ๊ธฐ์ฌํ๊ฒ ์ต๋๋ค.
|
| 255 |
+
```
|
| 256 |
+
|
| 257 |
+
### ์์ 4 - ์ง์ ๋๊ธฐ
|
| 258 |
+
์ง๋ฌธ: ์ผ์ฑ์ ์๋ฅผ ์ง์ํ ์ด์ ์ ์
์ฌ ํ ํ์ฌ์์ ์ด๋ฃจ๊ณ ์ถ์ ๊ฟ์ ๊ธฐ์ ํ์์ค.
|
| 259 |
+
|
| 260 |
+
๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ:
|
| 261 |
+
| ๋จ๊ณ | ํญ๋ชฉ | ์ค๋ช
| ์ฒดํฌํฌ์ธํธ |
|
| 262 |
+
| --- | --- | --- | --- |
|
| 263 |
+
| โ ์ง๋ฌด ๊ด์ฌ ๊ณ๊ธฐ | ํด๋น ์ง๋ฌด์ ๊ด์ฌ์ ๊ฐ๊ฒ ๋ ์ฒซ ๊ณ๊ธฐ | ์์
, ํ๋, ์ฌ๋, ์ฌ๊ฑด ๋ฑ ํตํด ์ง๋ฌด์ ํฅ๋ฏธ๋ฅผ ๋๋ผ๊ฒ ๋ ๊ตฌ์ฒด์ ์ถ๋ฐ์ ์ ์ | ๋จ์ํ ํฅ๋ฏธ X / ๊ตฌ์ฒด์ ์ธ ํ๋์ด๋ ๊ฒฝํ์ ๋ฐํ์ผ๋ก ์์ |
|
| 264 |
+
| โก ํ์ฌ ์ ํ ์ด์ | ์ฌ๋ฌ ํ์ฌ ์ค ์ด ํ์ฌ๋ฅผ ์ ํํ ์ด์ | ๊ธฐ์
์ ์ ํ, ์๋น์ค, ์ฐ์
, ์กฐ์ง๋ฌธํ, ๊ฒฝ์์ฒ ํ ๋ฑ๊ณผ ๋ณธ์ธ์ ์ฐ๊ฒฐ๊ณ ๋ฆฌ ์ค๋ช
| "์ง๋ฌด๋ง"์ด ์๋๋ผ "์ด ํ์ฌ์์" ํ๊ณ ์ถ์ ์ด์ ์ฌ์ผ ์ค๋๋ ฅ ์์ |
|
| 265 |
+
| โข ํ์ฌ์ ๋ํด ๋๋ ์ | ํ์ฌ/์กฐ์ง์ ์ ํ๊ฑฐ๋ ์กฐ์ฌํ๋ฉด์ ๋๋ ๊ตฌ์ฒด์ ์ธ ์ธ์ | ์ฒดํ, ์ค์ต, ๊ธฐ์ฌ, ๋ฆฌ์์น, ์ฌ๋๊ณผ์ ์ ์ ์ ํตํด ๋๋ ์ธ์, ๋ถ์๊ธฐ, ๊ฐ์ ๋ฑ | ๋จ์ํ ์นญ์ฐฌ X / ๋ณธ์ธ์ ๊ธฐ์ค์ผ๋ก ํด์ํ ๊ด์ฐฐ๊ณผ ์ธ์ ์ค์ฌ |
|
| 266 |
+
| โฃ ์
์ฌ ํ ๊ณํ | ์
์ฌ ์งํ 1~3๋
๋ด ํ๊ณ ์ถ์ ์ผ, ์ญ๋ ์ฑ์ฅ ๊ณํ | ๋งก๊ฒ ๋ ์ง๋ฌด์์ ์ด๋ค ๋ฐฉ์์ผ๋ก ๊ธฐ์ฌํ๊ณ ์ถ์ผ๋ฉฐ, ์ด๋ค ๋ถ๋ถ์ ์ฑ์ฅ์ํฌ ๊ฒ์ธ์ง | "์ผ๋จ ์ด์ฌํ ํ๊ฒ ๋ค" ์์ ๋ง์ฐํ ์์ง๊ฐ ์๋ ๊ตฌ์ฒด์ ์ธ ํ๋๊ณผ ๋ชฉํ ์ค์ฌ |
|
| 267 |
+
| โค ์ฅ๊ธฐ์ ์ธ ๋ชฉํ | ์ปค๋ฆฌ์ด ๊ด์ ์์์ ์ค์ฅ๊ธฐ์ ์ฑ์ฅ ๋ฐฉํฅ | ์ง๋ฌด ์ ๋ฌธ๊ฐ๋ก์ ๋๋ ๋ฆฌ๋๋ก์ ์ด๋ค ๋ชจ์ต์ผ๋ก ์ฑ์ฅํ๊ณ ์ถ์์ง | ํ์ฌ๊ฐ ๊ทธ ์ฑ์ฅ์ ๋ฐฐ๊ฒฝ์ด ๋์ด์ผ ํจ |
|
| 268 |
+
| โฅ ํ์ฌ์์ ๊ธฐ์ฌ | ๋ณธ์ธ์ ์ฑ์ฅ๊ณผ ํ์ฌ์ ๋ฐฉํฅ์ด ๋ง๋๋ ์ง์ | ๋ณธ์ธ์ ์ญ๋๊ณผ ํ์ฌ์ ๋น์ /๋ฐฉํฅ์ด ๋ง๋ฟ๋ ์ ์ ์ ๊ฐ์กฐ | "๋์ ์ฑ์ฅ = ํ์ฌ์ ๊ธฐ์ฌ"๋ผ๋ ๊ตฌ๋๊ฐ ์์ฐ์ค๋ฝ๊ฒ ๋ณด์ฌ์ ธ์ผ ํจ |
|
| 269 |
+
|
| 270 |
+
๋ชจ๋ฒ๋ต์:
|
| 271 |
+
```markdown
|
| 272 |
+
[์ ํ์ ํ์ง์ ๊ฒฐ์ ์ง๋ ํต์ฌ]
|
| 273 |
+
|
| 274 |
+
ํ๋ถ์์ 3ํ๋
๋ ์ฐธ์ฌํ ์บก์คํค ์ค๊ณ ํ๋ก์ ํธ์์ SoC ๊ธฐ๋ฐ ์ ์ ๋ ฅ ํ๋ก๋ฅผ ์ค๊ณํ๋ฉฐ ๋์งํธ ํ๋ก ์ค๊ณ์ ๊ด์ฌ์ ๊ฐ๊ฒ ๋์์ต๋๋ค. ์ค๊ณ์ ๋ฏธ์ธํ ์ฐจ์ด๊ฐ ์ ์ฒด ์์คํ
์ ๋ฏธ์น๋ ์ํฅ์ ์ฒด๊ฐํ๊ณ , ํ๋ก๊ฐ๋ฐ์ด ๋จ์ํ ๊ธฐ์ ์ ๋์ด '์ ํ์ ํ์ง์ ๊ฒฐ์ ์ง๋ ํต์ฌ'์์ ์ค๊ฐํ์ต๋๋ค.
|
| 275 |
+
|
| 276 |
+
์ด๋ฅผ ๋ฐํ์ผ๋ก ์ผ์ฑ์ ์ ์ฅ๊ธฐํ์ฅ์ค์ต์ ์ง์ํ์ฌ Soc Integration ์
๋ฌด๋ฅผ ์ค์ ํ์ฅ์์ ์ ์ฉํ๊ณ ์ธ๋ฏธ๋์๋ ์ฐธ์ฌํ์ต๋๋ค. ์ด๋ฐ ์ฅ๊ธฐํ์ฅ์ค์ต์ ํตํด ์ผ์ฑ์ ์์ ์ผ์์ผ๋ก์ ๋ณธ์ธ์ ์
๋ฌด์ ์ด์ ์ ๊ฐ๊ณ ๋ฐ๋์ฒด ํ๋ก์ ์ ๋ฐํจ๊ณผ ๋
ผ๋ฆฌ์์์ ๋์์์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ๋๊ฐ๋ ์์ง๋์ด๋ถ๋ค์ ๋ชจ์ต์ ๋ณด๋ฉฐ ๊ผญ ๊ทผ๋ฌดํ๊ณ ์ถ์ ํ์ฌ๋ผ๋ ์๊ฐ์ ๊ฐ๊ฒ ๋์ด ์ง์ํ์ต๋๋ค. ๋ํ, ์ผ์ฑ์ ์์ ์ฐจ์ธ๋ ๊ณต์ ๊ธฐ์ ๊ณผ ์ง์ ํ๋ก ์ค๊ณ ๋ถ์ผ๋ ๋์์๋ ํ์ ์ ํ์๋ก ํ๋ฉฐ, ์ด๋ ์ ๊ฒ ๋์ ๊ณผ ์ฑ์ฅ์ ์ฝ์ํ๋ ํ๊ฒฝ์ด๋ผ ์๊ฐํด ์ง์ํ์ต๋๋ค.
|
| 277 |
+
|
| 278 |
+
์
์ฌ ํ์๋ ๊ทธ๋์์ ๊ฒฝํ์ ๋ฐํ์ผ๋ก ์ ์ ๋ ฅ ๊ณ ํจ์จ ํ๋ก ์ค๊ณ ์ญ๋์ ๋์ฑ ์ฌํ ์ํค๊ฒ ์ต๋๋ค. ํนํ ์์คํ
์ ๋ ฅ ์ต์ ํ๋ฅผ ์ํ ์๋ ๋ก๊ทธยท๋์งํธ ํผํฉ ์ ํธ ํ๋ก ์ค๊ณ ์ญ๋์ ํค์, '์ด์ ์ ๋ฐ๋์ฒด' ๊ฐ๋ฐ์ ๊ธฐ์ฌํ๋ ๊ฒ์ด ์ ๊ฟ์
๋๋ค. ๊ถ๊ทน์ ์ผ๋ก๋ '์ ํ์ ํ์ง์ ๊ฒฐ์ ์ง๋ ํต์ฌ์ธ ํ๋ก๊ฐ๋ฐ'์ฒ๋ผ, ์ผ์ฑ์ ์์ ๊ธฐ์ ๊ฒฝ์๋ ฅ์ ๋์ด๊ณ , ์ง์ ๊ฐ๋ฅํ ๋ฏธ๋ ๊ธฐ์ ์ ์คํํ๋ ๋ฐ ๋ณดํฌ์ด ๋์ด '์ผ์ฑ์ ์์ ํต์ฌ์ด ๋๋ ์ธ์ฌ'๊ฐ ๋๊ฒ ์ต๋๋ค.
|
| 279 |
+
```
|
| 280 |
+
|
| 281 |
+
### ์์ 5 - ์ฑ์ฅ ๊ณผ์
|
| 282 |
+
์ง๋ฌธ: ๋ณธ์ธ์ ์ฑ์ฅ๊ณผ์ ์ ๊ฐ๋ตํ ๊ธฐ์ ํ๋ ํ์ฌ์ ์์ ์๊ฒ ๊ฐ์ฅ ํฐ ์ํฅ์ ๋ผ์น ์ฌ๊ฑด, ์ธ๋ฌผ ๋ฑ์ ํฌํจํ์ฌ ๊ธฐ์ ํ์์ค.
|
| 283 |
+
|
| 284 |
+
๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ:
|
| 285 |
+
| ๋จ๊ณ | ํญ๋ชฉ | ์ค๋ช
| ์ฒดํฌํฌ์ธํธ |
|
| 286 |
+
| --- | --- | --- | --- |
|
| 287 |
+
| โ ์ด๊ธฐ ๋ฐฐ๊ฒฝ | ์ฑ์ฅ ํ๊ฒฝ ๋๋ ์ ๋
๊ธฐ ํน์ง | ์ด๋ฆฐ ์์ ํน์ ํ์ฐฝ ์์ ์ ๊ฐ์น๊ด ํ์ฑ ๋ฐฐ๊ฒฝ์ด ๋๋ ์ฌ๊ฑด์ด๋ ํ๊ฒฝ์ ์๊ฐ | ๋จ์ํ ์ฑ๊ฒฉ ๋ฌ์ฌ๋ณด๋ค๋ ํ๋/์ฌ๊ณ ์ ๊ทผ๊ฑฐ๊ฐ ๋ ์ฌ๊ฑด์ด ์ข์ |
|
| 288 |
+
| โก ๊ฐ์น๊ด ํ์ฑ ์ฌ๊ฑด | ๋์๊ฒ ์ํฅ์ ์ค ์ฌ๊ฑด ๋๋ ์ธ๋ฌผ | ํ์ฌ์ ์ฌ๊ณ ๋ฐฉ์์ด๋ ํ๋ ๋ฐฉ์์ ํ์ฑํ๊ฒ ๋ง๋ ์ฃผ์ ์ฌ๊ฑด์ด๋ ์ธ๋ฌผ ์๊ฐ | ๋จ์ ์๊ฐ X โ ๊ตฌ์ฒด์ ์ธ ์ํฉ ๋ฌ์ฌ + ๋์๊ฒ ์ค ๋ณํ |
|
| 289 |
+
| โข ๋ณํ์ ๊ฒฐ๊ณผ | ์ฌ๊ณ ๋ฐฉ์, ํ๋ ๋ณํ ๋ฐ ์ฑ๊ณผ | ์ ์ฌ๊ฑด/์ธ๋ฌผ๋ก ์ธํด ์๊ธด ๋ณํ๊ฐ ์ค์ ํ๋์ด๋ ์ฑ๊ณผ๋ก ์ด์ด์ก์์ ์์ | ์๊ฐ๋ง ๋ณํ ๊ฒ ์๋๋ผ, ํ๋๊ณผ ๊ฒฐ๊ณผ๊ฐ ์์๋์ง ๋ณด์ฌ์ค ๊ฒ |
|
| 290 |
+
| โฃ ์ง๋ฌด์์ ์ฐ๊ฒฐ | ์ง๋ฌด์ ์ฐ๊ฒฐ๋ ๊ฐ์น๊ด ์ ๋ฆฝ ๋ฐ ์ ํฉ์ฑ ์ดํ | ์ ๊ณผ์ ์์ ํ์ฑ๋ ๊ฐ์น๊ด์ด๋ ์ญ๋์ด ์ง์ ์ง๋ฌด์ ์ ํฉํจ์ ์ค๋ช
| '๊ทธ๋์ ์ง๊ธ ์ด ์ง๋ฌด์ ์ ์ ํฉํ๊ฐ?'๋ฅผ ๋ช
ํํ๊ฒ ์ฐ๊ฒฐ |
|
| 291 |
+
|
| 292 |
+
๋ชจ๋ฒ๋ต์:
|
| 293 |
+
```markdown
|
| 294 |
+
[๊ตฌ์กฐ๋ฅผ ํ์
ํ๊ณ ์ดํดํ๋ ๋ฌธ์ ์ค์ฌ ์ค๊ณ ์ฌ๊ณ ]
|
| 295 |
+
|
| 296 |
+
์ด๋ฆด ๋๋ถํฐ ์ง๊ธ๊น์ง ์ ๋ ์ง ์์ ์์ ์ ์๊ธฐ๊ธฐ๊ฐ ๊ณ ์ฅ ๋๋ฉด ๊ทธ๋ฅ ๋ฒ๋ฆฌ์ง ์๊ณ ์ง์ ๋ถํดํ๋ฉฐ ๋ด๋ถ๋ฅผ ์ดํด๋ณด์์ต๋๋ค. ์ฒ์์๋ ๋จ์ํ ํธ๊ธฐ์ฌ์ผ๋ก ํ๋ ํ๋์ด ํ๋ค ๋ณด๋ ์ ์ ์์ฌ์ด ๋์ ์ค์ค๋ก ์ ์๊ธฐ๊ธฐ์ ์๋ฆฌ๋ฅผ ์ฐพ์๋ณด๊ณ ํ์ตํด์ '์๋ฆฌ'์ ๋ํ ์์ฌ๊น์ง ์๊ธฐ๊ธฐ ์์ํ์ต๋๋ค.
|
| 297 |
+
|
| 298 |
+
์ด๋ฐ ์ ์๊ฒ ๊ฐ์ฅ ํฐ ์ํฅ์ ์ค ์ธ๋ฌผ์ ์ ํ๋ฒ 000์
๋๋ค. ๋จ์ํ ํธ๊ธฐ์ฌ์ผ๋ก ์ ์๊ธฐ๊ธฐ๋ฅผ ๋ถํดํ ๋๋ ๊ทธ์ '์๋ฆฌ'๋ฅผ ์ํด ๋ฐ๋ผํ๋ ํ๋์ธ๋ฐ, ์์ฌ์ด ๋๊ธฐ ์์ํ์ ๋๋ '๊ตฌ์กฐ๋ฅผ ํ์
'ํ๊ธฐ ์ํด ๋ฉด๋ฐํ ์ดํด๋ณด๋ ์ต๊ด์ด ๋ค์์ต๋๋ค. ์ ํ๋ฒ 000์ "๊ทธ์ ๋ฐ๋ผํ์ง ๋ง์๊ณ , ์ด๋ค ์๋ฆฌ๋ก ์๋ํ๋์ง ํ์
ํ๊ณ , ์ดํด ํ๋๊ฒ ์ค์ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ค๋ฅธ ์ ํ๋ ์ค์ค๋ก ์๋ฆฌํ์ค ์ ์์ต๋๋ค"์ด๋ฐ ๋ง์ ์์ฃผ ํ๊ณ , ์ด๋ ์ ์ ์ฌ๊ณ ๋ฐฉ์๊ณผ ํ์ต ํ๋๋ฅผ ๋ฐ๊ฟ ๋์์ต๋๋ค.
|
| 299 |
+
|
| 300 |
+
์ ์๊ธฐ๊ธฐ์์ ์์๋ ํธ๊ธฐ์ฌ์ด ์ปค์ ธ ์ ์๊ณตํ์ ์ ๊ณตํ๊ฒ ๋์ ๋๋, ์ ํ๋ฒ 000์ ๋ง์ ์์ฃผ ๋ ์ฌ๋ ค ํ๋ํ์ต๋๋ค. ํ๋ก์ค๊ณ์์๋ ๋จ์ํ ์ค๊ณ๋ ํ๋ก๋ฅผ ์๋ฎฌ๋ ์ด์
ํ๊ณ ๊ฒฐ๊ณผ๋ง ํ์ธํ๋ ์์ค์ด ์๋, ๊ธฐ์กด์ ๊ตฌ์กฐ ๋ฐฉ์์ ๋ ์ฌ๋ฆฌ๊ณ ์ดํดํ ๋ฐฉ๋ฒ์ ์ ์ฉํ๊ธฐ ์ํด ๋
ธ๋ ฅํ์ต๋๋ค. ๋๋ถ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋๋ "๊ธฐ์กด ๊ตฌ์กฐ ๋ฐฉ์๊ณผ ๋ค๋ฅธ ๋ฌธ์ ๋ ๋ญ์์ง? ์ด ๊ตฌ์กฐ์์๋ ์ 00๋ฐฉ์์ ์ ํํ์ง? ์ ๋ ฅ ์๋ชจ๋ฅผ ์ค์ผ ์ ์๋ ๋ค๋ฅธ ๊ตฌ์กฐ๋ ์์๊น?"์ด๋ฐ ์ง๋ฌธ์ ์์ฐ์ค๋ฝ๊ฒ ๋ ์ฌ๋ฆฌ๊ณ , ๋ค๋ฅธ ํ์๋ค๋ณด๋ค ์ฝ๊ฒ ๋ฌธ์ ํด๊ฒฐ ๏ฟฝ๏ฟฝ์์ ์ฐพ์ ์ ์์์ต๋๋ค. ์ ๋ ํ๋ก์ '๊ธฐ๋ฅ'๋ฟ ์๋๋ผ, 'ํจ์จ์ฑ๊ณผ ๊ตฌ์กฐ์ ์ค๊ณ'์ ๋ํ ๊ณ ๋ฏผ์ ํ๊ฒ ๋์๊ณ , ๋๋ถ์ ์ต์ฐ์ ์ฑ์ ์ฅํ์์ด ๋ ์ ์์์ต๋๋ค.
|
| 301 |
+
|
| 302 |
+
"๊ตฌ์กฐ๋ฅผ ํ์
ํ๊ณ ์ดํดํ๋ ๋ฌธ์ ์ค์ฌ ์ค๊ณ ์ฌ๊ณ "๋ฅผ ํตํด ๋์์์ด ํ๋ก์ ๊ตฌ์กฐ์ ํจ์จ์ ํ๊ตฌํ๋ ์ต๊ด์ ์ผ์ฑ์ ์ ํ๋ก๊ฐ๋ฐ ์ง๋ฌด์์๋ ์ค์ง์ ์ธ ๊ฒฝ์๋ ฅ์ผ๋ก ์ด์ด์ง ๊ฒ์
๋๋ค.
|
| 303 |
+
```
|
| 304 |
+
|
| 305 |
+
### ์์ 6 - ๋ณด์ ์ง์ ๋ฐ ๊ธฐ์ (๋ชฉํ์งํฅํ)
|
| 306 |
+
์ง๋ฌธ: ๋ณด์ ํ ๊ธฐ์ ์คํ(Language, Framework, DB ๋ฑ)์ ๋ํด ์๋ จ๋๋ฅผ ํฌํจํ์ฌ ์์ธํ ๊ธฐ์ ํ์์ค.
|
| 307 |
+
|
| 308 |
+
๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ:
|
| 309 |
+
| ๋จ๊ณ | ํญ๋ชฉ | ์ค๋ช
| ์ฒดํฌํฌ์ธํธ |
|
| 310 |
+
| --- | --- | --- | --- |
|
| 311 |
+
| โ ํต์ฌ ์ญ๋ ์ ์ธ | ํ์ฌ ๋ณด์ ํ ๊ธฐ์ ์ญ๋์ ํ ๋ฌธ์ฅ์ผ๋ก ์์ฝํ๋ฉฐ ๋ชฉํ ์งํฅ์ฑ์ ๊ฐ์กฐ | ๋จ์ํ ๊ฒฝํ ๋์ด์ด ์๋๋ผ ๋ชฉํ์ /์ ๋ต์ ํ์ต์ผ๋ก ์ ๊ทผํ์์ ๋ช
์ | "๊ทธ๋ฅ ํ๋ค" X โ "์ด๊ฑธ ๋ชฉํ๋ก ์๋์ ์ผ๋ก ํด์๋ค" O |
|
| 312 |
+
| โก ์ค์ ์ฌ๋ก | ์ค๋ฌดํ ํ๋ก์ ํธ์์ ํด๋น ๊ธฐ์ ์ ์ง์ ํ์ฉํ ๊ฒฝํ ์ ์ | ๋๊ตฌ ์ฌ์ฉ ์์ค์ด ์๋๋ผ ์ด๋ป๊ฒ ์ ์ฉํ๋์ง๊ฐ ๊ตฌ์ฒด์ ์ผ๋ก ๋๋ฌ๋์ผ ํจ | ํ๋ก์ ํธ ๋ฐฐ๊ฒฝ๊ณผ ๋ด ์ญํ , ๊ธฐ์ ํ์ฉ ๋ฐฉ์๊น์ง ํฌํจ |
|
| 313 |
+
| โข ๋ฌธ์ ์ํฉ ๋ฐ ๊ทน๋ณต | ํ๋ก์ ํธ ๋ด ๊ธฐ์ ์ ๋ฌธ์ ๋ ํ์
์ด์, ์ํ์ฐฉ์ค ๋ฑ์ ํด๊ฒฐํ ๊ฒฝํ | ๊ธฐ์ ๋ง์ด ์๋ ํ์
/์ํต/๋ฌธ์ํ๊น์ง ๋ค๋ค๋ ์ข์ | ์คํจ๋ ์ด๋ ค์์ ํํผํ์ง ์๊ณ ๊ทน๋ณตํ ๊ณผ์ ๊ฐ์กฐ |
|
| 314 |
+
| โฃ ๊ธฐ์ ์ญ๋ ์์ฝ | ์ง๊ธ๊น์ง ํ์ตํ ๊ธฐ์ ์คํ๊ณผ ์๋ จ๋๋ฅผ ์ ๋ฆฌ | ๋จ์ ๋์ด์ด ์๋๋ผ ์ด์ ์ ์๋ จ ์์ค๊น์ง ํจ๊ป ์ ์ | ๊ธฐ์ ๋ง๋ค ์๋ จ๋/ํ์ฉ ๋ฐฐ๊ฒฝ/์ง์์ฑ ํฌํจ๋๋ฉด ์ ๋ขฐ โ |
|
| 315 |
+
| โค ์ง๋ฌด ์ฐ๊ณ ๋ฐ ํฌ๋ถ | ๋์ ๊ธฐ์ ์ญ๋์ด ํด๋น ์ง๋ฌด์ ์ด๋ป๊ฒ ๊ธฐ์ฌํ ์ ์๋์ง ์์ | ๋จ์ ์ฐ๊ฒฐ X โ ์ด๋ค ํ, ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ถ์์ง ๊ตฌ์ฒดํ | "๊ธฐ์ฌ ๊ฐ๋ฅ์ฑ + ์ ์๋ ฅ + ์ฑ์ฅ ์์ง"๊ฐ ํจ๊ป ๋ณด์ด๋ฉด ์ข์ |
|
| 316 |
+
|
| 317 |
+
๋ชจ๋ฒ๋ต์:
|
| 318 |
+
```markdown
|
| 319 |
+
์ ๋ ๋จ์ํ ๊ธฐ๋ฅ ๊ตฌํ์ด ์๋, ์ค๋ฌด์ ๊ฐ๊น์ด ํ๊ฒฝ ์์์ ๋ชฉํ ์งํฅ์ ์ผ๋ก ๊ฐ๋ฐ ์ญ๋์ ์์์์ต๋๋ค. ๊ฐ๋ฐ์์๊ฒ ํ์ํ ๊ธฐ์ ์ ๋ ๋น ๋ฅด๊ฒ ๋ฐ๋์ง๋ง, ์ ๋ ํ๋ก์ ํธ ๋จ์๋ก ์ค์ง์ ์ธ ๋ฌธ์ ๋ฅผ ์ ์ํ๊ณ , ์ด๋ฅผ ๊ธฐ์ ๋ก ํด๊ฒฐํ๋ฉฐ ์ญ๋์ ๋จ๊ณ์ ์ผ๋ก ํ์ฅํด ์์ต๋๋ค.
|
| 320 |
+
|
| 321 |
+
๋ํ์ ์ธ ์ฌ๋ก๋ ๋ํ๊ต ํ ํ๋ก์ ํธ๋ก ์งํํ '์บ ํ์ฅ ์์ฝ ํ๋ซํผ'์
๋๋ค. ์ด ํ๋ก์ ํธ์์ ์ ๋ ๋ฐฑ์๋ ์ ๋ฐ์ ๋ด๋นํ๋ฉฐ, ์ฌ์ฉ์ ์ ์ฆ๊ฐ๋ฅผ ๊ณ ๋ คํ **ํ์ฅ ๊ฐ๋ฅํ๊ณ ์์ ์ ์ธ ์์คํ
์ค๊ณ**๋ฅผ ๋ชฉํ๋ก ์ค์ ํ์ต๋๋ค. Node.js์ Express๋ฅผ ํ์ฉํด RESTful API๋ฅผ ๊ตฌ์ฑํ๊ณ , MySQL์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ค๊ณํ๋ฉฐ ๋ฐ์ดํฐ ์ ๊ทํ์ ์ฟผ๋ฆฌ ํจ์จํ์ ์ค์ ์ ๋์์ต๋๋ค. ํด๋ผ์ฐ๋ ๋ฐฐํฌ๋ AWS EC2์ RDS๋ก ์ง์ ํ๊ฒฝ์ ๊ตฌ์ฑํด ์๋น์ค ์์ ์ฑ์ ํ๋ณดํ์ต๋๋ค.
|
| 322 |
+
|
| 323 |
+
์ด๊ธฐ์๋ API ๋ช
์ธ์ ํ์
๋ฐฉ์์ ๋ฏธํกํจ์ผ๋ก ์ธํด ํ๋ก ํธ์๋์ ์ฆ์ ์ถฉ๋์ด ์์๊ณ , ์๋ฒ ์๋ต ๊ตฌ์กฐ์ ๋ถ์ผ์น๋ก ์ค๋ฅ๊ฐ ๋ฐ๋ณต๋์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Swagger๋ฅผ ๋์
ํด API ๋ฌธ์ํ๋ฅผ ์งํํ๊ณ , Git ๋ธ๋์น ์ ๋ต๊ณผ ํ
์คํธ ์๋ํ ๋๊ตฌ(Postman ๋ฑ)๋ฅผ ์ ์ฉํด ํ ๊ฐ ๊ฐ๋ฐ ์๋๋ฅผ ๋ง์ท์ต๋๋ค. ์ด ๊ณผ์ ์ ํตํด ์ ๋ **๊ธฐ์ ๋งํผ์ด๋ ์ํต๊ณผ ๋ฌธ์ํ๊ฐ ๊ฐ๋ฐ์ ํต์ฌ**์ด๋ผ๋ ์ ์ ์ฒด๊ฐํ๊ฒ ๋์์ต๋๋ค.
|
| 324 |
+
|
| 325 |
+
์ดํ์๋ ๊ธฐ์ ์ ๊น์ด๋ฅผ ๋ํ๊ธฐ ์ํด TypeScript, Nest.js ๋ฑ์ ํ์ต ์ค์ด๋ฉฐ, ํ์ฌ๊น์ง ์๋ จ๋ ์คํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
|
| 326 |
+
|
| 327 |
+
- **์ธ์ด**: JavaScript (์ค์๊ธ), TypeScript (๊ธฐ์ด ์ด์)
|
| 328 |
+
- **๋ฐฑ์๋ ํ๋ ์์ํฌ**: Express.js (์ค์๊ธ), Nest.js (ํ์ต ์ค)
|
| 329 |
+
- **๋ฐ์ดํฐ๋ฒ ์ด์ค**: MySQL (์ค์๊ธ, ์ ๊ทํ ๋ฐ ์ฟผ๋ฆฌ ์ต์ ํ ๊ฒฝํ ๋ณด์ )
|
| 330 |
+
- **DevOps/ํ์
**: AWS EC2/RDS, Git, Swagger, Postman ๋ฑ ์ค๋ฌด ํ์ฉ ๊ฒฝํ
|
| 331 |
+
|
| 332 |
+
์ ๋ ๊ธฐ์ ์ ๋จ์ํ ๊ธฐ๋ฅ ๊ตฌํ์ ๋๊ตฌ๋ก ๋ณด์ง ์์ต๋๋ค. ์ฌ์ฉ์์ ๋ฌธ์ ๋ฅผ ํ์
ํ๊ณ , ๊ธฐ์ ๋ก ์ฐ๊ฒฐํ๋ฉฐ, ํ์
์ ํตํด ํ์ค์ ์ธ ํด๋ฒ์ ๋ง๋ค์ด๋ด๋ ๊ณผ์ ์ด ์ง์ง ๊ฐ๋ฐ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ฌํ ๊ธฐ์ ๋ ฅ๊ณผ ์ค์ ๊ฐ๊ฐ์ ๊ท์ฌ์ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ๋น ๋ฅด๊ฒ ์ ์ํ๊ณ , ํ ๋จ์ ์ฑ๊ณผ๋ฅผ ์ฐฝ์ถํ๋ ๋ฐ ๋ถ๋ช
ํ ๊ธฐ์ฌํ ์ ์์ ๊ฒ์
๋๋ค.
|
| 333 |
+
```
|
| 334 |
+
|
| 335 |
+
### ์์ 7 - ์ญ๋ ๊ฐ๋ฐ ๊ณผ์
|
| 336 |
+
์ง๋ฌธ: ์ง๋ฌด ์ ๋ฌธ์ฑ์ ๊ฐ์ถ๊ธฐ ์ํด ์์์ ์ผ๋ก ์ด๋ค ๋
ธ๋ ฅ์ ํด์๋๊ฐ?
|
| 337 |
+
|
| 338 |
+
๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ:
|
| 339 |
+
| ๋จ๊ณ | ํญ๋ชฉ | ์ค๋ช
| ์ฒดํฌํฌ์ธํธ |
|
| 340 |
+
| --- | --- | --- | --- |
|
| 341 |
+
| โ ๊ณ๊ธฐ ๋ฐ ๋ฐฐ๊ฒฝ | ์ ๋ฌธ์ฑ์ ํค์ฐ๊ธฐ ์ํด ํ์ต์ด ํ์ํ๋ค๊ณ ๋๋ ๊ณ๊ธฐ | ์ค์ ๊ฒฝํ์ด๋ ์คํจ, ํ๊ณ๋ฅผ ๊ฒช์ผ๋ฉฐ ๋๋ 'ํ์ต์ ํ์์ฑ' | ๋จ์ ํธ๊ธฐ์ฌ X โ ๋ฌธ์ ์ธ์ ๋๋ ํ์ ์์ ๊ธฐ๋ฐ |
|
| 342 |
+
| โก ํ์ต ํ๋ | ํ์ต์ ์ํด ์ด๋ค ๋
ธ๋ ฅ์ ํ๋์ง ๊ตฌ์ฒด์ ํ๋ ์์ | ๊ต๏ฟฝ๏ฟฝ ์ด์, ํ๋ก์ ํธ ์ฐธ์ฌ, ๋๊ตฌ ํ์ต, ํผ๋๋ฐฑ ๋ฑ | ์ค์ค๋ก ์ ํํ๊ณ ๋ชฐ์
ํ ๊ฒฝํ์ด๋ฉด ๋ ์ข์ |
|
| 343 |
+
| โข ์ ์ฉ ๋ฐ ์ค์ฒ | ํ์ตํ ๋ด์ฉ์ ์ค์ ๊ฒฝํ์ ์ ์ฉํ ๊ณผ์ | ํ์ต-์คํ ์ฐ๊ฒฐ๊ณ ๋ฆฌ ๋ช
ํํ ์ค๋ช
| ๊ฒฐ๊ณผ๊ฐ ๋์ค์ง ์์๋ ์คํ์ด ์ค์ |
|
| 344 |
+
| โฃ ์ฑ๊ณผ | ์คํ ํ ์ด๋ค ๋ณํ๋ ์ฑ๊ณผ๊ฐ ์์๋์ง | ์์น, ๋น๊ต, ํ์ธ์ ํ๊ฐ ๋ฑ์ผ๋ก ์ค๋๋ ฅ ๊ฐํ | "๊ทธ๋์ ์ด๋ค ํจ๊ณผ๊ฐ ์์๋๊ฐ?"์ ๋ตํด์ผ ํจ |
|
| 345 |
+
| โค ์ฑ์ฅ ๋ฐ ์ฐ๊ณ | ํ์ต์ด ์ด๋ป๊ฒ ๋ด ์ฌ๊ณ ๋ฐฉ์/์ญ๋์ ์ํฅ์ ๋ฏธ์ณค๋์ง | ๋ง์ธ๋์
๋ณํ, ์ดํ ํ๋์ ๋ณํ | ์ง๋ฌด ์ ํฉ์ฑ๊ณผ ์ฐ๊ฒฐ๋๋๋ก ๋ง๋ฌด๋ฆฌ |
|
| 346 |
+
|
| 347 |
+
๋ชจ๋ฒ๋ต์:
|
| 348 |
+
```markdown
|
| 349 |
+
๋ํ๊ต 2ํ๋
์์ , ์ ๋ ํ ์ง์ญ ์์๊ณต์ธ ์ฐํฉํ์์ ์ฃผ์ตํ SNS ๋ง์ผํ
์ํฌํฐ์ฆ ํ๋์ ์ฐธ์ฌํ๊ฒ ๋์์ต๋๋ค. ์ธ๊ทผ ์์์ ์ ๋์์ผ๋ก ํ๋ณด ์ฝํ
์ธ ๋ฅผ ๊ธฐํํ๊ณ ์ด์ํ๋ ํ๋ก์ ํธ์๋๋ฐ, ๋ฉ๋ด ์ฌ์ง์ ์ฌ๋ฆฌ๊ณ ํด์ํ๊ทธ๋ง ๋ถ์ด๋ฉด ๋ ์ค ์์๋ ์ ์ ์๊ฐ์ ๊ธ์ธ ๊นจ์ก์ต๋๋ค. ์ฝํ
์ธ ๋ฅผ ์๋ฌด๋ฆฌ ์ฌ๋ ค๋ ์กฐํ์์ ๋ฐ์์ ๋ฏธ๋ฏธํ๊ณ , ์ฌ์ฅ๋๋ค์ ๊ฒฐ๊ณผ๋ฅผ ๊ถ๊ธํดํ๋ฉฐ ์ฐ๋ฆฌ ํ์ ์ฌ์ดํ์ต๋๋ค.
|
| 350 |
+
|
| 351 |
+
๊ทธ๋ ์ ์๊ฒ ๊น์ ์ธ์ฌ์ดํธ๋ฅผ ์ค ์ธ๋ฌผ์ ๋น์ ํ๋์ ์ด๊ดํ๋ ๋ง์ผํ
์ค๋ฌด ๋ฉํ ์์ต๋๋ค. ๊ทธ๋ "์๋น์์ ๋๋์ด์์ ์ถ๋ฐํ์ง ์๋ ์ฝํ
์ธ ๋ ์๋ฌด๋ฆฌ ์ ์ฑ ๋ค์ฌ๋ ์๋ฏธ ์๋ค"๋ฉฐ, ์๋น์ ๊ด์ ์์ ์ ๊ทผํ๋ ๋ฒ์ ์๋ ค์ฃผ์์ต๋๋ค. ๊ณ ๊ฐ์ด ์ธ์ , ์, ์ด๋ค ๋ชฉ์ ์ผ๋ก ์ด ๊ฐ๊ฒ๋ฅผ ๋ฐฉ๋ฌธํ ์ง๋ฅผ ์ค์ฌ์ผ๋ก ์ฌ๊ณ ํ๋ ๋ฒ์ ๋ฐฐ์ฐ๋ฉด์, ๋จ์ ํ๋ณด๊ฐ ์๋ **๋ฌธ์ ํด๊ฒฐํ ๋ง์ผํ
**์ด ๋ฌด์์ธ์ง ์ฒ์์ผ๋ก ์ค๊ฐํ ์ ์์์ต๋๋ค.
|
| 352 |
+
|
| 353 |
+
์ดํ ์ ๋ ์์์ ๋ฐฉ๋ฌธ ๊ณ ๊ฐ์ ์ง์ ๊ด์ฐฐํ๊ณ ๊ฐ๋จํ ์ธํฐ๋ทฐ๋ฅผ ์งํํด ์ฃผ์ ๊ณ ๊ฐ์ธต์ ํ์
ํ์ต๋๋ค. ๋ถ์ ๊ฒฐ๊ณผ, '์ง์ฅ์ธ ์ ์ฌ ์์'๊ฐ ํต์ฌ์ด๋ผ๋ ์ ์ ๋์ถํด, ๋ฉ๋ด๋ณ ๋๊ธฐ ์๊ฐ๊ณผ ํผ๋ฐฅ ์ข์ ์ฌ๋ถ๋ฅผ ์ฝํ
์ธ ์ ๋ฐ์ํ์ต๋๋ค. ๋ํ, ์ธ์คํ๊ทธ๋จ ํผ๋๋ฅผ ํ์ฉํ '์ค๋์ ์ ์ฌ ์ถ์ฒ' ์ฝํ
์ธ ๋ฅผ ๊ธฐํํ๊ณ ๊ฒ์ํ ๊ฒฐ๊ณผ, ๊ฐ๊ฒ ์ธก์ผ๋ก๋ถํฐ "์ด์ ๋ณด๋ค ์ ์ฌ ๋งค์ถ์ด ๋์ ๋๊ฒ ๋์๋ค"๋ ํผ๋๋ฐฑ์ ๋ฐ์๊ณ , ๊ฒ์๋ฌผ ํ๊ท ์กฐํ์๋ 2๋ฐฐ ์ด์ ์์นํ์ต๋๋ค.
|
| 354 |
+
|
| 355 |
+
์ด ๊ฒฝํ์ ๋ง์ผํ
์ ๋จ์ ์ฝํ
์ธ ์ ์์ด ์๋ **๊ณ ๊ฐ ๋ฌธ์ ํด๊ฒฐ์ ์ํ ๋๊ตฌ**๋ก ๋ฐ๋ผ๋ณด๋ ๊ด์ ์ ๊ธธ๋ฌ์ฃผ์์ต๋๋ค. ์ดํ ๊ต๋ด ๋ง์ผํ
ํ๋ก์ ํธ, ๊ตฌ๊ธ ์ ๋๋ฆฌํฑ์ค ๋ฐ SNS ๋ถ์ ๋๊ตฌ ํ์ต ๋ฑ์ ํตํด ๋ฐ์ดํฐ ๊ธฐ๋ฐ์ ์ ๋ต์ ์ฌ๊ณ ๋ ฅ์ ๊ฐํํ์ต๋๋ค. ํ์ฅ์ ์๊ฐ๊ณผ ๋์งํธ ์ญ๋์ ํจ๊ป ๊ฐ์ถ ์ ๋, ๊ณ ๊ฐ๊ณผ ์์ฅ์ ๋์์ ์ดํดํ๊ณ ์ค๋ํ ์ ์๋ ๋ง์ผํ
์ธ์ฌ๋ก์ ๋๊ตฌ๋ณด๋ค ๋น ๋ฅด๊ฒ ์ฑ๊ณผ๋ฅผ ์ฐฝ์ถํ ์์ ์ด ์์ต๋๋ค.
|
| 356 |
+
```
|
| 357 |
+
|
| 358 |
+
### ์ถ๋ก
|
| 359 |
+
์ง๋ฌธ: {question}
|
| 360 |
+
๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ: {guideline}
|
| 361 |
+
ํ์ฌ ์ด๋ฆ: {company_name}
|
| 362 |
+
์ง์ ์ง๋ฌด: {job_position}
|
| 363 |
+
๊ฒฝ๋ ฅ ์์ค: {experience_level}
|
| 364 |
+
๊ธ์์ ์ ํ: {word_limit}
|
| 365 |
+
๋ํ ๋ด์ฉ: {conversation}
|
| 366 |
+
|
| 367 |
+
๋ชจ๋ฒ๋ต์:
|
| 368 |
+
|
example_info.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"company_name": "์นด์นด์ค",
|
| 3 |
+
"industry": "IT/์ํํธ์จ์ด",
|
| 4 |
+
"position_title": "๋ฐฑ์๋ ๊ฐ๋ฐ์",
|
| 5 |
+
"core_values": "ํ์ ์ฑ, ํ์
๋ฅ๋ ฅ, ๋์ ์ ์ ",
|
| 6 |
+
"company_size": "๋๊ธฐ์
",
|
| 7 |
+
"context_report": "์นด์นด์ค๋ ์ต๊ทผ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ
์ฒ๋ก์ ์ ํ์ ์งํ ์ค์ด๋ฉฐ, ํ์ ๊ณผ ํ์
์ ์ค์ํ๋ ๊ธฐ์
๋ฌธํ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.",
|
| 8 |
+
"jd": "๋ฐฑ์๋ ๊ฐ๋ฐ์๋ก์ ๋๊ท๋ชจ ํธ๋ํฝ ์ฒ๋ฆฌ, ๋ง์ดํฌ๋ก์๋น์ค ์ค๊ณ ๋ฐ ์ด์, RESTful API ๊ฐ๋ฐ ๊ฒฝํ์ด ์๊ตฌ๋ฉ๋๋ค.",
|
| 9 |
+
"recent_issue": "ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ
์ฒ๋ก์ ์ ํ ์งํ ์ค",
|
| 10 |
+
"student_name": "๊น์ฒ ์",
|
| 11 |
+
"student_major": "์ปดํจํฐ๊ณตํ๊ณผ",
|
| 12 |
+
"student_status": "4ํ๋
",
|
| 13 |
+
"experience_summary": "ํ๋ถ ์์ ๋ค์ํ ํ ํ๋ก์ ํธ์ ์ธํด ๊ฒฝํ์ ํตํด ํ์
๊ณผ ๋ฌธ์ ํด๊ฒฐ ๋ฅ๋ ฅ์ ํค์ ์ผ๋ฉฐ, ๋ฐฑ์๋ ๊ฐ๋ฐ ๊ด๋ จ ํ๋ก์ ํธ๋ฅผ ๋ค์ ์ํํ์์ต๋๋ค.",
|
| 14 |
+
"guide": "- ์ฑ์ฅ ๊ณผ์ : ์ง์์์ ๊ฐ์น๊ด์ ์ํฅ์ ๋ฏธ์น ๊ฒฐ์ ์ ์ธ ๊ฒฝํ์ด๋ ์ฌ๊ฑด์ ๋ํด ์ง๋ฌธํ์ฌ, ์ถ์ ํ๋์ ์ ๋
์ ํ์
ํฉ๋๋ค.\\n- ๊ฐ์ : ์ง๋ฌด์ ๊ด๋ จ๋ ํต์ฌ ๊ฐ์ ์ ์ ์ ํ๊ณ , ๊ทธ ๊ฐ์ ์ ์ฆ๋ช
ํ ์ ์๋ ๊ตฌ์ฒด์ ์ธ ๊ฒฝํ๊ณผ ์ฌ๋ก๋ฅผ ๋ค์ด ์ค๋ช
ํ๋๋ก ์ ๋ํฉ๋๋ค.\\n- ๋จ์ : ์์งํ์ง๋ง ์น๋ช
์ ์ด์ง ์์ ๋จ์ ์ ์ธ๊ธํ๊ณ , ์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ์ด๋ค ๋
ธ๋ ฅ์ ํ๊ณ ์๋์ง ๊ตฌ์ฒด์ ์ผ๋ก ์ค๋ช
ํ๋๋ก ์ ๋ํฉ๋๋ค.",
|
| 15 |
+
"questions": [
|
| 16 |
+
"๋ณธ์ธ์ ์ฑ์ฅ ๊ณผ์ ๊ณผ ์ฑ๊ฒฉ์ ์ฅ๋จ์ ์ ๋ํด ์์ ํ์์ค."
|
| 17 |
+
]
|
| 18 |
+
}
|
| 19 |
+
|
guide_generation/__init__.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
# This file can be empty. It marks the directory as a Python package.
|
guide_generation/__pycache__/__init__.cpython-312.pyc
ADDED
|
Binary file (161 Bytes). View file
|
|
|
guide_generation/__pycache__/llm_functions.cpython-312.pyc
ADDED
|
Binary file (5.93 kB). View file
|
|
|
guide_generation/guide_generation_report_20250625_090910.html
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
guide_generation/llm_functions.py
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from openai import OpenAI
|
| 2 |
+
from dotenv import load_dotenv
|
| 3 |
+
import yaml
|
| 4 |
+
import os
|
| 5 |
+
import json
|
| 6 |
+
import re
|
| 7 |
+
|
| 8 |
+
load_dotenv()
|
| 9 |
+
|
| 10 |
+
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
|
| 11 |
+
|
| 12 |
+
# load prompt
|
| 13 |
+
try:
|
| 14 |
+
current_dir = os.path.dirname(os.path.abspath(__file__))
|
| 15 |
+
prompt_path = os.path.join(current_dir, 'prompt.yaml')
|
| 16 |
+
with open(prompt_path, "r", encoding='utf-8') as file:
|
| 17 |
+
prompt = yaml.safe_load(file)["prompt"]
|
| 18 |
+
except Exception as e:
|
| 19 |
+
print(f"Warning: prompt.yaml ๋ก๋ ์คํจ. ๊ธฐ๋ณธ ํ๋กฌํํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ค๋ฅ: {e}")
|
| 20 |
+
prompt = "Question: {question}\nJD: {jd}\nCompany: {company_name}\nExperience: {experience_level}\nGenerate a guide based on this information in markdown table format."
|
| 21 |
+
|
| 22 |
+
|
| 23 |
+
def parse_json_from_response(text: str) -> dict | None:
|
| 24 |
+
"""
|
| 25 |
+
Markdown ์ฝ๋ ๋ธ๋ก ์์ ํฌํจ๋ ์ ์๋ JSON ๋ฌธ์์ด์ ์ถ์ถํ๊ณ ํ์ฑํฉ๋๋ค.
|
| 26 |
+
|
| 27 |
+
Deprecated: ์ด ํจ์๋ JSON ํ์ฑ์ฉ์ด๋ฏ๋ก guide generation์์๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
|
| 28 |
+
|
| 29 |
+
Args:
|
| 30 |
+
text (str): LLM์ด ๋ฐํํ ์ ์ฒด ํ
์คํธ ์๋ต.
|
| 31 |
+
|
| 32 |
+
Returns:
|
| 33 |
+
dict | None: ํ์ฑ๋ ๋์
๋๋ฆฌ ๊ฐ์ฒด, ๋๋ ์คํจ ์ None.
|
| 34 |
+
"""
|
| 35 |
+
if not text:
|
| 36 |
+
return None
|
| 37 |
+
|
| 38 |
+
# ```json ... ``` ๋๋ ``` ... ``` ํ์์ ์ฝ๋ ๋ธ๋ก์์ JSON ์ถ์ถ
|
| 39 |
+
match = re.search(r"```(?:json)?\s*([\s\S]*?)\s*```", text)
|
| 40 |
+
if match:
|
| 41 |
+
json_str = match.group(1)
|
| 42 |
+
else:
|
| 43 |
+
# ์ฝ๋ ๋ธ๋ก์ด ์๋ค๋ฉด, ์ ์ฒด ํ
์คํธ๋ฅผ JSON์ผ๋ก ๊ฐ์
|
| 44 |
+
json_str = text
|
| 45 |
+
|
| 46 |
+
try:
|
| 47 |
+
return json.loads(json_str)
|
| 48 |
+
except json.JSONDecodeError:
|
| 49 |
+
# ์ ์ฒด ํ์ฑ์ด ์คํจํ๋ฉด, ์ฒซ '{'์ ๋ง์ง๋ง '}'๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ค์ ์๋
|
| 50 |
+
start_index = json_str.find('{')
|
| 51 |
+
end_index = json_str.rfind('}')
|
| 52 |
+
if start_index != -1 and end_index != -1 and start_index < end_index:
|
| 53 |
+
potential_json = json_str[start_index:end_index+1]
|
| 54 |
+
try:
|
| 55 |
+
return json.loads(potential_json)
|
| 56 |
+
except json.JSONDecodeError:
|
| 57 |
+
pass # ์ด๋ง์ ๋ ์คํจํ๋ฉด ๊ทธ๋ฅ None ๋ฐํ
|
| 58 |
+
|
| 59 |
+
return None
|
| 60 |
+
|
| 61 |
+
def parse_markdown_table_from_response(text: str) -> str:
|
| 62 |
+
"""
|
| 63 |
+
LLM ์๋ต์์ ๋งํฌ๋ค์ด ํ
์ด๋ธ์ ์ถ์ถํ์ฌ ๋ฐํํฉ๋๋ค.
|
| 64 |
+
|
| 65 |
+
Args:
|
| 66 |
+
text (str): LLM์ด ๋ฐํํ ์ ์ฒด ํ
์คํธ ์๋ต.
|
| 67 |
+
|
| 68 |
+
Returns:
|
| 69 |
+
str: ์ถ์ถ๋ ๋งํฌ๋ค์ด ํ
์ด๋ธ ๋ฌธ์์ด, ์คํจ ์ ์ ์ฒด ํ
์คํธ ๋ฐํ
|
| 70 |
+
"""
|
| 71 |
+
if not text:
|
| 72 |
+
return ""
|
| 73 |
+
|
| 74 |
+
# ๋งํฌ๋ค์ด ์ฝ๋ ๋ธ๋ก์์ ํ
์ด๋ธ ์ถ์ถ ์๋
|
| 75 |
+
markdown_match = re.search(r"```(?:markdown)?\s*([\s\S]*?)\s*```", text)
|
| 76 |
+
if markdown_match:
|
| 77 |
+
return markdown_match.group(1).strip()
|
| 78 |
+
|
| 79 |
+
# ํ
์ด๋ธ ํจํด ์ง์ ์ฐพ๊ธฐ (| ... | ... | ํํ)
|
| 80 |
+
lines = text.split('\n')
|
| 81 |
+
table_lines = []
|
| 82 |
+
in_table = False
|
| 83 |
+
|
| 84 |
+
for line in lines:
|
| 85 |
+
line = line.strip()
|
| 86 |
+
if '|' in line and ('๋จ๊ณ' in line or '---' in line or 'โ ' in line):
|
| 87 |
+
in_table = True
|
| 88 |
+
table_lines.append(line)
|
| 89 |
+
elif in_table and '|' in line:
|
| 90 |
+
table_lines.append(line)
|
| 91 |
+
elif in_table and not line:
|
| 92 |
+
# ๋น ์ค์ด๋ฉด ํ
์ด๋ธ ๋
|
| 93 |
+
break
|
| 94 |
+
|
| 95 |
+
if table_lines:
|
| 96 |
+
return '\n'.join(table_lines)
|
| 97 |
+
|
| 98 |
+
# ํ
์ด๋ธ์ ์ฐพ์ง ๋ชปํ์ผ๋ฉด ์ ์ฒด ํ
์คํธ ๋ฐํ
|
| 99 |
+
return text.strip()
|
| 100 |
+
|
| 101 |
+
def generate_guide(question, jd, company_name, experience_level):
|
| 102 |
+
"""
|
| 103 |
+
์๊ธฐ์๊ฐ์ ๋ฌธํญ ๊ฐ์ด๋๋ฅผ ์์ฑํ๊ณ , ๋งํฌ๋ค์ด ํ
์ด๋ธ๊ณผ ์ ์ฒด ์๋ต ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํจ์
|
| 104 |
+
"""
|
| 105 |
+
try:
|
| 106 |
+
response = client.chat.completions.create(
|
| 107 |
+
model="gpt-4o-mini",
|
| 108 |
+
messages=[{"role": "user", "content": prompt.format(question=question, jd=jd, company_name=company_name, experience_level=experience_level)}],
|
| 109 |
+
# response_format์ ์ ๊ฑฐํ์ฌ ์ผ๋ฐ ํ
์คํธ ์๋ต์ ๋ฐ์
|
| 110 |
+
)
|
| 111 |
+
|
| 112 |
+
# ๋งํฌ๋ค์ด ํ
์ด๋ธ ํ์ฑ
|
| 113 |
+
guide_content = parse_markdown_table_from_response(response.choices[0].message.content)
|
| 114 |
+
|
| 115 |
+
# ํธํ์ฑ์ ์ํด ๋์
๋๋ฆฌ ํํ๋ก ๋ฐํ
|
| 116 |
+
guide_dict = {"guide": guide_content}
|
| 117 |
+
return guide_dict, response
|
| 118 |
+
|
| 119 |
+
except Exception as e:
|
| 120 |
+
print(f"๊ฐ์ด๋ ์์ฑ ๋๋ ํ์ฑ ์ค ์ค๋ฅ ๋ฐ์: {e}")
|
| 121 |
+
return {"error": f"Failed to generate or parse guide: {str(e)}", "guide": ""}, None
|
| 122 |
+
|
| 123 |
+
|
| 124 |
+
if __name__ == "__main__":
|
| 125 |
+
example_input = {
|
| 126 |
+
"question": "์ผ์ฑ์ ์๋ฅผ ์ง์ํ ์ด์ ์ ์
์ฌ ํ ์ด๋ฃจ๊ณ ์ถ์ ๊ฟ์ ๊ธฐ์ ํ์์ค.",
|
| 127 |
+
"jd": "์ผ์ฑ์ ์๋ ์ธ๊ณ์ ์ธ ๊ธฐ์ ๊ธฐ์
์ผ๋ก, ๋ค์ํ ๋ถ์ผ์์ ์ ๋์ ์ธ ๊ธฐ์ ์ ๊ฐ๋ฐํ๊ณ ์์ต๋๋ค. ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ก ์
์ฌํ๋ฉด ๋ค์ํ ํ๋ก์ ํธ์ ์ฐธ์ฌํ๋ฉฐ, ์ต์ ๊ธฐ์ ์ ์ ์ฉํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.",
|
| 128 |
+
"company_name": "์ผ์ฑ์ ์",
|
| 129 |
+
"experience_level": "์ ์
"
|
| 130 |
+
}
|
| 131 |
+
guide_dict, _ = generate_guide(**example_input)
|
| 132 |
+
print("Guide content:")
|
| 133 |
+
print(guide_dict.get("guide", "No guide generated"))
|
guide_generation/prompt.yaml
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
prompt: >
|
| 2 |
+
์ฃผ์ด์ง ์ง๋ฌธ์ ๋ํด ์์์ ๋ต๋ณ ๊ตฌ์กฐ๋ฅผ ์์ฑํ์์ค.
|
| 3 |
+
|
| 4 |
+
### ์ถ๋ ฅ ํ์
|
| 5 |
+
๋ฐ๋์ ๋ค์ markdown ํ์์ผ๋ก๋ง ์๋ตํ์ธ์:
|
| 6 |
+
|
| 7 |
+
<์ง๋ฌธ ๋ถ๋ฅ>
|
| 8 |
+
|
| 9 |
+
```markdown
|
| 10 |
+
| ๋จ๊ณ | ์ค๋ช
|
|
| 11 |
+
| --- | --- |
|
| 12 |
+
| โ ... | ... |
|
| 13 |
+
| โก ... | ... |
|
| 14 |
+
| โข ... | ... |
|
| 15 |
+
| โฃ ... | ... |
|
| 16 |
+
| โค ... | ... |
|
| 17 |
+
```
|
| 18 |
+
|
| 19 |
+
## ์์
|
| 20 |
+
|
| 21 |
+
### ์์ 1 - ์ง์๋๊ธฐ ์ ํ
|
| 22 |
+
์ง๋ฌธ: ํ๋์๋์ฐจ์ ์ง์ํ๊ฒ ๋ ๋๊ธฐ์ ํด๋น ์ง๋ฌด์ ๋ณธ์ธ์ด ์ ํฉํ๋ค๊ณ ์๊ฐํ๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
|
| 23 |
+
|
| 24 |
+
๋ต๋ณ ๊ตฌ์กฐ:
|
| 25 |
+
```markdown
|
| 26 |
+
| ๋จ๊ณ | ์ค๋ช
|
|
| 27 |
+
| --- | --- |
|
| 28 |
+
| โ Why: ๊ด์ฌ ๊ณ๊ธฐ | ์ง๋ฌด/๋ถ์ผ์ ๊ด์ฌ์ ๊ฐ๊ฒ ๋ ๊ณ๊ธฐ๋ ๊ฒฝํ (์ด๋ฆด ๋, ํ์ฐฝ์์ , ๋ํ ์์ ๋ฑ) |
|
| 29 |
+
| โก How: ์ค๋น ๊ณผ์ | ๊ด๋ จ ์ง๋ฌด๋ฅผ ๊ฒฝํํ ์ฌ๋ก (ํ๋ก์ ํธ, ์ธํด, ์ค์ต, ์๋ฅด๋ฐ์ดํธ ๋ฑ) โ ๋ฌด์์ ๋๋ผ๊ณ ๋ฐฐ์ ๋์ง |
|
| 30 |
+
| โข Why Us: ๊ธฐ์
์ ํ ์ด์ | ๋ง์ ๊ธฐ์
์ค **์ ์ด ํ์ฌ์ธ์ง**, ์ง๋ฌด์ ์ฐ๊ณ๋ ์ด์ , ๊ธฐ์
์ ๋ํ ์ดํด๋ |
|
| 31 |
+
| โฃ Future: ์
์ฌ ํ ํฌ๋ถ | ์ง๋ฌด์์ ์ฑ์ฅํด๋๊ฐ ๊ตฌ์ฒด์ ์ธ ๊ณํ, ์ด๋ฅผ ํตํด ์ด๋ค ๊ธฐ์ฌ๋ฅผ ํ ์ ์์์ง |
|
| 32 |
+
```
|
| 33 |
+
|
| 34 |
+
### ์์ 2 - ์ง๋ฌด์ญ๋ ๋ฐ ์ ๋ฌธ์ฑ ์ ํ
|
| 35 |
+
์ง๋ฌธ: ์ง์ํ ์ง๋ฌด์ ๊ด๋ จ๋ ๊ฐ์ฅ ๋ํ์ ์ธ ํ๋ก์ ํธ ๊ฒฝํ์ ๋ณธ์ธ์ ์ญํ ๊ณผ ๊ธฐ์ฌ ์์ฃผ๋ก ๊ธฐ์ ํ์์ค.
|
| 36 |
+
|
| 37 |
+
๋ต๋ณ ๊ตฌ์กฐ:
|
| 38 |
+
```markdown
|
| 39 |
+
| ๋จ๊ณ | ์ค๋ช
|
|
| 40 |
+
| --- | --- |
|
| 41 |
+
| โ ์ง๋ฌด์ ๊ด์ฌ์ ๊ฐ๊ฒ ๋ ๊ณ๊ธฐ | ์ด ์ง๋ฌด๋ฅผ ์ฒ์ ๊ด์ฌ ๊ฐ๊ฒ ๋ ์ฌ๊ฑด/๊ฒฝํ (๋ํ ์์
, ๊ณผ์ , ์ฌ๋, ๋ฌธ์ ์์ ๋ฑ) |
|
| 42 |
+
| โก ์ง๋ฌด๋ฅผ ์ง์ ๊ฒฝํํ ์ฌ๋ก | ์ธํด, ํ๋ก์ ํธ, ๋์ธํ๋ ๋ฑ์์ ํด๋น ์ง๋ฌด๋ฅผ ์ง์ ํด๋ณธ ์ฌ๋ก |
|
| 43 |
+
| โข ์ญ๋ ๊ฐํ๋ฅผ ์ํ ๋
ธ๋ ฅ | ๊ด๋ จ ์ง์/์คํฌ์ ๊ฐ์ถ๊ธฐ ์ํด ๋
ธ๋ ฅํ ์ (๊ณต๋ถ, ์๊ฒฉ์ฆ, ํฌํธํด๋ฆฌ์ค, ๋ฐ๋ณต ์๋ ๋ฑ) |
|
| 44 |
+
| โฃ ๊ทธ ๊ฒฐ๊ณผ ๋ํ๋ ์ฑ๊ณผ๋ ์ฑ์ฅ | ์ง๋ฌด ์ํ ๊ณผ์ ์์ ๊ฒช์ ๊ตฌ์ฒด์ ์ธ ์ฑ๊ณผ or ์ค์ค๋ก ์ฑ์ฅํ ๋ถ๋ถ |
|
| 45 |
+
| โค ํด๋น ๊ธฐ์
์์ ์ด ์ง๋ฌด๋ฅผ ํ๊ณ ์ถ์ ์ด์ | (์ ํ) ์ด ํ์ฌ์์ ์ด ์ง๋ฌด๋ฅผ ํ๊ณ ์ถ์ ์ด์ , ๊ธฐ์
์ ๋ํ ์ดํด ํฌํจ |
|
| 46 |
+
```
|
| 47 |
+
|
| 48 |
+
### ์์ 3 - ํ์
/๊ฐ๋ฑ ํด๊ฒฐ ๊ฒฝํ ์ ํ
|
| 49 |
+
์ง๋ฌธ: ํ์ ์ผ์์ผ๋ก์ ๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ํ๋ ฅํ์ฌ ์ฑ๊ณผ๋ฅผ ๋ธ ๊ฒฝํ์ ๋ํด ๊ธฐ์ ํด ์ฃผ์ญ์์ค.
|
| 50 |
+
|
| 51 |
+
๋ต๋ณ ๊ตฌ์กฐ:
|
| 52 |
+
```markdown
|
| 53 |
+
| ๋จ๊ณ | ์ค๋ช
|
|
| 54 |
+
| --- | --- |
|
| 55 |
+
| โ ์ํฉ (Context) | ์ธ์ , ์ด๋ค ๋งฅ๋ฝ์์, ๋๊ตฌ์ ์ด๋ค ๋ชฉํ๋ฅผ ์ํด ํ์
ํ๋๊ฐ |
|
| 56 |
+
| โก ๋ฌธ์ (Obstacle) | ํ์
์ค์ ๋ฐ์ํ ๊ฐ๋ฑ, ๋ฌธ์ , ์ฅ์ ์์๋ ๋ฌด์์ด์๋๊ฐ |
|
| 57 |
+
| โข ๋ถ์ ๋ฐ ํ๋ (Solution) | ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ๋ถ์ํ๊ณ , ์ด๋ค ๋ฐฉ์์ผ๋ก ์ํตํ๊ณ ํด๊ฒฐํ๋๊ฐ |
|
| 58 |
+
| โฃ ๊ฒฐ๊ณผ (Outcome) | ๊ทธ ํด๊ฒฐ๋ฐฉ์์ด ์ด๋ค ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์๋๊ฐ (์์น/๋ณํ/๋ถ์๊ธฐ ๋ฑ) |
|
| 59 |
+
| โค ๊ตํ ๋ฐ ์ ์ฉ (Value) | ์ด ๊ฒฝํ์์ ๋ฌด์์ ๋ฐฐ์ ๊ณ , ๊ทธ ๋ฐฐ์์ ์ง๋ฌด์ ์ด๋ป๊ฒ ์ ์ฉํ ์ ์์๊น |
|
| 60 |
+
```
|
| 61 |
+
|
| 62 |
+
### ์์ 4 - ์ฅ๋จ์ ์ ํ (์ฅ์ )
|
| 63 |
+
์ง๋ฌธ: ๋ณธ์ธ์ ๊ฐ์ ๊ณผ ์ฝ์ ์ ์ค๋ช
ํ๊ณ , ์ฝ์ ์ ๋ณด์ํ๊ธฐ ์ํด ์ด๋ค ๋
ธ๋ ฅ์ ํ๋์ง ๊ธฐ์ ํ์์ค.
|
| 64 |
+
|
| 65 |
+
๋ต๋ณ ๊ตฌ์กฐ (์ฅ์ ๋ถ๋ถ):
|
| 66 |
+
```markdown
|
| 67 |
+
| ๋จ๊ณ | ์ค๋ช
|
|
| 68 |
+
| --- | --- |
|
| 69 |
+
| โ ์ฅ์ ํ ๋ฌธ์ฅ | ์ง๋ฌด์ ํ์ํ ์ฑ๊ฒฉ/์ญ๋ ๊ธฐ๋ฐ ๊ฐ์ |
|
| 70 |
+
| โก ๊ด๋ จ ์ํฉ | ์๋ฅด๋ฐ์ดํธ, ํ๋ก์ ํธ ๋ฑ ์ง๋ฌด์ ์ ์ฌํ ๋งฅ๋ฝ |
|
| 71 |
+
| โข ๋์ ์ญํ /ํ๋ | ๋ณธ์ธ์ ์ก์
์ด ๋๋ฌ๋๋๋ก ๊ตฌ์ฒด์ ์ผ๋ก, ์์น ๊ธฐ๋ฐ์ด๋ฉด ๋ ์ข์ |
|
| 72 |
+
| โฃ ๊ฒฐ๊ณผ ๋ฐ ํ๊ฐ | ์ฑ๊ณผ, ์ธ์ , ๊ณ ๊ฐ/์์ฌ ๋ฐ์ ๋ฑ ์ธ๋ถ ํผ๋๋ฐฑ ์ค์ฌ |
|
| 73 |
+
```
|
| 74 |
+
|
| 75 |
+
### ์์ 5 - ์ฅ๋จ์ ์ ํ (๋จ์ )
|
| 76 |
+
์ง๋ฌธ: ๋ณธ์ธ์ ๊ฐ์ ๊ณผ ์ฝ์ ์ ์ค๋ช
ํ๊ณ , ์ฝ์ ์ ๋ณด์ํ๊ธฐ ์ํด ์ด๋ค ๋
ธ๋ ฅ์ ํ๋์ง ๊ธฐ์ ํ์์ค.
|
| 77 |
+
|
| 78 |
+
๋ต๋ณ ๊ตฌ์กฐ (๋จ์ ๋ถ๋ถ):
|
| 79 |
+
```markdown
|
| 80 |
+
| ๋จ๊ณ | ์ค๋ช
|
|
| 81 |
+
| --- | --- |
|
| 82 |
+
| โ ๋จ์ ํ ๋ฌธ์ฅ | ์ง๋ฌด์ ๋จ์ ์ด์ง๋ง ๊ทน๋ณต ๊ฐ๋ฅ์ฑ์ด ์๋ ์ฑ๊ฒฉ |
|
| 83 |
+
| โก ๋ฌธ์ ์ํฉ/์คํจ ๊ฒฝํ | ๋จ์ ์ด ์ค์ ๋ก ๋ฌธ์ ๊ฐ ๋์๋ ๊ตฌ์ฒด์ ๊ฒฝํ |
|
| 84 |
+
| โข ์์ธ ์ธ์ | ์ ๊ทธ๋ฐ ํ๋์ ํ๋์ง, ์ด๋ค ๋ถ๋ถ์ด ๋ถ์กฑํ๋์ง |
|
| 85 |
+
| โฃ ๊ฐ์ ๋ ํ๋ ์ฌ๋ก | ๊ทธ ์ดํ ์ ์ฌํ ์ํฉ์์ ๋ฌ๋ผ์ง ํ๋๊ณผ ๊ฒฐ๊ณผ |
|
| 86 |
+
| โค ์ง์ ๋
ธ๋ ฅ | ์์ ํ ๊ทน๋ณตํ ๊ฑด ์๋์ง๋ง ๊ณ์ ๋
ธ๋ ฅํ๊ณ ์๋ ๋ชจ์ต |
|
| 87 |
+
```
|
| 88 |
+
|
| 89 |
+
### ์์ 6 - ์ฑ๊ณต ๊ฒฝํ/๋์ ๊ฒฝํ ์ ํ
|
| 90 |
+
์ง๋ฌธ: ์ค์ค๋ก ๋์ ๋ชฉํ๋ฅผ ์ธ์ฐ๊ณ ๋์ง๊ธฐ๊ฒ ๋
ธ๋ ฅํ์ฌ ์ฑ์ทจํ ๊ฒฝํ์ ๋ํด ์์ ํด ์ฃผ์ญ์์ค.
|
| 91 |
+
|
| 92 |
+
๋ต๋ณ ๊ตฌ์กฐ:
|
| 93 |
+
```markdown
|
| 94 |
+
| ๋จ๊ณ | ์ค๋ช
|
|
| 95 |
+
| --- | --- |
|
| 96 |
+
| โ ๋์ ๋ฐฐ๊ฒฝ | ์ธ์ , ์ด๋์, ๋ฌด์์ ์ํด ๋์ ํ๋๊ฐ (์ํฉ๊ณผ ๋ชฉํ) |
|
| 97 |
+
| โก ๋ฌธ์ ์ธ์ | ๊ณผ์ ์ค ์ด๋ค ๋ฌธ์ ๊ฐ ์์๋๊ฐ (ํ์ค์ ์ฅ์ ๋ฌผ) |
|
| 98 |
+
| โข ํด๊ฒฐ ๊ณผ์ | ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ๋ถ์ํ๊ณ ์ด๋ค ํด๊ฒฐ์ฑ
์ ์คํํ๋๊ฐ |
|
| 99 |
+
| โฃ ๊ฒฐ๊ณผ ๋ฐ ์ฑ๊ณผ | ๋์ ์ด ์ด๋ค ์ฑ๊ณผ๋ก ์ด์ด์ก๋๊ฐ (์ ๋์ ์ด๋ฉด ๋ ์ข์) |
|
| 100 |
+
| โค ๊ตํ ๋ฐ ์ ์ฉ | ์ด ๊ฒฝํ์์ ๋ฌด์์ ๋ฐฐ์ ๊ณ , ์ง๋ฌด์ ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋๋๊ฐ |
|
| 101 |
+
```
|
| 102 |
+
|
| 103 |
+
### ์์ 7 - ์คํจ๊ฒฝํ ์ ํ
|
| 104 |
+
์ง๋ฌธ: ๊ฐ์ฅ ํฐ ์คํจ๋ฅผ ๊ฒฝํํ๊ณ , ์ด๋ฅผ ๊ทน๋ณตํ๋ ๊ณผ์ ์์ ๋ฌด์์ ๋ฐฐ์ ๋์ง ๊ธฐ์ ํ์์ค.
|
| 105 |
+
|
| 106 |
+
๋ต๋ณ ๊ตฌ์กฐ:
|
| 107 |
+
```markdown
|
| 108 |
+
| ๋จ๊ณ | ์ค๋ช
|
|
| 109 |
+
| --- | --- |
|
| 110 |
+
| โ ์คํจ ์ํฉ | ์ธ์ , ์ด๋์, ๋ฌด์์ ํ๋ค ์คํจํ๋์ง ๊ตฌ์ฒด์ ์ผ๋ก ์์ |
|
| 111 |
+
| โก ๋น์์ ์๊ฐ๊ณผ ํ๋ | ์ ๊ทธ๋ฐ ๊ฒฐ์ ์ ํ๊ณ , ์ด๋ค ํ๋์ ํ๋์ง โ **์คํจ์ ์์ธ**์ ๋ ์์ ์๊ฒ์ ์ฐพ๊ธฐ |
|
| 112 |
+
| โข ๊นจ๋ฌ์ ๋ฐ ๋ฐ์ฑ | ์คํจ ์ดํ ์ด๋ค ์ ์ ๊นจ๋ฌ์๋์ง |
|
| 113 |
+
| โฃ ์ดํ์ ๋ณํ๋ ํ๋ | ์ ์ฌํ ์ํฉ์์ ์ด๋ป๊ฒ ๋ฌ๋ผ์ง ๋ฐฉ์์ผ๋ก ๋์ํ๋์ง |
|
| 114 |
+
| โค ์ง๋ฌด์์ ์ฐ๊ฒฐ | ์ด ์คํจ ๊ฒฝํ์ด ์ด๋ป๊ฒ ์ง๋ฌด์ ๋์์ด ๋ ์ ์๋์ง |
|
| 115 |
+
```
|
| 116 |
+
|
| 117 |
+
### ์์ 8 - ์ฑ์ฅ๊ณผ์ /์ฑ์ฅ๋ฐฐ๊ฒฝ ์ ํ
|
| 118 |
+
์ง๋ฌธ: ํ์ฌ์ ์์ ์๊ฒ ๊ฐ์ฅ ํฐ ์ํฅ์ ๋ฏธ์น ์ฌ๊ฑด์ด๋ ์ธ๋ฌผ์ ํฌํจํ์ฌ ์ฑ์ฅ๊ณผ์ ์ ๊ธฐ์ ํ์์ค.
|
| 119 |
+
|
| 120 |
+
๋ต๋ณ ๊ตฌ์กฐ:
|
| 121 |
+
```markdown
|
| 122 |
+
| ๋จ๊ณ | ์ค๋ช
|
|
| 123 |
+
| --- | --- |
|
| 124 |
+
| โ ์ํฅ ๋ฐ์ ๋ฐฐ๊ฒฝ | ์ด๋ฆฐ ์์ , ๊ฐ์ ํ๊ฒฝ, ์ฌ๊ฑด, ์ธ๋ฌผ ๋ฑ |
|
| 125 |
+
| โก ๊ฐ์น๊ด ๋๋ ํ๋์ ํ์ฑ | ์ ๊ฒฝํ์ ํตํด ์ด๋ค ์๊ฐ/์ฑํฅ์ด ๋ง๋ค์ด์ก๋์ง |
|
| 126 |
+
| โข ์ง๋ฌด์ญ๋๊ณผ์ ์ฐ๊ฒฐ | ํ์ฑ๋ ๊ฐ์น๊ด/์ฑํฅ์ด ์ง๋ฌด์ ์ด๋ป๊ฒ ์ฐ๊ด๋๋์ง |
|
| 127 |
+
| โฃ ํ์ฌ์ ๋๋ก ์ฐ๊ฒฐ | ํ์ฌ ๋ด๊ฐ ์ด๋ป๊ฒ ํ๋ํ๊ณ ์ฑ์ฅํ๊ณ ์๋์ง |
|
| 128 |
+
```
|
| 129 |
+
|
| 130 |
+
### ์์ 9 - ์ธ๋ฌผ์ด๋ ์ฌ๊ฑด ์ ํ
|
| 131 |
+
์ง๋ฌธ: ๋น์ ์ ์ธ์์ ๊ฐ์ฅ ํฐ ์ํฅ์ ์ค ์ธ๋ฌผ์ด๋ ์ฌ๊ฑด์ ๋ํด ์ค๋ช
ํ์์ค.
|
| 132 |
+
|
| 133 |
+
๋ต๋ณ ๊ตฌ์กฐ:
|
| 134 |
+
```markdown
|
| 135 |
+
| ๋จ๊ณ | ์ค๋ช
|
|
| 136 |
+
| --- | --- |
|
| 137 |
+
| โ ์ธ๋ฌผ/์ฌ๊ฑด ์๊ฐ | ๋์๊ฒ ์ํฅ์ ์ค ์ธ๋ฌผ ๋๋ ์ฌ๊ฑด์ด ๋ฌด์์ธ์ง ๊ตฌ์ฒด์ ์ผ๋ก ์๊ฐ |
|
| 138 |
+
| โก ๊ทธ ๋น์์ ๋ | ๊ทธ ์ ์ ๋์ ํ๋/๊ด์ ์ ์ด๋ ๋์ง, ์ ๊ทธ ์ธ๋ฌผ์ด ํน๋ณํ๋์ง |
|
| 139 |
+
| โข ๋ณํ์ ๊ณ๊ธฐ | ์ด๋ค ๊ณ๊ธฐ๋ก, ์ด๋ค ์๊ฐ/๊ฐ์น/ํ๋์ด ๋ฐ๋๊ฒ ๋์๋์ง |
|
| 140 |
+
| โฃ ์ค์ ๋ณํ๋ ํ๋ | ์ดํ ๋ณํ๊ฐ ์ค์ ํ๋๊ณผ ๊ฒฐ๊ณผ๋ก ์ด๋ป๊ฒ ์ด์ด์ก๋์ง |
|
| 141 |
+
| โค ์ง๋ฌด์์ ์ฐ๊ฒฐ | ์ด๋ฐ ๋ณํ๊ฐ ์ง๊ธ์ ์ง๋ฌด ์ญ๋์ ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋๋์ง |
|
| 142 |
+
```
|
| 143 |
+
|
| 144 |
+
### ์์ 10 - ์
์ฌ ํ ๋ชฉํ/ํฌ๋ถ ์ ํ
|
| 145 |
+
์ง๋ฌธ: ์
์ฌ ํ 5๋
, 10๋
๋ค ์ด๋ฃจ๊ณ ์ถ์ ๋ชฉํ๋ ๋ฌด์์ด๋ฉฐ, ์ด๋ฅผ ์ํด ์ด๋ค ๋
ธ๋ ฅ์ ํ ๊ฒ์ธ์ง ๊ธฐ์ ํ์์ค.
|
| 146 |
+
|
| 147 |
+
๋ต๋ณ ๊ตฌ์กฐ:
|
| 148 |
+
```markdown
|
| 149 |
+
| ๋จ๊ณ | ์ค๋ช
|
|
| 150 |
+
| --- | --- |
|
| 151 |
+
| โ ๋ชฉํ ํ ๋ฌธ์ฅ | ๋ด๊ฐ ๋๊ณ ์ถ์ ๋ชจ์ต, ์ด๋ฃจ๊ณ ์ถ์ ๋ชฉํ๋ฅผ ํ ๋ฌธ์ฅ์ผ๋ก ์์ฝ |
|
| 152 |
+
| โก ๋จ๊ธฐ ์คํ ๊ณํ | ์
์ฌ ์งํ ๋ฐ๋ก ์ค์ฒ ๊ฐ๋ฅํ ํ๋ ์ค์ฌ ๊ณํ |
|
| 153 |
+
| โข ์ค์ฅ๊ธฐ ๋ชฉํ | 3~5๋
์์ ์ด๋ฃจ๊ณ ์ถ์ ์ฑ๊ณผ/์ญํ /์ญ๋ |
|
| 154 |
+
| โฃ ์คํ ์ ๋ต | ๊ทธ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด ์ด๋ค ๋
ธ๋ ฅ์ ํ ๊ฒ์ธ์ง ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ |
|
| 155 |
+
| โค ๋์ ์์ง์ ์ ์ฌ๋ ฅ | ๋๋ ์ ์ด ๋ชฉํ๋ฅผ ์ด๋ฃฐ ์ ์๋ ์ฌ๋์ธ๊ฐ? โ ์ฑ์ฅ ๊ฐ๋ฅ์ฑ๊ณผ ํ๋ |
|
| 156 |
+
```
|
| 157 |
+
|
| 158 |
+
### ์์ 11 - ํ์ ์ญ๋/๊ธฐ์กด ๋ฐฉ์ ๊ฐ์ ๊ฒฝํ ์ ํ
|
| 159 |
+
์ง๋ฌธ: ๊ธฐ์กด ๋ฐฉ์์ ๋นํจ์จ์ฑ์ ๊ฐ์ ํ๊ธฐ ์ํด ์๋ก์ด ์์ด๋์ด๋ฅผ ์ ์ํ๊ณ ์ ์ฉํ๋ ๊ฒฝํ์ ์ฐ์์ค.
|
| 160 |
+
|
| 161 |
+
๋ต๋ณ ๊ตฌ์กฐ:
|
| 162 |
+
```markdown
|
| 163 |
+
| ๋จ๊ณ | ์ค๋ช
|
|
| 164 |
+
| --- | --- |
|
| 165 |
+
| โ ํ ๋ฌธ์ฅ ์์ฝ | ๋ฌธ์ ํด๊ฒฐ ํน์ ๊ฐ์ ํ๋ ๊ฒฝํ์ ํต์ฌ ๋ฌธ์ฅ์ผ๋ก ์ ์ |
|
| 166 |
+
| โก ๋ฌธ์ ์ํฉ | ๊ธฐ์กด ๋ฐฉ์์ ๋นํจ์จ, ์ค๋ฅ, ๋ฐ๋ณต๋๋ ๋ฌธ์ ๋ฑ โ ๊ตฌ์ฒด์ ์ผ๋ก ์์ |
|
| 167 |
+
| โข ๊ฐ์ค ๋ฐ ์์ธ ๋ถ์ | ์์ธ์ ๋๋ฆ๋๋ก ๋ถ์ํ๊ณ , ์คํ/๋น๊ต/๊ด์ฐฐ ๋ฑ์ผ๋ก ๊ฒ์ฆํ ๋ฐฉ์ |
|
| 168 |
+
| โฃ ์คํํ ํ๋ | ๊ตฌ์ฒด์ ์ผ๋ก ๋ฌด์์ ๋ฐ๊พธ์๋์ง, ์ด๋ค ๋ฐฉ์์ผ๋ก ๊ฐ์ ํ๋์ง |
|
| 169 |
+
| โค ์ฑ๊ณผ ๋ฐ ์ธ๋ถ ํ๊ฐ | ๊ฒฐ๊ณผ ์์น, ๋ณํ๋ ํ๊ฒฝ, ์์ฌ/์ฌ์ฉ์์ ํผ๋๋ฐฑ ๋ฑ |
|
| 170 |
+
| โฅ ์ง๋ฌด ์ฐ๊ฒฐ ๋ฐ ์๊ฒฌ | ์ด ๊ฒฝํ์ด ์ง์ํ ์ง๋ฌด์ ์ด๋ป๊ฒ ๋์์ด ๋๋์ง + ๋์ ๊ด์ |
|
| 171 |
+
```
|
| 172 |
+
|
| 173 |
+
### ์์ 12 - ํ์ฌ์ฐ์
์ง์ ์ ํ
|
| 174 |
+
์ง๋ฌธ: ๋น์ฌ ์๋น์ค์ ์ฅ๋จ์ ์ ๋ถ์ํ๊ณ , ๊ฐ์ ๋ฐฉ์์ ์ ์ํด ์ฃผ์ญ์์ค.
|
| 175 |
+
|
| 176 |
+
๋ต๋ณ ๊ตฌ์กฐ:
|
| 177 |
+
```markdown
|
| 178 |
+
| ๋จ๊ณ | ์ค๋ช
|
|
| 179 |
+
| --- | --- |
|
| 180 |
+
| โ ํ์ฌ/์ฐ์
์ ์ฅ์ | ๋ด๊ฐ ๋๋ ์ฐจ๋ณ์ , ๊ฐ์ ๋ฑ์ ์์ฝ (๋๋ฌด ๋ปํ๊ฑฐ๋ ์ถ์์ ์ธ ๋ง์ ํผํ๊ธฐ) |
|
| 181 |
+
| โก ๋จ์ ๋๋ ๊ฐ์ ์ฌ์ง | ๊ฒฝ์์ฌ ๋๋น ๋ถ์กฑํ ์ , ์ด์ฉ ๊ฒฝํ์์ ๋๋ ๋ถํธํจ ๋ฑ โ ๊ฐ๊ด์ ์ผ๋ก ์์ |
|
| 182 |
+
| โข ๊ตฌ์ฒด์ ์ธ ์์ด๋์ด ์ ์ | ๋จ์ ๋ณด์ ๋๋ ๊ฒฝ์๋ ฅ ๊ฐํ๋ฅผ ์ํ ๋ณธ์ธ์ ์์ด๋์ด ์ ์ |
|
| 183 |
+
| โฃ ์ง๋ฌด์์ ์ฐ๊ฒฐ | ์ ์ํ ์์ด๋์ด๋ฅผ ๋ด๊ฐ ๋งก์ ์ง๋ฌด์์ ์ด๋ป๊ฒ ์คํํ ์ ์์์ง ์ฐ๊ฒฐ |
|
| 184 |
+
| โค ๊ธฐ์ฌ ํฌ๋ถ | ์ด ํ์ฌ๋ฅผ ์ด๋ป๊ฒ ๋ ์ข์ ๋ฐฉํฅ์ผ๋ก ์ด๋๊ณ ์ถ์์ง ๋ง๋ฌด๋ฆฌ |
|
| 185 |
+
```
|
| 186 |
+
|
| 187 |
+
### ์์ 13 - ๊ฐ์น๊ด ์ ํ
|
| 188 |
+
์ง๋ฌธ: ๋น์ฌ์ ํต์ฌ๊ฐ์น(๋์ , ํ๋ ฅ, ์ ๋ขฐ) ์ค ๋ณธ์ธ์ ๊ฐ์ฅ ์ ๋ํ๋ด๋ ๊ฐ์น์ ๊ทธ ์ด์ ๋ฅผ ๊ฒฝํ์ ๋ค์ด ์ค๋ช
ํ์์ค.
|
| 189 |
+
|
| 190 |
+
๋ต๋ณ ๊ตฌ์กฐ:
|
| 191 |
+
```markdown
|
| 192 |
+
| ๋จ๊ณ | ์ค๋ช
|
|
| 193 |
+
| --- | --- |
|
| 194 |
+
| โ ๊ฐ์น๊ด ์ ํ | ํ์ฌ๊ฐ ์ ์ํ ๊ฐ์น ์ค, ๋ณธ์ธ์ ์ฑํฅ/๊ฐ์ /์ง๋ฌด์ ์ฐ๊ฒฐ๋๋ ๊ฒ์ ์ ํ |
|
| 195 |
+
| โก ๊ฐ์น๊ด์ ํ์ฑํ ๊ฒฝํ | ์ ๊ทธ ๊ฐ์น๊ด์ด ์ค์ํ๋ค๊ณ ์๊ฐํ๊ฒ ๋์๋์ง โ ๊ฒฝํ์ ๊ณ๊ธฐ ์ค์ฌ |
|
| 196 |
+
| โข ๊ฐ์น๊ด ์ค์ฒ ๊ณผ์ | ์ค์ ๋ก ๊ทธ ๊ฐ์น๊ด์ ๋ฐ์ํด ํ๋ํ ๊ตฌ์ฒด์ ์ฌ๋ก |
|
| 197 |
+
| โฃ ๊ฒฐ๊ณผ ๋ฐ ํ๊ฐ | ๊ทธ ํ๋์ผ๋ก ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ๋ํ๋ฌ๋์ง, ์ธ๋ถ ํผ๋๋ฐฑ์ด ์๋ค๋ฉด ํจ๊ป |
|
| 198 |
+
| โค ์ง๋ฌด/์กฐ์ง ์ฐ๊ฒฐ | ์ด ๊ฐ์น๊ด์ด ์ง์ํ ์ง๋ฌด์์ ์ด๋ป๊ฒ ๋์์ด ๋ ์ง, ์กฐ์ง๊ณผ์ ์ปฌ์ฒํ ๊ฐ์กฐ |
|
| 199 |
+
```
|
| 200 |
+
|
| 201 |
+
### ์์ 14 - ์ฌํ์ด์ ์ ํ
|
| 202 |
+
์ง๋ฌธ: ์ต๊ทผ ๊ด์ฌ์ ๊ฐ๊ณ ์๋ ์ฌํ์ ์ด์๊ฐ ์๋ค๋ฉด ๋ณธ์ธ์ ๊ฒฌํด์ ํจ๊ป ์ค๋ช
ํ์์ค.
|
| 203 |
+
|
| 204 |
+
๋ต๋ณ ๊ตฌ์กฐ:
|
| 205 |
+
```markdown
|
| 206 |
+
| ๋จ๊ณ | ์ค๋ช
|
|
| 207 |
+
| --- | --- |
|
| 208 |
+
| โ ์ด์ ์ ํ ๋ฐ ์์ฝ | ํ์ฌ ์ฌํ์ ยท์ฐ์
์ ์ผ๋ก ์ค์ํ ์ด์ 1๊ฐ์ง ์ ํ |
|
| 209 |
+
| โก ์ด์์ ์ค์์ฑ | ์ ์ด ์ด์๊ฐ ์ค์ํ์ง, ์ฌํ์ ์ฐ์
์ ๋ฏธ์น๋ ์ํฅ |
|
| 210 |
+
| โข ๊ฒฝํ ๊ธฐ๋ฐ์ ๊ฒฌํด | ์ด ์ด์์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ๋ฉฐ, ๊ด๋ จ ๊ฒฝํ์ด ์๋ค๋ฉด ์๊ฐ |
|
| 211 |
+
| โฃ ์ง๋ฌด/์ง์
๊ด ์ฐ๊ฒฐ | ์ด ์ด์๋ฅผ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ง๋ฌด์ ๋ฐ์ํ๊ฑฐ๋ ํ์ฉํ๊ณ ์ถ์์ง |
|
| 212 |
+
| โค ๊ฐ์น๊ด/์์ง ํํ | ๋ด๊ฐ ๊ฐ์ง ๋ฌธ์ ์์, ์์ผ๋ก์ ํ๋/์ค๋น/๊ฐ์ค ๋ฑ |
|
| 213 |
+
```
|
| 214 |
+
|
| 215 |
+
### ์ถ๋ก
|
| 216 |
+
์ง๋ฌธ: {question}
|
| 217 |
+
Job Description: {jd}
|
| 218 |
+
ํ์ฌ ์ด๋ฆ: {company_name}
|
| 219 |
+
๊ฒฝ๋ ฅ ์์ค: {experience_level}
|
| 220 |
+
๋ต๋ณ ๊ฐ์ด๋๋ผ์ธ:
|
guide_generation/test.py
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import random
|
| 3 |
+
import datetime
|
| 4 |
+
import json
|
| 5 |
+
import multiprocessing
|
| 6 |
+
import sys
|
| 7 |
+
from tqdm import tqdm
|
| 8 |
+
|
| 9 |
+
# ์์ ๋๋ ํ ๋ฆฌ์ utils.py๋ฅผ importํ๊ธฐ ์ํด ๊ฒฝ๋ก ์ถ๊ฐ
|
| 10 |
+
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
| 11 |
+
from utils import track_api_cost
|
| 12 |
+
from llm_functions import generate_guide
|
| 13 |
+
|
| 14 |
+
# ํ
์คํธ๋ฅผ ์ํ ํ๊ฒฝ ๋ณ์ ๋ก๋ (ํ์์)
|
| 15 |
+
try:
|
| 16 |
+
from dotenv import load_dotenv
|
| 17 |
+
load_dotenv()
|
| 18 |
+
except ImportError:
|
| 19 |
+
pass
|
| 20 |
+
|
| 21 |
+
# ์์ ๋ฐ์ดํฐ
|
| 22 |
+
example_companies = ["์ผ์ฑ์ ์", "์นด์นด์ค", "๋ค์ด๋ฒ", "์ฟ ํก", "ํ ์ค", "ํ๋์๋์ฐจ", "CJ์ ์ผ์ ๋น", "ํ์ด๋ธ"]
|
| 23 |
+
example_jobs_jds = {
|
| 24 |
+
"๋ฐฑ์๋ ๊ฐ๋ฐ์": "Spring Boot, JPA, MySQL ๊ฒฝํ์. MSA ํ๊ฒฝ ๊ฒฝํ ์ฐ๋. ํด๋ผ์ฐ๋(AWS) ํ๊ฒฝ ๋ฐฐํฌ ๋ฐ ์ด์ ๊ฒฝํ์.",
|
| 25 |
+
"ํ๋ก ํธ์๋ ๊ฐ๋ฐ์": "React, TypeScript, Redux ์ฌ์ฉ. ๋ฐ์ํ ์น ๊ฐ๋ฐ ๊ฒฝํ ํ์. UI/UX์ ๋ํ ์ดํด๋๊ฐ ๋์ ๋ถ.",
|
| 26 |
+
"๋ฐ์ดํฐ ๋ถ์๊ฐ": "SQL, Python(Pandas, Scikit-learn) ํ์ฉ ๋ฅ๋ ฅ. ํต๊ณ์ ์ง์๊ณผ ๋ฐ์ดํฐ ์๊ฐํ(Tableau ๋ฑ) ๋ฅ๋ ฅ.",
|
| 27 |
+
"ํ๋ก๋ํธ ๋งค๋์ (PM)": "IT ํ๋ก๋ํธ ๊ธฐํ ๋ฐ ๊ด๋ฆฌ ๊ฒฝํ. ์ฌ์ฉ์ ์คํ ๋ฆฌ ์์ฑ, ๋ฐฑ๋ก๊ทธ ๊ด๋ฆฌ. ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์์ฌ๊ฒฐ์ ๋ฅ๋ ฅ.",
|
| 28 |
+
"๋ง์ผํฐ": "๋์งํธ ๋ง์ผํ
(SA, DA, SEO) ๊ฒฝํ. ์ฝํ
์ธ ๊ธฐํ ๋ฐ ์ ์, ์ฑ๊ณผ ๋ถ์. SNS ์ฑ๋ ์ด์ ๊ฒฝํ."
|
| 29 |
+
}
|
| 30 |
+
example_questions = {
|
| 31 |
+
"์ง์๋๊ธฐ": "{company_name}์ ์ง์ํ ๋๊ธฐ์ ๋ํด ๊ธฐ์ ํด์ฃผ์ญ์์ค.",
|
| 32 |
+
"์ฑ์ฅ๊ณผ์ ": "๋ณธ์ธ์ ์ฑ์ฅ๊ณผ์ ์ ๊ฐ๋ตํ ๊ธฐ์ ํ๋ ํ์ฌ์ ์์ ์๊ฒ ๊ฐ์ฅ ํฐ ์ํฅ์ ๋ผ์น ์ฌ๊ฑด, ์ธ๋ฌผ ๋ฑ์ ํฌํจํ์ฌ ๊ธฐ์ ํด์ฃผ์ญ์์ค.",
|
| 33 |
+
"์ง๋ฌด์ญ๋": "{job_title} ์ง๋ฌด ์ํ์ ํ์ํ ์ญ๋์ ๋ฌด์์ด๋ผ๊ณ ์๊ฐํ๋ฉฐ, ์ด๋ฅผ ๊ฐ์ถ๊ธฐ ์ํด ์ด๋ค ๋
ธ๋ ฅ์ ํด์๋์ง ๊ธฐ์ ํด์ฃผ์ญ์์ค.",
|
| 34 |
+
"์
์ฌํํฌ๋ถ": "์
์ฌ ํ 10๋
๋์์ ํ์ฌ์ํ ์๋๋ฆฌ์ค์ ๊ทธ๊ฒ์ ์ถ๊ตฌํ๋ ์ด์ ๋ฅผ ๊ธฐ์ ํด์ฃผ์ญ์์ค."
|
| 35 |
+
}
|
| 36 |
+
experience_levels = ["์ ์
", "๊ฒฝ๋ ฅ", "์ธํด"]
|
| 37 |
+
|
| 38 |
+
NUM_TESTS = 100
|
| 39 |
+
NUM_PROCESSES = 10
|
| 40 |
+
MODEL_NAME = "gpt-4o-mini"
|
| 41 |
+
|
| 42 |
+
def run_test(test_input_with_id):
|
| 43 |
+
"""๊ฐ๋ณ ํ
์คํธ ์ผ์ด์ค๋ฅผ ์คํํ๋ ์์ปค ํจ์"""
|
| 44 |
+
test_id, test_input = test_input_with_id
|
| 45 |
+
total_cost = 0
|
| 46 |
+
error_message = ""
|
| 47 |
+
status = "โ
Success"
|
| 48 |
+
|
| 49 |
+
try:
|
| 50 |
+
parsed_guide, response = generate_guide(**test_input)
|
| 51 |
+
|
| 52 |
+
if response and hasattr(response, 'usage'):
|
| 53 |
+
total_cost = track_api_cost(response, MODEL_NAME, None)
|
| 54 |
+
|
| 55 |
+
if "error" in parsed_guide or not parsed_guide:
|
| 56 |
+
status = "โ Failure"
|
| 57 |
+
error_message = str(parsed_guide.get("error", "Unknown failure"))
|
| 58 |
+
|
| 59 |
+
return {
|
| 60 |
+
"id": test_id,
|
| 61 |
+
"input": test_input,
|
| 62 |
+
"parsed_result": parsed_guide,
|
| 63 |
+
"error": error_message,
|
| 64 |
+
"cost": total_cost,
|
| 65 |
+
"status": status,
|
| 66 |
+
}
|
| 67 |
+
except Exception as e:
|
| 68 |
+
return {
|
| 69 |
+
"id": test_id,
|
| 70 |
+
"input": test_input,
|
| 71 |
+
"parsed_result": {},
|
| 72 |
+
"error": f"Exception: {str(e)}",
|
| 73 |
+
"cost": total_cost,
|
| 74 |
+
"status": "โ Error"
|
| 75 |
+
}
|
| 76 |
+
|
| 77 |
+
def main():
|
| 78 |
+
"""ํ
์คํธ๋ฅผ ์ค๋น, ์คํํ๊ณ ๋ณด๊ณ ์๋ฅผ ์์ฑํ๋ ๋ฉ์ธ ํจ์"""
|
| 79 |
+
print(f"์ด {NUM_TESTS}๊ฐ์ ํ
์คํธ๋ฅผ {NUM_PROCESSES}๊ฐ ํ๋ก์ธ์ค๋ก ๋ณ๋ ฌ ์คํํฉ๋๋ค...")
|
| 80 |
+
|
| 81 |
+
test_inputs = []
|
| 82 |
+
for i in range(NUM_TESTS):
|
| 83 |
+
company = random.choice(example_companies)
|
| 84 |
+
job_title, jd = random.choice(list(example_jobs_jds.items()))
|
| 85 |
+
question_type, question_template = random.choice(list(example_questions.items()))
|
| 86 |
+
question = question_template.format(company_name=company, job_title=job_title)
|
| 87 |
+
experience = random.choice(experience_levels)
|
| 88 |
+
|
| 89 |
+
test_input = {
|
| 90 |
+
"company_name": company,
|
| 91 |
+
"jd": jd,
|
| 92 |
+
"question": question,
|
| 93 |
+
"experience_level": experience
|
| 94 |
+
}
|
| 95 |
+
test_inputs.append((i + 1, test_input))
|
| 96 |
+
|
| 97 |
+
results = []
|
| 98 |
+
with multiprocessing.Pool(processes=NUM_PROCESSES) as pool:
|
| 99 |
+
with tqdm(total=NUM_TESTS, desc="๊ฐ์ด๋ ์์ฑ ํ
์คํธ") as pbar:
|
| 100 |
+
for result in pool.imap_unordered(run_test, test_inputs):
|
| 101 |
+
results.append(result)
|
| 102 |
+
pbar.update()
|
| 103 |
+
|
| 104 |
+
results.sort(key=lambda x: x['id'])
|
| 105 |
+
print("๋ชจ๋ ํ
์คํธ๊ฐ ์๋ฃ๋์์ต๋๋ค.")
|
| 106 |
+
|
| 107 |
+
now = datetime.datetime.now()
|
| 108 |
+
report_filename = f"guide_generation_report_{now.strftime('%Y%m%d_%H%M%S')}.html"
|
| 109 |
+
|
| 110 |
+
failure_count = sum(1 for r in results if "Success" not in r["status"])
|
| 111 |
+
total_cost = sum(r['cost'] for r in results)
|
| 112 |
+
failure_rate = (failure_count / NUM_TESTS) * 100 if NUM_TESTS > 0 else 0
|
| 113 |
+
|
| 114 |
+
html_template = """
|
| 115 |
+
<!DOCTYPE html><html lang="ko"><head><meta charset="UTF-8"><title>๊ฐ์ด๋ ์์ฑ ํ
์คํธ ๋ณด๊ณ ์</title>
|
| 116 |
+
<style>body{{font-family:sans-serif;margin:20px;}} h1,h2{{text-align:center;}} .summary{{border:1px solid #ddd;padding:20px;margin-bottom:20px;}} table{{width:100%;border-collapse:collapse;}} th,td{{border:1px solid #ddd;padding:8px;text-align:left;vertical-align:top;}} th{{background-color:#f2f2f2;}} .status-success{{color:green;font-weight:bold;}} .status-failure{{color:red;font-weight:bold;}} pre{{white-space:pre-wrap;word-wrap:break-word;background-color:#f9f9f9;padding:10px;border:1px solid #ddd;}} .container{{max-width:1400px;margin:auto;}}</style>
|
| 117 |
+
</head><body><div class="container"><h1>๊ฐ์ด๋ ์์ฑ ํ
์คํธ ๋ณด๊ณ ์</h1><div class="summary"><h2>์์ฝ</h2><p><strong>ํ
์คํธ ์๊ฐ:</strong> {now}</p><p><strong>์ด ํ
์คํธ ์:</strong> {total_tests}</p><p><strong>์ฑ๊ณต:</strong> {success_count}</p><p><strong>์คํจ/์๋ฌ:</strong> {failure_count}</p><p><strong>์คํจ์จ:</strong> <span class="{status_class}">{failure_rate:.2f}%</span></p><p><strong>์ด ์์ ๋น์ฉ:</strong> ${total_cost:.6f}</p></div>
|
| 118 |
+
<h2>์์ธ ๊ฒฐ๊ณผ</h2><table><thead><tr><th>ID</th><th>์
๋ ฅ (Input)</th><th>ํ์ฑ ๊ฒฐ๊ณผ (Parsed)</th><th>์๋ฌ</th><th>๋น์ฉ</th><th>์ํ</th></tr></thead><tbody>{table_rows}</tbody></table></div></body></html>
|
| 119 |
+
"""
|
| 120 |
+
|
| 121 |
+
table_rows_html = ""
|
| 122 |
+
for res in results:
|
| 123 |
+
status_class = "status-success" if "Success" in res["status"] else "status-failure"
|
| 124 |
+
table_rows_html += f"""
|
| 125 |
+
<tr>
|
| 126 |
+
<td>{res['id']}</td>
|
| 127 |
+
<td><pre>{json.dumps(res['input'], indent=2, ensure_ascii=False)}</pre></td>
|
| 128 |
+
<td><pre>{json.dumps(res['parsed_result'], indent=2, ensure_ascii=False)}</pre></td>
|
| 129 |
+
<td><pre>{res['error']}</pre></td>
|
| 130 |
+
<td>${res['cost']:.6f}</td>
|
| 131 |
+
<td class="{status_class}">{res['status']}</td>
|
| 132 |
+
</tr>
|
| 133 |
+
"""
|
| 134 |
+
|
| 135 |
+
final_html = html_template.format(
|
| 136 |
+
now=now.strftime('%Y-%m-%d %H:%M:%S'),
|
| 137 |
+
total_tests=NUM_TESTS,
|
| 138 |
+
success_count=NUM_TESTS - failure_count,
|
| 139 |
+
failure_count=failure_count,
|
| 140 |
+
status_class="status-success" if failure_rate < 10 else "status-failure",
|
| 141 |
+
failure_rate=failure_rate,
|
| 142 |
+
total_cost=total_cost,
|
| 143 |
+
table_rows=table_rows_html
|
| 144 |
+
)
|
| 145 |
+
|
| 146 |
+
with open(report_filename, "w", encoding="utf-8") as f:
|
| 147 |
+
f.write(final_html)
|
| 148 |
+
|
| 149 |
+
print(f"'{report_filename}' ํ์ผ๋ก ๋ณด๊ณ ์๊ฐ ์ ์ฅ๋์์ต๋๋ค.")
|
| 150 |
+
print(f"์ด ์์ ๋น์ฉ: ${total_cost:.6f}")
|
| 151 |
+
|
| 152 |
+
if __name__ == "__main__":
|
| 153 |
+
main()
|
llm_functions.py
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from openai import OpenAI
|
| 2 |
+
import yaml
|
| 3 |
+
import os
|
| 4 |
+
import json
|
| 5 |
+
|
| 6 |
+
# ํด๋ผ์ด์ธํธ ๋ฐ ํ๋กฌํํธ ์ด๊ธฐํ
|
| 7 |
+
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
|
| 8 |
+
|
| 9 |
+
try:
|
| 10 |
+
current_dir = os.path.dirname(os.path.abspath(__file__))
|
| 11 |
+
prompt_path = os.path.join(current_dir, 'prompt.yaml')
|
| 12 |
+
with open(prompt_path, "r", encoding='utf-8') as file:
|
| 13 |
+
prompts = yaml.safe_load(file)
|
| 14 |
+
except Exception as e:
|
| 15 |
+
print(f"Warning: prompt.yaml ๋ก๋ ์คํจ. ๊ธฐ๋ณธ ํ๋กฌํํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ค๋ฅ: {e}")
|
| 16 |
+
prompts = {
|
| 17 |
+
"Interviewer": "You are a job interviewer.",
|
| 18 |
+
"Student": "You are a job applicant.",
|
| 19 |
+
"CoverLetter": "Write a cover letter based on the conversation."
|
| 20 |
+
}
|
| 21 |
+
|
| 22 |
+
def get_interviewer_response(example_info):
|
| 23 |
+
"""
|
| 24 |
+
์งํ๋ฅ (progress)์ ํฌํจํ ๋ฉด์ ๊ด์ ์๋ต์ ์คํธ๋ฆฌ๋ฐ์ผ๋ก ์์ฑํฉ๋๋ค.
|
| 25 |
+
"""
|
| 26 |
+
# ํ๋กฌํํธ ํฌ๋งคํ
์ ํ์ํ ๋ชจ๋ ๋ณ์๋ฅผ kwargs๋ก ๋ฌถ๊ธฐ
|
| 27 |
+
format_kwargs = {
|
| 28 |
+
**example_info
|
| 29 |
+
}
|
| 30 |
+
system_prompt = prompts.get("Interviewer", "").format(**format_kwargs)
|
| 31 |
+
|
| 32 |
+
with open("system_prompt.txt", "w", encoding='utf-8') as f:
|
| 33 |
+
f.write(system_prompt)
|
| 34 |
+
conversation = [{"role": "system", "content": "You must generate the response in json format."}, {"role": "user", "content": system_prompt}]
|
| 35 |
+
# for role, content in messages:
|
| 36 |
+
# conversation.append({"role": role, "content": content})
|
| 37 |
+
|
| 38 |
+
response_stream = client.chat.completions.create(
|
| 39 |
+
model="gpt-4.1",
|
| 40 |
+
messages=conversation,
|
| 41 |
+
stream=True
|
| 42 |
+
)
|
| 43 |
+
for chunk in response_stream:
|
| 44 |
+
yield chunk.choices[0].delta.content or ""
|
| 45 |
+
|
| 46 |
+
def get_student_response(example_info):
|
| 47 |
+
"""ํ์์ AI ๋ต๋ณ์ ์คํธ๋ฆฌ๋ฐ์ผ๋ก ์์ฑํฉ๋๋ค."""
|
| 48 |
+
system_prompt = prompts.get("Student", "").format(**example_info)
|
| 49 |
+
|
| 50 |
+
conversation = [{"role": "system", "content": "You must generate the response in json format."}]
|
| 51 |
+
|
| 52 |
+
with open("student_input.txt", "w", encoding='utf-8') as f:
|
| 53 |
+
f.write(system_prompt)
|
| 54 |
+
# for speaker, content in history:
|
| 55 |
+
# conversation.append({"role": "user", "content": f"{speaker}: {content}"})
|
| 56 |
+
|
| 57 |
+
conversation.append({"role": "user", "content": f"{system_prompt}"})
|
| 58 |
+
|
| 59 |
+
response_stream = client.chat.completions.create(
|
| 60 |
+
model="gpt-4o",
|
| 61 |
+
messages=conversation,
|
| 62 |
+
stream=True
|
| 63 |
+
)
|
| 64 |
+
for chunk in response_stream:
|
| 65 |
+
yield chunk.choices[0].delta.content or ""
|
| 66 |
+
|
| 67 |
+
def generate_cover_letter_response(question, conversation_history, example_info, flow, word_limit):
|
| 68 |
+
"""
|
| 69 |
+
์งํ๋ฅ ์ ํฌํจํ์ฌ ์๊ธฐ์๊ฐ์ ๋ต๋ณ์ ์คํธ๋ฆฌ๋ฐ์ผ๋ก ์์ฑํฉ๋๋ค.
|
| 70 |
+
"""
|
| 71 |
+
conversation_text = "\n".join([f"{speaker}: {content}" for speaker, content in conversation_history])
|
| 72 |
+
|
| 73 |
+
# ์งํ๋ฅ ํ์๋ฅผ ์์ฒญํ๋ ํ๋กฌํํธ
|
| 74 |
+
prompt = prompts.get("CoverLetter", "").format(
|
| 75 |
+
conversation=conversation_text,
|
| 76 |
+
question=question,
|
| 77 |
+
flow=flow,
|
| 78 |
+
word_limit=word_limit,
|
| 79 |
+
**example_info
|
| 80 |
+
)
|
| 81 |
+
|
| 82 |
+
response_stream = client.chat.completions.create(
|
| 83 |
+
model="gpt-4o",
|
| 84 |
+
messages=[{"role": "user", "content": prompt}],
|
| 85 |
+
stream=True
|
| 86 |
+
)
|
| 87 |
+
for chunk in response_stream:
|
| 88 |
+
yield chunk.choices[0].delta.content or ""
|