Spaces:
Sleeping
Sleeping
Delete chatbot_ver1
Browse files- chatbot_ver1/LICENSE +0 -121
- chatbot_ver1/README.md +0 -1
- chatbot_ver1/app.py +0 -175
- chatbot_ver1/app1.py +0 -175
- chatbot_ver1/ceo_video.mp4 +0 -3
- chatbot_ver1/chitchat.yaml +0 -16
- chatbot_ver1/company_knowledge.md +0 -66
- chatbot_ver1/keyword_map.yaml +0 -262
- chatbot_ver1/persona.yaml +0 -22
- chatbot_ver1/requirements.txt +0 -5
- chatbot_ver1/style.css +0 -62
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 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|