File size: 3,558 Bytes
6efb911
7245599
7e32ca3
7245599
 
6efb911
f32f861
6efb911
 
 
 
883c35f
7245599
23361a6
 
7245599
d66a427
7245599
d66a427
7245599
d66a427
 
 
 
7245599
7d395cb
23361a6
d66a427
 
 
 
23361a6
 
 
 
7e32ca3
23361a6
7245599
51285c9
7245599
 
 
 
 
7d395cb
 
 
 
 
 
883c35f
7245599
 
 
 
 
7d395cb
 
 
 
 
 
1670941
 
 
 
 
 
 
 
 
 
 
 
 
 
d66a427
7245599
d66a427
7245599
883c35f
 
 
 
 
 
 
7245599
d66a427
7245599
883c35f
 
b27167a
883c35f
 
 
b27167a
883c35f
7245599
883c35f
7245599
883c35f
d66a427
51285c9
d66a427
51285c9
d66a427
883c35f
7e32ca3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
---
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)