soojeongcrystal commited on
Commit
5ad04e8
โ€ข
1 Parent(s): 402b304

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +17 -66
app.py CHANGED
@@ -11,9 +11,9 @@ import io
11
  # Sentence-BERT ๋ชจ๋ธ ๋กœ๋“œ
12
  model = SentenceTransformer('all-MiniLM-L6-v2')
13
 
14
- # ์ถ”์ฒœ ๊ฒฐ๊ณผ๋ฅผ CSV ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๋Š” ํ•จ์ˆ˜
15
  def save_recommendations_to_csv(recommendations):
16
- output = io.StringIO()
17
  writer = csv.writer(output)
18
  writer.writerow(["Employee ID", "Employee Name", "Recommended Programs"])
19
 
@@ -24,15 +24,8 @@ def save_recommendations_to_csv(recommendations):
24
  output.seek(0)
25
  return output
26
 
27
- # ์ถ”์ฒœ ๊ฒฐ๊ณผ์™€ ํ”ผ๋“œ๋ฐฑ์„ ๊ธฐ๋กํ•˜๋Š” ํ•จ์ˆ˜
28
- def log_recommendation(employee_name, recommended_programs, feedback=None):
29
- with open('recommendation_log.csv', mode='a', newline='') as file:
30
- writer = csv.writer(file)
31
- timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
32
- writer.writerow([timestamp, employee_name, recommended_programs, feedback])
33
-
34
  # ์ง์› ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๊ต์œก ํ”„๋กœ๊ทธ๋žจ์„ ์ถ”์ฒœํ•˜๊ณ  ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ฆฌ๋Š” ํ•จ์ˆ˜
35
- def analyze_data(employee_file, program_file, feedback=None):
36
  # ์ง์› ๋ฐ์ดํ„ฐ์™€ ๊ต์œก ํ”„๋กœ๊ทธ๋žจ ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
37
  employee_df = pd.read_csv(employee_file.name)
38
  program_df = pd.read_csv(program_file.name)
@@ -61,9 +54,6 @@ def analyze_data(employee_file, program_file, feedback=None):
61
  else:
62
  recommendation = f"์ง์› {employee['employee_name']}์—๊ฒŒ ์ ํ•ฉํ•œ ํ”„๋กœ๊ทธ๋žจ์ด ์—†์Šต๋‹ˆ๋‹ค."
63
  recommendation_rows.append([employee['employee_id'], employee['employee_name'], "์ ํ•ฉํ•œ ํ”„๋กœ๊ทธ๋žจ ์—†์Œ"])
64
-
65
- # ํ”ผ๋“œ๋ฐฑ ๋กœ๊ทธ ๊ธฐ๋ก
66
- log_recommendation(employee['employee_name'], recommended_programs, feedback)
67
 
68
  recommendations.append(recommendation)
69
 
@@ -83,8 +73,8 @@ def analyze_data(employee_file, program_file, feedback=None):
83
  # ๊ทธ๋ž˜ํ”„ ์‹œ๊ฐํ™”
84
  plt.figure(figsize=(10, 8))
85
  pos = nx.spring_layout(G)
86
- nx.draw(G, pos, with_labels=True, node_color='skyblue', node_size=2000, font_size=10, font_weight='bold')
87
- plt.title("์ง์›๊ณผ ํ”„๋กœ๊ทธ๋žจ ๊ฐ„์˜ ๊ด€๊ณ„")
88
  plt.tight_layout()
89
 
90
  # CSV ํŒŒ์ผ๋กœ ์ถ”์ฒœ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
@@ -92,64 +82,25 @@ def analyze_data(employee_file, program_file, feedback=None):
92
 
93
  return "\n".join(recommendations), plt.gcf(), csv_output
94
 
