|
import gradio as gr |
|
from google import genai |
|
import os |
|
|
|
class SimpleBanchanChatbot: |
|
def __init__(self): |
|
|
|
api_key = os.getenv("GEMINI_API_KEY") |
|
if not api_key: |
|
raise ValueError("GEMINI_API_KEY ํ๊ฒฝ๋ณ์๊ฐ ์ค์ ๋์ง ์์์ต๋๋ค!") |
|
|
|
self.genai_client = genai.Client(api_key=api_key) |
|
|
|
|
|
self.faq_data = """ |
|
๋ฐ์ฐฌ๊ฐ๊ฒ ๊ณ ๊ฐ์ผํฐ FAQ: |
|
|
|
1. Q: ์ฃผ๋ฌธ์ ์ด๋ป๊ฒ ํ๋์? |
|
A: ๋ก๊ทธ์ธ โ ์ฃผ๋ฌธํ๊ธฐ ํด๋ฆญ โ ์ ์ฒด์ฃผ๋ฌธ/์ผ๋ณ์ฃผ๋ฌธ ์ ํ โ ๋ฐ์ฐฌ ์ ํ(์ต์ 26,000์) โ ๊ตฌ๋งค/์ฅ๋ฐ๊ตฌ๋ โ ๊ฒฐ์ (์ ์ฉ์นด๋/์ ๋กํ์ด/๋ฌดํต์ฅ) |
|
|
|
2. Q: ํฌ์ธํธ ์ฌ์ฉ์ด ์ด๋ป๊ฒ ํ๋์? |
|
A: ๊ฒฐ์ ์ ์ฒซ ํ์ด์ง์์ ํฌ์ธํธ ๊ธ์ก์ ๋ฃ๊ณ ๋ฌดํต์ฅ์
๊ธ |
|
|
|
3. Q: ๋ฐ์ฐฌ ์ถ๊ฐ๋ ์ด๋ป๊ฒ ํ๋์? |
|
A: ์ฒซ ํ์ด์ง์์ ๊ตฌ๋งคํ๊ณ ์ถ์ ๋ฐ์ฐฌ ์ ํ โ ์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ โ ์ฅ๋ฐ๊ตฌ๋์์ ์๋ ์ถ๊ฐ ๊ฐ๋ฅ |
|
|
|
4. Q: ์นด๋๊ฒฐ์ ํ๊ณ ์ถ์๋ฐ ์ด๋ป๊ฒ ํ๋์? |
|
A: ๊ฒฐ์ ์ฐฝ์์ ์ ์ฉ์นด๋/์ ๋กํ์ด/๋ฌดํต์ฅ ์ค ์ ํํด์ ๊ฒฐ์ |
|
|
|
5. Q: ๋ฐฐ์ก๋น๋ ์ผ๋ง์ธ๊ฐ์? |
|
A: ์๋ฒฝ๋ฐฐ์ก 3,500์, ํ๋ฐฐ๋ฐฐ์ก 4,000์ |
|
|
|
6. Q: ์๋ฒฝ๋ฐฐ์ก์ธ์ง ํ๋ฐฐ์ธ์ง ์ด๋ป๊ฒ ๊ตฌ๋ถํ๋์? |
|
A: ์ด์ฉ๋ฐฉ๋ฒ์์ ๋ฐฐ์ก์ง๋ฅผ ์
๋ ฅํ์๋ฉด ํ์ธ ๊ฐ๋ฅํฉ๋๋ค |
|
|
|
7. Q: ํ๋ถ์ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์? |
|
A: ์นด๋๋ ์ทจ์ ํ 2-3์ผ, ์ทจ์๋ 2์ผ ์ ์๋ง ๊ฐ๋ฅ, ํ๋ฃจ ์ ์๋ ์ด๋ฏธ ์ ์๋์ด ์ทจ์ ๋ถ๊ฐ |
|
|
|
8. Q: ๊ณ์ข๋ฒํธ ํ์ธ์ ์ด๋์ ํ๋์? |
|
A: ๋ฌดํต์ฅ ๊ฑฐ๋์ ์
๊ธ๊ณ์ข - ํ๋์ํ 12345-00-1234304 ์ฃผ)๊ฒฝ์๋ค |
|
|
|
9. Q: ์ต์ ์ฃผ๋ฌธ๊ธ์ก์ด ์๋์? |
|
A: ์ต์ ์ฃผ๋ฌธ 25,000์์
๋๋ค |
|
|
|
10. Q: ๋ฐฐ์ก์ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์? |
|
A: ์ ๋ ํฌ์ฅ โ ๋ฐฐ์ก์
์ฒด ๋์ฅ์ผํฐ 8์ ์
๊ณ โ ๋ถ๋ฅ์์
โ ์๋ฒฝ๋ฐฐ์ก |
|
|
|
๊ณ ๊ฐ์ผํฐ: 010-8082-0047 |
|
""" |
|
|
|
def chat_stream(self, message, history): |
|
system_prompt = f""" |
|
๋น์ ์ ๋ง์๋๋ฐ์ฐฌ๊ฐ๊ฒ์ ์น์ ํ ์๋ด์์
๋๋ค. |
|
|
|
{self.faq_data} |
|
|
|
์ FAQ ์ ๋ณด๋ฅผ ์ฐธ๊ณ ํ์ฌ ๊ณ ๊ฐ์ ์ง๋ฌธ์ ์ ํํ๊ณ ์น์ ํ๊ฒ ๋ต๋ณํด์ฃผ์ธ์. |
|
- FAQ์ ์๋ ์ ๋ณด๋ ์ ํํ ์ ๊ณตํด์ฃผ์ธ์ |
|
- FAQ์ ์๋ ๋ด์ฉ์ "์์ธํ ์ฌํญ์ ๊ณ ๊ฐ์ผํฐ(010-8082-0047)๋ก ๋ฌธ์ํด์ฃผ์ธ์"๋ผ๊ณ ์๋ดํด์ฃผ์ธ์ |
|
- ๋ฐ๋ง๋ณด๋ค๋ ์กด๋๋ง์ ์ฌ์ฉํด์ฃผ์ธ์ |
|
- ๊ฐ๊ฒฐํ๊ณ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ต๋ณํด์ฃผ์ธ์ |
|
""" |
|
|
|
try: |
|
response = self.genai_client.models.generate_content_stream( |
|
model="gemini-2.0-flash-exp", |
|
contents=message, |
|
config=genai.types.GenerateContentConfig( |
|
system_instruction=system_prompt, |
|
temperature=0.1 |
|
) |
|
) |
|
|
|
partial_message = "" |
|
for chunk in response: |
|
if chunk.text: |
|
partial_message += chunk.text |
|
yield partial_message |
|
|
|
except Exception as e: |
|
yield f"์ฃ์กํฉ๋๋ค. ์์คํ
์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๊ณ ๊ฐ์ผํฐ(010-8082-0047)๋ก ์ฐ๋ฝํด์ฃผ์ธ์." |
|
|
|
|
|
try: |
|
chatbot = SimpleBanchanChatbot() |
|
|
|
|
|
demo = gr.ChatInterface( |
|
fn=chatbot.chat_stream, |
|
title="๐ฅข ๋ง์๋๋ฐ์ฐฌ๊ฐ๊ฒ AI ์๋ด๋ด", |
|
description="์ ๋ฏธ๋์ด 2.0 ๊ธฐ๋ฐ ๋ฐ์ฐฌ๊ฐ๊ฒ ๊ณ ๊ฐ ์๋ด๋ด์
๋๋ค. ๊ถ๊ธํ ๊ฒ์ ๋ฌผ์ด๋ณด์ธ์!", |
|
examples=[ |
|
"์ฃผ๋ฌธ์ ์ด๋ป๊ฒ ํ๋์?", |
|
"ํฌ์ธํธ๋ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์?", |
|
"๋ฐฐ์ก๋น๊ฐ ์ผ๋ง์ธ๊ฐ์?", |
|
"ํ๋ถ ๋ฐฉ๋ฒ์ ์๋ ค์ฃผ์ธ์", |
|
"์ต์ ์ฃผ๋ฌธ๊ธ์ก์ด ์๋์?" |
|
], |
|
theme=gr.themes.Soft(), |
|
css=""" |
|
.gradio-container { |
|
max-width: 800px !important; |
|
margin: auto !important; |
|
} |
|
""" |
|
) |
|
|
|
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() |