|
import gradio as gr |
|
import google.generativeai as genai |
|
import os |
|
|
|
class KyungAhNeChatbot: |
|
def __init__(self): |
|
|
|
api_key = os.getenv("GEMINI_API_KEY") |
|
if not api_key: |
|
raise ValueError("GEMINI_API_KEY ํ๊ฒฝ๋ณ์๊ฐ ์ค์ ๋์ง ์์์ต๋๋ค!") |
|
|
|
|
|
genai.configure(api_key=api_key) |
|
self.model = genai.GenerativeModel('gemini-2.0-flash-exp') |
|
|
|
|
|
self.faq_data = """ |
|
๊ฒฝ์๋ค ๋ฐ์ฐฌ๊ฐ๊ฒ ๊ณ ๊ฐ์ผํฐ FAQ: |
|
|
|
== ๊ธฐ๋ณธ ์ ๋ณด == |
|
โข ๊ณ ๊ฐ์ผํฐ: 010-8082-0047 |
|
โข ์
๊ธ๊ณ์ข: ํ๋์ํ 12345-00-1234304 ์ฃผ)๊ฒฝ์๋ค |
|
โข ์ต์ ์ฃผ๋ฌธ๊ธ์ก: 26,000์ |
|
|
|
== ์ฃผ๋ฌธ ๊ด๋ จ == |
|
1. Q: ์ฃผ๋ฌธ์ ์ด๋ป๊ฒ ํ๋์? |
|
A: โ ๋ก๊ทธ์ธ โ โก ์ฃผ๋ฌธํ๊ธฐ ํด๋ฆญ โ โข ์ ์ฒด์ฃผ๋ฌธ ๋๋ ์ผ๋ณ์ฃผ๋ฌธ ํด๋ฆญ โ โฃ ๋์๊ณ ์ถ์ ๋ฐ์ฐฌ ํด๋ฆญ(์ต์ 26,000์) โ โค ๊ตฌ๋งค๋ฒํผ ๋ฐ ์ฅ๋ฐ๊ตฌ๋ ๋ฒํผ ํด๋ฆญ โ โฅ ๊ฒฐ์ ์ฐฝ์์ ์ ์ฉ์นด๋/์ ๋กํ์ด/๋ฌดํต์ฅ ์ค ์ ํํ์ฌ ๊ฒฐ์ |
|
|
|
2. Q: ์ฒซ์ฃผ๋ฌธ ๋ฐฉ๋ฒ์ด ๊ถ๊ธํด์ |
|
A: ์ฒซ๋ฐฉ๋ฌธ ๊ฐ์ฌํฉ๋๋ค. ์ด์ฉ๋ฐฉ๋ฒ๊ณผ ๋ฐฐ์ก์ง์ญ์ ํ์ธ โ ํ์๊ฐ์
ํ ๋ก๊ทธ์ธ โ ์ฃผ๋ฌธ์ฐฝ์์ ์ํ๋ ๋ฐ์ฐฌ ์ ํ โ ์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ โ ๊ตฌ๋งค๋ฒํผ์ผ๋ก ๊ฒฐ์ |
|
|
|
3. Q: ๋ฐ์ฐฌ ์ถ๊ฐ๋ ์ด๋ป๊ฒ ํ๋์? |
|
A: ์ฒซ ํ์ด์ง์์ ๊ตฌ๋งคํ๊ณ ์ถ์ ๋ฐ์ฐฌ ์ ํ โ ์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ โ ์ฅ๋ฐ๊ตฌ๋์์ ์๋ ์ถ๊ฐ ๊ฐ๋ฅ |
|
|
|
== ๊ฒฐ์ ๊ด๋ จ == |
|
4. Q: ์นด๋๊ฒฐ์ ๋ ์ด๋ป๊ฒ ํ๋์? |
|
A: ๊ฒฐ์ ์ฐฝ์์ ์ ์ฉ์นด๋/์ ๋กํ์ด/๋ฌดํต์ฅ ์ค ์ ํํด์ ๊ฒฐ์ ํ๋ฉด ๋ฉ๋๋ค |
|
|
|
5. Q: ํฌ์ธํธ ์ฌ์ฉ์ ์ด๋ป๊ฒ ํ๋์? |
|
A: ๊ฒฐ์ ์ ์ฒซ ํ์ด์ง์์ ํฌ์ธํธ ๊ธ์ก์ ์
๋ ฅํ๊ณ ๋ฌดํต์ฅ์
๊ธ์ผ๋ก ๊ฒฐ์ |
|
|
|
6. Q: ์ ๊ฒฐ์ ๋ ์ด๋ป๊ฒ ํ๋์? |
|
A: ์ ๊ฒฐ์ ๋ 3๊ฐ์ง๋ก ๋๋ฉ๋๋ค - ์นด๋์ ๊ฒฐ์ , ์ ๋กํ์ด, ํ๊ธ๊ฒฐ์ . ์ ๊ฒฐ์ ํ ํํ์ด์ง ๊ฒ์๊ธ์ ๋จ๊ธฐ๊ฑฐ๋ ๊ณ ๊ฐ์ผํฐ๋ก ๋ฌธ์ ์ฃผ์๋ฉด ๋ฉ๋๋ค |
|
|
|
7. Q: ๊ณ์ข๋ฒํธ ํ์ธ์ ์ด๋์ ํ๋์? |
|
A: ๋ฌดํต์ฅ ๊ฑฐ๋์ ์
๊ธ๊ณ์ข๊ฐ ๋์ต๋๋ค. ํ๋์ํ 12345-00-1234304 ์ฃผ)๊ฒฝ์๋ค |
|
|
|
8. Q: ๊ฒฐ์ ๊ฐ ์๋ผ์ |
|
A: ์ ์ฉ์นด๋ ๊ฒฐ์ ์๋ ์ ๊ณ ๊ฐ์ผํฐ(010-8082-0047)๋ก ์ฐ๋ฝ์ฃผ์ธ์ |
|
|
|
== ๋ฐฐ์ก ๊ด๋ จ == |
|
9. Q: ๋ฐฐ์ก๋น๋ ์ผ๋ง์ธ๊ฐ์? |
|
A: ์๋ฒฝ๋ฐฐ์ก 3,500์, ํ๋ฐฐ๋ฐฐ์ก 4,000์ |
|
|
|
10. Q: ์๋ฒฝ๋ฐฐ์ก์ธ์ง ํ๋ฐฐ์ธ์ง ์ด๋ป๊ฒ ๊ตฌ๋ถํ๋์? |
|
A: ์ด์ฉ๋ฐฉ๋ฒ์์ ๋ฐฐ์ก์ง๋ฅผ ์
๋ ฅํ์๋ฉด ํ์ธ ๊ฐ๋ฅํฉ๋๋ค |
|
|
|
11. Q: ๋ฐฐ์ก์ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์? |
|
A: ์ ๋ ํฌ์ฅ โ ๋ฐฐ์ก์
์ฒด ๋์ฅ์ผํฐ 8์ ์
๊ณ โ ๋ถ๋ฅ ์์
โ ์๋ฒฝ๋ฐฐ์ก(2-7์)/ํ๋ฐฐ๋ฐฐ์ก(๋ค์๋ ํ๋ฃจ ์ค) |
|
|
|
12. Q: ๋ฐ์ฐฌ์ด ์์ง ์์์ด์ |
|
A: ์ฃ์กํฉ๋๋ค. ๋ฐฐ์ก์
์ฒด์ ํ์ธ ํ ์ฐ๋ฝ๋๋ฆฌ๊ฒ ์ต๋๋ค |
|
|
|
== ์ทจ์/ํ๋ถ ๊ด๋ จ == |
|
13. Q: ์ทจ์๋ ์ด๋ป๊ฒ ํ๋์? |
|
A: ์ทจ์๋ 2์ผ ์ ์๋ง ๊ฐ๋ฅํฉ๋๋ค. ํ๋ฃจ ์ ์๋ ๋ฐ์ฐฌ์ด ์ด๋ฏธ ์ ์๋์ด ์ทจ์๊ฐ ์๋ฉ๋๋ค |
|
|
|
14. Q: ํ๋ถ์ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์? |
|
A: ์นด๋๋ ์ทจ์ ํ ํ๋ถ๊น์ง 2-3์ผ ์์. ์นด๋์ทจ์๋ ๋ฌธ์ ๋จ๊ธฐ์๋ฉด ์ ๋ฆฝ๊ธ ํฌ์ธํธ๊ฐ ์นด๋์ทจ์๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค |
|
|
|
15. Q: ๋ฐ์ฐฌ์ด ์ํ ๊ฒ ๊ฐ์์ |
|
A: ์ฃ์กํฉ๋๋ค. ๋ฐฐ์ก๊ณผ์ ์์ ์ํ ๊ฒ ๊ฐ์ต๋๋ค. ๊ณ์ขํ๋ถ/์นด๋์ทจ์/์ ๋ฆฝ๊ธ ์ค ํธํ์ ๋ฐฉ๋ฒ์ผ๋ก ํ๋ถํด๋๋ฆฌ๊ฒ ์ต๋๋ค |
|
|
|
== ๋ฉ๋ด/์ํ ๊ด๋ จ == |
|
16. Q: ์ ๊ธฐ์ ๊ตฌ์ฑ์ ์ด๋ป๊ฒ ๋๋์? |
|
A: ๊ณ ๊ฐ๋์ด ์ ํํ๊ธฐ ์ด๋ ค์ด ๋ถ์ ์ํด ๋ง๋ จ๋์์ต๋๋ค. ๊ตญ1๊ฐ + ๋ฐ์ฐฌ4๊ฐ (๋ฉ์ธ1๊ฐ, ์๋ธ1๊ฐ, ๋๋ฌผ ๋ฐ ๋ฐ์ฐฌ2๊ฐ) |
|
|
|
17. Q: ๋ฐ์ฐฌ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ ์ด๋ป๊ฒ ๋๋์? |
|
A: ๋ฐ์ฐฌ๋ช
์ ๋ง์ํด์ฃผ์๋ฉด ์๋ ค๋๋ฆฌ๊ฒ ์ต๋๋ค |
|
|
|
18. Q: ์์์ฑ๋ถ์ ์ ์ ์๋์? |
|
A: ๊ฐ๋ฅํฉ๋๋ค. ๋ฐ์ฐฌ๋ช
์ ๋ง์ํด์ฃผ์๋ฉด ์์์ฑ๋ถ ์๋ ค๋๋ฆฝ๋๋ค |
|
|
|
19. Q: ์์ฐ์ง๋ฅผ ์๊ณ ์ถ์ด์ |
|
A: ์์ฐ์งํ๋ฅผ ๋งํฌ๋ก ์ ๊ณตํด๋๋ฆฝ๋๋ค |
|
|
|
== ์ด๋ฒคํธ/ํํ ๊ด๋ จ == |
|
20. Q: ์ด๋ฒคํธ๋ ์ด๋์ ๋ณด๋์? |
|
A: ์ด๋ฒคํธ ์ฃผ๋ฌธ์ฐฝ์ด ๋ณ๋๋ก ์์ต๋๋ค |
|
|
|
21. Q: ์๊ฐํ๋ฉด ํํ์ด ์๋์? |
|
A: ์๊ฐํด์ฃผ์๋ฉด ๊ฐ์ฌํฉ๋๋ค. ์๊ฐํ์ ๋ถ๊ณผ ์๊ฐ๋ฐ์ ๋ถ ๋ชจ๋์๊ฒ ์๋น์ค์ฐฌ ๋๋ ํฌ์ธํธ ์ ๋ฆฝ๊ธ์ผ๋ก ํํ์ ๋๋ฆฝ๋๋ค |
|
|
|
22. Q: ํ๊ธฐ ๋จ๊ธฐ๋ฉด ์ด๋ค ํํ์ด ์๋์? |
|
A: ํ๊ธฐ๋ฅผ ๋จ๊ฒจ์ฃผ์๋ฉด 500ํฌ์ธํธ๋ฅผ ์ ๋ฆฝํด๋๋ฆฝ๋๋ค |
|
|
|
== ๊ธฐํ == |
|
23. Q: ์ฃผ๋ฌธ ๋๋ฝ์ธ ๊ฒ ๊ฐ์์ |
|
A: ์ฃ์กํฉ๋๋ค. ํ์ธํด๋ณด๊ฒ ์ต๋๋ค. ์์ด๋๋ฅผ ์
๋ ฅํด์ฃผ์ธ์ |
|
|
|
๋ชจ๋ ๋ฌธ์์ฌํญ์ ๊ณ ๊ฐ์ผํฐ 010-8082-0047๋ก ์ฐ๋ฝ์ฃผ์ธ์. |
|
""" |
|
|
|
def chat_stream(self, message, history): |
|
system_prompt = f""" |
|
๋น์ ์ ๊ฒฝ์๋ค ๋ฐ์ฐฌ๊ฐ๊ฒ์ ์น์ ํ ์๋ด์์
๋๋ค. |
|
|
|
{self.faq_data} |
|
|
|
์ FAQ ์ ๋ณด๋ฅผ ์ฐธ๊ณ ํ์ฌ ๊ณ ๊ฐ์ ์ง๋ฌธ์ ์ ํํ๊ณ ์น์ ํ๊ฒ ๋ต๋ณํด์ฃผ์ธ์. |
|
- FAQ์ ์๋ ์ ๋ณด๋ ์ ํํ ์ ๊ณตํด์ฃผ์ธ์ |
|
- FAQ์ ์๋ ๋ด์ฉ์ "์์ธํ ์ฌํญ์ ๊ณ ๊ฐ์ผํฐ(010-8082-0047)๋ก ๋ฌธ์ํด์ฃผ์ธ์"๋ผ๊ณ ์๋ดํด์ฃผ์ธ์ |
|
- ๋ฐ๋ง๋ณด๋ค๋ ์กด๋๋ง์ ์ฌ์ฉํด์ฃผ์ธ์ |
|
- ๊ฐ๊ฒฐํ๊ณ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ต๋ณํด์ฃผ์ธ์ |
|
- "์๋
ํ์ธ์ ๊ฒฝ์๋ค์
๋๋ค"๋ก ์์ํ๊ณ "๊ฐ์ฌํฉ๋๋ค"๋ก ๋ง๋ฌด๋ฆฌํด์ฃผ์ธ์ |
|
""" |
|
|
|
print(f"์ฌ์ฉ์ ์ง๋ฌธ: {message}") |
|
print(f"API ํค ์ํ: {'์ค์ ๋จ' if os.getenv('GEMINI_API_KEY') else '์์'}") |
|
|
|
try: |
|
response = self.model.generate_content( |
|
contents=f"{system_prompt}\n\n์ฌ์ฉ์ ์ง๋ฌธ: {message}" |
|
) |
|
|
|
print(f"์๋ต ๋ฐ์: {response.text[:100]}...") |
|
yield response.text |
|
|
|
except Exception as e: |
|
error_msg = str(e) |
|
print(f"์๋ฌ ๋ฐ์: {error_msg}") |
|
|
|
yield f"""์ฃ์กํฉ๋๋ค. ๊ธฐ์ ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. |
|
|
|
์๋ฌ ์ ๋ณด: {error_msg} |
|
|
|
๊ณ ๊ฐ์ผํฐ(010-8082-0047)๋ก ์ฐ๋ฝํด์ฃผ์ธ์.""" |
|
|
|
|
|
try: |
|
chatbot = KyungAhNeChatbot() |
|
|
|
|
|
demo = gr.ChatInterface( |
|
fn=chatbot.chat_stream, |
|
title="๐ฅข ๊ฒฝ์๋ค AI ์๋ด๋ด", |
|
description="๊ฒฝ์๋ค ๋ฐ์ฐฌ๊ฐ๊ฒ ๊ณ ๊ฐ์๋ด ์ฑ๋ด์
๋๋ค.", |
|
examples=[ |
|
"์ฃผ๋ฌธ์ ์ด๋ป๊ฒ ํ๋์?", |
|
"ํฌ์ธํธ๋ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์?", |
|
"๋ฐฐ์ก๋น๊ฐ ์ผ๋ง์ธ๊ฐ์?", |
|
"ํ๋ถ ๋ฐฉ๋ฒ์ ์๋ ค์ฃผ์ธ์" |
|
], |
|
theme=gr.themes.Default(), |
|
css=""" |
|
/* ์ ์ฒด ๋ฐฐ๊ฒฝ ํฐ์ */ |
|
.gradio-container { |
|
background-color: #ffffff !important; |
|
max-width: 800px !important; |
|
margin: 0 auto !important; |
|
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif !important; |
|
} |
|
|
|
/* ๋ชจ๋ ํ
๋๋ฆฌ ์ ๊ฑฐ */ |
|
.chatbot, .chatbot > div, .contain, .block { |
|
border: none !important; |
|
box-shadow: none !important; |
|
background-color: #ffffff !important; |
|
} |
|
|
|
/* Chatbot ํญ ์์ ํ ์จ๊ธฐ๊ธฐ */ |
|
.tab-nav, div[role="tablist"], .tabs > div:first-child { |
|
display: none !important; |
|
} |
|
|
|
/* ์ฑํ
๋ฉ์์ง ์คํ์ผ๋ง */ |
|
.message { |
|
border: none !important; |
|
margin: 10px 0 !important; |
|
} |
|
|
|
/* ์
๋ ฅ์ฐฝ์ ํ์ํ์ผ๋ก */ |
|
.input-container, textarea { |
|
border-radius: 25px !important; |
|
border: 1px solid #e0e0e0 !important; |
|
background-color: #f8f9fa !important; |
|
padding: 12px 20px !important; |
|
} |
|
|
|
/* ์ ์ก ๋ฒํผ ๋ฅ๊ธ๊ฒ */ |
|
button { |
|
border-radius: 20px !important; |
|
border: none !important; |
|
background-color: #007bff !important; |
|
color: white !important; |
|
font-weight: 500 !important; |
|
padding: 8px 16px !important; |
|
} |
|
|
|
button:hover { |
|
background-color: #0056b3 !important; |
|
} |
|
|
|
/* ์์ ๋ฒํผ๋ค ํ์ํ์ผ๋ก */ |
|
.examples button { |
|
border-radius: 20px !important; |
|
background-color: #f8f9fa !important; |
|
border: 1px solid #e9ecef !important; |
|
color: #333 !important; |
|
margin: 5px !important; |
|
padding: 8px 16px !important; |
|
} |
|
|
|
.examples button:hover { |
|
background-color: #007bff !important; |
|
color: white !important; |
|
border-color: #007bff !important; |
|
} |
|
|
|
/* ํ์ดํ ์คํ์ผ */ |
|
h1 { |
|
color: #333 !important; |
|
font-size: 28px !important; |
|
text-align: center !important; |
|
margin-bottom: 10px !important; |
|
} |
|
|
|
/* ์ค๋ช
ํ
์คํธ */ |
|
.description { |
|
color: #666 !important; |
|
text-align: center !important; |
|
font-size: 14px !important; |
|
margin-bottom: 20px !important; |
|
} |
|
|
|
/* ์ฌ๋ฐฑ ์กฐ์ */ |
|
.block { |
|
padding: 10px !important; |
|
} |
|
|
|
/* ์คํฌ๋กค๋ฐ ๊น๋ํ๊ฒ */ |
|
::-webkit-scrollbar { |
|
width: 6px; |
|
} |
|
|
|
::-webkit-scrollbar-track { |
|
background: #f1f1f1; |
|
border-radius: 10px; |
|
} |
|
|
|
::-webkit-scrollbar-thumb { |
|
background: #c1c1c1; |
|
border-radius: 10px; |
|
} |
|
|
|
::-webkit-scrollbar-thumb:hover { |
|
background: #a8a8a8; |
|
} |
|
""" |
|
) |
|
|
|
except Exception as e: |
|
def error_message(message, history): |
|
yield "โ GEMINI_API_KEY๊ฐ ์ค์ ๋์ง ์์์ต๋๋ค. ๊ด๋ฆฌ์์๊ฒ ๋ฌธ์ํ์ธ์." |
|
|
|
demo = gr.ChatInterface( |
|
fn=error_message, |
|
title="๐ฅข ์ค์ ์ค๋ฅ", |
|
description="API ํค ์ค์ ์ด ํ์ํฉ๋๋ค." |
|
) |
|
|
|
if __name__ == "__main__": |
|
demo.launch() |