95
- # ์˜ˆ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํ•จ์ˆ˜
96
- def show_example_data():
97
- employee_example = pd.DataFrame({
98
- 'employee_id': ['001', '002'],
99
- 'employee_name': ['ํ™๊ธธ๋™', '๊น€์˜ํฌ'],
100
- 'current_role': ['๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€', '๋งˆ์ผ€ํŒ… ๋งค๋‹ˆ์ €'],
101
- 'current_skills': ['Python, SQL, ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”', '๋งˆ์ผ€ํŒ… ์ „๋žต, ๋ฐ์ดํ„ฐ ๋ถ„์„'],
102
- 'past_training': ['Python ๊ธฐ๋ณธ ๊ณผ์ •, SQL ์ค‘๊ธ‰', '๋ฐ์ดํ„ฐ ๋ถ„์„ ๊ธฐ์ดˆ ๊ณผ์ •'],
103
- 'performance_review': ['์„ฑ๊ณผ ์šฐ์ˆ˜', '์„ฑ๊ณผ ์ข‹์Œ'],
104
- 'learning_goal': ['๋จธ์‹ ๋Ÿฌ๋‹ ๊ธฐ์ดˆ ํ•™์Šต', '๊ณ ๊ธ‰ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๊ธฐ์ˆ  ํ•™์Šต']
105
- })
106
-
107
- program_example = pd.DataFrame({
108
- 'program_id': ['101', '102'],
109
- 'program_name': ['Python ๊ณ ๊ธ‰ ๊ณผ์ •', '๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™” ์‹ฌํ™” ๊ณผ์ •'],
110
- 'learning_objectives': ['Python ๊ณ ๊ธ‰ ๊ธฐ์ˆ  ์Šต๋“', '๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™” ๋„๊ตฌ ์‚ฌ์šฉ๋ฒ• ์ˆ™์ง€'],
111
- 'skills_acquired': ['Python ๊ณ ๊ธ‰, ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ', 'Tableau, ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™” ๋„๊ตฌ'],
112
- 'prerequisites': ['Python ๊ธฐ์ดˆ', '๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™” ๊ธฐ์ดˆ'],
113
- 'duration': ['4์ฃผ', '2์ฃผ'],
114
- 'learning_outcome': ['๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋Šฅ๋ ฅ', '์‹œ๊ฐํ™” ๊ฒฐ๊ณผ๋ฌผ ์ž‘์„ฑ ๋Šฅ๋ ฅ']
115
- })
116
-
117
- return employee_example, program_example
118
-
119
  # Gradio ๋ธ”๋ก
120
- with gr.Blocks() as demo:
 
 
121
  with gr.Row():
122
  with gr.Column(scale=1):
123
- gr.Markdown("# HybridRAG ์‹œ์Šคํ…œ")
124
-
125
- # ์ง์› ๋ฐ์ดํ„ฐ์™€ ํ”„๋กœ๊ทธ๋žจ ๋ฐ์ดํ„ฐ ์—…๋กœ๋“œ
126
- employee_file = gr.File(label="์ง์› ๋ฐ์ดํ„ฐ ์—…๋กœ๋“œ")
127
- program_file = gr.File(label="๊ต์œก ํ”„๋กœ๊ทธ๋žจ ๋ฐ์ดํ„ฐ ์—…๋กœ๋“œ")
128
- analyze_button = gr.Button("๋ถ„์„ ์‹œ์ž‘")
129
- output_text = gr.Textbox(label="๋ถ„์„ ๊ฒฐ๊ณผ")
130
-
131
- # HR ๊ด€๋ฆฌ์ž๋Š” ์ง์› ํ”ผ๋“œ๋ฐฑ์„ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
132
- feedback_input = gr.Radio(choices=["๋งŒ์กฑ", "๋ถˆ๋งŒ์กฑ"], label="์ง์› ํ”ผ๋“œ๋ฐฑ ๊ธฐ๋ก")
133
-
134
- # ๋ถ„์„ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์‹คํ–‰
135
- analyze_button.click(analyze_data, inputs=[employee_file, program_file, feedback_input], outputs=[output_text])
136
-
137
- # ์˜ˆ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋กœ ์ œ๊ณต
138
- example_button = gr.Button("์˜ˆ์‹œ ๋ฐ์ดํ„ฐ ๋ณด๊ธฐ")
139
- employee_example_output = gr.DataFrame(label="์ง์› ๋ฐ์ดํ„ฐ ์˜ˆ์‹œ")
140
- program_example_output = gr.DataFrame(label="๊ต์œก ํ”„๋กœ๊ทธ๋žจ ๋ฐ์ดํ„ฐ ์˜ˆ์‹œ")
141
- example_button.click(show_example_data, outputs=[employee_example_output, program_example_output])
142
 
143
  with gr.Column(scale=2):
144
- gr.Markdown("### ์ •๋ณด ํŒจ๋„")
145
- gr.Markdown("์—…๋กœ๋“œ๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋ถ„์„ ๋ฐ ๊ฒฐ๊ณผ๋ฅผ ์—ฌ๊ธฐ์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.")
146
-
147
- # ์‹œ๊ฐํ™” ์ฐจํŠธ ์ถœ๋ ฅ
148
  chart_output = gr.Plot(label="์‹œ๊ฐํ™” ์ฐจํŠธ")
149
-
150
- # ๋ถ„์„ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์ฐจํŠธ ์—…๋ฐ์ดํŠธ ๋ฐ ์ถ”์ฒœ ๊ฒฐ๊ณผ ๋‹ค์šด๋กœ๋“œ ์ถ”๊ฐ€
151
  csv_download = gr.File(label="์ถ”์ฒœ ๊ฒฐ๊ณผ ๋‹ค์šด๋กœ๋“œ")
152
- analyze_button.click(analyze_data, inputs=[employee_file, program_file, feedback_input], outputs=[output_text, chart_output, csv_download])
 
 
153
 
154
  # Gradio ์ธํ„ฐํŽ˜์ด์Šค ์‹คํ–‰
155
  demo.launch()
 
