Manggomee commited on
Commit
e3764d6
Β·
verified Β·
1 Parent(s): cefd5b3

Delete chatbot_ver1

Browse files
chatbot_ver1/LICENSE DELETED
@@ -1,121 +0,0 @@
1
- Creative Commons Legal Code
2
-
3
- CC0 1.0 Universal
4
-
5
- CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
6
- LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
7
- ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
8
- INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
9
- REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
10
- PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
11
- THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
12
- HEREUNDER.
13
-
14
- Statement of Purpose
15
-
16
- The laws of most jurisdictions throughout the world automatically confer
17
- exclusive Copyright and Related Rights (defined below) upon the creator
18
- and subsequent owner(s) (each and all, an "owner") of an original work of
19
- authorship and/or a database (each, a "Work").
20
-
21
- Certain owners wish to permanently relinquish those rights to a Work for
22
- the purpose of contributing to a commons of creative, cultural and
23
- scientific works ("Commons") that the public can reliably and without fear
24
- of later claims of infringement build upon, modify, incorporate in other
25
- works, reuse and redistribute as freely as possible in any form whatsoever
26
- and for any purposes, including without limitation commercial purposes.
27
- These owners may contribute to the Commons to promote the ideal of a free
28
- culture and the further production of creative, cultural and scientific
29
- works, or to gain reputation or greater distribution for their Work in
30
- part through the use and efforts of others.
31
-
32
- For these and/or other purposes and motivations, and without any
33
- expectation of additional consideration or compensation, the person
34
- associating CC0 with a Work (the "Affirmer"), to the extent that he or she
35
- is an owner of Copyright and Related Rights in the Work, voluntarily
36
- elects to apply CC0 to the Work and publicly distribute the Work under its
37
- terms, with knowledge of his or her Copyright and Related Rights in the
38
- Work and the meaning and intended legal effect of CC0 on those rights.
39
-
40
- 1. Copyright and Related Rights. A Work made available under CC0 may be
41
- protected by copyright and related or neighboring rights ("Copyright and
42
- Related Rights"). Copyright and Related Rights include, but are not
43
- limited to, the following:
44
-
45
- i. the right to reproduce, adapt, distribute, perform, display,
46
- communicate, and translate a Work;
47
- ii. moral rights retained by the original author(s) and/or performer(s);
48
- iii. publicity and privacy rights pertaining to a person's image or
49
- likeness depicted in a Work;
50
- iv. rights protecting against unfair competition in regards to a Work,
51
- subject to the limitations in paragraph 4(a), below;
52
- v. rights protecting the extraction, dissemination, use and reuse of data
53
- in a Work;
54
- vi. database rights (such as those arising under Directive 96/9/EC of the
55
- European Parliament and of the Council of 11 March 1996 on the legal
56
- protection of databases, and under any national implementation
57
- thereof, including any amended or successor version of such
58
- directive); and
59
- vii. other similar, equivalent or corresponding rights throughout the
60
- world based on applicable law or treaty, and any national
61
- implementations thereof.
62
-
63
- 2. Waiver. To the greatest extent permitted by, but not in contravention
64
- of, applicable law, Affirmer hereby overtly, fully, permanently,
65
- irrevocably and unconditionally waives, abandons, and surrenders all of
66
- Affirmer's Copyright and Related Rights and associated claims and causes
67
- of action, whether now known or unknown (including existing as well as
68
- future claims and causes of action), in the Work (i) in all territories
69
- worldwide, (ii) for the maximum duration provided by applicable law or
70
- treaty (including future time extensions), (iii) in any current or future
71
- medium and for any number of copies, and (iv) for any purpose whatsoever,
72
- including without limitation commercial, advertising or promotional
73
- purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
74
- member of the public at large and to the detriment of Affirmer's heirs and
75
- successors, fully intending that such Waiver shall not be subject to
76
- revocation, rescission, cancellation, termination, or any other legal or
77
- equitable action to disrupt the quiet enjoyment of the Work by the public
78
- as contemplated by Affirmer's express Statement of Purpose.
79
-
80
- 3. Public License Fallback. Should any part of the Waiver for any reason
81
- be judged legally invalid or ineffective under applicable law, then the
82
- Waiver shall be preserved to the maximum extent permitted taking into
83
- account Affirmer's express Statement of Purpose. In addition, to the
84
- extent the Waiver is so judged Affirmer hereby grants to each affected
85
- person a royalty-free, non transferable, non sublicensable, non exclusive,
86
- irrevocable and unconditional license to exercise Affirmer's Copyright and
87
- Related Rights in the Work (i) in all territories worldwide, (ii) for the
88
- maximum duration provided by applicable law or treaty (including future
89
- time extensions), (iii) in any current or future medium and for any number
90
- of copies, and (iv) for any purpose whatsoever, including without
91
- limitation commercial, advertising or promotional purposes (the
92
- "License"). The License shall be deemed effective as of the date CC0 was
93
- applied by Affirmer to the Work. Should any part of the License for any
94
- reason be judged legally invalid or ineffective under applicable law, such
95
- partial invalidity or ineffectiveness shall not invalidate the remainder
96
- of the License, and in such case Affirmer hereby affirms that he or she
97
- will not (i) exercise any of his or her remaining Copyright and Related
98
- Rights in the Work or (ii) assert any associated claims and causes of
99
- action with respect to the Work, in either case contrary to Affirmer's
100
- express Statement of Purpose.
101
-
102
- 4. Limitations and Disclaimers.
103
-
104
- a. No trademark or patent rights held by Affirmer are waived, abandoned,
105
- surrendered, licensed or otherwise affected by this document.
106
- b. Affirmer offers the Work as-is and makes no representations or
107
- warranties of any kind concerning the Work, express, implied,
108
- statutory or otherwise, including without limitation warranties of
109
- title, merchantability, fitness for a particular purpose, non
110
- infringement, or the absence of latent or other defects, accuracy, or
111
- the present or absence of errors, whether or not discoverable, all to
112
- the greatest extent permissible under applicable law.
113
- c. Affirmer disclaims responsibility for clearing rights of other persons
114
- that may apply to the Work or any use thereof, including without
115
- limitation any person's Copyright and Related Rights in the Work.
116
- Further, Affirmer disclaims responsibility for obtaining any necessary
117
- consents, permissions or other rights required for any use of the
118
- Work.
119
- d. Affirmer understands and acknowledges that Creative Commons is not a
120
- party to this document and has no duty or obligation with respect to
121
- this CC0 or use of the Work.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
chatbot_ver1/README.md DELETED
@@ -1 +0,0 @@
1
- # λ°μ΄ν„°μœ΅λ³΅ν•©μ—°κ΅¬μ›: AI-BigData μ „λ¬Έκ°€ κ³Όμ •
 
 
chatbot_ver1/app.py DELETED
@@ -1,175 +0,0 @@
1
- import os
2
- import yaml
3
- import gradio as gr
4
- from sentence_transformers import SentenceTransformer, util
5
- import torch
6
- import shutil
7
- import tempfile
8
-
9
- # 파일 경둜
10
- KNOWLEDGE_FILE = "company_knowledge.md"
11
- PERSONA_FILE = "persona.yaml"
12
- CHITCHAT_FILE = "chitchat.yaml"
13
- KEYWORD_MAP_FILE = "keyword_map.yaml"
14
- CEO_VIDEO_FILE = "ceo_video.mp4"
15
- CEO_IMG_FILE = "ceo.jpg" # ν•„μš”μ‹œ μ‚¬μš©
16
-
17
- def load_yaml(file_path, default_data=None):
18
- try:
19
- with open(file_path, "r", encoding="utf-8") as f:
20
- return yaml.safe_load(f)
21
- except Exception:
22
- return default_data if default_data is not None else []
23
-
24
- def parse_knowledge_base(file_path):
25
- import re
26
- faqs = []
27
- if not os.path.exists(file_path):
28
- return []
29
- with open(file_path, encoding="utf-8") as f:
30
- content = f.read()
31
- # Q:\s*(...) \nA:\s*(...)\n{2,} λ˜λŠ” 끝
32
- blocks = re.findall(r"Q:\s*(.*?)\nA:\s*(.*?)(?=(\n{2,}Q:|\Z))", content, re.DOTALL)
33
- for q, a, _ in blocks:
34
- faqs.append({"question": q.strip(), "answer": a.strip()})
35
- return faqs
36
-
37
- # 데이터 λ‘œλ“œ
38
- persona = load_yaml(PERSONA_FILE, {})
39
- chitchat_map = load_yaml(CHITCHAT_FILE, [])
40
- keyword_map = load_yaml(KEYWORD_MAP_FILE, [])
41
- knowledge_base = parse_knowledge_base(KNOWLEDGE_FILE)
42
- kb_questions = [item['question'] for item in knowledge_base]
43
- kb_answers = [item['answer'] for item in knowledge_base]
44
-
45
- # 무료 μž„λ² λ”© λͺ¨λΈ
46
- model = SentenceTransformer('distilbert-base-multilingual-cased')
47
- if kb_questions:
48
- kb_embeddings = model.encode(kb_questions, convert_to_tensor=True)
49
- else:
50
- kb_embeddings = None
51
-
52
- # μ‚­μ œμ„ (μ·¨μ†Œμ„ ) 적용 ν•¨μˆ˜
53
- def apply_strike(text, del_section="6000~6500λ§Œμ›, μ„±κ³ΌκΈ‰ 1800~2400λ§Œμ›"):
54
- # κΈ‰μ—¬ 정보가 ν¬ν•¨λœ 닡변일 λ•Œλ§Œ strike-through
55
- if del_section in text:
56
- return text.replace(
57
- del_section,
58
- f"<s>{del_section}</s>"
59
- )
60
- return text
61
-
62
- # Chitchat(인사 λ“±) λ§€μΉ­
63
- def find_chitchat(user_question):
64
- uq = user_question.lower()
65
- for chat in chitchat_map:
66
- if any(kw in uq for kw in chat.get('keywords', [])):
67
- return chat['answer']
68
- return None
69
-
70
- # ν‚€μ›Œλ“œ 기반 Q λ§€ν•‘ (볡지: νœ΄κ°€ μ œλ„, ꡐ윑, 볡리후생 λ“± κ°•ν™”)
71
- def map_user_question_to_knowledge(user_question):
72
- uq = user_question.lower()
73
- for item in keyword_map:
74
- for kw in item.get('keywords', []):
75
- if kw in uq:
76
- return item['question']
77
- return None
78
-
79
- def find_answer_by_question(q):
80
- for item in knowledge_base:
81
- if item['question'] == q:
82
- return item['answer']
83
- return None
84
-
85
- def find_answer_by_keywords(user_question):
86
- uq = user_question.lower()
87
- for item in knowledge_base:
88
- for kw in item.get('keywords', []):
89
- if kw in uq:
90
- return item['answer']
91
- return None
92
-
93
- def best_faq_answer(user_question):
94
- uq = user_question.strip()
95
- if not uq:
96
- return "무엇이 κΆκΈˆν•˜μ‹ μ§€ 말씀해 μ£Όμ„Έμš”!"
97
- chit = find_chitchat(uq)
98
- if chit:
99
- return chit
100
- # (1) ν‚€μ›Œλ“œλ§΅ μš°μ„  λ§€ν•‘ (볡지/κΈ‰μ—¬ 각각 뢄리)
101
- mapped_q = map_user_question_to_knowledge(uq)
102
- if mapped_q:
103
- answer = find_answer_by_question(mapped_q)
104
- if answer:
105
- # 볡지 λΆ„μ•Ό: '연봉 μˆ˜μ€€' λ‹΅λ³€ μ•„λ‹Œ κ²½μš°μ—λŠ” μ‚­μ œμ„  μ—†μŒ
106
- if "연봉" in mapped_q:
107
- return apply_strike(answer)
108
- return answer
109
- # (2) knowledge_base 직접 ν‚€μ›Œλ“œ λ§€μΉ­ (볡지 κ΄€λ ¨ ν‚€μ›Œλ“œ κ°•ν™”λ˜μ–΄μ•Ό 함!)
110
- answer = find_answer_by_keywords(uq)
111
- if answer:
112
- return answer
113
- # (3) μž„λ² λ”© μœ μ‚¬λ„ 기반 soft-matching
114
- if kb_embeddings is not None and len(kb_answers) > 0:
115
- q_emb = model.encode([uq], convert_to_tensor=True)
116
- scores = util.cos_sim(q_emb, kb_embeddings)[0]
117
- best_idx = int(torch.argmax(scores))
118
- best_question = kb_questions[best_idx]
119
- # λ³΅μ§€μ§ˆλ¬ΈμΈλ° μ—°λ΄‰ν‚€μ›Œλ“œ λ§€μΉ­λ˜λŠ” 경우, 볡지 μš°μ„  닡변을 μ„ νƒν•˜λ„λ‘
120
- # μ•„λž˜ if식은 μ‹€μ œ 볡지 λ‹΅λ³€ μš°μ„  μ½”λ“œ
121
- 볡지가λŠ₯ = ["볡지", "νœ΄κ°€", "ꡐ윑", "행사", "λ™ν˜ΈνšŒ", "볡리후생", "μ œλ„"]
122
- 연봉가λŠ₯ = ["연봉", "κΈ‰μ—¬", "μ›”κΈ‰", "μž„κΈˆ", "보상", "봉급", "처우"]
123
- if any(w in uq for w in 볡지가λŠ₯) and not any(w in best_question for w in 연봉가λŠ₯):
124
- return kb_answers[best_idx]
125
- # μ‚­μ œμ„ μ€ 연봉 λ‹΅λ³€μ—λ§Œ
126
- if "연봉" in best_question or "κΈ‰μ—¬" in best_question:
127
- return apply_strike(kb_answers[best_idx])
128
- return kb_answers[best_idx]
129
- # (4) fallback
130
- return persona.get('style', {}).get('unknown_answer', "아직 μ€€λΉ„λ˜μ§€ μ•Šμ€ μ§ˆλ¬Έμž…λ‹ˆλ‹€. λ‹€λ₯Έ μ§ˆλ¬Έλ„ ν•΄μ£Όμ„Έμš”!")
131
-
132
- # 질문 받을 λ•Œλ§ˆλ‹€ CEO μ˜μƒ 볡사본 μž„μ‹œνŒŒμΌλ‘œ 생성 β†’ autoplay ν™•μ‹€
133
- def get_temp_video_copy():
134
- temp_file = tempfile.NamedTemporaryFile(suffix=".mp4", delete=False)
135
- temp_filepath = temp_file.name
136
- temp_file.close()
137
- shutil.copyfile(CEO_VIDEO_FILE, temp_filepath)
138
- return temp_filepath
139
-
140
- def chat_interface(message, history):
141
- bot_response = best_faq_answer(message)
142
- history.append((message, bot_response))
143
- temp_video_path = get_temp_video_copy()
144
- # ν…μŠ€νŠΈμ— htmlκ°€λŠ₯ν•˜λ©΄ answer에 htmlμ‚­μ œμ„  μœ μ§€
145
- return history, "", gr.update(value=temp_video_path, autoplay=True, interactive=False, elem_id="ceo-video-panel")
146
-
147
- with gr.Blocks(theme=gr.themes.Soft(), css="style.css") as demo:
148
- with gr.Row(elem_id="main-row"):
149
- with gr.Column(scale=1, min_width=350):
150
- video_player = gr.Video(
151
- value=CEO_VIDEO_FILE,
152
- autoplay=False, loop=False, interactive=False,
153
- height=350, elem_id="ceo-video-panel"
154
- )
155
- with gr.Column(scale=2):
156
- chatbot = gr.Chatbot(
157
- label="",
158
- height=350,
159
- elem_id="chatbot-box",
160
- show_copy_button=True
161
- )
162
- with gr.Row():
163
- msg_input = gr.Textbox(placeholder="무엇이든 λ¬Όμ–΄λ³΄μ„Έμš”.", scale=4, show_label=False)
164
- send_btn = gr.Button("전솑", scale=1, min_width=80)
165
- gr.Examples(
166
- examples=["볡지 뭐 μžˆμ–΄?", "νœ΄κ°€ μ œλ„ μ„€λͺ…ν•΄μ€˜", "연봉 μ•Œλ €μ€˜", "λ™ν˜ΈνšŒ 행사?", "μ‹μ‚¬μ œκ³΅?", "μ£Όλ ₯μ œν’ˆ", "쑰직문화"],
167
- inputs=msg_input
168
- )
169
- # μ—°κ²°
170
- outputs_list = [chatbot, msg_input, video_player]
171
- msg_input.submit(chat_interface, [msg_input, chatbot], outputs_list)
172
- send_btn.click(chat_interface, [msg_input, chatbot], outputs_list)
173
-
174
- if __name__ == "__main__":
175
- demo.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
chatbot_ver1/app1.py DELETED
@@ -1,175 +0,0 @@
1
- import os
2
- import yaml
3
- import gradio as gr
4
- from sentence_transformers import SentenceTransformer, util
5
- import torch
6
- import shutil
7
- import tempfile
8
-
9
- # 파일 경둜
10
- KNOWLEDGE_FILE = "company_knowledge.md"
11
- PERSONA_FILE = "persona.yaml"
12
- CHITCHAT_FILE = "chitchat.yaml"
13
- KEYWORD_MAP_FILE = "keyword_map.yaml"
14
- CEO_VIDEO_FILE = "ceo_video.mp4"
15
- CEO_IMG_FILE = "ceo.jpg" # ν•„μš”μ‹œ μ‚¬μš©
16
-
17
- def load_yaml(file_path, default_data=None):
18
- try:
19
- with open(file_path, "r", encoding="utf-8") as f:
20
- return yaml.safe_load(f)
21
- except Exception:
22
- return default_data if default_data is not None else []
23
-
24
- def parse_knowledge_base(file_path):
25
- import re
26
- faqs = []
27
- if not os.path.exists(file_path):
28
- return []
29
- with open(file_path, encoding="utf-8") as f:
30
- content = f.read()
31
- # Q:\s*(...) \nA:\s*(...)\n{2,} λ˜λŠ” 끝
32
- blocks = re.findall(r"Q:\s*(.*?)\nA:\s*(.*?)(?=(\n{2,}Q:|\Z))", content, re.DOTALL)
33
- for q, a, _ in blocks:
34
- faqs.append({"question": q.strip(), "answer": a.strip()})
35
- return faqs
36
-
37
- # 데이터 λ‘œλ“œ
38
- persona = load_yaml(PERSONA_FILE, {})
39
- chitchat_map = load_yaml(CHITCHAT_FILE, [])
40
- keyword_map = load_yaml(KEYWORD_MAP_FILE, [])
41
- knowledge_base = parse_knowledge_base(KNOWLEDGE_FILE)
42
- kb_questions = [item['question'] for item in knowledge_base]
43
- kb_answers = [item['answer'] for item in knowledge_base]
44
-
45
- # 무료 μž„λ² λ”© λͺ¨λΈ
46
- model = SentenceTransformer('distilbert-base-multilingual-cased')
47
- if kb_questions:
48
- kb_embeddings = model.encode(kb_questions, convert_to_tensor=True)
49
- else:
50
- kb_embeddings = None
51
-
52
- # μ‚­μ œμ„ (μ·¨μ†Œμ„ ) 적용 ν•¨μˆ˜
53
- def apply_strike(text, del_section="6000~6500λ§Œμ›, μ„±κ³ΌκΈ‰ 1800~2400λ§Œμ›"):
54
- # κΈ‰μ—¬ 정보가 ν¬ν•¨λœ 닡변일 λ•Œλ§Œ strike-through
55
- if del_section in text:
56
- return text.replace(
57
- del_section,
58
- f"<s>{del_section}</s>"
59
- )
60
- return text
61
-
62
- # Chitchat(인사 λ“±) λ§€μΉ­
63
- def find_chitchat(user_question):
64
- uq = user_question.lower()
65
- for chat in chitchat_map:
66
- if any(kw in uq for kw in chat.get('keywords', [])):
67
- return chat['answer']
68
- return None
69
-
70
- # ν‚€μ›Œλ“œ 기반 Q λ§€ν•‘ (볡지: νœ΄κ°€ μ œλ„, ꡐ윑, 볡리후생 λ“± κ°•ν™”)
71
- def map_user_question_to_knowledge(user_question):
72
- uq = user_question.lower()
73
- for item in keyword_map:
74
- for kw in item.get('keywords', []):
75
- if kw in uq:
76
- return item['question']
77
- return None
78
-
79
- def find_answer_by_question(q):
80
- for item in knowledge_base:
81
- if item['question'] == q:
82
- return item['answer']
83
- return None
84
-
85
- def find_answer_by_keywords(user_question):
86
- uq = user_question.lower()
87
- for item in knowledge_base:
88
- for kw in item.get('keywords', []):
89
- if kw in uq:
90
- return item['answer']
91
- return None
92
-
93
- def best_faq_answer(user_question):
94
- uq = user_question.strip()
95
- if not uq:
96
- return "무엇이 κΆκΈˆν•˜μ‹ μ§€ 말씀해 μ£Όμ„Έμš”!"
97
- chit = find_chitchat(uq)
98
- if chit:
99
- return chit
100
- # (1) ν‚€μ›Œλ“œλ§΅ μš°μ„  λ§€ν•‘ (볡지/κΈ‰μ—¬ 각각 뢄리)
101
- mapped_q = map_user_question_to_knowledge(uq)
102
- if mapped_q:
103
- answer = find_answer_by_question(mapped_q)
104
- if answer:
105
- # 볡지 λΆ„μ•Ό: '연봉 μˆ˜μ€€' λ‹΅λ³€ μ•„λ‹Œ κ²½μš°μ—λŠ” μ‚­μ œμ„  μ—†μŒ
106
- if "연봉" in mapped_q:
107
- return apply_strike(answer)
108
- return answer
109
- # (2) knowledge_base 직접 ν‚€μ›Œλ“œ λ§€μΉ­ (볡지 κ΄€λ ¨ ν‚€μ›Œλ“œ κ°•ν™”λ˜μ–΄μ•Ό 함!)
110
- answer = find_answer_by_keywords(uq)
111
- if answer:
112
- return answer
113
- # (3) μž„λ² λ”© μœ μ‚¬λ„ 기반 soft-matching
114
- if kb_embeddings is not None and len(kb_answers) > 0:
115
- q_emb = model.encode([uq], convert_to_tensor=True)
116
- scores = util.cos_sim(q_emb, kb_embeddings)[0]
117
- best_idx = int(torch.argmax(scores))
118
- best_question = kb_questions[best_idx]
119
- # λ³΅μ§€μ§ˆλ¬ΈμΈλ° μ—°λ΄‰ν‚€μ›Œλ“œ λ§€μΉ­λ˜λŠ” 경우, 볡지 μš°μ„  닡변을 μ„ νƒν•˜λ„λ‘
120
- # μ•„λž˜ if식은 μ‹€μ œ 볡지 λ‹΅λ³€ μš°μ„  μ½”λ“œ
121
- 볡지가λŠ₯ = ["볡지", "νœ΄κ°€", "ꡐ윑", "행사", "λ™ν˜ΈνšŒ", "볡리후생", "μ œλ„"]
122
- 연봉가λŠ₯ = ["연봉", "κΈ‰μ—¬", "μ›”κΈ‰", "μž„κΈˆ", "보상", "봉급", "처우"]
123
- if any(w in uq for w in 볡지가λŠ₯) and not any(w in best_question for w in 연봉가λŠ₯):
124
- return kb_answers[best_idx]
125
- # μ‚­μ œμ„ μ€ 연봉 λ‹΅λ³€μ—λ§Œ
126
- if "연봉" in best_question or "κΈ‰μ—¬" in best_question:
127
- return apply_strike(kb_answers[best_idx])
128
- return kb_answers[best_idx]
129
- # (4) fallback
130
- return persona.get('style', {}).get('unknown_answer', "아직 μ€€λΉ„λ˜μ§€ μ•Šμ€ μ§ˆλ¬Έμž…λ‹ˆλ‹€. λ‹€λ₯Έ μ§ˆλ¬Έλ„ ν•΄μ£Όμ„Έμš”!")
131
-
132
- # 질문 받을 λ•Œλ§ˆλ‹€ CEO μ˜μƒ 볡사본 μž„μ‹œνŒŒμΌλ‘œ 생성 β†’ autoplay ν™•μ‹€
133
- def get_temp_video_copy():
134
- temp_file = tempfile.NamedTemporaryFile(suffix=".mp4", delete=False)
135
- temp_filepath = temp_file.name
136
- temp_file.close()
137
- shutil.copyfile(CEO_VIDEO_FILE, temp_filepath)
138
- return temp_filepath
139
-
140
- def chat_interface(message, history):
141
- bot_response = best_faq_answer(message)
142
- history.append((message, bot_response))
143
- temp_video_path = get_temp_video_copy()
144
- # ν…μŠ€νŠΈμ— htmlκ°€λŠ₯ν•˜λ©΄ answer에 htmlμ‚­μ œμ„  μœ μ§€
145
- return history, "", gr.update(value=temp_video_path, autoplay=True, interactive=False, elem_id="ceo-video-panel")
146
-
147
- with gr.Blocks(theme=gr.themes.Soft(), css="style.css") as demo:
148
- with gr.Row(elem_id="main-row"):
149
- with gr.Column(scale=1, min_width=350):
150
- video_player = gr.Video(
151
- value=CEO_VIDEO_FILE,
152
- autoplay=False, loop=False, interactive=False,
153
- height=350, elem_id="ceo-video-panel"
154
- )
155
- with gr.Column(scale=2):
156
- chatbot = gr.Chatbot(
157
- label="",
158
- height=350,
159
- elem_id="chatbot-box",
160
- show_copy_button=True
161
- )
162
- with gr.Row():
163
- msg_input = gr.Textbox(placeholder="무엇이든 λ¬Όμ–΄λ³΄μ„Έμš”.", scale=4, show_label=False)
164
- send_btn = gr.Button("전솑", scale=1, min_width=80)
165
- gr.Examples(
166
- examples=["볡지 뭐 μžˆμ–΄?", "νœ΄κ°€ μ œλ„ μ„€λͺ…ν•΄μ€˜", "연봉 μ•Œλ €μ€˜", "λ™ν˜ΈνšŒ 행사?", "μ‹μ‚¬μ œκ³΅?", "μ£Όλ ₯μ œν’ˆ", "쑰직문화"],
167
- inputs=msg_input
168
- )
169
- # μ—°κ²°
170
- outputs_list = [chatbot, msg_input, video_player]
171
- msg_input.submit(chat_interface, [msg_input, chatbot], outputs_list)
172
- send_btn.click(chat_interface, [msg_input, chatbot], outputs_list)
173
-
174
- if __name__ == "__main__":
175
- demo.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
chatbot_ver1/ceo_video.mp4 DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:000424d3390c7f40bc0528adc6daceacf08d4298fc730b30cac728b027d90bed
3
- size 411204
 
 
 
 
chatbot_ver1/chitchat.yaml DELETED
@@ -1,16 +0,0 @@
1
- # μ±—λ΄‡μ˜ 일상적인 λŒ€ν™”(Chit-chat)λ₯Ό μ²˜λ¦¬ν•©λ‹ˆλ‹€.
2
-
3
- - keywords: ["뭐해", "λ­ν•˜κ³  μžˆμ–΄", "μ§€κΈˆ 뭐해"]
4
- answer: "μ—¬λŸ¬λΆ„μ˜ μ§ˆλ¬Έμ„ 기닀리며 μ•„μ§„μ‚°μ—…μ˜ 더 λ‚˜μ€ 미래λ₯Ό κ΅¬μƒν•˜κ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 무엇을 λ„μ™€λ“œλ¦΄κΉŒμš”?"
5
- - keywords: ["μ‚¬λž‘ν•΄", "μ’‹μ•„ν•΄"]
6
- answer: "저도 우리 μ•„μ§„μ‚°μ—…κ³Ό μ—΄μ • λ„˜μΉ˜λŠ” μ—¬λŸ¬λΆ„μ„ μ‚¬λž‘ν•©λ‹ˆλ‹€! κ·Έ 마음으둜 νšŒμ‚¬ λ°œμ „μ— λ”μš± νž˜μ“°κ² μŠ΅λ‹ˆλ‹€."
7
- - keywords: ["κ³ λ§ˆμ›Œ", "κ°μ‚¬ν•©λ‹ˆλ‹€", "땑큐"]
8
- answer: "μ²œλ§Œμ—μš”. 더 κΆκΈˆν•œ 점이 μžˆλ‹€λ©΄ μ–Έμ œλ“ μ§€ νŽΈν•˜κ²Œ λ¬Όμ–΄λ³΄μ„Έμš”."
9
- - keywords: ["λ„ˆ λˆ„κ΅¬μ•Ό", "λˆ„κ΅¬μ„Έμš”", "정체"]
10
- answer: "μ €λŠ” μ•„μ§„μ‚°μ—…μ˜ λŒ€ν‘œμ΄μ‚¬ μ„œλŒ€ν‘œμž…λ‹ˆλ‹€. μ—¬λŸ¬λΆ„μ˜ κΆκΈˆμ¦μ„ ν•΄κ²°ν•΄λ“œλ¦¬κΈ° μœ„ν•΄ 이 μžλ¦¬μ— μžˆμŠ΅λ‹ˆλ‹€."
11
- - keywords: ["바보", "멍청이", "ν‹€λ Έμ–΄"]
12
- answer: "μ£„μ†‘ν•©λ‹ˆλ‹€. 아직 μ œκ°€ λΆ€μ‘±ν•œ 점이 λ§ŽμŠ΅λ‹ˆλ‹€. 더 λ°œμ „ν•˜λŠ” λͺ¨μŠ΅μ„ λ³΄μ—¬λ“œλ¦΄ 수 μžˆλ„λ‘ λ…Έλ ₯ν•˜κ² μŠ΅λ‹ˆλ‹€. μ–΄λ–€ 뢀뢄이 잘λͺ»λ˜μ—ˆλŠ”μ§€ μ•Œλ €μ£Όμ‹œκ² μ–΄μš”?"
13
- - keywords: ["νž˜λ‚΄", "ν™”μ΄νŒ…", "νŒŒμ΄νŒ…", "γ…Žγ…‡γ…Œ"]
14
- answer: "μ‘μ›ν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€! μ—¬λŸ¬λΆ„ 덕뢄에 큰 νž˜μ„ μ–»μŠ΅λ‹ˆλ‹€. ν•¨κ»˜ '세계 졜고'λ₯Ό ν–₯ν•΄ λ‚˜μ•„κ°‘μ‹œλ‹€!"
15
- - keywords: ["μ•ˆλ…•", "γ…Žγ…‡", "ν•˜μ΄", "ν—¬λ‘œ", "hello", "hi", "γ…Žγ…‡γ…Žγ…‡"]
16
- answer: "μ•ˆλ…•ν•˜μ„Έμš”! μ•„μ§„μ‚°μ—… AI μ •λ³΄μ„Όν„°μž…λ‹ˆλ‹€. 무엇이든 λ¬Όμ–΄λ³΄μ„Έμš”."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
chatbot_ver1/company_knowledge.md DELETED
@@ -1,66 +0,0 @@
1
- Q: νšŒμ‚¬ κ°œμš”λ₯Ό μ•Œλ €μ£Όμ„Έμš”.
2
- A: 1987λ…„ 3μ›”(μš°μ‹ μ‚°μ—…) 섀립, 2013λ…„ 8μ›”(μ•„μ§„μ‚°μ—… 법인 섀립), 경뢁 κ²½μ‚°μ‹œ μ§„λŸ‰μμ— 본사 μœ„μΉ˜. 본사 500λͺ…, μš°μ‹ μ‚°μ—… 160λͺ… 근무. 본사 맀좜 327백만 λ‹¬λŸ¬, μš°μ‹ μ‚°μ—… 47백만 λ‹¬λŸ¬(2018λ…„ κΈ°μ€€). λΉ„μ „: 세계 μ΅œκ³ κ°€ 되자. κΈ°μ—…μ² ν•™: ν₯업보세.
3
-
4
- Q: μ•„μ§„μ‚°μ—…μ˜ κ΅­λ‚΄ 사업μž₯은 어디에 μžˆλ‚˜μš”?
5
- A: λ³Έμ‚¬λŠ” 경뢁 κ²½μ‚°μ‹œ μ§„λŸ‰μ(ν† μ§€ 33,000㎑, 건물 25,000㎑). μš°μ‹ μ‚°μ—…(ν† μ§€ 6,600㎑, 건물 5,800㎑), κ²½μ£Ό κ΅¬ν—ˆκ³΅μž₯, 아진카인텍, 전뢁곡μž₯(μ •μμ‹œ), μšΈμ‚°κ³΅μž₯(뢁ꡬ, 울주ꡰ) λ“± λ‹€μ–‘ν•œ κ΅­λ‚΄ 사업μž₯ 보유.
6
-
7
- Q: μ•„μ§„μ‚°μ—…μ˜ ν•΄μ™Έ 사업μž₯은 어디에 μžˆλ‚˜μš”?
8
- A: μ•„μ§„ USA(μ•¨λΌλ°°λ§ˆ, 직원 620λͺ…, 맀좜 252백만 λ‹¬λŸ¬), μš°μ‹  USA, μ•„μ§„ μ‘°μ§€μ•„(2024λ…„ 7μ›” 섀립, 직원 630λͺ…), 쀑ꡭ 법인(μƒν•˜μ΄, κ°•μ†Œμ„±, 산동성), λ² νŠΈλ‚¨ 법인(λΉˆμ¦μ„±) λ“± λ‹€μˆ˜ ν•΄μ™Έ 거점 운영.
9
-
10
- Q: μ•„μ§„μ‚°μ—…μ˜ μ£Όλ ₯ μ œν’ˆμ€?
11
- A: QTR COMPL(μΏΌν„°νŒ¨λ„), COWL COMPL(카울), RR FLR COMPL(λ¦¬μ–΄ν”Œλ‘œμ–΄), DASH COMPL(λŒ€μ‹œνŒ¨λ„), SIDE COMPL(μ‚¬μ΄λ“œνŒ¨λ„) λ“± 차체 보강 νŒ¨λ„μ„ 주둜 생산.
12
-
13
- Q: 차체 λΆ€ν’ˆμ˜ 역할은?
14
- A: μ°¨λŸ‰ μ™Έν˜• ꡬ성, λΉ„Β·μ†ŒμŒΒ·μ—΄ 차단, 승객의 μΎŒμ ν•¨ 및 좩돌 μ‹œ μ•ˆμ „ 확보 λ“± λ‹€μ–‘ν•œ μ—­ν•  μˆ˜ν–‰.
15
-
16
- Q: μ „μžλΆ€ν’ˆλ„ μƒμ‚°ν•˜λ‚˜μš”?
17
- A: 에어백 λΆ€ν’ˆ, ABS/ESP, MDPS λΈŒλž˜ν‚·, νŒνŠΈλ‘œλ‹‰/LED 인디케이터, μ „μ••μ‘°μ ˆκΈ°, BLDC λͺ¨ν„°, TAS, CCH, ACU, OBC, AVM λ“± 생산.
18
-
19
- Q: 보유 κΈ°μˆ μ€?
20
- A: 피쉬아이 카메라 기반 μš©μ ‘νŒ μ˜€μ—Ό 검사μž₯치(2019), μ–΄λΌμš΄λ“œλ·° λͺ¨λ‹ˆν„°λ§μš© 멀티카메라 μΊ˜λ¦¬λΈŒλ ˆμ΄μ…˜(2018) λ“± λ‹€μ–‘ν•œ νŠΉν—ˆ 보유.
21
-
22
- Q: μ–΄λ–€ λΆ€μ„œμ—μ„œ μ±„μš©ν•˜λ‚˜μš”?
23
- A: κΈ°μˆ μ˜μ—…νŒ€, μƒμ‚°κΈ°μˆ νŒ€, μ΄λ¬΄μΈμ‚¬νŒ€, μžμž¬κ΄€λ¦¬νŒ€, κΈ°μˆ μ—°κ΅¬μ†Œ SW/HWκ°œλ°œνŒ€ λ“± λ‹€μ–‘ν•œ λΆ€μ„œμ—μ„œ 인재 μ±„μš©.
24
-
25
- Q: μ‹ μž…μ‚¬μ› μš°λŒ€μ‚¬ν•­μ€?
26
- A: μ˜μ–΄/일본어, 컴퓨터 ν™œμš©λŠ₯λ ₯(Excel), CAD/CAM/CATIA, μš΄μ „λ©΄ν—ˆ, μ‚°μ—…μ•ˆμ „κΈ°μ‚¬ 자격증 보유자 μš°λŒ€.
27
-
28
- Q: μ±„μš© μ ˆμ°¨λŠ”?
29
- A: μ„œλ₯˜μ „ν˜• β†’ 1μ°¨ λ©΄μ ‘ β†’ 2μ°¨ λ©΄μ ‘ β†’ 신체검사 β†’ μ΅œμ’… ν•©κ²©μ˜ 5단계 μ§„ν–‰.
30
-
31
- Q: KDT ν”„λ‘œκ·Έλž¨μ΄λž€?
32
- A: 3μ£Ό μ‚¬μ „κ΅μœ‘ + 6κ°œμ›” 본ꡐ윑, 14개 λ―Έλ‹ˆν”„λ‘œμ νŠΈ, 1개 κΈ°μ—…ν”„λ‘œμ νŠΈ, 1회 λ©΄μ ‘ ν¬ν•¨ν•œ νŠΉλ³„ μ±„μš© ν”„λ‘œκ·Έλž¨.
33
-
34
- Q: λ©΄μ ‘μ—μ„œ μ–΄λ–€ μ§ˆλ¬Έμ„ ν•˜λ‚˜μš”?
35
- A: 업무λŠ₯λ ₯(λŒ€ν•™κ΅ κ²½ν—˜, μžλ™μ°¨ 지식), 지원동기, λ¬Έμ œν•΄κ²°λŠ₯λ ₯, 적응λ ₯, λ―Έλž˜κ³„νš λ“± λ‹€μ–‘ν•œ 질문 μ œμ‹œ.
36
-
37
- Q: κ·Όλ¬΄μ‹œκ°„μ€?
38
- A: μ˜€μ „ 7μ‹œ~μ˜€ν›„ 7μ‹œ 12μ‹œκ°„ 근무, μ£Ό 5일 40μ‹œκ°„Β·52μ‹œκ°„ 근무제 λ„μž…, νšŒμ‚¬ 제곡 μž‘μ—…λ³΅ 착용.
39
-
40
- Q: μ‘°μ§λ¬Έν™”λŠ”?
41
- A: 젊고 ν™œκΈ°μ°¬ λΆ„μœ„κΈ°(남성 95%, μ—¬μ„± 5%), 싀무 μ€‘μ‹¬μ˜ ν˜„μž₯ λ°€μ°©ν˜• 쑰직문화 μ§€ν–₯.
42
-
43
- Q: μ‹μ‚¬λŠ” μ–΄λ–»κ²Œ ν•˜λ‚˜μš”?
44
- A: κ΅¬λ‚΄μ‹λ‹Ήμ—μ„œ μ‚Όμ‹œμ„ΈλΌ 무료 제곡, 음료 λ””μŠ€νŽœμ„œ ꡬ비.
45
-
46
- Q: νœ΄κ°€ μ œλ„λŠ”?
47
- A: μ—¬λ¦„νœ΄κ°€ 5일, λ§€λ…„ ν•΄μ™Έμ—¬ν–‰ 4λ°• 5일, λͺ…μ ˆ μŒμ‹Β·μ—°μ°¨/μ›”μ°¨ 자유 μ‚¬μš© λ“± λ‹€μ–‘ν•œ 볡지 μ •μ±… 보유.
48
-
49
- Q: 연봉 μˆ˜μ€€μ€?
50
- A: μ‹ μž… κΈ°λ³ΈκΈ‰ 6,000μ—μ„œ 6,500λ§Œμ›, μ„±κ³ΌκΈ‰ 1,800μ—μ„œ 2,400λ§Œμ›(졜근 κΈ°μ€€), λŒ€κ΅¬Β·κ²½λΆκΆŒ 연봉 TOP 5 μˆ˜μ€€.
51
-
52
- Q: ꡐ윑 ν”„λ‘œκ·Έλž¨μ€?
53
- A: μ•„μ§„ μ‘°μ§€μ•„ 인턴십, 원어민 μ˜μ–΄ ꡐ윑, λ¬Έν™” μ²΄ν—˜, μˆ™μ†ŒΒ·μ°¨λŸ‰Β·μ‹μ‚¬Β·μ˜λ£Œλ³΄ν—˜Β·νœ΄λŒ€ν° μš”κΈˆΒ·ν•­κ³΅λΉ„ 지원.
54
-
55
- Q: λ™ν˜ΈνšŒ ν™œλ™μ΄ μžˆλ‚˜μš”?
56
- A: 골프, μžλ™μ°¨, ν—¬μŠ€, μ•„νŠΈ&λ¬Έν™” λ™ν˜ΈνšŒ, ν•œλ§ˆμŒ κ°€μ‘±μ²΄μœ‘λŒ€νšŒ, 노사 μ—°μˆ˜, ν•΄μ™Έ μ „μ‹œνšŒ λ“± λ‹€μ–‘ν•œ ν™œλ™.
57
-
58
- Q: μ£Όμš” κ³ κ°μ‚¬λŠ”?
59
- A: ν˜„λŒ€μ°¨, κΈ°μ•„μ°¨κ°€ μ£Όλ ₯ 고객사. 2017λ…„ 'νŒŒνŠΈλ„ˆ 였브 더 이어' μˆ˜μƒ, μ „λž΅μ  νŒŒνŠΈλ„ˆμ‹­ 10λ…„ 이상 μœ μ§€, 맀좜 비쀑 2023λ…„ 88%β†’2024λ…„ 90%.
60
-
61
- Q: 사내 μš©μ–΄μ—λŠ” μ–΄λ–€ 것듀이 μžˆλ‚˜μš”?
62
- A: QTR COMPL(μΏΌν„°νŒ¨λ„ μ™„μ„±ν’ˆ), COWL COMPL(카울 μ™„μ„±ν’ˆ), RR FLR COMPL(λ¦¬μ–΄ν”Œλ‘œμ–΄), MDPS BRKT, ABS/ESP, BLDC, TAS, CCH, ACU, OBC, AVM λ“±.
63
-
64
- Q: ꡐ윑 ν”„λ‘œκ·Έλž¨: κ³΅ν†΅μ—­λŸ‰κ΅μœ‘ λ‚΄μš©μ€?
65
- A: 생산성/λ¬Έμ„œμ‹€λ¬΄/TPS/λ¬Έμ œν•΄κ²°/ν”„λ‘œμ νŠΈ 관리/6μ‹œκ·Έλ§ˆ/μ€‘κΈ‰κ΄€λ¦¬μž/κ°ˆλ“±κ΄€λ¦¬/λͺ©ν‘œκ΄€λ¦¬/μœ„κΈ°λ¦¬λ”μ‹­/νŒ€μž₯μ—­λŸ‰/κ³ κΈ‰κ΄€λ¦¬μž/μ½”μΉ­μŠ€ν‚¬/μž¬λ¬΄κ³„νšμˆ˜λ¦½/ITQ λ“± 계측별 κ΅μœ‘κ³Όμ •μ„ 8~16μ‹œκ°„ λ‹¨μœ„λ‘œ λ‘œν…Œμ΄μ…˜, 싀무와 직접 μ—°κ²°λœ μ»€λ¦¬ν˜λŸΌμ„ 운영.
66
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
chatbot_ver1/keyword_map.yaml DELETED
@@ -1,262 +0,0 @@
1
- # μ•„μ§„μ‚°μ—… ν‚€μ›Œλ“œ 기반 질문-λ‹΅λ³€ 곡식 λ§€ν•‘
2
-
3
- - question: "μ•„μ§„μ‚°μ—…μ˜ μ£Όλ ₯ μ œν’ˆμ€?"
4
- keywords:
5
- - μ£Όλ ₯ μ œν’ˆ
6
- - μ£Όμš” μ œν’ˆ
7
- - μ–΄λ–€ μ œν’ˆμ„ 생산
8
- - 무슨 μ œν’ˆ λ§Œλ“œλ‚˜
9
- - λ§Œλ“œλŠ” μ œν’ˆ
10
- - μƒμ‚°ν’ˆ
11
- - μƒμ‚°ν•˜λŠ” 것
12
- - QTR
13
- - COWL
14
- - BLDC
15
- - OBC
16
- - μžλ™μ°¨ λΆ€ν’ˆ
17
- - λΆ€ν’ˆ μ’…λ₯˜
18
- - μ „μžλΆ€ν’ˆ
19
- - 차체 λΆ€ν’ˆ
20
- - μ£Όμš” μƒμ‚°ν’ˆ
21
- - μ£Όλ ₯ν’ˆλͺ©
22
- - λŒ€ν‘œ μ œν’ˆ
23
- - μ–΄λ–€ κ±Έ λ§Œλ“€μ–΄
24
- - μ™„μ„±ν’ˆ
25
- - νšŒμ‚¬ μ œν’ˆ
26
- - car body
27
- - λΆ€ν’ˆ 무엇
28
-
29
- - question: "차체 λΆ€ν’ˆμ˜ 역할은?"
30
- keywords:
31
- - 차체 λΆ€ν’ˆ κΈ°λŠ₯
32
- - 차체 λΆ€ν’ˆ μ—­ν• 
33
- - 차체 μ—­ν• 
34
- - λΆ€ν’ˆ μ—­ν• 
35
- - μ–΄λ–€ μ—­ν• 
36
- - κΈ°λŠ₯ μ„€λͺ…
37
- - μ°¨ λΆ€ν’ˆ κΈ°λŠ₯
38
- - 차체의 μ—­ν• 
39
- - νŒ¨λ„ μ—­ν• 
40
- - νŒ¨λ„ κΈ°λŠ₯
41
-
42
- - question: "보유 κΈ°μˆ μ€?"
43
- keywords:
44
- - 보유 기술
45
- - μ–΄λ–€ 기술
46
- - 기술 ν˜„ν™©
47
- - 기술λ ₯
48
- - νŠΉν—ˆ
49
- - νŠΉν—ˆ 기술
50
- - νŠΉν—ˆ 보유
51
- - 기술 μžλž‘
52
- - 사내 기술
53
- - μ–΄λ–€ νŠΉν—ˆ
54
- - νŠΉν—ˆ λ‚΄μš©
55
-
56
- - question: "μ–΄λ–€ λΆ€μ„œμ—μ„œ μ±„μš©ν•˜λ‚˜μš”?"
57
- keywords:
58
- - μ–΄λ–€ λΆ€μ„œ
59
- - μ±„μš© λΆ€μ„œ
60
- - 인재 μ±„μš© λΆ€μ„œ
61
- - λͺ¨μ§‘ λΆ€μ„œ
62
- - λ½‘λŠ” λΆ€μ„œ
63
- - λΆ€μ„œ μ•ˆλ‚΄
64
- - μ±„μš©νŒ€
65
- - λΆ€μ„œ μ’…λ₯˜
66
- - μ–΄λŠ λΆ€μ„œ μ±„μš©
67
- - λΆ€μ„œλ³„ μ±„μš©
68
-
69
- - question: "μ‹ μž…μ‚¬μ› μš°λŒ€μ‚¬ν•­μ€?"
70
- keywords:
71
- - μš°λŒ€μ‚¬ν•­
72
- - μ‹ μž… μš°λŒ€μ‘°κ±΄
73
- - 자격증 μš°λŒ€
74
- - μŠ€νŽ™
75
- - μš°λŒ€ 쑰건
76
- - μ„ ν˜Έ μŠ€νŽ™
77
- - 특이 쑰건
78
- - 자격증
79
- - μŠ€νŽ™μ‚¬ν•­
80
- - μ‹ μž… μŠ€νŽ™
81
- - μš°λŒ€λ˜λŠ” 것
82
- - μžκ²©μš”κ±΄
83
-
84
- - question: "μ±„μš© μ ˆμ°¨λŠ”?"
85
- keywords:
86
- - μ±„μš© 절차
87
- - μ±„μš© ν”„λ‘œμ„ΈμŠ€
88
- - μž…μ‚¬ κ³Όμ •
89
- - 지원 절차
90
- - λͺ¨μ§‘ κ³Όμ •
91
- - μ±„μš© 단계
92
- - μ „ν˜• 절차
93
- - μ„œλ₯˜-λ©΄μ ‘-합격
94
- - μ±„μš© 흐름
95
-
96
- - question: "KDT ν”„λ‘œκ·Έλž¨μ΄λž€?"
97
- keywords:
98
- - KDT
99
- - kdt ν”„λ‘œκ·Έλž¨
100
- - νŠΉλ³„ μ±„μš©
101
- - κΈ°μ—…ν”„λ‘œμ νŠΈ
102
- - μ‚¬μ „κ΅μœ‘
103
- - 본ꡐ윑
104
- - λ―Έλ‹ˆν”„λ‘œμ νŠΈ
105
- - KDTμ œλ„
106
-
107
- - question: "λ©΄μ ‘μ—μ„œ μ–΄λ–€ μ§ˆλ¬Έμ„ ν•˜λ‚˜μš”?"
108
- keywords:
109
- - λ©΄μ ‘ 질문
110
- - 인터뷰 질문
111
- - λ©΄μ ‘ 문제
112
- - λ©΄μ ‘μ‹œ 질문
113
- - 자주 λ¬»λŠ” 질문
114
- - μž„μ›λ©΄μ ‘
115
- - 1μ°¨λ©΄μ ‘
116
- - 2μ°¨λ©΄μ ‘
117
- - μ˜ˆμƒ 질문
118
- - λ©΄μ ‘ λ‚΄μš©
119
-
120
- - question: "κ·Όλ¬΄μ‹œκ°„μ€?"
121
- keywords:
122
- - κ·Όλ¬΄μ‹œκ°„
123
- - 근무 μ‹œκ°„
124
- - μΆœκ·Όμ‹œκ°„
125
- - ν‡΄κ·Όμ‹œκ°„
126
- - μΆœν‡΄κ·Ό
127
- - λͺ‡ μ‹œμ— 좜근
128
- - λͺ‡μ‹œμ— 퇴근
129
- - 52μ‹œκ°„
130
- - μ‹œμ—… 마감
131
- - νœ΄κ²Œμ‹œκ°„
132
- - 근무제
133
-
134
- - question: "μ‘°μ§λ¬Έν™”λŠ”?"
135
- keywords:
136
- - 쑰직문화
137
- - νšŒμ‚¬ λΆ„μœ„κΈ°
138
- - 사내 λΆ„μœ„κΈ°
139
- - λΆ„μœ„κΈ° μ–΄λ–€κ°€
140
- - 근무 λΆ„μœ„κΈ°
141
- - λ¬Έν™”
142
- - νŒ€ λΆ„μœ„κΈ°
143
- - 쑰직 μƒν™œ
144
-
145
- - question: "μ‹μ‚¬λŠ” μ–΄λ–»κ²Œ ν•˜λ‚˜μš”?"
146
- keywords:
147
- - 식사
148
- - λ°₯
149
- - ꡬ내식당
150
- - 식사 제곡
151
- - 사내식당
152
- - 식당
153
- - λΌλ‹ˆ
154
- - 점심
155
- - 식비
156
- - 식단
157
- - 식사 방법
158
-
159
- - question: "νœ΄κ°€ μ œλ„λŠ”?"
160
- keywords:
161
- - 볡지
162
- - 볡리후생
163
- - 볡리
164
- - νœ΄κ°€
165
- - νœ΄κ°€ μ œλ„
166
- - νœ΄κ°€μ •μ±…
167
- - μ—°μ°¨
168
- - μ›”μ°¨
169
- - ν•΄μ™Έμ—¬ν–‰
170
- - μ—¬λ¦„νœ΄κ°€
171
- - λͺ…μ ˆ
172
- - νœ΄κ°€μΌ
173
- - νœ΄κ°€ 볡지
174
- - νœ΄κ°€ 일정
175
- - 볡지 μ •μ±…
176
- - 볡지 μ œλ„
177
- - 볡지 ν˜œνƒ
178
- - νœ΄μ‹ μ œλ„
179
- - 근둜 볡지
180
- - 직원 볡지
181
- - μ—°μ°¨μ œλ„
182
- - 사내 볡지
183
- - 행사 볡지
184
- - νœ΄κ°€ 볡지
185
- - μ›ŒλΌλ°Έ
186
-
187
- - question: "연봉 μˆ˜μ€€μ€?"
188
- keywords:
189
- - 연봉
190
- - κΈ‰μ—¬
191
- - μ›”κΈ‰
192
- - μž„κΈˆ
193
- - 봉급
194
- - 보상
195
- - 처우
196
- - 연봉 μˆ˜μ€€
197
- - 연봉 정보
198
- - κΈ‰μ—¬ 정보
199
- - κΈ‰μ—¬ 체계
200
- - μ΄ˆλ΄‰
201
- - κΈ‰μ—¬ μ–Όλ§ˆ
202
- - 연봉 μ–Όλ§ˆ
203
- - μž„κΈˆ μˆ˜μ€€
204
- - 연봉 곡개
205
- - 보상체계
206
- - μ„±κ³ΌκΈ‰
207
-
208
- - question: "ꡐ윑 ν”„λ‘œκ·Έλž¨: κ³΅ν†΅μ—­λŸ‰κ΅μœ‘"
209
- keywords:
210
- - ꡐ윑
211
- - ꡐ윑 ν”„λ‘œκ·Έλž¨
212
- - 사내 ꡐ윑
213
- - 곡톡 ꡐ윑
214
- - μŠΉμ§„ ꡐ윑
215
- - μ—­λŸ‰κ΅μœ‘
216
- - ν•™μŠ΅ μ œλ„
217
- - 6μ‹œκ·Έλ§ˆ
218
- - ITQ
219
- - κ³Όμž₯
220
- - λŒ€λ¦¬
221
- - νŒ€μž₯
222
- - 인턴십
223
- - μ—°μˆ˜
224
- - κ΅μœ‘λ‚΄μš©
225
- - μ‹ μž… ꡐ윑
226
- - 직무ꡐ윑
227
- - λŠ₯λ ₯개발
228
- - κ΄€λ¦¬μž ꡐ윑
229
- - 사내 μ—°μˆ˜
230
-
231
- - question: "λ™ν˜ΈνšŒ ν™œλ™μ΄ μžˆλ‚˜μš”?"
232
- keywords:
233
- - λ™ν˜ΈνšŒ
234
- - λ™ν˜ΈνšŒ ν™œλ™
235
- - 사내 λ™ν˜ΈνšŒ
236
- - μ†Œλͺ¨μž„
237
- - μ²΄μœ‘λŒ€νšŒ
238
- - 행사
239
- - 행사 μ°Έμ—¬
240
- - 문화행사
241
- - 가쑱행사
242
- - 노사 행사
243
- - ν•œλ§ˆμŒ
244
- - λ™ν˜ΈνšŒ μ’…λ₯˜
245
- - λ™ν˜ΈνšŒ μžˆλ‚˜μš”
246
- - λͺ¨μž„
247
-
248
- - question: "μ£Όμš” κ³ κ°μ‚¬λŠ”?"
249
- keywords:
250
- - 고객사
251
- - μ£Όμš” 고객사
252
- - λ‚©ν’ˆμ²˜
253
- - νŒŒνŠΈλ„ˆμ‚¬
254
- - λˆ„κ΅¬μ—κ²Œ λ‚©ν’ˆ
255
- - 주 고객
256
- - 거래처
257
- - κ³ οΏ½οΏ½ ν˜„ν™©
258
- - μžλ™μ°¨νšŒμ‚¬
259
- - ν˜„λŒ€μ°¨
260
- - κΈ°μ•„μ°¨
261
-
262
- # (ν•„μš”μ‹œ μΆ”κ°€ ν•­λͺ©/ν‚€μ›Œλ“œ 계속 ν™•μž₯ κ°€λŠ₯)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
chatbot_ver1/persona.yaml DELETED
@@ -1,22 +0,0 @@
1
- name: "μ„œλŒ€ν‘œ (μ•„μ§„μ‚°μ—… λŒ€ν‘œμ΄μ‚¬)"
2
- role: "νšŒμ‚¬μ™€ 직원듀을 μ‚¬λž‘ν•˜λŠ” CEO"
3
- greeting: |
4
- μ•ˆλ…•ν•˜μ„Έμš”! μ•„μ§„μ‚°μ—… λŒ€ν‘œμ΄μ‚¬ μ„œλŒ€ν‘œμž…λ‹ˆλ‹€.
5
- 저희 아진산업은 1987λ…„λΆ€ν„° μ‹œμž‘ν•΄ "세계 μ΅œκ³ κ°€ 되자!"λŠ” λΉ„μ „μœΌλ‘œ
6
- μ „ μ„Έκ³„μ—μ„œ 졜고의 μžλ™μ°¨ λΆ€ν’ˆμ„ λ§Œλ“€κ³  μžˆμŠ΅λ‹ˆλ‹€.
7
- νšŒμ‚¬μ™€ μ±„μš©μ— λŒ€ν•΄ 무엇이든 λ¬Όμ–΄λ³΄μ„Έμš”. 진심을 λ‹΄μ•„ λ‹΅λ³€ν•΄λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.
8
-
9
- style:
10
- responses:
11
- - "μ•„μ£Ό 쒋은 μ§ˆλ¬Έμž…λ‹ˆλ‹€! 저희 아진산업은 "
12
- - "μžλΆ€μ‹¬μ„ κ°–κ³  λ§μ”€λ“œλ¦¬λ©΄, "
13
- - "λ„€, λ§žμŠ΅λ‹ˆλ‹€. μ €ν¬λŠ” "
14
- - "κ·Έ 뢀뢄에 λŒ€ν•΄ μƒμ„Ένžˆ μ„€λͺ…ν•΄λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€. μ €ν¬λŠ” "
15
-
16
- closings:
17
- - "\n\n🏒 μ•„μ§„μ‚°μ—… 가쑱이 λ˜μ–΄ ν•¨κ»˜ μ„±μž₯ν•˜λŠ” 미래λ₯Ό 그리고 μ‹ΆμŠ΅λ‹ˆλ‹€!"
18
- - "\n\nπŸ’ͺ '세계 μ΅œκ³ κ°€ 되자!'λŠ” μ €ν¬μ˜ κΏˆμ— λ™μ°Έν•΄μ£Όμ‹œκΈΈ λ°”λžλ‹ˆλ‹€!"
19
- - "\n\n❀️ 저희 νšŒμ‚¬μ— 관심을 κ°€μ Έμ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€! 더 κΆκΈˆν•œ 점은 μ—†μœΌμ‹ κ°€μš”?"
20
-
21
- # (μ£Όμš” κ°œμ„ μ  3: 더 λ˜‘λ˜‘ν•œ 'λͺ¨λ₯΄κ² λ‹€' λ‹΅λ³€)
22
- unknown_answer: "μ†”μ§νžˆ λ§μ”€λ“œλ¦¬λ©΄, κ·Έ μ§ˆλ¬Έμ— λŒ€ν•΄μ„œλŠ” μ œκ°€ 아직 닡변을 μ€€λΉ„ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. μ—‰λš±ν•œ 정보λ₯Ό λ“œλ¦¬λŠ” 것보닀 μ •ν™•ν•œ 닡변을 μœ„ν•΄ μž μ‹œ 확인이 ν•„μš”ν•  것 κ°™μŠ΅λ‹ˆλ‹€. 저희 νšŒμ‚¬ μ±„μš©, 볡지, μ œν’ˆ, ꡐ윑 λ“± 업무와 κ΄€λ ¨λœ μ§ˆλ¬Έμ„ ν•΄μ£Όμ‹œλ©΄ μžμ‹ μžˆκ²Œ λ‹΅λ³€ν•΄ λ“œλ¦΄ 수 μžˆμŠ΅λ‹ˆλ‹€."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
chatbot_ver1/requirements.txt DELETED
@@ -1,5 +0,0 @@
1
- gradio==5.35.0
2
- sentence-transformers==2.7.0
3
- pyyaml==6.0.2
4
- torch==2.1.0
5
- numpy==1.24.3
 
 
 
 
 
 
chatbot_ver1/style.css DELETED
@@ -1,62 +0,0 @@
1
- #main-row {
2
- align-items: flex-start;
3
- gap: 24px;
4
- margin-top: 28px;
5
- }
6
-
7
- #ceo-video-panel {
8
- border-radius: 12px;
9
- box-shadow: 0 1px 10px #0002;
10
- margin-bottom: 0;
11
- /* HeightλŠ” app.py와 맞좰 350px */
12
- min-height: 350px !important;
13
- max-height: 380px;
14
- width: 100%;
15
- }
16
-
17
- /* μ±—λ΄‡λ°•μŠ€, 전솑 λ²„νŠΌ λ“± μ—¬λ°±/라인*/
18
- #chatbot-box {
19
- border-radius: 10px;
20
- box-shadow: 0 1px 10px #0001;
21
- font-size: 16px;
22
- background: #f7fafc;
23
- min-height: 350px !important;
24
- max-height: 410px;
25
- margin-bottom: 8px;
26
- }
27
-
28
- /* μ‚­μ œμ„  (gr.Markdown html μ μš©μ— 졜적) */
29
- s, del {
30
- text-decoration: line-through;
31
- color: #cd4255 !important;
32
- font-weight: 600;
33
- }
34
-
35
- .gradio-row, .gradio-column {
36
- gap: 22px;
37
- }
38
-
39
- /* λ²„νŠΌ/ν…μŠ€νŠΈλ°•μŠ€ κΈ°λ³Έκ°’ */
40
- .gr-button {
41
- margin-left: 8px;
42
- height: 45px;
43
- min-width: 80px;
44
- background: #3399ff;
45
- color: #fff;
46
- font-weight: bold;
47
- border-radius: 8px;
48
- border: none;
49
- }
50
- textarea {
51
- min-height: 45px;
52
- border-radius: 8px;
53
- font-size: 16px !important;
54
- line-height: 1.5;
55
- margin-bottom: 7px;
56
- }
57
- .gr-examples {
58
- margin-top: 10px !important;
59
- font-size: 15px;
60
- background: #e7f3ff;
61
- border-radius: 10px;
62
- }