ssboost commited on
Commit
e52c8cd
ยท
verified ยท
1 Parent(s): bfae8f8

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +120 -0
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()