11
  # Sentence-BERT ๋ชจ๋ธ ๋กœ๋“œ
12
  model = SentenceTransformer('all-MiniLM-L6-v2')
13
 
14
+ # ์ถ”์ฒœ ๊ฒฐ๊ณผ๋ฅผ CSV ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๋Š” ํ•จ์ˆ˜ (BytesIO๋กœ ์ˆ˜์ •)
15
  def save_recommendations_to_csv(recommendations):
16
+ output = io.BytesIO()
17
  writer = csv.writer(output)
18
  writer.writerow(["Employee ID", "Employee Name", "Recommended Programs"])
19
 
 
24
  output.seek(0)
25
  return output
26
 
 
 
 
 
 
 
 
27
  # ์ง์› ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๊ต์œก ํ”„๋กœ๊ทธ๋žจ์„ ์ถ”์ฒœํ•˜๊ณ  ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ฆฌ๋Š” ํ•จ์ˆ˜
28
+ def analyze_data(employee_file, program_file):
29
  # ์ง์› ๋ฐ์ดํ„ฐ์™€ ๊ต์œก ํ”„๋กœ๊ทธ๋žจ ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
30
  employee_df = pd.read_csv(employee_file.name)
31
  program_df = pd.read_csv(program_file.name)
 
54
  else:
55
  recommendation = f"์ง์› {employee['employee_name']}์—๊ฒŒ ์ ํ•ฉํ•œ ํ”„๋กœ๊ทธ๋žจ์ด ์—†์Šต๋‹ˆ๋‹ค."
56
  recommendation_rows.append([employee['employee_id'], employee['employee_name'], "์ ํ•ฉํ•œ ํ”„๋กœ๊ทธ๋žจ ์—†์Œ"])
 
 
 
57
 
58
  recommendations.append(recommendation)
59
 
 
73
  # ๊ทธ๋ž˜ํ”„ ์‹œ๊ฐํ™”
74
  plt.figure(figsize=(10, 8))
75
  pos = nx.spring_layout(G)
76
+ nx.draw(G, pos, with_labels=True, node_color='lightblue', node_size=3000, font_size=10, font_weight='bold', edge_color='gray')
77
+ plt.title("์ง์›๊ณผ ํ”„๋กœ๊ทธ๋žจ ๊ฐ„์˜ ๊ด€๊ณ„", fontsize=14, fontweight='bold')
78
  plt.tight_layout()
79
 
80
  # CSV ํŒŒ์ผ๋กœ ์ถ”์ฒœ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
 
82
 
83
  return "\n".join(recommendations), plt.gcf(), csv_output
84
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
  # Gradio ๋ธ”๋ก
86
+ with gr.Blocks(css=".gradio-button {background-color: #6c757d; color: white;} .gradio-textbox {border-color: #6c757d;}") as demo:
87
+ gr.Markdown("<h1 style='text-align: center; color: #2c3e50;'>๐Ÿ’ผ HybridRAG ์‹œ์Šคํ…œ</h1>", unsafe_allow_html=True)
88
+
89
  with gr.Row():
90
  with gr.Column(scale=1):
91
+ gr.Markdown("<h3 style='color: #34495e;'>1. ์ง์› ๋ฐ ํ”„๋กœ๊ทธ๋žจ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋กœ๋“œํ•˜์„ธ์š”</h3>")
92
+ employee_file = gr.File(label="์ง์› ๋ฐ์ดํ„ฐ ์—…๋กœ๋“œ", interactive=True)
93
+ program_file = gr.File(label="๊ต์œก ํ”„๋กœ๊ทธ๋žจ ๋ฐ์ดํ„ฐ ์—…๋กœ๋“œ", interactive=True)
94
+ analyze_button = gr.Button("๋ถ„์„ ์‹œ์ž‘", elem_classes="gradio-button")
95
+ output_text = gr.Textbox(label="๋ถ„์„ ๊ฒฐ๊ณผ", interactive=False, elem_classes="gradio-textbox")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
 
97
  with gr.Column(scale=2):
98
+ gr.Markdown("<h3 style='color: #34495e;'>2. ๋ถ„์„ ๊ฒฐ๊ณผ</h3>")
 
 
 
99
  chart_output = gr.Plot(label="์‹œ๊ฐํ™” ์ฐจํŠธ")
 
 
100
  csv_download = gr.File(label="์ถ”์ฒœ ๊ฒฐ๊ณผ ๋‹ค์šด๋กœ๋“œ")
101
+
102
+ # ๋ถ„์„ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์ฐจํŠธ์™€ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ๋ฅผ ์—…๋ฐ์ดํŠธ
103
+ analyze_button.click(analyze_data, inputs=[employee_file, program_file], outputs=[output_text, chart_output, csv_download])
104
 
105
  # Gradio ์ธํ„ฐํŽ˜์ด์Šค ์‹คํ–‰
106
  demo.launch()