--- title: Megumin RAG Chat emoji: "๐Ÿ’ฅ" colorFrom: red colorTo: yellow sdk: gradio sdk_version: 6.10.0 app_file: app.py pinned: false --- # Megumin RAG Chat ๋ฉ”๊ตฌ๋ฐ๊ณผ ์ง์ ‘ ๋Œ€ํ™”ํ•˜๋Š” ์ฒดํ—˜ํ˜• ์บ๋ฆญํ„ฐ ์ฑ—๋ด‡์ž…๋‹ˆ๋‹ค. ๋ฉ”๊ตฌ๋ฐ์˜ ๋งํˆฌ์™€ ๊ฐ์ •์„ , ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋…ธ์Šค๋ฐ” ์„ค์ • ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ์ฐธ๊ณ ํ•ด ๋‹ต๋ณ€ํ•ฉ๋‹ˆ๋‹ค. ## ๋ฐ”๋กœ ์จ๋ณด๊ธฐ ์ด๋Ÿฐ ์งˆ๋ฌธ์œผ๋กœ ์‹œ์ž‘ํ•ด๋ณด์„ธ์š”. - ๋ฉ”๊ตฌ๋ฐ, ์นด์ฆˆ๋งˆ ์”จ๋ฅผ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? - ํญ๋ ฌ๋งˆ๋ฒ•์„ ๊ฐ€๋ฅด์ณ ์ค€ ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ์ธ๊ฐ€์š”? - ์•„์ฟ ์•„์˜ ์„ธ์ดํฌ๋ฆฌ๋“œ ๋ธŒ๋ ˆ์ดํฌ ์ŠคํŽ ์ด ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”. - ํ™๋งˆ์กฑ๋‹ค์šด ์ž๊ธฐ์†Œ๊ฐœ๋ฅผ ํ•œ ๋ฒˆ ๋“ค๋ ค์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ฒซ ์ ‘์† ์‹œ ๋ฉ”๊ตฌ๋ฐ์ด ๋จผ์ € ์ธ์‚ฟ๋ง์„ ๊ฑด๋„ค๊ณ , ๋‹ต๋ณ€์€ ADK SSE ์ŠคํŠธ๋ฆฌ๋ฐ์œผ๋กœ ์ ์ง„์ ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ## ์ด Space์˜ ํŠน์ง• - ๋ฉ”๊ตฌ๋ฐ ํŽ˜๋ฅด์†Œ๋‚˜ ๊ธฐ๋ฐ˜ ๋Œ€ํ™” - ์„ค์ • RAG + ์Šคํƒ€์ผ RAG ๋™์‹œ ์‚ฌ์šฉ - question ์ธ๋ฑ์Šค์™€ question+answer ์ธ๋ฑ์Šค๋ฅผ ํ•จ๊ป˜ ์กฐํšŒํ•˜๋Š” FAISS ๊ฒ€์ƒ‰ - ์ฒซ ์งˆ๋ฌธ ์‹œ lazy init - `์„œ๋น„์Šค ์ค€๋น„ ์ค‘...`, `๋‹ต๋ณ€ ์ƒ์„ฑ ์ค‘...` ์ƒํƒœ ํ‘œ์‹œ - ๊ทœ์น™ ๊ธฐ๋ฐ˜ ์ž‘์€ ์ƒํƒœ ๋ฐฐ์ง€ - `ssr_mode=False`๋กœ ์ดˆ๊ธฐ ๋ Œ๋” ๋ถ€๋‹ด ์™„ํ™” - ๋ชจ๋ฐ”์ผ์—์„œ๋Š” ์ œ๋ชฉ, ์ตœ์†Œ ์„ค๋ช…, ์ด๋ฏธ์ง€, ์ฑ„ํŒ…์ฐฝ๋งŒ ๋ณด์ด๋Š” ๋‹จ์ˆœํ™” ๋ ˆ์ด์•„์›ƒ ## ์‹คํ–‰ ```bash python app_gradio.py ``` ๋ฉ”์‹ ์ €ํ˜• UI: ```bash python app_gradio_messenger.py ``` Hugging Face Spaces ์ง„์ž…์ : ```bash python app.py ``` UI ์„ ํƒ: ```bash MEGUMIN_UI=messenger ``` ## ๋ฉ”์‹ ์ € ๋ ˆ์ด์•„์›ƒ ๋ฉ”๋ชจ `app_gradio_messenger.py`๋Š” ๋ฐ์Šคํฌํ†ฑ ํ™˜๊ฒฝ์—์„œ Gradio ๋ž˜ํผ๊ฐ€ ์„ธ๋กœ๋กœ ๋Š˜์–ด๋‚˜๋Š” ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์ • ๋†’์ด ๋ฉ”์‹ ์ € ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. - ์ขŒ์ธก๊ณผ ์šฐ์ธก ์„นํ„ฐ๋Š” Gradio `Column(scale=3)`๊ณผ `Column(scale=7)`๋กœ `3:7` ๋น„์œจ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. - ๋ฉ”์‹ ์ € ํŒจ๋„ ๋†’์ด๋Š” ๋ทฐํฌํŠธ ์˜์กด flex ํ™•์žฅ์ด ์•„๋‹ˆ๋ผ CSS ๋ณ€์ˆ˜๋กœ ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค. - ์šฐ์ธก ์„นํ„ฐ๋Š” ์„ธ ๊ฐœ์˜ ๊ณ ์ • ์—ญํ• ์„ ๊ฐ–๋Š” 3ํ–‰ grid๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. `์ƒ๋‹จ ํ—ค๋” = 96px`, `์ž…๋ ฅ ์˜์—ญ = 176px`, `๋ฉ”์‹œ์ง€ ํ‘œ์‹œ ์˜์—ญ = ๋‚˜๋จธ์ง€ ๋†’์ด` - ๋ฉ”์‹ ์ € UI์—์„œ๋Š” `gr.Blocks(fill_height=True)`๋ฅผ ์˜๋„์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Gradio์˜ ์ž๋™ stretch ๋ž˜ํผ๊ฐ€ ๊ณ ์ • ๋†’์ด ๋™์ž‘์„ ๋‹ค์‹œ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. - ํ”„๋กœํ•„ ์ด๋ฏธ์ง€๋Š” ์™ธ๋ถ€ URL ๋Œ€์‹  ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€ `source_file` ํด๋”์˜ ๋กœ์ปฌ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. - ์šฐ์„ ์ˆœ์œ„๋Š” `megumin_profile.png`, `megumin_profile.jpg`, `megumin_profile.jpeg`, `megumin_profile.webp`์ด๋ฉฐ, ์—†์œผ๋ฉด ๊ฐ™์€ ํด๋”์˜ ์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. - ๊ธฐ๋ณธ SVG๋Š” ์ด๋ฏธ์ง€ ๋กœ๋“œ ์‹คํŒจ ์‹œ์—๋งŒ ๋ณด์ด๋ฉฐ, `source_file` ํด๋”๋Š” ๋ฉ”์‹ ์ € ๋‹จ๋… ์‹คํ–‰๊ณผ `app.py` ๊ฒฝ์œ  ์‹คํ–‰ ๋ชจ๋‘์—์„œ `allowed_paths`๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์„œ๋น™ํ•ฉ๋‹ˆ๋‹ค. - ์ดํ›„ ๋ฉ”์‹ ์ € ๋ ˆ์ด์•„์›ƒ์„ ๋ณ€๊ฒฝํ•˜๋ฉด `app_gradio_messenger.py`์™€ `docs/agent-architecture.md`๋ฅผ ํ•จ๊ป˜ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ## Hugging Face ๊ตฌ์„ฑ ์•ฑ repo: - `app.py` - `app_gradio.py` - `megumin_agent/` - `scripts/` - `docs/` - `requirements.txt` - `README.md` dataset repo: - `megumin_qa_dataset.json` - `megumin_questions.faiss` - `megumin_question_answer.faiss` - `megumin_questions_meta.json` - `namuwiki_qa.json` - `namuwiki_questions.faiss` - `namuwiki_question_answer.faiss` - `namuwiki_questions_meta.json` ํ•„์ˆ˜ Secret: - `GOOGLE_API_KEY` - `HF_TOKEN` ## ๋ฌธ์„œ - [ADK ์ •๋ฆฌ](docs/Google-ADK.md) - [๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋ช…์„ธ](docs/data-collection-spec.md) - [Agent ๊ตฌ์กฐ ๋ช…์„ธ](docs/agent-architecture.md)