kyle8581's picture
.
594e237
import gradio as gr
import yaml
import json
import os
from openai import OpenAI
from llm_functions import generate_question_recommendation, parse_question_recommendation
# OpenAI ํด๋ผ์ด์–ธํŠธ ์ดˆ๊ธฐํ™”
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
# ํ”„๋กฌํ”„ํŠธ ๋กœ๋“œ
def load_prompts():
with open('prompt.yaml', 'r', encoding='utf-8') as file:
return yaml.safe_load(file)
prompts = load_prompts()
def recommend_question(job_title, company_name, experience_level):
"""๋ฉด์ ‘ ์งˆ๋ฌธ์„ ์ถ”์ฒœํ•˜๋Š” ํ•จ์ˆ˜"""
try:
# LLM ํ•จ์ˆ˜ ํ˜ธ์ถœ
result = generate_question_recommendation(
client=client,
prompts=prompts,
job_title=job_title,
company_name=company_name,
experience_level=experience_level
)
# ๊ฒฐ๊ณผ ํŒŒ์‹ฑ
parsed_result = parse_question_recommendation(result)
if parsed_result and 'recommended_question' in parsed_result:
return parsed_result['recommended_question']
else:
return "์งˆ๋ฌธ ์ƒ์„ฑ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”."
except Exception as e:
return f"์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: {str(e)}"
# ์˜ˆ์‹œ ๋ฒ„ํŠผ ํ•จ์ˆ˜๋“ค
def example_1():
return "๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ", "ํ† ์Šค (๋น„๋ฐ”๋ฆฌํผ๋ธ”๋ฆฌ์นด)", "์‹ ์ž…"
def example_2():
return "์‹ํ’ˆ๋งˆ์ผ€ํŒ…", "CJ์ œ์ผ์ œ๋‹น", "๊ฒฝ๋ ฅ"
def example_3():
return "A&R", "ํ•˜์ด๋ธŒ", "์ธํ„ด"
def example_4():
return "๊ฒฝ์˜๊ธฐํš", "ํ˜„๋Œ€๊ฑด์„ค", "์‹ ์ž…"
def example_5():
return "ํ•ด์™ธ์˜์—…", "์‚ผ์„ฑ์ „์ž", "๊ฒฝ๋ ฅ"
# Gradio ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์„ฑ
with gr.Blocks(
title="๋ฉด์ ‘ ์งˆ๋ฌธ ์ถ”์ฒœ",
theme=gr.themes.Soft(
primary_hue="purple",
secondary_hue="pink",
neutral_hue="gray"
),
css="""
.main-container {
max-width: 900px;
margin: 0 auto;
padding: 20px;
}
.header {
text-align: center;
margin-bottom: 30px;
padding: 20px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border-radius: 15px;
color: white;
}
.input-section {
background: white;
padding: 25px;
border-radius: 15px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
margin-bottom: 20px;
}
.result-section {
background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
padding: 25px;
border-radius: 15px;
color: white;
margin-top: 20px;
}
.example-buttons {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-top: 15px;
justify-content: center;
}
.example-btn {
background: linear-gradient(45deg, #667eea, #764ba2);
border: none;
color: white;
padding: 8px 16px;
border-radius: 20px;
font-size: 12px;
cursor: pointer;
transition: all 0.3s ease;
}
.example-btn:hover {
transform: translateY(-2px);
box-shadow: 0 4px 8px rgba(0,0,0,0.2);
}
"""
) as demo:
with gr.Column(elem_classes="main-container"):
# ํ—ค๋”
gr.HTML("""
<div class="header">
<h1>๐ŸŽฏ ๋ฉด์ ‘ ์งˆ๋ฌธ ์ถ”์ฒœ</h1>
<p>์ง๋ฌด, ํšŒ์‚ฌ๋ช…, ๊ฒฝ๋ ฅ ์ˆ˜์ค€์„ ์ž…๋ ฅํ•˜๋ฉด ๋งž์ถคํ˜• ๋ฉด์ ‘ ์งˆ๋ฌธ์„ ์ถ”์ฒœํ•ด๋“œ๋ฆฝ๋‹ˆ๋‹ค</p>
</div>
""")
with gr.Column(elem_classes="input-section"):
gr.HTML("<h3>๐Ÿ“ ์ •๋ณด ์ž…๋ ฅ</h3>")
job_title = gr.Textbox(
label="์ง๋ฌด",
placeholder="์˜ˆ: ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ, ๋งˆ์ผ€ํŒ…, ๊ธฐํš ๋“ฑ",
lines=1
)
company_name = gr.Textbox(
label="ํšŒ์‚ฌ๋ช…",
placeholder="์˜ˆ: ํ† ์Šค, ์‚ผ์„ฑ์ „์ž, ๋„ค์ด๋ฒ„ ๋“ฑ",
lines=1
)
experience_level = gr.Dropdown(
label="๊ฒฝ๋ ฅ ์ˆ˜์ค€",
choices=["์‹ ์ž…", "๊ฒฝ๋ ฅ", "์ธํ„ด", "๊ธฐํƒ€"],
value="์‹ ์ž…"
)
# ์˜ˆ์‹œ ๋ฒ„ํŠผ๋“ค
gr.HTML("<h4>๐Ÿ’ก ์˜ˆ์‹œ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ</h4>")
with gr.Row():
ex1_btn = gr.Button("ํ† ์Šค ๋ฐฑ์—”๋“œ ์‹ ์ž…", size="sm", variant="secondary")
ex2_btn = gr.Button("CJ์ œ์ผ์ œ๋‹น ๋งˆ์ผ€ํŒ… ๊ฒฝ๋ ฅ", size="sm", variant="secondary")
ex3_btn = gr.Button("ํ•˜์ด๋ธŒ A&R ์ธํ„ด", size="sm", variant="secondary")
with gr.Row():
ex4_btn = gr.Button("ํ˜„๋Œ€๊ฑด์„ค ๊ฒฝ์˜๊ธฐํš ์‹ ์ž…", size="sm", variant="secondary")
ex5_btn = gr.Button("์‚ผ์„ฑ์ „์ž ํ•ด์™ธ์˜์—… ๊ฒฝ๋ ฅ", size="sm", variant="secondary")
submit_btn = gr.Button("๐ŸŽฏ ๋ฉด์ ‘ ์งˆ๋ฌธ ์ถ”์ฒœ๋ฐ›๊ธฐ", variant="primary", size="lg")
# ๊ฒฐ๊ณผ ์ถœ๋ ฅ
with gr.Column(elem_classes="result-section"):
gr.HTML("<h3>๐Ÿ’ฌ ์ถ”์ฒœ ๋ฉด์ ‘ ์งˆ๋ฌธ</h3>")
result_output = gr.Textbox(
label="",
placeholder="์œ„ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜๊ณ  '๋ฉด์ ‘ ์งˆ๋ฌธ ์ถ”์ฒœ๋ฐ›๊ธฐ' ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์„ธ์š”.",
lines=5,
show_label=False,
interactive=False
)
# ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ
submit_btn.click(
fn=recommend_question,
inputs=[job_title, company_name, experience_level],
outputs=result_output
)
# ์˜ˆ์‹œ ๋ฒ„ํŠผ ์ด๋ฒคํŠธ
ex1_btn.click(fn=example_1, outputs=[job_title, company_name, experience_level])
ex2_btn.click(fn=example_2, outputs=[job_title, company_name, experience_level])
ex3_btn.click(fn=example_3, outputs=[job_title, company_name, experience_level])
ex4_btn.click(fn=example_4, outputs=[job_title, company_name, experience_level])
ex5_btn.click(fn=example_5, outputs=[job_title, company_name, experience_level])
if __name__ == "__main__":
demo.launch(
# server_port=7864,
share=True,
show_error=True
)