Download app.py from ssboost/FGE3: direct link, hf CLI and curl.
- Browser
- Download file 10.2 kB
-
https://huggingface.co/spaces/ssboost/FGE3/resolve/main/app.py
- Command line
-
hf download hf://spaces/ssboost/FGE3/app.py
-
curl -L -o app.py https://huggingface.co/spaces/ssboost/FGE3/resolve/main/app.py
10.2 kB
| import gradio as gr | |
| import google.generativeai as genai | |
| import os | |
| class KyungAhNeChatbot: | |
| def __init__(self): | |
| # ํ๊น ํ์ด์ค ์คํ์ด์ค์์๋ secrets์์ API ํค ๊ฐ์ ธ์ค๊ธฐ | |
| 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') | |
| # ๊ฒฝ์๋ค ๋ฐ์ฐฌ๊ฐ๊ฒ FAQ ๋ฐ์ดํฐ | |
| 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() |