Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,120 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
from google import genai
|
3 |
+
import os
|
4 |
+
|
5 |
+
class SimpleBanchanChatbot:
|
6 |
+
def __init__(self):
|
7 |
+
# ํ๊น
ํ์ด์ค ์คํ์ด์ค์์๋ secrets์์ API ํค ๊ฐ์ ธ์ค๊ธฐ
|
8 |
+
api_key = os.getenv("GEMINI_API_KEY")
|
9 |
+
if not api_key:
|
10 |
+
raise ValueError("GEMINI_API_KEY ํ๊ฒฝ๋ณ์๊ฐ ์ค์ ๋์ง ์์์ต๋๋ค!")
|
11 |
+
|
12 |
+
self.genai_client = genai.Client(api_key=api_key)
|
13 |
+
|
14 |
+
# FAQ ๋ฐ์ดํฐ (์์
์์ ์ถ์ถํ ๋ด์ฉ)
|
15 |
+
self.faq_data = """
|
16 |
+
๋ฐ์ฐฌ๊ฐ๊ฒ ๊ณ ๊ฐ์ผํฐ FAQ:
|
17 |
+
|
18 |
+
1. Q: ์ฃผ๋ฌธ์ ์ด๋ป๊ฒ ํ๋์?
|
19 |
+
A: ๋ก๊ทธ์ธ โ ์ฃผ๋ฌธํ๊ธฐ ํด๋ฆญ โ ์ ์ฒด์ฃผ๋ฌธ/์ผ๋ณ์ฃผ๋ฌธ ์ ํ โ ๋ฐ์ฐฌ ์ ํ(์ต์ 26,000์) โ ๊ตฌ๋งค/์ฅ๋ฐ๊ตฌ๋ โ ๊ฒฐ์ (์ ์ฉ์นด๋/์ ๋กํ์ด/๋ฌดํต์ฅ)
|
20 |
+
|
21 |
+
2. Q: ํฌ์ธํธ ์ฌ์ฉ์ด ์ด๋ป๊ฒ ํ๋์?
|
22 |
+
A: ๊ฒฐ์ ์ ์ฒซ ํ์ด์ง์์ ํฌ์ธํธ ๊ธ์ก์ ๋ฃ๊ณ ๋ฌดํต์ฅ์
๊ธ
|
23 |
+
|
24 |
+
3. Q: ๋ฐ์ฐฌ ์ถ๊ฐ๋ ์ด๋ป๊ฒ ํ๋์?
|
25 |
+
A: ์ฒซ ํ์ด์ง์์ ๊ตฌ๋งคํ๊ณ ์ถ์ ๋ฐ์ฐฌ ์ ํ โ ์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ โ ์ฅ๋ฐ๊ตฌ๋์์ ์๋ ์ถ๊ฐ ๊ฐ๋ฅ
|
26 |
+
|
27 |
+
4. Q: ์นด๋๊ฒฐ์ ํ๊ณ ์ถ์๋ฐ ์ด๋ป๊ฒ ํ๋์?
|
28 |
+
A: ๊ฒฐ์ ์ฐฝ์์ ์ ์ฉ์นด๋/์ ๋กํ์ด/๋ฌดํต์ฅ ์ค ์ ํํด์ ๊ฒฐ์
|
29 |
+
|
30 |
+
5. Q: ๋ฐฐ์ก๋น๋ ์ผ๋ง์ธ๊ฐ์?
|
31 |
+
A: ์๋ฒฝ๋ฐฐ์ก 3,500์, ํ๋ฐฐ๋ฐฐ์ก 4,000์
|
32 |
+
|
33 |
+
6. Q: ์๋ฒฝ๋ฐฐ์ก์ธ์ง ํ๋ฐฐ์ธ์ง ์ด๋ป๊ฒ ๊ตฌ๋ถํ๋์?
|
34 |
+
A: ์ด์ฉ๋ฐฉ๋ฒ์์ ๋ฐฐ์ก์ง๋ฅผ ์
๋ ฅํ์๋ฉด ํ์ธ ๊ฐ๋ฅํฉ๋๋ค
|
35 |
+
|
36 |
+
7. Q: ํ๋ถ์ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์?
|
37 |
+
A: ์นด๋๋ ์ทจ์ ํ 2-3์ผ, ์ทจ์๋ 2์ผ ์ ์๋ง ๊ฐ๋ฅ, ํ๋ฃจ ์ ์๋ ์ด๋ฏธ ์ ์๋์ด ์ทจ์ ๋ถ๊ฐ
|
38 |
+
|
39 |
+
8. Q: ๊ณ์ข๋ฒํธ ํ์ธ์ ์ด๋์ ํ๋์?
|
40 |
+
A: ๋ฌดํต์ฅ ๊ฑฐ๋์ ์
๊ธ๊ณ์ข - ํ๋์ํ 12345-00-1234304 ์ฃผ)๊ฒฝ์๋ค
|
41 |
+
|
42 |
+
9. Q: ์ต์ ์ฃผ๋ฌธ๊ธ์ก์ด ์๋์?
|
43 |
+
A: ์ต์ ์ฃผ๋ฌธ 25,000์์
๋๋ค
|
44 |
+
|
45 |
+
10. Q: ๋ฐฐ์ก์ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์?
|
46 |
+
A: ์ ๋ ํฌ์ฅ โ ๋ฐฐ์ก์
์ฒด ๋์ฅ์ผํฐ 8์ ์
๊ณ โ ๋ถ๋ฅ์์
โ ์๋ฒฝ๋ฐฐ์ก
|
47 |
+
|
48 |
+
๊ณ ๊ฐ์ผํฐ: 010-8082-0047
|
49 |
+
"""
|
50 |
+
|
51 |
+
def chat_stream(self, message, history):
|
52 |
+
system_prompt = f"""
|
53 |
+
๋น์ ์ ๋ง์๋๋ฐ์ฐฌ๊ฐ๊ฒ์ ์น์ ํ ์๋ด์์
๋๋ค.
|
54 |
+
|
55 |
+
{self.faq_data}
|
56 |
+
|
57 |
+
์ FAQ ์ ๋ณด๋ฅผ ์ฐธ๊ณ ํ์ฌ ๊ณ ๊ฐ์ ์ง๋ฌธ์ ์ ํํ๊ณ ์น์ ํ๊ฒ ๋ต๋ณํด์ฃผ์ธ์.
|
58 |
+
- FAQ์ ์๋ ์ ๋ณด๋ ์ ํํ ์ ๊ณตํด์ฃผ์ธ์
|
59 |
+
- FAQ์ ์๋ ๋ด์ฉ์ "์์ธํ ์ฌํญ์ ๊ณ ๊ฐ์ผํฐ(010-8082-0047)๋ก ๋ฌธ์ํด์ฃผ์ธ์"๋ผ๊ณ ์๋ดํด์ฃผ์ธ์
|
60 |
+
- ๋ฐ๋ง๋ณด๋ค๋ ์กด๋๋ง์ ์ฌ์ฉํด์ฃผ์ธ์
|
61 |
+
- ๊ฐ๊ฒฐํ๊ณ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ต๋ณํด์ฃผ์ธ์
|
62 |
+
"""
|
63 |
+
|
64 |
+
try:
|
65 |
+
response = self.genai_client.models.generate_content_stream(
|
66 |
+
model="gemini-2.0-flash-exp",
|
67 |
+
contents=message,
|
68 |
+
config=genai.types.GenerateContentConfig(
|
69 |
+
system_instruction=system_prompt,
|
70 |
+
temperature=0.1
|
71 |
+
)
|
72 |
+
)
|
73 |
+
|
74 |
+
partial_message = ""
|
75 |
+
for chunk in response:
|
76 |
+
if chunk.text:
|
77 |
+
partial_message += chunk.text
|
78 |
+
yield partial_message
|
79 |
+
|
80 |
+
except Exception as e:
|
81 |
+
yield f"์ฃ์กํฉ๋๋ค. ์์คํ
์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๊ณ ๊ฐ์ผํฐ(010-8082-0047)๋ก ์ฐ๋ฝํด์ฃผ์ธ์."
|
82 |
+
|
83 |
+
# ์ฑ๋ด ์ธ์คํด์ค ์์ฑ
|
84 |
+
try:
|
85 |
+
chatbot = SimpleBanchanChatbot()
|
86 |
+
|
87 |
+
# ๊ทธ๋ผ๋์ค ์ธํฐํ์ด์ค
|
88 |
+
demo = gr.ChatInterface(
|
89 |
+
fn=chatbot.chat_stream,
|
90 |
+
title="๐ฅข ๋ง์๋๋ฐ์ฐฌ๊ฐ๊ฒ AI ์๋ด๋ด",
|
91 |
+
description="์ ๋ฏธ๋์ด 2.0 ๊ธฐ๋ฐ ๋ฐ์ฐฌ๊ฐ๊ฒ ๊ณ ๊ฐ ์๋ด๋ด์
๋๋ค. ๊ถ๊ธํ ๊ฒ์ ๋ฌผ์ด๋ณด์ธ์!",
|
92 |
+
examples=[
|
93 |
+
"์ฃผ๋ฌธ์ ์ด๋ป๊ฒ ํ๋์?",
|
94 |
+
"ํฌ์ธํธ๋ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์?",
|
95 |
+
"๋ฐฐ์ก๋น๊ฐ ์ผ๋ง์ธ๊ฐ์?",
|
96 |
+
"ํ๋ถ ๋ฐฉ๋ฒ์ ์๋ ค์ฃผ์ธ์",
|
97 |
+
"์ต์ ์ฃผ๋ฌธ๊ธ์ก์ด ์๋์?"
|
98 |
+
],
|
99 |
+
theme=gr.themes.Soft(),
|
100 |
+
css="""
|
101 |
+
.gradio-container {
|
102 |
+
max-width: 800px !important;
|
103 |
+
margin: auto !important;
|
104 |
+
}
|
105 |
+
"""
|
106 |
+
)
|
107 |
+
|
108 |
+
except Exception as e:
|
109 |
+
# API ํค๊ฐ ์์ ๋ ์๋ฌ ๋ฉ์์ง ํ์
|
110 |
+
def error_message(message, history):
|
111 |
+
yield "โ GEMINI_API_KEY๊ฐ ์ค์ ๋์ง ์์์ต๋๋ค. ๊ด๋ฆฌ์์๊ฒ ๋ฌธ์ํ์ธ์."
|
112 |
+
|
113 |
+
demo = gr.ChatInterface(
|
114 |
+
fn=error_message,
|
115 |
+
title="๐ฅข ์ค์ ์ค๋ฅ",
|
116 |
+
description="API ํค ์ค์ ์ด ํ์ํฉ๋๋ค."
|
117 |
+
)
|
118 |
+
|
119 |
+
if __name__ == "__main__":
|
120 |
+
demo.launch()
|