|
import gradio as gr |
|
from google import genai |
|
import os |
|
|
|
class SimpleBanchanChatbot: |
|
def __init__(self): |
|
self.genai_client = genai.Client(api_key=os.getenv("GEMINI_API_KEY")) |
|
|
|
|
|
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)๋ก ๋ฌธ์ํด์ฃผ์ธ์"๋ผ๊ณ ์๋ดํด์ฃผ์ธ์ |
|
- ๋ฐ๋ง๋ณด๋ค๋ ์กด๋๋ง์ ์ฌ์ฉํด์ฃผ์ธ์ |
|
- ๊ฐ๊ฒฐํ๊ณ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ต๋ณํด์ฃผ์ธ์ |
|
""" |
|
|
|
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)๋ก ์ฐ๋ฝํด์ฃผ์ธ์. ์ค๋ฅ: {str(e)}" |
|
|
|
|
|
chatbot = SimpleBanchanChatbot() |
|
|
|
|
|
demo = gr.ChatInterface( |
|
fn=chatbot.chat_stream, |
|
title="๐ฅข ๋ง์๋๋ฐ์ฐฌ๊ฐ๊ฒ AI ์๋ด๋ด", |
|
description="๊ฐ๋จํ๊ณ ๋น ๋ฅธ ๋ฐ์ฐฌ๊ฐ๊ฒ ์๋ด๋ด (์ ๋ฏธ๋์ด 2.0 + FAQ ๋ฐ์ดํฐ)", |
|
examples=[ |
|
"์ฃผ๋ฌธ์ ์ด๋ป๊ฒ ํ๋์?", |
|
"ํฌ์ธํธ๋ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์?", |
|
"๋ฐฐ์ก๋น๊ฐ ์ผ๋ง์ธ๊ฐ์?", |
|
"ํ๋ถ ๋ฐฉ๋ฒ์ ์๋ ค์ฃผ์ธ์", |
|
"์ต์ ์ฃผ๋ฌธ๊ธ์ก์ด ์๋์?" |
|
], |
|
theme=gr.themes.Soft(), |
|
css=""" |
|
.gradio-container { |
|
max-width: 800px !important; |
|
margin: auto !important; |
|
} |
|
""" |
|
) |
|
|
|
if __name__ == "__main__": |
|
demo.launch( |
|
server_name="0.0.0.0", |
|
server_port=7860, |
|
share=True |
|
) |