Spaces:
Sleeping
Sleeping
Update docs/agent-architecture.md
Browse files- docs/agent-architecture.md +53 -98
docs/agent-architecture.md
CHANGED
|
@@ -1,129 +1,84 @@
|
|
| 1 |
-
#
|
| 2 |
|
| 3 |
## κ°μ
|
| 4 |
|
| 5 |
-
|
| 6 |
|
| 7 |
-
1. `
|
| 8 |
-
2. `
|
| 9 |
-
3. `
|
| 10 |
-
4. `
|
| 11 |
-
5. `app_gradio.py`μμ PC/λͺ¨λ°μΌ λ°μν μ±ν
UI μ 곡
|
| 12 |
|
| 13 |
-
|
| 14 |
|
| 15 |
-
##
|
| 16 |
-
|
| 17 |
-
- `.env` λ‘λ
|
| 18 |
-
- λ‘컬 `adk-python/src` κ²½λ‘ λ±λ‘
|
| 19 |
-
- Hugging Face dataset repoμμ λ°μ΄ν° νμΌ λ€μ΄λ‘λ
|
| 20 |
-
- λ€μ΄λ‘λ μ€ν¨ μ λ‘컬 `data/processed`λ₯Ό fallbackμΌλ‘ μ¬μ©
|
| 21 |
|
| 22 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
|
| 24 |
-
|
| 25 |
-
- `megumin_questions.faiss`
|
| 26 |
-
- `megumin_question_answer.faiss`
|
| 27 |
-
- `megumin_questions_meta.json`
|
| 28 |
-
- `namuwiki_qa.json`
|
| 29 |
-
- `namuwiki_questions.faiss`
|
| 30 |
-
- `namuwiki_question_answer.faiss`
|
| 31 |
-
- `namuwiki_questions_meta.json`
|
| 32 |
|
| 33 |
-
### `megumin_agent/
|
| 34 |
|
| 35 |
-
-
|
| 36 |
-
-
|
| 37 |
-
-
|
| 38 |
-
-
|
| 39 |
|
| 40 |
-
|
| 41 |
|
| 42 |
-
-
|
| 43 |
-
- μ¬μ€
|
|
|
|
| 44 |
|
| 45 |
### `megumin_agent/agent.py`
|
| 46 |
|
| 47 |
-
- λ©κ΅¬λ° νλ₯΄μλ ν둬ννΈ μ μ
|
| 48 |
-
-
|
| 49 |
-
-
|
| 50 |
-
- ADK callbackμΌλ‘ λν μμ½, μ΅κ·Ό μ§μ, RAG νμ μ stateμ κΈ°λ‘
|
| 51 |
-
|
| 52 |
-
tool λ°ν ν΅μ¬:
|
| 53 |
-
|
| 54 |
-
- `persona_matches`
|
| 55 |
-
- `fact_matches`
|
| 56 |
-
- `style_notes`
|
| 57 |
-
- `fact_notes`
|
| 58 |
|
| 59 |
### `megumin_agent/chat.py`
|
| 60 |
|
| 61 |
-
-
|
| 62 |
-
- `stream_chat()`μΌλ‘
|
| 63 |
-
-
|
| 64 |
-
- μ΅κ·Ό 6ν΄μ λ¨κΈ°κ³ , κ·Έ μ΄μ λνλ `conversation_summary_map` key-value κ΅¬μ‘°λ‘ μμΆ
|
| 65 |
-
- μμΆλ μμ½μ μ§§μ λ¬Έμμ΄ ννμ `conversation_summary`λ‘λ ν¨κ» λ λλ§
|
| 66 |
-
|
| 67 |
-
μμ½ κ΅¬μ‘°:
|
| 68 |
-
|
| 69 |
-
- `user_topics`
|
| 70 |
-
- `assistant_points`
|
| 71 |
|
| 72 |
### `app_gradio.py`
|
| 73 |
|
| 74 |
-
-
|
| 75 |
-
-
|
| 76 |
-
-
|
| 77 |
-
- μ€λ₯Έμͺ½: λ©κ΅¬λ° λΉμ£ΌμΌ ν¨λ
|
| 78 |
-
- 첫 μ μ μ κΈ°λ³Έ μΈμΏλ§μ assistant λ©μμ§λ‘ 미리 νμ
|
| 79 |
-
- `create_chat_services()`λ import μμ μ΄ μλλΌ μ²« μ§λ¬Έ μμ μ lazy init
|
| 80 |
-
- 첫 μ§λ¬Έ μ μλ `μλΉμ€ μ€λΉ μ€...`, μ΄ν μλ΅ μμ± μ€μλ `λ΅λ³ μμ± μ€...` μν νμ
|
| 81 |
-
- μμ κ·μΉ κΈ°λ° μν λ°°μ§λ₯Ό μΆκ°ν΄ λ©κ΅¬λ°μ νμ¬ λΆμκΈ°λ₯Ό νμ
|
| 82 |
-
- ADKμ SSE partial eventλ₯Ό λ°μ λ΅λ³μ μ μ§μ μΌλ‘ μ€νΈλ¦¬λ° νμ
|
| 83 |
-
- `launch(..., ssr_mode=False)`λ‘ μλ² μ¬μ΄λ λ λλ§μ λκ³ μ΄κΈ° κΈ°λ λΆλ΄μ μ€μ
|
| 84 |
-
- λͺ¨λ°μΌμμλ μ’μ° glass panelμ μ¨κΈ°κ³ , μ λͺ©, μ΅μ μ€λͺ
, μ΄λ―Έμ§, μ±ν
μ°½λ§ λ³΄μ΄λλ‘ λ¨μν
|
| 85 |
|
| 86 |
### `app_gradio_messenger.py`
|
| 87 |
|
| 88 |
-
-
|
| 89 |
-
- μ’μΈ‘
|
| 90 |
-
-
|
| 91 |
-
- μ°μΈ‘
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 92 |
|
| 93 |
### `app.py`
|
| 94 |
|
| 95 |
-
- Hugging Face Spaces μ§μ
μ
|
| 96 |
-
- `MEGUMIN_UI`
|
| 97 |
-
|
| 98 |
-
## λν νλ¦
|
| 99 |
-
|
| 100 |
-
μ¬μ©μ μ
λ ₯μ΄ λ€μ΄μ€λ©΄:
|
| 101 |
-
|
| 102 |
-
1. `app_gradio.py`κ° μν 문ꡬλ₯Ό λ¨Όμ κ°±μ
|
| 103 |
-
2. 첫 μ§λ¬Έμ΄λ©΄ `get_services()`κ° lazy initμΌλ‘ μλΉμ€ μ€λΉ
|
| 104 |
-
3. `chat.py`μ `stream_chat()`μ΄ ADK `run_async(..., RunConfig(streaming_mode=SSE))`λ‘ μ€ν
|
| 105 |
-
4. `agent.py`μ toolμ΄ retrieval μν
|
| 106 |
-
5. `retrieval.py`κ°
|
| 107 |
-
- νλ₯΄μλ λ°μ΄ν° top-2
|
| 108 |
-
- μ¬μ€ λ°μ΄ν° top-2
|
| 109 |
-
λ₯Ό κ°κ° κ²μ
|
| 110 |
-
6. ADK partial eventκ° λ€μ΄μ¬ λλ§λ€ UIκ° assistant λ΅λ³μ μ μ§μ μΌλ‘ κ°±μ
|
| 111 |
-
7. μΈμ
μ’
λ£ ν μ€λλ μ΄λ²€νΈλ₯Ό key-value summaryλ‘ μμΆ
|
| 112 |
-
|
| 113 |
-
## μΈμ
κ³Ό λ©λͺ¨λ¦¬
|
| 114 |
-
|
| 115 |
-
νμ¬ μ μ₯ λ°©μμ `InMemorySessionService`μ
λλ€.
|
| 116 |
|
| 117 |
-
|
| 118 |
-
- μ¬μμ μ μ΄κΈ°ν
|
| 119 |
-
- μ΅κ·Ό 6ν΄λ§ μ μ§
|
| 120 |
-
- μ€λλ λ΄μ©μ `user_topics`, `assistant_points` μ€μ¬μ key-value summaryλ‘ stateμ λ¨κΉ
|
| 121 |
|
| 122 |
-
|
|
|
|
|
|
|
| 123 |
|
| 124 |
-
|
| 125 |
|
| 126 |
-
-
|
| 127 |
-
-
|
| 128 |
-
-
|
| 129 |
-
-
|
|
|
|
| 1 |
+
# μμ΄μ νΈ μν€ν
μ²
|
| 2 |
|
| 3 |
## κ°μ
|
| 4 |
|
| 5 |
+
νλ‘μ νΈλ μΈ κ°μ UI μ§μ
μ κ³Ό νλμ κ³΅μ© μ±ν
λ°νμμΌλ‘ ꡬμ±λ©λλ€.
|
| 6 |
|
| 7 |
+
1. `app.py`
|
| 8 |
+
2. `app_gradio.py`
|
| 9 |
+
3. `app_gradio_messenger.py`
|
| 10 |
+
4. `megumin_agent/`
|
|
|
|
| 11 |
|
| 12 |
+
κ° UI κ³μΈ΅μ κ°μ μ±ν
μλΉμ€ ν¬νΌλ₯Ό νΈμΆνκ³ , μ±ν
μλΉμ€λ κ²μ, μμ΄μ νΈ μ€ν, μ€νΈλ¦¬λ°, μΈμ
μν κ΄λ¦¬λ₯Ό λ΄λΉν©λλ€.
|
| 13 |
|
| 14 |
+
## λ°νμ νλ¦
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 15 |
|
| 16 |
+
1. `megumin_agent/bootstrap.py`κ° νκ²½ λ³μλ₯Ό λΆλ¬μ€κ³ λ‘컬 λλ μ격 λ°μ΄ν° νμΌμ μ€λΉν©λλ€.
|
| 17 |
+
2. `megumin_agent/retrieval.py`κ° νλ₯΄μλ/μ¬μ€ κ²μμ νμν FAISS μΈλ±μ€μ λ©νλ°μ΄ν°λ₯Ό λ‘λν©λλ€.
|
| 18 |
+
3. `megumin_agent/agent.py`κ° ADK μμ΄μ νΈλ₯Ό ꡬμ±νκ³ κ²μ κΈ°λ° λꡬλ₯Ό μ°κ²°ν©λλ€.
|
| 19 |
+
4. `megumin_agent/chat.py`κ° μ±ν
μλΉμ€λ₯Ό λ§λ€κ³ λΆλΆ μλ΅ μ€νΈλ¦¬λ°κ³Ό μΈμ
λ©λͺ¨λ¦¬λ₯Ό κ΄λ¦¬ν©λλ€.
|
| 20 |
+
5. UI λͺ¨λμ΄ νλ©΄μ λ λλ§νκ³ μ¬μ©μ λ©μμ§λ₯Ό `stream_chat()`μΌλ‘ μ λ¬ν©λλ€.
|
| 21 |
|
| 22 |
+
## λͺ¨λλ³ μ€λͺ
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
|
| 24 |
+
### `megumin_agent/bootstrap.py`
|
| 25 |
|
| 26 |
+
- `.env`λ₯Ό λ‘λν©λλ€.
|
| 27 |
+
- νμ μ λ‘컬 `adk-python/src` κ²½λ‘λ₯Ό μ€λΉν©λλ€.
|
| 28 |
+
- κ°λ₯νλ©΄ Hugging Faceμμ λ°μ΄ν°μ
μμ°μ λ΄λ €λ°μ΅λλ€.
|
| 29 |
+
- μ격 μμ°μ μ¬μ©ν μ μμΌλ©΄ λ‘컬 μ²λ¦¬ λ°μ΄ν°λ‘ ν΄λ°±ν©λλ€.
|
| 30 |
|
| 31 |
+
### `megumin_agent/retrieval.py`
|
| 32 |
|
| 33 |
+
- QA JSON μμ€μ FAISS μΈλ±μ€λ₯Ό λ‘λν©λλ€.
|
| 34 |
+
- νλ₯΄μλν λ°μ΄ν°μ μ¬μ€ν λ°μ΄ν°μ λν΄ κ²μμ μνν©λλ€.
|
| 35 |
+
- ν둬ννΈ κ΅¬μ±μ μ¬μ©ν κ°κ²°ν κ²μ κ²°κ³Όλ₯Ό λ°νν©λλ€.
|
| 36 |
|
| 37 |
### `megumin_agent/agent.py`
|
| 38 |
|
| 39 |
+
- λ©κ΅¬λ° νλ₯΄μλ ν둬ννΈμ κ²μ λꡬλ₯Ό μ μν©λλ€.
|
| 40 |
+
- νλ₯΄μλ κ²μκ³Ό μ¬μ€ κ²μμ νλμ μμ΄μ νΈ νλ¦μΌλ‘ ν©μΉ©λλ€.
|
| 41 |
+
- λ©ν°ν΄ λνμ νμν μμ½ μνλ₯Ό κ΄λ¦¬ν©λλ€.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 42 |
|
| 43 |
### `megumin_agent/chat.py`
|
| 44 |
|
| 45 |
+
- κ³΅μ© λ¬λμ λ©λͺ¨λ¦¬ κΈ°λ° μΈμ
μλΉμ€λ₯Ό μμ±ν©λλ€.
|
| 46 |
+
- `stream_chat()`μΌλ‘ SSE μ€νμΌμ λΆλΆ μλ΅μ μ 곡ν©λλ€.
|
| 47 |
+
- μ΅κ·Ό ν΄ μνμ μμ½ μ 보λ₯Ό μ μ§ν΄ νμ λνλ₯Ό μ§μν©λλ€.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 48 |
|
| 49 |
### `app_gradio.py`
|
| 50 |
|
| 51 |
+
- κΈ°μ‘΄ λ€μ€ ν¨λ ꡬμ±μ λ©μΈ μ±ν
UIμ
λλ€.
|
| 52 |
+
- 첫 μμ² μμ μ μ±ν
μλΉμ€λ₯Ό μ§μ° μ΄κΈ°νν©λλ€.
|
| 53 |
+
- μ΄μμ€ν΄νΈμ λΆλΆ μλ΅μ νλ©΄μ μ±ν
μμμ μ€νΈλ¦¬λ°ν©λλ€.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 54 |
|
| 55 |
### `app_gradio_messenger.py`
|
| 56 |
|
| 57 |
+
- λμΌν κ³΅μ© μ±ν
μλΉμ€ κ³μΈ΅ μμ λ©μ μ ν UIλ₯Ό μ¬λ¦° νμΌμ
λλ€.
|
| 58 |
+
- μ’μΈ‘κ³Ό μ°μΈ‘ μΉν°λ Gradio `Column(scale=3)`κ³Ό `Column(scale=7)`μΌλ‘ `3:7` λΉμ¨μ μ μ§ν©λλ€.
|
| 59 |
+
- λ°μ€ν¬ν± λ©μ μ λ μ΄μμμ μλμ μΌλ‘ κ³ μ λμ΄λ₯Ό μ¬μ©ν©λλ€.
|
| 60 |
+
- μ°μΈ‘ μΉν°λ `μλ¨ ν€λ`, `λ©μμ§ νμ μμ`, `μ
λ ₯ μμ`μ μΈ ννΈλ‘ λλλ©°, κ³ μ 3ν gridλ‘ λ°°μΉλ©λλ€.
|
| 61 |
+
- `μλ¨ ν€λ`μ `μ
λ ₯ μμ`μ λͺ
μμ μΈ ν½μ
λμ΄λ₯Ό μ¬μ©ν©λλ€.
|
| 62 |
+
- λ©μμ§ λ·°ν¬νΈλ `calc(...)`λ‘ λ¨λ λμ΄λ§ μ¬μ©ν©λλ€.
|
| 63 |
+
- μλ°ν μ΄λ―Έμ§λ μΈλΆ μ μ₯μ λμ νλ‘μ νΈ λ΄λΆ `source_file` ν΄λμ λ‘컬 μ΄λ―Έμ§ νμΌμ Gradio νμΌ λΌμ°νΈλ‘ μλΉν©λλ€.
|
| 64 |
+
- μ°μ μ μΌλ‘ `megumin_profile` μ΄λ¦μ `png`, `jpg`, `jpeg`, `webp` νμΌμ μ°Ύκ³ , μμΌλ©΄ κ°μ ν΄λμ 첫 λ²μ§Έ μ΄λ―Έμ§ νμΌμ μ¬μ©ν©λλ€.
|
| 65 |
+
- fallback SVGλ λ‘컬 μ΄λ―Έμ§ λ‘λ μ€ν¨ μμλ§ νμλλ©°, `source_file` ν΄λλ λ©μ μ λ¨λ
μ€νκ³Ό `app.py` κ²½μ μ€ν λͺ¨λμμ `allowed_paths`λ‘ λͺ
μμ μΌλ‘ λ
ΈμΆν©λλ€.
|
| 66 |
+
- Gradio μλ stretch λνΌκ° μΈλ‘ νμ₯μ λ€μ μ λ°ν μ μμΌλ―λ‘ μ΄ νμΌμμλ `gr.Blocks(fill_height=True)`λ₯Ό μ¬μ©νμ§ μμ΅λλ€.
|
| 67 |
|
| 68 |
### `app.py`
|
| 69 |
|
| 70 |
+
- Hugging Face Spaces μ§μ
μ μ
λλ€.
|
| 71 |
+
- `MEGUMIN_UI` κ°μ λ°λΌ κΈ°λ³Έ UIμ λ©μ μ UI μ€ νλλ₯Ό μ νν©λλ€.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 72 |
|
| 73 |
+
## μΈμ
λͺ¨λΈ
|
|
|
|
|
|
|
|
|
|
| 74 |
|
| 75 |
+
- νμ¬ μΈμ
μ μ₯μλ λ©λͺ¨λ¦¬ κΈ°λ°μ
λλ€.
|
| 76 |
+
- μ± νλ‘μΈμ€κ° μ΄μ μλ λμ λν μ°μμ±μ΄ μ μ§λ©λλ€.
|
| 77 |
+
- μ΅κ·Ό λ©μμ§λ μ§μ 보쑴νκ³ , μ€λλ λ§₯λ½μ μμ½ μνλ‘ μΆμ½ν©λλ€.
|
| 78 |
|
| 79 |
+
## λ©μ μ λ μ΄μμ μ μ§λ³΄μ κ·μΉ
|
| 80 |
|
| 81 |
+
- `app_gradio_messenger.py`λ λ·°ν¬νΈλ₯Ό κ½ μ±μ°λ flex μ€νμ΄ μλλΌ κ³ μ λμ΄ λ μ΄μμμΌλ‘ λ€λ£Ήλλ€.
|
| 82 |
+
- λ©μ μ ν¨λ λμ΄κ° λ°λλ©΄ CSS λ³μμ μ΄ λ¬Έμλ₯Ό ν¨κ» μμ ν©λλ€.
|
| 83 |
+
- μ’μ° λΉμ¨μ΄ λ°λλ©΄ Gradio `scale` κ°κ³Ό README λ©λͺ¨λ₯Ό ν¨κ» μμ ν©λλ€.
|
| 84 |
+
- νΉλ³ν μ΄μ μ λΈλΌμ°μ κ²μ¦ μμ΄ λ΄λΆ λνΌμ μ€μ²©λ κ³ μ `min-height` 체μΈμ λ€μ λμ
νμ§ μμ΅λλ€.
|