Spaces:
Sleeping
Sleeping
Upload 3 files
Browse files- docs/Google-ADK.md +1127 -0
- docs/agent-architecture.md +108 -0
- docs/data-collection-spec.md +92 -0
docs/Google-ADK.md
ADDED
|
@@ -0,0 +1,1127 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Google ADK ํต์ฌ ๊ฐ๋
์์ ๊ฐ์ด๋
|
| 2 |
+
|
| 3 |
+
์ด ๋ฌธ์๋ Google Agent Development Kit (ADK)์ ํต์ฌ ๊ฐ๋
๋ค์ ์ฒด๊ณ์ ์ผ๋ก ์ค๋ช
ํฉ๋๋ค.
|
| 4 |
+
์ํ ์ฝ๋์์ ์ฌ์ฉ๋ ๋ชจ๋ ์ค์ ์์๋ค์ ์ดํดํ ์ ์๋๋ก ๊ตฌ์ฑํ์ต๋๋ค.
|
| 5 |
+
|
| 6 |
+
---
|
| 7 |
+
|
| 8 |
+
## ๐ ๋ชฉ์ฐจ
|
| 9 |
+
|
| 10 |
+
1. [์ ์ฒด ์ํคํ
์ฒ ๊ฐ์](#1-์ ์ฒด-์ํคํ
์ฒ-๊ฐ์)
|
| 11 |
+
2. [Session (์ธ์
)](#2-session-์ธ์
)
|
| 12 |
+
3. [State (์ํ)](#3-state-์ํ)
|
| 13 |
+
4. [Event (์ด๋ฒคํธ)](#4-event-์ด๋ฒคํธ)
|
| 14 |
+
5. [Context (์ปจํ
์คํธ)](#5-context-์ปจํ
์คํธ)
|
| 15 |
+
6. [Runner (๋ฌ๋)](#6-runner-๋ฌ๋)
|
| 16 |
+
7. [Memory (๋ฉ๋ชจ๋ฆฌ)](#7-memory-๋ฉ๋ชจ๋ฆฌ)
|
| 17 |
+
8. [Callbacks (์ฝ๋ฐฑ)](#8-callbacks-์ฝ๋ฐฑ)
|
| 18 |
+
9. [Tools (๋๊ตฌ)](#9-tools-๋๊ตฌ)
|
| 19 |
+
10. [ํต์ฌ ๊ฐ๋
๊ฐ์ ๊ด๊ณ](#10-ํต์ฌ-๊ฐ๋
-๊ฐ์-๊ด๊ณ)
|
| 20 |
+
|
| 21 |
+
---
|
| 22 |
+
|
| 23 |
+
## 1. ์ ์ฒด ์ํคํ
์ฒ ๊ฐ์
|
| 24 |
+
|
| 25 |
+
### ADK์ ํต์ฌ ์ฒ ํ
|
| 26 |
+
|
| 27 |
+
ADK๋ **"์์ด์ ํธ ๊ฐ๋ฐ์ ์ํํธ์จ์ด ๊ฐ๋ฐ์ฒ๋ผ"** ๋ง๋๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
|
| 28 |
+
๋ณต์กํ AI ์์ด์ ํธ ์์คํ
์ ๋ชจ๋ํํ๊ณ , ํ
์คํธ ๊ฐ๋ฅํ๋ฉฐ, ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
|
| 29 |
+
|
| 30 |
+
### ํต์ฌ ์ปดํฌ๋ํธ ๋ค์ด์ด๊ทธ๋จ
|
| 31 |
+
|
| 32 |
+
```
|
| 33 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 34 |
+
โ ์ฌ์ฉ์ (User) โ
|
| 35 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 36 |
+
โ
|
| 37 |
+
โผ
|
| 38 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 39 |
+
โ Runner (๋ฌ๋/์ค์ผ์คํธ๋ ์ดํฐ) โ
|
| 40 |
+
โ - ์คํ ๋ฃจํ ๊ด๋ฆฌ โ
|
| 41 |
+
โ - ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฐ ๋ผ์ฐํ
โ
|
| 42 |
+
โ - ์๋น์ค ์กฐ์จ โ
|
| 43 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 44 |
+
โ โ โ
|
| 45 |
+
โผ โผ โผ
|
| 46 |
+
โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ
|
| 47 |
+
โ SessionService โ โ MemoryService โ โ ArtifactService โ
|
| 48 |
+
โ (์ธ์
๊ด๋ฆฌ) โ โ (์ฅ๊ธฐ ๊ธฐ์ต) โ โ (ํ์ผ/๋ฐ์ดํฐ) โ
|
| 49 |
+
โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ
|
| 50 |
+
โ
|
| 51 |
+
โผ
|
| 52 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 53 |
+
โ Session (์ธ์
) โ
|
| 54 |
+
โ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
|
| 55 |
+
โ โ State โ โ Events โ โ Metadata (ID, User) โ โ
|
| 56 |
+
โ โ (์ํ) โ โ (์ด๋ฒคํธ๋ค) โ โ โ โ
|
| 57 |
+
โ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
|
| 58 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 59 |
+
โ
|
| 60 |
+
โผ
|
| 61 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 62 |
+
โ Agent (์์ด์ ํธ) โ
|
| 63 |
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
|
| 64 |
+
โ โ InvocationContext (ํธ์ถ ์ปจํ
์คํธ) โ โ
|
| 65 |
+
โ โ - session, state, services ์ ๊ทผ โ โ
|
| 66 |
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
|
| 67 |
+
โ โ โ
|
| 68 |
+
โ โโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโ โ
|
| 69 |
+
โ โผ โผ โผ โ
|
| 70 |
+
โ โโโโโโโโโโโ โโโโโโโโโโโ โโโโโโโโโโโ โ
|
| 71 |
+
โ โ Tools โ โ LLM โ โCallbacksโ โ
|
| 72 |
+
โ โ (๋๊ตฌ) โ โ (๋ชจ๋ธ) โ โ (์ฝ๋ฐฑ) โ โ
|
| 73 |
+
โ โโโโโโโโโโโ โโโโโโโโโโโ โโโโโโโโโโโ โ
|
| 74 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 75 |
+
```
|
| 76 |
+
|
| 77 |
+
---
|
| 78 |
+
|
| 79 |
+
## 2. Session (์ธ์
)
|
| 80 |
+
|
| 81 |
+
### ๊ฐ๋
|
| 82 |
+
|
| 83 |
+
**Session**์ ์ฌ์ฉ์์ ์์ด์ ํธ ๊ฐ์ **๋จ์ผ ๋ํ ์ค๋ ๋**๋ฅผ ๋ํ๋
๋๋ค.
|
| 84 |
+
์ ํ ํตํ์ ๋น์ ํ๋ฉด, ํ๋์ ํตํ๊ฐ ํ๋์ ์ธ์
์
๋๋ค.
|
| 85 |
+
|
| 86 |
+
### ์ฃผ์ ์์ฑ
|
| 87 |
+
|
| 88 |
+
```python
|
| 89 |
+
from google.adk.sessions import Session
|
| 90 |
+
|
| 91 |
+
# Session์ ์ฃผ์ ์์ฑ
|
| 92 |
+
session.id # ์ธ์
๊ณ ์ ID
|
| 93 |
+
session.app_name # ์ ํ๋ฆฌ์ผ์ด์
์ด๋ฆ
|
| 94 |
+
session.user_id # ์ฌ์ฉ์ ID
|
| 95 |
+
session.state # ์ํ ๋์
๋๋ฆฌ (State)
|
| 96 |
+
session.events # ์ด๋ฒคํธ ํ์คํ ๋ฆฌ ๋ฆฌ์คํธ
|
| 97 |
+
session.last_update_time # ๋ง์ง๋ง ์
๋ฐ์ดํธ ์๊ฐ
|
| 98 |
+
```
|
| 99 |
+
|
| 100 |
+
### SessionService
|
| 101 |
+
|
| 102 |
+
์ธ์
์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ ์๋น์ค์
๋๋ค.
|
| 103 |
+
|
| 104 |
+
```python
|
| 105 |
+
from google.adk.sessions import InMemorySessionService
|
| 106 |
+
|
| 107 |
+
# ์ธ์
์๋น์ค ์์ฑ
|
| 108 |
+
session_service = InMemorySessionService()
|
| 109 |
+
|
| 110 |
+
# ์ ์ธ์
์์ฑ
|
| 111 |
+
session = await session_service.create_session(
|
| 112 |
+
app_name="my_app",
|
| 113 |
+
user_id="user_123",
|
| 114 |
+
state={"initial_key": "initial_value"} # ์ด๊ธฐ ์ํ ์ค์ ๊ฐ๋ฅ
|
| 115 |
+
)
|
| 116 |
+
|
| 117 |
+
# ๊ธฐ์กด ์ธ์
์กฐํ
|
| 118 |
+
session = await session_service.get_session(
|
| 119 |
+
app_name="my_app",
|
| 120 |
+
user_id="user_123",
|
| 121 |
+
session_id="session_abc"
|
| 122 |
+
)
|
| 123 |
+
|
| 124 |
+
# ์ธ์
๋ชฉ๋ก ์กฐํ
|
| 125 |
+
sessions = await session_service.list_sessions(
|
| 126 |
+
app_name="my_app",
|
| 127 |
+
user_id="user_123"
|
| 128 |
+
)
|
| 129 |
+
|
| 130 |
+
# ์ธ์
์ญ์
|
| 131 |
+
await session_service.delete_session(
|
| 132 |
+
app_name="my_app",
|
| 133 |
+
user_id="user_123",
|
| 134 |
+
session_id="session_abc"
|
| 135 |
+
)
|
| 136 |
+
```
|
| 137 |
+
|
| 138 |
+
### SessionService ๊ตฌํ์ฒด ์ข
๋ฅ
|
| 139 |
+
|
| 140 |
+
| ๊ตฌํ์ฒด | ์ ์ฅ ์์น | ์์์ฑ | ์ฉ๋ |
|
| 141 |
+
| ------------------------ | ------------ | ---------------------- | ------------- |
|
| 142 |
+
| `InMemorySessionService` | ๋ฉ๋ชจ๋ฆฌ | โ (์ฑ ์ฌ์์ ์ ์๋ฉธ) | ๊ฐ๋ฐ/ํ
์คํธ |
|
| 143 |
+
| `DatabaseSessionService` | SQL DB | โ
| ํ๋ก๋์
|
|
| 144 |
+
| `VertexAISessionService` | Google Cloud | โ
| ํด๋ผ์ฐ๋ ๋ฐฐํฌ |
|
| 145 |
+
|
| 146 |
+
### ์ธ์
์๋ช
์ฃผ๊ธฐ
|
| 147 |
+
|
| 148 |
+
```
|
| 149 |
+
โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ
|
| 150 |
+
โ CREATE โ โโโถ โ UPDATE โ โโโถ โ DELETE โ
|
| 151 |
+
โ (์์ฑ) โ โ (์ด๋ฒคํธ ์ถ๊ฐ)โ โ (์ข
๋ฃ) โ
|
| 152 |
+
โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ
|
| 153 |
+
โ
|
| 154 |
+
โผ
|
| 155 |
+
โโโโโโโโโโโโโโโ
|
| 156 |
+
โ State โ
|
| 157 |
+
โ ๋ณ๊ฒฝ โ
|
| 158 |
+
โโโโโโโโโโโโโโโ
|
| 159 |
+
```
|
| 160 |
+
|
| 161 |
+
---
|
| 162 |
+
|
| 163 |
+
## 3. State (์ํ)
|
| 164 |
+
|
| 165 |
+
### ๊ฐ๋
|
| 166 |
+
|
| 167 |
+
**State**๋ ์ธ์
๋ด์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ **ํค-๊ฐ ์ ์ฅ์**์
๋๋ค.
|
| 168 |
+
์์ด์ ํธ์ "๋ฉ๋ชจ์ฅ" ์ญํ ์ ํ๋ฉฐ, ๋ํ ์ค ํ์ํ ์ ๋ณด๋ฅผ ๊ธฐ์ตํฉ๋๋ค.
|
| 169 |
+
|
| 170 |
+
### State์ ๋ฒ์ (Prefix)
|
| 171 |
+
|
| 172 |
+
ADK์์ State๋ **prefix**๋ก ๋ฒ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค:
|
| 173 |
+
|
| 174 |
+
| Prefix | ๋ฒ์ | ์ค๋ช
|
|
| 175 |
+
| ------- | ------------ | --------------------------------------------- |
|
| 176 |
+
| (์์) | ์ธ์
์ ์ฒด | ๊ธฐ๋ณธ๊ฐ, ์ธ์
๋์ ์ ์ง |
|
| 177 |
+
| `app:` | ์ ํ๋ฆฌ์ผ์ด์
| ๊ฐ์ ์ฑ์ ๋ชจ๋ ์ธ์
์์ ๊ณต์ |
|
| 178 |
+
| `user:` | ์ฌ์ฉ์ | ๊ฐ์ ์ฌ์ฉ์์ ๋ชจ๋ ์ธ์
์์ ๊ณต์ |
|
| 179 |
+
| `temp:` | ํ์ฌ ํธ์ถ | ํ์ฌ invocation์์๋ง ์ ์ง, ํธ์ถ ์ข
๋ฃ ์ ์ญ์ |
|
| 180 |
+
|
| 181 |
+
```python
|
| 182 |
+
# State ์ฌ์ฉ ์์
|
| 183 |
+
ctx.session.state["user_name"] = "ํ๊ธธ๋" # ์ธ์
๋ฒ์
|
| 184 |
+
ctx.session.state["app:settings"] = {"theme": "dark"} # ์ฑ ์ ์ฒด ๊ณต์
|
| 185 |
+
ctx.session.state["user:preferences"] = {"lang": "ko"} # ์ฌ์ฉ์ ๊ณต์
|
| 186 |
+
ctx.session.state["temp:current_step"] = 3 # ํ์ฌ ํธ์ถ๋ง
|
| 187 |
+
```
|
| 188 |
+
|
| 189 |
+
### State ์ฝ๊ธฐ/์ฐ๊ธฐ
|
| 190 |
+
|
| 191 |
+
#### 1. output_key๋ฅผ ํตํ ์๋ ์ ์ฅ (LlmAgent)
|
| 192 |
+
|
| 193 |
+
```python
|
| 194 |
+
from google.adk.agents import LlmAgent
|
| 195 |
+
|
| 196 |
+
# ์์ด์ ํธ ์๋ต์ด ์๋์ผ๋ก state['analysis_result']์ ์ ์ฅ๋จ
|
| 197 |
+
agent = LlmAgent(
|
| 198 |
+
name="Analyzer",
|
| 199 |
+
instruction="๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ์ธ์.",
|
| 200 |
+
output_key="analysis_result" # โ ์๋ ์ ์ฅ
|
| 201 |
+
)
|
| 202 |
+
```
|
| 203 |
+
|
| 204 |
+
#### 2. Instruction ํ
ํ๋ฆฟ์์ ์ฝ๊ธฐ
|
| 205 |
+
|
| 206 |
+
```python
|
| 207 |
+
agent = LlmAgent(
|
| 208 |
+
name="Reporter",
|
| 209 |
+
instruction="""
|
| 210 |
+
์ด์ ๋ถ์ ๊ฒฐ๊ณผ: {analysis_result}
|
| 211 |
+
์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก ๋ณด๊ณ ์๋ฅผ ์์ฑํ์ธ์.
|
| 212 |
+
""" # โ {key} ํ์์ผ๋ก ์๋ ์ฃผ์
|
| 213 |
+
)
|
| 214 |
+
```
|
| 215 |
+
|
| 216 |
+
#### 3. Tool/Callback์์ ์ง์ ์ ๊ทผ
|
| 217 |
+
|
| 218 |
+
```python
|
| 219 |
+
from google.adk.tools import ToolContext
|
| 220 |
+
|
| 221 |
+
def my_tool(context: ToolContext, query: str) -> dict:
|
| 222 |
+
# ์ฝ๊ธฐ
|
| 223 |
+
user_name = context.state.get("user_name", "Unknown")
|
| 224 |
+
|
| 225 |
+
# ์ฐ๊ธฐ (์๋์ผ๋ก state_delta์ ์ถ์ ๋จ)
|
| 226 |
+
context.state["last_query"] = query
|
| 227 |
+
context.state["query_count"] = context.state.get("query_count", 0) + 1
|
| 228 |
+
|
| 229 |
+
return {"result": f"Hello {user_name}, processed: {query}"}
|
| 230 |
+
```
|
| 231 |
+
|
| 232 |
+
### โ ๏ธ State ์์ ์ ์ฃผ์์ฌํญ
|
| 233 |
+
|
| 234 |
+
```python
|
| 235 |
+
# โ ์๋ชป๋ ๋ฐฉ๋ฒ: ์ธ์
๊ฐ์ฒด ์ง์ ์์
|
| 236 |
+
session = await session_service.get_session(...)
|
| 237 |
+
session.state["key"] = "value" # ์ถ์ ๋์ง ์์!
|
| 238 |
+
|
| 239 |
+
# โ
์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ: Context๋ฅผ ํตํด ์์
|
| 240 |
+
def my_callback(context: CallbackContext):
|
| 241 |
+
context.state["key"] = "value" # ์๋ ์ถ์ ๋จ
|
| 242 |
+
```
|
| 243 |
+
|
| 244 |
+
---
|
| 245 |
+
|
| 246 |
+
## 4. Event (์ด๋ฒคํธ)
|
| 247 |
+
|
| 248 |
+
### ๊ฐ๋
|
| 249 |
+
|
| 250 |
+
**Event**๋ ์ธ์
๋ด์์ ๋ฐ์ํ๋ **๋ชจ๋ ํ๋์ ๊ธฐ๋ก ๋จ์**์
๋๋ค.
|
| 251 |
+
์ฌ์ฉ์ ๋ฉ์์ง, ์์ด์ ํธ ์๋ต, ๋๊ตฌ ํธ์ถ, ์ํ ๋ณ๊ฒฝ ๋ฑ ๋ชจ๋ ๊ฒ์ด ์ด๋ฒคํธ์
๋๋ค.
|
| 252 |
+
|
| 253 |
+
### Event ๊ตฌ์กฐ
|
| 254 |
+
|
| 255 |
+
```python
|
| 256 |
+
from google.adk.events import Event, EventActions
|
| 257 |
+
|
| 258 |
+
event = Event(
|
| 259 |
+
# ์๋ณ ์ ๋ณด
|
| 260 |
+
id="event_123", # ๊ณ ์ ID
|
| 261 |
+
invocation_id="inv_456", # ์์ invocation ID
|
| 262 |
+
author="MyAgent", # ์์ฑ์ (์์ด์ ํธ๋ช
)
|
| 263 |
+
|
| 264 |
+
# ๋ด์ฉ
|
| 265 |
+
content=types.Content( # ์ค์ ๋ฉ์์ง/๋ฐ์ดํฐ
|
| 266 |
+
parts=[types.Part(text="์๋
ํ์ธ์!")]
|
| 267 |
+
),
|
| 268 |
+
|
| 269 |
+
# ์ก์
/๋ณ๊ฒฝ์ฌํญ
|
| 270 |
+
actions=EventActions(
|
| 271 |
+
state_delta={"key": "value"}, # ์ํ ๋ณ๊ฒฝ
|
| 272 |
+
artifact_delta={}, # ์ํฐํฉํธ ๋ณ๊ฒฝ
|
| 273 |
+
escalate=False, # ๋ฃจํ ์ข
๋ฃ ์ ํธ
|
| 274 |
+
transfer_to_agent="OtherAgent", # ์์ด์ ํธ ์ ํ
|
| 275 |
+
),
|
| 276 |
+
|
| 277 |
+
# ๋ฉํ๋ฐ์ดํฐ
|
| 278 |
+
timestamp=1234567890.0,
|
| 279 |
+
partial=False, # ์คํธ๋ฆฌ๋ฐ ์ค๊ฐ ๊ฒฐ๊ณผ ์ฌ๋ถ
|
| 280 |
+
)
|
| 281 |
+
```
|
| 282 |
+
|
| 283 |
+
### Event ์ ํ
|
| 284 |
+
|
| 285 |
+
| ์ ํ | ์ค๋ช
| ์๋ณ ๋ฐฉ๋ฒ |
|
| 286 |
+
| ------------- | -------------------- | -------------------------------- |
|
| 287 |
+
| ์ฌ์ฉ์ ๋ฉ์์ง | ์ฌ์ฉ์ ์
๋ ฅ | `event.content.role == "user"` |
|
| 288 |
+
| ํ
์คํธ ์๋ต | ์์ด์ ํธ ํ
์คํธ ์๋ต | `event.content.parts[0].text` |
|
| 289 |
+
| ๋๊ตฌ ํธ์ถ | LLM์ด ๋๊ตฌ ํธ์ถ ์์ฒญ | `event.get_function_calls()` |
|
| 290 |
+
| ๋๊ตฌ ๊ฒฐ๊ณผ | ๋๊ตฌ ์คํ ๊ฒฐ๊ณผ | `event.get_function_responses()` |
|
| 291 |
+
| ์ํ ๋ณ๊ฒฝ | State ์
๋ฐ์ดํธ | `event.actions.state_delta` |
|
| 292 |
+
| ์คํธ๋ฆฌ๋ฐ ์ฒญํฌ | ๋ถ๋ถ ์๋ต | `event.partial == True` |
|
| 293 |
+
|
| 294 |
+
### EventActions
|
| 295 |
+
|
| 296 |
+
์ด๋ฒคํธ์ ์ฐ๊ฒฐ๋ **๋ถ์ ํจ๊ณผ(side effects)**๋ฅผ ์ ์ํฉ๋๋ค:
|
| 297 |
+
|
| 298 |
+
```python
|
| 299 |
+
from google.adk.events import EventActions
|
| 300 |
+
|
| 301 |
+
actions = EventActions(
|
| 302 |
+
# ์ํ ๋ณ๊ฒฝ
|
| 303 |
+
state_delta={"new_key": "new_value"},
|
| 304 |
+
|
| 305 |
+
# ๋ฃจํ ์ข
๋ฃ ์ ํธ (LoopAgent์์ ์ฌ์ฉ)
|
| 306 |
+
escalate=True,
|
| 307 |
+
|
| 308 |
+
# ์์ด์ ํธ ์ ํ (LLM Transfer)
|
| 309 |
+
transfer_to_agent="TargetAgentName",
|
| 310 |
+
|
| 311 |
+
# ์ํฐํฉํธ(ํ์ผ) ๋ณ๊ฒฝ
|
| 312 |
+
artifact_delta={"file.txt": "content"},
|
| 313 |
+
)
|
| 314 |
+
```
|
| 315 |
+
|
| 316 |
+
### Event ์ฒ๋ฆฌ ํ๋ฆ
|
| 317 |
+
|
| 318 |
+
```
|
| 319 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 320 |
+
โ Event ์์ฑ ๋ฐ ์ฒ๋ฆฌ ํ๋ฆ โ
|
| 321 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 322 |
+
|
| 323 |
+
1. Event ์์ฑ
|
| 324 |
+
Agent/Tool/Callback โ yield Event(...)
|
| 325 |
+
|
| 326 |
+
2. Runner ์์
|
| 327 |
+
Runner๊ฐ ์ด๋ฒคํธ๋ฅผ ๋ฐ์
|
| 328 |
+
|
| 329 |
+
3. SessionService ์ฒ๋ฆฌ
|
| 330 |
+
- state_delta๋ฅผ session.state์ ๋ณํฉ
|
| 331 |
+
- artifact_delta ์ฒ๋ฆฌ
|
| 332 |
+
- events ํ์คํ ๋ฆฌ์ ์ถ๊ฐ
|
| 333 |
+
|
| 334 |
+
4. ํด๋ผ์ด์ธํธ ์ ๋ฌ
|
| 335 |
+
- UI/API๋ก ์ด๋ฒคํธ ์คํธ๋ฆฌ๋ฐ
|
| 336 |
+
```
|
| 337 |
+
|
| 338 |
+
---
|
| 339 |
+
|
| 340 |
+
## 5. Context (์ปจํ
์คํธ)
|
| 341 |
+
|
| 342 |
+
### ๊ฐ๋
|
| 343 |
+
|
| 344 |
+
**Context**๋ ํ์ฌ ์คํ ์ํฉ์ ๋ํ **๋ชจ๋ ์ ๋ณด๋ฅผ ๋ด์ ์ปจํ
์ด๋**์
๋๋ค.
|
| 345 |
+
์์ด์ ํธ, ๋๊ตฌ, ์ฝ๋ฐฑ์ด ์คํ๋ ๋ ํ์ํ ๋ชจ๋ ์ ๋ณด์ ์ ๊ทผํ ์ ์๊ฒ ํฉ๋๋ค.
|
| 346 |
+
|
| 347 |
+
### Context ์ ํ
|
| 348 |
+
|
| 349 |
+
#### 1. InvocationContext (ํธ์ถ ์ปจํ
์คํธ)
|
| 350 |
+
|
| 351 |
+
๊ฐ์ฅ ์์ ๋ ๋ฒจ์ ์ปจํ
์คํธ๋ก, ํ๋์ ์ฌ์ฉ์ ์์ฒญ ์ฒ๋ฆฌ ์ ์ฒด๋ฅผ ๊ด์ฅํฉ๋๋ค.
|
| 352 |
+
|
| 353 |
+
```python
|
| 354 |
+
from google.adk.agents import BaseAgent
|
| 355 |
+
from google.adk.agents.invocation_context import InvocationContext
|
| 356 |
+
|
| 357 |
+
class MyAgent(BaseAgent):
|
| 358 |
+
async def _run_async_impl(self, ctx: InvocationContext):
|
| 359 |
+
# ์ธ์
์ ๋ณด ์ ๊ทผ
|
| 360 |
+
session_id = ctx.session.id
|
| 361 |
+
user_id = ctx.session.user_id
|
| 362 |
+
|
| 363 |
+
# ์ํ ์ ๊ทผ
|
| 364 |
+
state_value = ctx.session.state.get("key")
|
| 365 |
+
|
| 366 |
+
# ์๋น์ค ์ ๊ทผ
|
| 367 |
+
memory_service = ctx.memory_service
|
| 368 |
+
artifact_service = ctx.artifact_service
|
| 369 |
+
|
| 370 |
+
# ํ์ฌ ์์ด์ ํธ ์ ๋ณด
|
| 371 |
+
agent_name = ctx.agent.name
|
| 372 |
+
|
| 373 |
+
# ํธ์ถ ์ ์ด
|
| 374 |
+
ctx.end_invocation = True # ํธ์ถ ์ข
๋ฃ ์ ํธ
|
| 375 |
+
|
| 376 |
+
yield Event(author=self.name, content=...)
|
| 377 |
+
```
|
| 378 |
+
|
| 379 |
+
#### 2. CallbackContext (์ฝ๋ฐฑ ์ปจํ
์คํธ)
|
| 380 |
+
|
| 381 |
+
์ฝ๋ฐฑ ํจ์์์ ์ฌ์ฉ๋๋ฉฐ, InvocationContext์ ์๋ธ์
์
๋๋ค.
|
| 382 |
+
|
| 383 |
+
```python
|
| 384 |
+
from google.adk.agents.callback_context import CallbackContext
|
| 385 |
+
|
| 386 |
+
def my_before_agent_callback(ctx: CallbackContext):
|
| 387 |
+
# ์์ด์ ํธ ์ ๋ณด
|
| 388 |
+
agent_name = ctx.agent_name
|
| 389 |
+
invocation_id = ctx.invocation_id
|
| 390 |
+
|
| 391 |
+
# ์ํ ์ฝ๊ธฐ/์ฐ๊ธฐ
|
| 392 |
+
ctx.state["processed"] = True
|
| 393 |
+
|
| 394 |
+
# ์ฌ์ฉ์ ์
๋ ฅ ํ์ธ
|
| 395 |
+
user_content = ctx.user_content
|
| 396 |
+
|
| 397 |
+
return None # ๊ณ์ ์งํ (๋๋ Content ๋ฐํ ์ ์์ด์ ํธ ๊ฑด๋๋)
|
| 398 |
+
```
|
| 399 |
+
|
| 400 |
+
#### 3. ToolContext (๋๊ตฌ ์ปจํ
์คํธ)
|
| 401 |
+
|
| 402 |
+
๋๊ตฌ(Tool) ํจ์์์ ์ฌ์ฉ๋๋ฉฐ, ๋๊ตฌ ์คํ์ ํ์ํ ์ถ๊ฐ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
|
| 403 |
+
|
| 404 |
+
```python
|
| 405 |
+
from google.adk.tools import ToolContext
|
| 406 |
+
|
| 407 |
+
def my_tool(context: ToolContext, query: str) -> dict:
|
| 408 |
+
# ์ํ ์ ๊ทผ (CallbackContext์ ๋์ผ)
|
| 409 |
+
context.state["last_query"] = query
|
| 410 |
+
|
| 411 |
+
# ๋๊ตฌ ์ ์ฉ ๊ธฐ๋ฅ
|
| 412 |
+
function_call_id = context.function_call_id # ํ์ฌ ํจ์ ํธ์ถ ID
|
| 413 |
+
|
| 414 |
+
# ๋ฉ๋ชจ๋ฆฌ ๊ฒ์
|
| 415 |
+
results = await context.search_memory("๊ฒ์์ด")
|
| 416 |
+
|
| 417 |
+
# ์ํฐํฉํธ ๋ชฉ๋ก
|
| 418 |
+
artifacts = context.list_artifacts()
|
| 419 |
+
|
| 420 |
+
# ์ธ์ฆ ์์ฒญ (OAuth ๋ฑ)
|
| 421 |
+
credential = await context.get_auth_response(auth_config)
|
| 422 |
+
|
| 423 |
+
return {"result": "success"}
|
| 424 |
+
```
|
| 425 |
+
|
| 426 |
+
### Context ๊ณ์ธต ๊ตฌ์กฐ
|
| 427 |
+
|
| 428 |
+
```
|
| 429 |
+
InvocationContext (์ต์์)
|
| 430 |
+
โโโ session
|
| 431 |
+
โ โโโ state
|
| 432 |
+
โ โโโ events
|
| 433 |
+
โโโ agent (ํ์ฌ ์์ด์ ํธ)
|
| 434 |
+
โโโ services (memory, artifact, session)
|
| 435 |
+
โโโ invocation_id
|
| 436 |
+
|
| 437 |
+
โผ ํ์
|
| 438 |
+
|
| 439 |
+
CallbackContext (์ฝ๋ฐฑ์ฉ)
|
| 440 |
+
โโโ state (์ฝ๊ธฐ/์ฐ๊ธฐ)
|
| 441 |
+
โโโ agent_name
|
| 442 |
+
โโโ user_content
|
| 443 |
+
โโโ invocation_id
|
| 444 |
+
|
| 445 |
+
โผ ํ์ฅ
|
| 446 |
+
|
| 447 |
+
ToolContext (๋๊ตฌ์ฉ)
|
| 448 |
+
โโโ (CallbackContext์ ๋ชจ๋ ๊ฒ)
|
| 449 |
+
โโโ function_call_id
|
| 450 |
+
โโโ search_memory()
|
| 451 |
+
โโโ list_artifacts()
|
| 452 |
+
โโโ request_credential()
|
| 453 |
+
```
|
| 454 |
+
|
| 455 |
+
---
|
| 456 |
+
|
| 457 |
+
## 6. Runner (๋ฌ๋)
|
| 458 |
+
|
| 459 |
+
### ๊ฐ๋
|
| 460 |
+
|
| 461 |
+
**Runner**๋ ์์ด์ ํธ ์คํ์ **์ค์ ์ค์ผ์คํธ๋ ์ดํฐ**์
๋๋ค.
|
| 462 |
+
์ฌ์ฉ์ ์
๋ ฅ์ ๋ฐ์ ์์ด์ ํธ๋ฅผ ์คํํ๊ณ , ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ฉฐ, ์๋น์ค๋ค์ ์กฐ์จํฉ๋๋ค.
|
| 463 |
+
|
| 464 |
+
### ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
|
| 465 |
+
|
| 466 |
+
```python
|
| 467 |
+
from google.adk.runners import InMemoryRunner, Runner
|
| 468 |
+
from google.adk.sessions import InMemorySessionService
|
| 469 |
+
|
| 470 |
+
# ๋ฐฉ๋ฒ 1: InMemoryRunner (๊ฐ๋จํ ํ
์คํธ์ฉ)
|
| 471 |
+
runner = InMemoryRunner(
|
| 472 |
+
agent=my_agent,
|
| 473 |
+
app_name="my_app"
|
| 474 |
+
)
|
| 475 |
+
|
| 476 |
+
# ๋ฐฉ๋ฒ 2: Runner (์ปค์คํฐ๋ง์ด์ง ํ์ ์)
|
| 477 |
+
session_service = InMemorySessionService()
|
| 478 |
+
runner = Runner(
|
| 479 |
+
agent=my_agent,
|
| 480 |
+
app_name="my_app",
|
| 481 |
+
session_service=session_service,
|
| 482 |
+
# memory_service=my_memory_service, # ์ต์
|
| 483 |
+
# artifact_service=my_artifact_service, # ์ต์
|
| 484 |
+
)
|
| 485 |
+
```
|
| 486 |
+
|
| 487 |
+
### ์์ด์ ํธ ์คํ
|
| 488 |
+
|
| 489 |
+
```python
|
| 490 |
+
# ๋น๋๊ธฐ ์คํ (์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ)
|
| 491 |
+
async for event in runner.run_async(
|
| 492 |
+
user_id="user_123",
|
| 493 |
+
session_id="session_456", # ์ ์ธ์
์ด๋ฉด ์๋ ์์ฑ
|
| 494 |
+
new_message="์๋
ํ์ธ์!"
|
| 495 |
+
):
|
| 496 |
+
if event.content and event.content.parts:
|
| 497 |
+
for part in event.content.parts:
|
| 498 |
+
if hasattr(part, 'text') and part.text:
|
| 499 |
+
print(f"[{event.author}]: {part.text}")
|
| 500 |
+
|
| 501 |
+
# ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ (์์ฑ/์์)
|
| 502 |
+
async for event in runner.run_live(...):
|
| 503 |
+
...
|
| 504 |
+
```
|
| 505 |
+
|
| 506 |
+
### Runner ์คํ ํ๋ฆ
|
| 507 |
+
|
| 508 |
+
```
|
| 509 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 510 |
+
โ Runner.run_async() ํ๋ฆ โ
|
| 511 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 512 |
+
|
| 513 |
+
1. ์ธ์
์ค๋น
|
| 514 |
+
โโโโโโโโโโโโโโโโโโโ
|
| 515 |
+
โ get/create โ โ ์ธ์
์กฐํ ๋๋ ์์ฑ
|
| 516 |
+
โ Session โ
|
| 517 |
+
โโโโโโโโโโโโโโโโโโโ
|
| 518 |
+
โ
|
| 519 |
+
โผ
|
| 520 |
+
2. ์ฌ์ฉ์ ๋ฉ์์ง๋ฅผ ์ด๋ฒคํธ๋ก ์ถ๊ฐ
|
| 521 |
+
โโโโโโโโโโโโโโโโโโโ
|
| 522 |
+
โ append_event โ โ ์ฌ์ฉ์ ์
๋ ฅ์ ์ธ์
ํ์คํ ๋ฆฌ์ ์ถ๊ฐ
|
| 523 |
+
โ (user message) โ
|
| 524 |
+
โโโโโโโโโโโโโโโโโโโ
|
| 525 |
+
โ
|
| 526 |
+
โผ
|
| 527 |
+
3. InvocationContext ์์ฑ
|
| 528 |
+
โโโโโโโโโโโโโโโโโโโ
|
| 529 |
+
โ Create โ โ ์คํ์ ํ์ํ ๋ชจ๋ ์ ๋ณด ์ค๋น
|
| 530 |
+
โ InvocationContextโ
|
| 531 |
+
โโโโโโโโโโโโโโโโโโโ
|
| 532 |
+
๏ฟฝ๏ฟฝ
|
| 533 |
+
โผ
|
| 534 |
+
4. ์์ด์ ํธ ์คํ ๋ฃจํ
|
| 535 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 536 |
+
โ โโโโโโโโโโโโโโโโโโโ โ
|
| 537 |
+
โ โ Agent.run() โ โ ์์ด์ ํธ ์คํ โ
|
| 538 |
+
โ โโโโโโโโโโโโโโโโโโโ โ
|
| 539 |
+
โ โ โ
|
| 540 |
+
โ โผ โ
|
| 541 |
+
โ โโโโโโโโโโโโโโโโโโโ โ
|
| 542 |
+
โ โ yield Event โ โ ์ด๋ฒคํธ ์์ฑ โ
|
| 543 |
+
โ โโโโโโโโโโโโโโโโโโโ โ
|
| 544 |
+
โ โ โ
|
| 545 |
+
โ โผ โ
|
| 546 |
+
โ โโโโโโโโโโโโโโโโโโโ โ
|
| 547 |
+
โ โ Process Event โ โ ์ด๋ฒคํธ ์ฒ๋ฆฌ โ
|
| 548 |
+
โ โ - state_delta โ (์ํ ์
๋ฐ์ดํธ ๋ฑ) โ
|
| 549 |
+
โ โ - append to โ โ
|
| 550 |
+
โ โ session โ โ
|
| 551 |
+
โ โโโโโโโโโโโโโโโโโโโ โ
|
| 552 |
+
โ โ โ
|
| 553 |
+
โ โผ โ
|
| 554 |
+
โ โโโโโโโโโโโโโโโโโโโ โ
|
| 555 |
+
โ โ yield to caller โ โ ํธ์ถ์์๊ฒ ์ ๋ฌ โ
|
| 556 |
+
โ โโโโโโโโโโโโโโโโโโโ โ
|
| 557 |
+
โ โ โ
|
| 558 |
+
โ โผ โ
|
| 559 |
+
โ [๋ ๋ง์ ์ด๋ฒคํธ?] โโYesโโโถ (๋ฐ๋ณต) โ
|
| 560 |
+
โ โ โ
|
| 561 |
+
โ No โ
|
| 562 |
+
โ โ โ
|
| 563 |
+
โโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 564 |
+
โ
|
| 565 |
+
โผ
|
| 566 |
+
5. ์คํ ์๋ฃ
|
| 567 |
+
```
|
| 568 |
+
|
| 569 |
+
### Invocation vs Agent Call vs Step
|
| 570 |
+
|
| 571 |
+
```
|
| 572 |
+
Invocation (ํธ์ถ)
|
| 573 |
+
โ ์ฌ์ฉ์ ๋ฉ์์ง โ ์ต์ข
์๋ต๊น์ง์ ์ ์ฒด ์ฌ์ดํด
|
| 574 |
+
โ
|
| 575 |
+
โโโ Agent Call 1 (์์ด์ ํธ ํธ์ถ)
|
| 576 |
+
โ โ ํ๋์ ์์ด์ ํธ๊ฐ ์คํ๋๋ ๋จ์
|
| 577 |
+
โ โ
|
| 578 |
+
โ โโโ Step 1 (์คํ
)
|
| 579 |
+
โ โ โโโ LLM ํธ์ถ 1ํ + ๋๊ตฌ ์คํ
|
| 580 |
+
โ โ
|
| 581 |
+
โ โโโ Step 2
|
| 582 |
+
โ โ โโโ LLM ํธ์ถ 1ํ + ๋๊ตฌ ์คํ
|
| 583 |
+
โ โ
|
| 584 |
+
โ โโโ (transfer_to_agent ๋ฐ์)
|
| 585 |
+
โ
|
| 586 |
+
โโโ Agent Call 2 (๋ค๋ฅธ ์์ด์ ํธ๋ก ์ ํ)
|
| 587 |
+
โ โ
|
| 588 |
+
โ โโโ Step 1
|
| 589 |
+
โ โ โโโ LLM ํธ์ถ + ์ต์ข
์๋ต
|
| 590 |
+
โ โ
|
| 591 |
+
โ โโโ (์๋ฃ)
|
| 592 |
+
โ
|
| 593 |
+
โโโ Invocation ์ข
๋ฃ
|
| 594 |
+
```
|
| 595 |
+
|
| 596 |
+
---
|
| 597 |
+
|
| 598 |
+
## 7. Memory (๋ฉ๋ชจ๋ฆฌ)
|
| 599 |
+
|
| 600 |
+
### ๊ฐ๋
|
| 601 |
+
|
| 602 |
+
**Memory**๋ **์ฅ๊ธฐ ๊ธฐ์ต ์ ์ฅ์**์
๋๋ค.
|
| 603 |
+
์ธ์
์ด ์ข
๋ฃ๋ ํ์๋ ์ ์ง๋๋ฉฐ, ์ฌ๋ฌ ์ธ์
์ ๊ฑธ์ณ ์ ๋ณด๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค.
|
| 604 |
+
|
| 605 |
+
### Session State vs Memory ๋น๊ต
|
| 606 |
+
|
| 607 |
+
| ํน์ฑ | Session State | Memory |
|
| 608 |
+
| --------- | ------------------------ | --------------- |
|
| 609 |
+
| ๋ฒ์ | ํ์ฌ ์ธ์
๋ด | ์ฌ๋ฌ ์ธ์
๊ฑธ์ณ |
|
| 610 |
+
| ์๋ช
| ์ธ์
์ข
๋ฃ ์ (๋ณดํต) ์ญ์ | ์๊ตฌ ์ ์ฅ |
|
| 611 |
+
| ์ ๊ทผ ๋ฐฉ์ | Key-Value ์ง์ ์ ๊ทผ | ๊ฒ์ ์ฟผ๋ฆฌ |
|
| 612 |
+
| ์ฉ๋ | ๋ํ ์ค ์์ ๋ฐ์ดํฐ | ๊ณผ๊ฑฐ ์ ๋ณด ์ฐธ์กฐ |
|
| 613 |
+
| ๋น์ | ๋ํ ์ค ๋ฉ๋ชจ์ฅ | ๋์๊ด ์์นด์ด๋ธ |
|
| 614 |
+
|
| 615 |
+
### MemoryService ์ฌ์ฉ
|
| 616 |
+
|
| 617 |
+
```python
|
| 618 |
+
from google.adk.memory import InMemoryMemoryService
|
| 619 |
+
|
| 620 |
+
# ๋ฉ๋ชจ๋ฆฌ ์๋น์ค ์์ฑ
|
| 621 |
+
memory_service = InMemoryMemoryService()
|
| 622 |
+
|
| 623 |
+
# ์ธ์
์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ (๋ํ ์ข
๋ฃ ํ)
|
| 624 |
+
await memory_service.add_session_to_memory(session)
|
| 625 |
+
|
| 626 |
+
# ๋ฉ๋ชจ๋ฆฌ ๊ฒ์
|
| 627 |
+
results = await memory_service.search_memory(
|
| 628 |
+
app_name="my_app",
|
| 629 |
+
user_id="user_123",
|
| 630 |
+
query="์ด์ ์ ์ถ์ฒ๋ฐ์ ์์์ "
|
| 631 |
+
)
|
| 632 |
+
|
| 633 |
+
for result in results.memories:
|
| 634 |
+
print(result.content)
|
| 635 |
+
```
|
| 636 |
+
|
| 637 |
+
### MemoryService ๊ตฌํ์ฒด
|
| 638 |
+
|
| 639 |
+
| ๊ตฌํ์ฒด | ์ ์ฅ ๋ฐฉ์ | ๊ฒ์ ๋ฐฉ์ | ์ฉ๋ |
|
| 640 |
+
| --------------------------- | --------- | ----------- | ----------- |
|
| 641 |
+
| `InMemoryMemoryService` | ๋ฉ๋ชจ๋ฆฌ | ํค์๋ ๋งค์นญ | ๊ฐ๋ฐ/ํ
์คํธ |
|
| 642 |
+
| `VertexAIMemoryBankService` | Vertex AI | ์๋งจํฑ ๊ฒ์ | ํ๋ก๋์
|
|
| 643 |
+
|
| 644 |
+
### ๋ฉ๋ชจ๋ฆฌ ์ํฌํ๋ก์ฐ
|
| 645 |
+
|
| 646 |
+
```
|
| 647 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 648 |
+
โ Memory ์ํฌํ๋ก์ฐ โ
|
| 649 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ๏ฟฝ๏ฟฝ๏ฟฝโโโโโโโโโโโโโโโ
|
| 650 |
+
|
| 651 |
+
1. ์ธ์
๋ํ ์งํ
|
| 652 |
+
User โ Agent (Session์ Events ์ถ์ )
|
| 653 |
+
|
| 654 |
+
2. ์ธ์
์ข
๋ฃ ์ ๋ฉ๋ชจ๋ฆฌ ์ ์ฅ
|
| 655 |
+
memory_service.add_session_to_memory(session)
|
| 656 |
+
โโโ ์ธ์
์ ์ฃผ์ ์ ๋ณด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ
|
| 657 |
+
|
| 658 |
+
3. ์ดํ ์ธ์
์์ ๋ฉ๋ชจ๋ฆฌ ๊ฒ์
|
| 659 |
+
results = memory_service.search_memory(query)
|
| 660 |
+
โโโ ๊ณผ๊ฑฐ ๋ํ์์ ๊ด๋ จ ์ ๋ณด ๊ฒ์
|
| 661 |
+
|
| 662 |
+
4. ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ฌ ๋ํ์ ํ์ฉ
|
| 663 |
+
Agent๊ฐ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ๊ณ ํ์ฌ ์๋ต
|
| 664 |
+
```
|
| 665 |
+
|
| 666 |
+
### ์์ด์ ํธ์์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
|
| 667 |
+
|
| 668 |
+
```python
|
| 669 |
+
from google.adk.tools import preload_memory_tool
|
| 670 |
+
|
| 671 |
+
# ๋ฉ๋ชจ๋ฆฌ ๊ฒ์ ๋๊ตฌ ์ถ๊ฐ
|
| 672 |
+
agent = LlmAgent(
|
| 673 |
+
name="MemoryAgent",
|
| 674 |
+
instruction="์ฌ์ฉ์์ ๊ณผ๊ฑฐ ๋ํ๋ฅผ ์ฐธ๊ณ ํ์ฌ ๋ต๋ณํ์ธ์.",
|
| 675 |
+
tools=[preload_memory_tool.PreloadMemoryTool()]
|
| 676 |
+
)
|
| 677 |
+
|
| 678 |
+
# ์ธ์
์ข
๋ฃ ์ ์๋ ์ ์ฅ ์ฝ๋ฐฑ
|
| 679 |
+
async def auto_save_to_memory(callback_context):
|
| 680 |
+
await callback_context._invocation_context.memory_service.add_session_to_memory(
|
| 681 |
+
callback_context._invocation_context.session
|
| 682 |
+
)
|
| 683 |
+
|
| 684 |
+
agent = LlmAgent(
|
| 685 |
+
name="AutoSaveAgent",
|
| 686 |
+
after_agent_callback=auto_save_to_memory
|
| 687 |
+
)
|
| 688 |
+
```
|
| 689 |
+
|
| 690 |
+
---
|
| 691 |
+
|
| 692 |
+
## 8. Callbacks (์ฝ๋ฐฑ)
|
| 693 |
+
|
| 694 |
+
### ๊ฐ๋
|
| 695 |
+
|
| 696 |
+
**Callback**์ ์์ด์ ํธ ์คํ ์ค **ํน์ ์์ ์ ๊ฐ์
**ํ ์ ์๋ ํ
(hook)์
๋๋ค.
|
| 697 |
+
๊ฐ๋๋ ์ผ, ๋ก๊น
, ์์ ๋ฑ ๋ค์ํ ์ฉ๋๋ก ์ฌ์ฉ๋ฉ๋๋ค.
|
| 698 |
+
|
| 699 |
+
### ์ฝ๋ฐฑ ์ข
๋ฅ ๋ฐ ์คํ ์์
|
| 700 |
+
|
| 701 |
+
```
|
| 702 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 703 |
+
โ ์ฝ๋ฐฑ ์คํ ์์ โ
|
| 704 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 705 |
+
|
| 706 |
+
์ฌ์ฉ์ ์
๋ ฅ
|
| 707 |
+
โ
|
| 708 |
+
โผ
|
| 709 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 710 |
+
โ before_agent_callback โ โ ์์ด์ ํธ ์คํ ์
|
| 711 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 712 |
+
โ
|
| 713 |
+
โผ
|
| 714 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 715 |
+
โ before_model_callback โ โ LLM ํธ์ถ ์
|
| 716 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 717 |
+
โ
|
| 718 |
+
โผ
|
| 719 |
+
[LLM ํธ์ถ]
|
| 720 |
+
โ
|
| 721 |
+
โผ
|
| 722 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 723 |
+
โ after_model_callback โ โ LLM ์๋ต ํ
|
| 724 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 725 |
+
โ
|
| 726 |
+
โผ
|
| 727 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 728 |
+
โ before_tool_callback โ โ ๋๊ตฌ ์คํ ์
|
| 729 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 730 |
+
โ
|
| 731 |
+
โผ
|
| 732 |
+
[๋๊ตฌ ์คํ]
|
| 733 |
+
โ
|
| 734 |
+
โผ
|
| 735 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 736 |
+
โ after_tool_callback โ โ ๋๊ตฌ ์คํ ํ
|
| 737 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 738 |
+
โ
|
| 739 |
+
โผ
|
| 740 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 741 |
+
โ after_agent_callback โ โ ์์ด์ ํธ ์คํ ํ
|
| 742 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 743 |
+
โ
|
| 744 |
+
โผ
|
| 745 |
+
์ต์ข
์๋ต
|
| 746 |
+
```
|
| 747 |
+
|
| 748 |
+
### ์ฝ๋ฐฑ ์ ์ ๋ฐ ์ฌ์ฉ
|
| 749 |
+
|
| 750 |
+
#### before_agent_callback
|
| 751 |
+
|
| 752 |
+
```python
|
| 753 |
+
from google.adk.agents import LlmAgent
|
| 754 |
+
from google.adk.agents.callback_context import CallbackContext
|
| 755 |
+
from google.genai import types
|
| 756 |
+
|
| 757 |
+
def check_access(ctx: CallbackContext) -> types.Content | None:
|
| 758 |
+
"""์์ด์ ํธ ์คํ ์ ์ ๊ทผ ์ ์ด"""
|
| 759 |
+
user_id = ctx.session.user_id
|
| 760 |
+
|
| 761 |
+
# ์ฐจ๋จํ ์ฌ์ฉ์ ์ฒดํฌ
|
| 762 |
+
if user_id in BLOCKED_USERS:
|
| 763 |
+
# Content ๋ฐํ ์ ์์ด์ ํธ ์คํ ๊ฑด๋๋
|
| 764 |
+
return types.Content(
|
| 765 |
+
parts=[types.Part(text="์ ๊ทผ์ด ๊ฑฐ๋ถ๋์์ต๋๋ค.")]
|
| 766 |
+
)
|
| 767 |
+
|
| 768 |
+
# None ๋ฐํ ์ ์ ์ ์งํ
|
| 769 |
+
return None
|
| 770 |
+
|
| 771 |
+
agent = LlmAgent(
|
| 772 |
+
name="SecureAgent",
|
| 773 |
+
before_agent_callback=check_access
|
| 774 |
+
)
|
| 775 |
+
```
|
| 776 |
+
|
| 777 |
+
#### before_model_callback (๊ฐ๋๋ ์ผ)
|
| 778 |
+
|
| 779 |
+
```python
|
| 780 |
+
from google.adk.models import LlmRequest, LlmResponse
|
| 781 |
+
|
| 782 |
+
def content_guardrail(ctx: CallbackContext, request: LlmRequest) -> LlmResponse | None:
|
| 783 |
+
"""LLM ํธ์ถ ์ ์
๋ ฅ ๊ฒ์ฌ"""
|
| 784 |
+
user_text = ctx.user_content.parts[0].text
|
| 785 |
+
|
| 786 |
+
# ๊ธ์ง์ด ์ฒดํฌ
|
| 787 |
+
if any(word in user_text for word in FORBIDDEN_WORDS):
|
| 788 |
+
return LlmResponse(
|
| 789 |
+
content=types.Content(
|
| 790 |
+
parts=[types.Part(text="๋ถ์ ์ ํ ๋ด์ฉ์ด ๊ฐ์ง๋์์ต๋๋ค.")]
|
| 791 |
+
)
|
| 792 |
+
)
|
| 793 |
+
|
| 794 |
+
# ํ๋กฌํํธ ์์
|
| 795 |
+
# request.contents๋ฅผ ์์ ํ์ฌ ์์คํ
์ง์ ์ถ๊ฐ ๊ฐ๋ฅ
|
| 796 |
+
|
| 797 |
+
return None # ์ ์ ์งํ
|
| 798 |
+
|
| 799 |
+
agent = LlmAgent(
|
| 800 |
+
name="GuardedAgent",
|
| 801 |
+
before_model_callback=content_guardrail
|
| 802 |
+
)
|
| 803 |
+
```
|
| 804 |
+
|
| 805 |
+
#### after_model_callback
|
| 806 |
+
|
| 807 |
+
```python
|
| 808 |
+
def post_process_response(ctx: CallbackContext, response: LlmResponse) -> LlmResponse | None:
|
| 809 |
+
"""LLM ์๋ต ํ์ฒ๋ฆฌ"""
|
| 810 |
+
# ์๋ต ๋ก๊น
|
| 811 |
+
print(f"LLM Response: {response.content}")
|
| 812 |
+
|
| 813 |
+
# ์๋ต ์์ (ํ์์)
|
| 814 |
+
# return modified_response
|
| 815 |
+
|
| 816 |
+
return None # ์๋ณธ ์๋ต ์ ์ง
|
| 817 |
+
|
| 818 |
+
agent = LlmAgent(
|
| 819 |
+
name="LoggingAgent",
|
| 820 |
+
after_model_callback=post_process_response
|
| 821 |
+
)
|
| 822 |
+
```
|
| 823 |
+
|
| 824 |
+
#### before_tool_callback / after_tool_callback
|
| 825 |
+
|
| 826 |
+
```python
|
| 827 |
+
def tool_guardrail(ctx: ToolContext, tool_name: str, args: dict) -> dict | None:
|
| 828 |
+
"""๋๊ตฌ ์คํ ์ ๊ฒ์ฌ"""
|
| 829 |
+
if tool_name == "delete_file" and not ctx.state.get("admin"):
|
| 830 |
+
return {"error": "๊ถํ์ด ์์ต๋๋ค."} # ๋๊ตฌ ์คํ ๊ฑด๋๋
|
| 831 |
+
return None
|
| 832 |
+
|
| 833 |
+
def log_tool_result(ctx: ToolContext, tool_name: str, result: dict) -> dict | None:
|
| 834 |
+
"""๋๊ตฌ ์คํ ํ ๋ก๊น
"""
|
| 835 |
+
print(f"Tool {tool_name} returned: {result}")
|
| 836 |
+
return None # ๊ฒฐ๊ณผ ์ ์ง
|
| 837 |
+
|
| 838 |
+
agent = LlmAgent(
|
| 839 |
+
name="ToolAuditAgent",
|
| 840 |
+
before_tool_callback=tool_guardrail,
|
| 841 |
+
after_tool_callback=log_tool_result
|
| 842 |
+
)
|
| 843 |
+
```
|
| 844 |
+
|
| 845 |
+
### ์ฝ๋ฐฑ ๋ฐํ๊ฐ์ ์๋ฏธ
|
| 846 |
+
|
| 847 |
+
| ์ฝ๋ฐฑ | ๋ฐํ๊ฐ | ํจ๊ณผ |
|
| 848 |
+
| ------------ | ------------- | ------------------------------------ |
|
| 849 |
+
| before_agent | `None` | ์์ด์ ํธ ์ ์ ์คํ |
|
| 850 |
+
| before_agent | `Content` | ์์ด์ ํธ ๊ฑด๋๋, ๋ฐํ๋ Content ์ฌ์ฉ |
|
| 851 |
+
| before_model | `None` | LLM ์ ์ ํธ์ถ |
|
| 852 |
+
| before_model | `LlmResponse` | LLM ํธ์ถ ๊ฑด๋๋, ๋ฐํ๋ ์๋ต ์ฌ์ฉ |
|
| 853 |
+
| before_tool | `None` | ๋๊ตฌ ์ ์ ์คํ |
|
| 854 |
+
| before_tool | `dict` | ๋๊ตฌ ์คํ ๊ฑด๋๋, ๋ฐํ๋ ๊ฒฐ๊ณผ ์ฌ์ฉ |
|
| 855 |
+
|
| 856 |
+
---
|
| 857 |
+
|
| 858 |
+
## 9. Tools (๋๊ตฌ)
|
| 859 |
+
|
| 860 |
+
### ๊ฐ๋
|
| 861 |
+
|
| 862 |
+
**Tool**์ ์์ด์ ํธ์๊ฒ **์ธ๋ถ ๊ธฐ๋ฅ์ ์ ๊ณต**ํ๋ ์ปดํฌ๋ํธ์
๋๋ค.
|
| 863 |
+
API ํธ์ถ, ๊ณ์ฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ ๋ฑ์ ์ํํ ์ ์์ต๋๋ค.
|
| 864 |
+
|
| 865 |
+
### Tool ์ ํ
|
| 866 |
+
|
| 867 |
+
#### 1. FunctionTool (ํจ์ ๋๊ตฌ)
|
| 868 |
+
|
| 869 |
+
Python ํจ์๋ฅผ ๋๊ตฌ๋ก ๋ณํํฉ๋๋ค.
|
| 870 |
+
|
| 871 |
+
```python
|
| 872 |
+
from google.adk.tools import FunctionTool
|
| 873 |
+
|
| 874 |
+
def get_weather(city: str, unit: str = "celsius") -> dict:
|
| 875 |
+
"""
|
| 876 |
+
ํน์ ๋์์ ๋ ์จ๋ฅผ ์กฐํํฉ๋๋ค.
|
| 877 |
+
|
| 878 |
+
Args:
|
| 879 |
+
city: ์กฐํํ ๋์ ์ด๋ฆ
|
| 880 |
+
unit: ์จ๋ ๋จ์ (celsius ๋๋ fahrenheit)
|
| 881 |
+
|
| 882 |
+
Returns:
|
| 883 |
+
๋ ์จ ์ ๋ณด ๋์
๋๋ฆฌ
|
| 884 |
+
"""
|
| 885 |
+
# ์ค์ API ํธ์ถ ๋๋ ์๋ฎฌ๋ ์ด์
|
| 886 |
+
return {"city": city, "temp": 20, "unit": unit}
|
| 887 |
+
|
| 888 |
+
# ํจ์๋ฅผ ๋๊ตฌ๋ก ๋ณํ
|
| 889 |
+
weather_tool = FunctionTool(func=get_weather)
|
| 890 |
+
|
| 891 |
+
# ์์ด์ ํธ์ ๋๊ตฌ ์ถ๊ฐ
|
| 892 |
+
agent = LlmAgent(
|
| 893 |
+
name="WeatherAgent",
|
| 894 |
+
tools=[weather_tool]
|
| 895 |
+
)
|
| 896 |
+
```
|
| 897 |
+
|
| 898 |
+
#### 2. AgentTool (์์ด์ ํธ๋ฅผ ๋๊ตฌ๋ก)
|
| 899 |
+
|
| 900 |
+
๋ค๋ฅธ ์์ด์ ํธ๋ฅผ ๋๊ตฌ์ฒ๋ผ ํธ์ถํ ์ ์์ต๋๋ค.
|
| 901 |
+
|
| 902 |
+
```python
|
| 903 |
+
from google.adk.tools import agent_tool
|
| 904 |
+
|
| 905 |
+
# ์ ๋ฌธ ์์ด์ ํธ ์ ์
|
| 906 |
+
translator = LlmAgent(
|
| 907 |
+
name="Translator",
|
| 908 |
+
description="ํ
์คํธ๋ฅผ ๋ฒ์ญํฉ๋๋ค."
|
| 909 |
+
)
|
| 910 |
+
|
| 911 |
+
# ์์ด์ ํธ๋ฅผ ๋๊ตฌ๋ก ๋ํ
|
| 912 |
+
translator_tool = agent_tool.AgentTool(agent=translator)
|
| 913 |
+
|
| 914 |
+
# ๋ค๋ฅธ ์์ด์ ํธ์์ ๋๊ตฌ๋ก ์ฌ์ฉ
|
| 915 |
+
main_agent = LlmAgent(
|
| 916 |
+
name="MainAgent",
|
| 917 |
+
tools=[translator_tool]
|
| 918 |
+
)
|
| 919 |
+
```
|
| 920 |
+
|
| 921 |
+
### ToolContext ํ์ฉ
|
| 922 |
+
|
| 923 |
+
๋๊ตฌ ํจ์ ๋ด์์ Context์ ์ ๊ทผํ์ฌ ๋ค์ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
|
| 924 |
+
|
| 925 |
+
```python
|
| 926 |
+
from google.adk.tools import ToolContext
|
| 927 |
+
|
| 928 |
+
def advanced_tool(context: ToolContext, query: str) -> dict:
|
| 929 |
+
# 1. ์ํ ์ฝ๊ธฐ/์ฐ๊ธฐ
|
| 930 |
+
context.state["last_query"] = query
|
| 931 |
+
previous = context.state.get("history", [])
|
| 932 |
+
|
| 933 |
+
# 2. ๋ฉ๋ชจ๋ฆฌ ๊ฒ์
|
| 934 |
+
memory_results = await context.search_memory(query)
|
| 935 |
+
|
| 936 |
+
# 3. ์ํฐํฉํธ ๋ชฉ๋ก ์กฐํ
|
| 937 |
+
artifacts = context.list_artifacts()
|
| 938 |
+
|
| 939 |
+
# 4. ์ธ์ฆ ์ฒ๋ฆฌ
|
| 940 |
+
if needs_auth:
|
| 941 |
+
cred = await context.get_auth_response(oauth_config)
|
| 942 |
+
|
| 943 |
+
return {"result": "processed"}
|
| 944 |
+
```
|
| 945 |
+
|
| 946 |
+
### ๋๊ตฌ ์คํ ํ๋ฆ
|
| 947 |
+
|
| 948 |
+
```
|
| 949 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 950 |
+
โ ๋๊ตฌ ์คํ ํ๋ฆ โ
|
| 951 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 952 |
+
|
| 953 |
+
1. LLM์ด ๋๊ตฌ ํธ์ถ ๊ฒฐ์
|
| 954 |
+
LLM Response: FunctionCall(name="get_weather", args={"city": "์์ธ"})
|
| 955 |
+
|
| 956 |
+
2. ADK๊ฐ ๋๊ตฌ ์ฐพ๊ธฐ
|
| 957 |
+
tools ๋ชฉ๋ก์์ "get_weather" ์ฐพ์
|
| 958 |
+
|
| 959 |
+
3. before_tool_callback ์คํ (์์ผ๋ฉด)
|
| 960 |
+
๊ฐ๋๋ ์ผ, ๋ก๊น
๋ฑ
|
| 961 |
+
|
| 962 |
+
4. ๋๊ตฌ ํจ์ ์คํ
|
| 963 |
+
result = get_weather(city="์์ธ")
|
| 964 |
+
|
| 965 |
+
5. after_tool_callback ์คํ (์์ผ๋ฉด)
|
| 966 |
+
๊ฒฐ๊ณผ ํ์ฒ๋ฆฌ, ๋ก๊น
๋ฑ
|
| 967 |
+
|
| 968 |
+
6. FunctionResponse ์ด๋ฒคํธ ์์ฑ
|
| 969 |
+
Event(content=FunctionResponse(name="get_weather", response=result))
|
| 970 |
+
|
| 971 |
+
7. LLM์๊ฒ ๊ฒฐ๊ณผ ์ ๋ฌ
|
| 972 |
+
LLM์ด ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ๋ค์ ์๋ต ์์ฑ
|
| 973 |
+
```
|
| 974 |
+
|
| 975 |
+
---
|
| 976 |
+
|
| 977 |
+
## 10. ํต์ฌ ๊ฐ๋
๊ฐ์ ๊ด๊ณ
|
| 978 |
+
|
| 979 |
+
### ์ ์ฒด ๊ด๊ณ๋
|
| 980 |
+
|
| 981 |
+
```
|
| 982 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโ๏ฟฝ๏ฟฝ๏ฟฝโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 983 |
+
โ ADK ํต์ฌ ๊ฐ๋
๊ด๊ณ๋ โ
|
| 984 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 985 |
+
|
| 986 |
+
โโโโโโโโโโโโโโโโโโโโโโโ
|
| 987 |
+
โ Runner โ
|
| 988 |
+
โ (์ค์ผ์คํธ๋ ์ดํฐ) โ
|
| 989 |
+
โโโโโโโโโโโโโโโโโโโโโโโ
|
| 990 |
+
โ
|
| 991 |
+
โโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโ
|
| 992 |
+
โผ โผ โผ
|
| 993 |
+
โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ
|
| 994 |
+
โ SessionSvc โ โ MemorySvc โ โ ArtifactSvc โ
|
| 995 |
+
โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ
|
| 996 |
+
โ โ
|
| 997 |
+
โผ โ
|
| 998 |
+
โโโโโโโโโโโโโโโโโโโ โ
|
| 999 |
+
โ Session โ โ
|
| 1000 |
+
โ โโโโโโโโโโโโโ โ โ
|
| 1001 |
+
โ โ State โโโโผโโโโโโโผโโโโ ์์ด์ ํธ๊ฐ ์ฝ๊ณ /์
|
| 1002 |
+
โ โโโโโโโโโโโโโ โ โ
|
| 1003 |
+
โ โโโโโโโโโโโโโ โ โ
|
| 1004 |
+
โ โ Events โ โ โ
|
| 1005 |
+
โ โโโโโโโโโโโโโ โ โ
|
| 1006 |
+
โโโโโโโโโโโโโโโโโโโ โ
|
| 1007 |
+
โ โ
|
| 1008 |
+
โผ โผ
|
| 1009 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 1010 |
+
โ InvocationContext โ
|
| 1011 |
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
|
| 1012 |
+
โ โ session, state, services, agent โ โ
|
| 1013 |
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
|
| 1014 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 1015 |
+
โ
|
| 1016 |
+
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโ
|
| 1017 |
+
โผ โผ โผ
|
| 1018 |
+
โโโโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ
|
| 1019 |
+
โ Callbacks โ โ Agent โ โ Tools โ
|
| 1020 |
+
โ โ โ โ โ โ
|
| 1021 |
+
โ Callback โ โ โ โ Tool โ
|
| 1022 |
+
โ Context โ โ โ โ Context โ
|
| 1023 |
+
โโโโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ
|
| 1024 |
+
โ โ โ
|
| 1025 |
+
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโ
|
| 1026 |
+
โผ
|
| 1027 |
+
โโโโโโโโโโโโโโ
|
| 1028 |
+
โ Event โ
|
| 1029 |
+
โ โโโโโโโโ โ
|
| 1030 |
+
โ โActionsโ โโโถ state_delta
|
| 1031 |
+
โ โโโโโโโโ โ escalate
|
| 1032 |
+
โโโโโโโโโโโโโโ transfer
|
| 1033 |
+
```
|
| 1034 |
+
|
| 1035 |
+
### ๋ฐ์ดํฐ ํ๋ฆ ์์ฝ
|
| 1036 |
+
|
| 1037 |
+
```
|
| 1038 |
+
1. ์ฌ์ฉ์ ์
๋ ฅ
|
| 1039 |
+
โโโโถ Runner.run_async(message)
|
| 1040 |
+
|
| 1041 |
+
2. ์ธ์
์ค๋น
|
| 1042 |
+
โโโโถ SessionService.get_session() โ Session
|
| 1043 |
+
|
| 1044 |
+
3. ์ปจํ
์คํธ ์์ฑ
|
| 1045 |
+
โโโโถ InvocationContext(session, services, ...)
|
| 1046 |
+
|
| 1047 |
+
4. ์ฝ๋ฐฑ ์คํ
|
| 1048 |
+
โโโโถ before_agent_callback(CallbackContext)
|
| 1049 |
+
|
| 1050 |
+
5. ์์ด์ ํธ ์คํ
|
| 1051 |
+
โโโโถ Agent.run(InvocationContext)
|
| 1052 |
+
โ
|
| 1053 |
+
โโโโถ before_model_callback
|
| 1054 |
+
โโโโถ LLM ํธ์ถ
|
| 1055 |
+
โโโโถ after_model_callback
|
| 1056 |
+
โ
|
| 1057 |
+
โโโโถ [๋๊ตฌ ํธ์ถ ์]
|
| 1058 |
+
โ โโโโถ before_tool_callback
|
| 1059 |
+
โ โโโโถ Tool ์คํ(ToolContext)
|
| 1060 |
+
โ โโโโถ after_tool_callback
|
| 1061 |
+
โ
|
| 1062 |
+
โโโโถ yield Event
|
| 1063 |
+
|
| 1064 |
+
6. ์ด๋ฒคํธ ์ฒ๋ฆฌ
|
| 1065 |
+
โโโโถ SessionService.append_event(event)
|
| 1066 |
+
โโโโถ state_delta ์ ์ฉ
|
| 1067 |
+
โโโโถ events ํ์คํ ๋ฆฌ ์ถ๊ฐ
|
| 1068 |
+
|
| 1069 |
+
7. ์ฝ๋ฐฑ ์คํ
|
| 1070 |
+
โโโโถ after_agent_callback(CallbackContext)
|
| 1071 |
+
|
| 1072 |
+
8. ๊ฒฐ๊ณผ ๋ฐํ
|
| 1073 |
+
โโโโถ yield event to caller
|
| 1074 |
+
```
|
| 1075 |
+
|
| 1076 |
+
### ํต์ฌ ํฌ์ธํธ ์ ๋ฆฌ
|
| 1077 |
+
|
| 1078 |
+
| ๊ฐ๋
| ์ญํ | ๋น์ |
|
| 1079 |
+
| ------------ | -------------- | ------------------- |
|
| 1080 |
+
| **Session** | ๋ํ ์ปจํ
์ด๋ | ์ ํ ํตํ ํ ๊ฑด |
|
| 1081 |
+
| **State** | ๋ํ ์ค ๋ฉ๋ชจ | ๋ฉ๋ชจ์ฅ/์คํฌ๋์นํจ๋ |
|
| 1082 |
+
| **Event** | ํ๋ ๊ธฐ๋ก ๋จ์ | ๋ํ ๊ธฐ๋ก์ ํ ์ค |
|
| 1083 |
+
| **Context** | ์คํ ์ ๋ณด ๋ฌถ์ | ์
๋ฌด ๋ฌธ๋งฅ/๋ฐฐ๊ฒฝ ์ ๋ณด |
|
| 1084 |
+
| **Runner** | ์คํ ์กฐ์จ์ | ์งํ์ |
|
| 1085 |
+
| **Memory** | ์ฅ๊ธฐ ๊ธฐ์ต | ๋์๊ด ์์นด์ด๋ธ |
|
| 1086 |
+
| **Callback** | ์คํ ์ค ๊ฐ์
์ | ์ฒดํฌํฌ์ธํธ/๊ด๋ฌธ |
|
| 1087 |
+
| **Tool** | ์ธ๋ถ ๊ธฐ๋ฅ | ๋๊ตฌ ์์ |
|
| 1088 |
+
|
| 1089 |
+
---
|
| 1090 |
+
|
| 1091 |
+
## ๋ถ๋ก: ์์ฃผ ๋ฌป๋ ์ง๋ฌธ (FAQ)
|
| 1092 |
+
|
| 1093 |
+
### Q1: State์ Memory์ ์ฐจ์ด๋?
|
| 1094 |
+
|
| 1095 |
+
- **State**: ํ์ฌ ์ธ์
๋ด์์๋ง ์ ํจ, ํค-๊ฐ ์ง์ ์ ๊ทผ
|
| 1096 |
+
- **Memory**: ์ฌ๋ฌ ์ธ์
์ ๊ฑธ์ณ ์ ์ง, ๊ฒ์ ์ฟผ๋ฆฌ๋ก ์ ๊ทผ
|
| 1097 |
+
|
| 1098 |
+
### Q2: output_key๊ฐ ์์ผ๋ฉด ์ด๋ป๊ฒ ๋๋์?
|
| 1099 |
+
|
| 1100 |
+
์์ด์ ํธ์ ์๋ต์ด state์ ์๋ ์ ์ฅ๋์ง ์์ต๋๋ค.
|
| 1101 |
+
๋ค์ ์์ด์ ํธ์์ ์ด์ ์๋ต์ ์ฐธ์กฐํ๋ ค๋ฉด output_key๋ฅผ ์ค์ ํ๊ฑฐ๋,
|
| 1102 |
+
์ง์ ์ฝ๋ฐฑ/๋๊ตฌ์์ state๋ฅผ ์
๋ฐ์ดํธํด์ผ ํฉ๋๋ค.
|
| 1103 |
+
|
| 1104 |
+
### Q3: InMemorySessionService๋ ํ๋ก๋์
์์ ์ธ ์ ์๋์?
|
| 1105 |
+
|
| 1106 |
+
๊ถ์ฅํ์ง ์์ต๋๋ค. ์ฑ ์ฌ์์ ์ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์์ค๋ฉ๋๋ค.
|
| 1107 |
+
ํ๋ก๋์
์์๋ Database-backed ๋๋ Cloud-based ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ์ธ์.
|
| 1108 |
+
|
| 1109 |
+
### Q4: ์ฝ๋ฐฑ์์ Content๋ฅผ ๋ฐํํ๋ฉด ๋ฌด์จ ์ผ์ด ์ผ์ด๋๋์?
|
| 1110 |
+
|
| 1111 |
+
before_agent_callback์์ Content๋ฅผ ๋ฐํํ๋ฉด ์์ด์ ํธ ์คํ์ด ๊ฑด๋๋ฐ์ด์ง๊ณ ,
|
| 1112 |
+
๋ฐํ๋ Content๊ฐ ์์ด์ ํธ์ ์๋ต์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
|
| 1113 |
+
์ด๋ฅผ ํตํด ์กฐ๊ฑด๋ถ ๋จ์ถ(short-circuit)์ ๊ตฌํํ ์ ์์ต๋๋ค.
|
| 1114 |
+
|
| 1115 |
+
### Q5: LoopAgent์ escalate๋ ์ด๋ป๊ฒ ๋์ํ๋์?
|
| 1116 |
+
|
| 1117 |
+
sub_agent๊ฐ Event๋ฅผ ์์ฑํ ๋ `actions=EventActions(escalate=True)`๋ฅผ ์ค์ ํ๋ฉด,
|
| 1118 |
+
LoopAgent๊ฐ ์ด๋ฅผ ๊ฐ์งํ๊ณ ์ฆ์ ๋ฃจํ๋ฅผ ์ข
๋ฃํฉ๋๋ค.
|
| 1119 |
+
max_iterations์ ๋๋ฌํ๊ธฐ ์ ์ ์กฐ๊ฑด๋ถ๋ก ์ข
๋ฃํ ๋ ์ฌ์ฉํฉ๋๋ค.
|
| 1120 |
+
|
| 1121 |
+
---
|
| 1122 |
+
|
| 1123 |
+
## ์ฐธ๊ณ ์๋ฃ
|
| 1124 |
+
|
| 1125 |
+
- [ADK ๊ณต์ ๋ฌธ์](https://google.github.io/adk-docs/)
|
| 1126 |
+
- [ADK GitHub (Python)](https://github.com/google/adk-python)
|
| 1127 |
+
- [Vertex AI Agent Engine](https://cloud.google.com/vertex-ai/docs/agents)
|
docs/agent-architecture.md
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Agent Architecture
|
| 2 |
+
|
| 3 |
+
## ๊ฐ์
|
| 4 |
+
|
| 5 |
+
ํ์ฌ ๋ฉ๊ตฌ๋ฐ ์ฑ๋ด์ ์๋ ํ๋ฆ์ผ๋ก ๋์ํฉ๋๋ค.
|
| 6 |
+
|
| 7 |
+
1. `bootstrap.py`์์ ํ๊ฒฝ๋ณ์์ ๋ฐํ์ ๋ฐ์ดํฐ ๊ฒฝ๋ก๋ฅผ ์ค๋น
|
| 8 |
+
2. `retrieval.py`์์ FAISS ์ธ๋ฑ์ค์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ก๋
|
| 9 |
+
3. `agent.py`์์ Google ADK `LlmAgent`์ retrieval tool ๊ตฌ์ฑ
|
| 10 |
+
4. `chat.py`์์ ์ธ์
์คํ๊ณผ ๋ํ ์์ฝ ๊ด๋ฆฌ
|
| 11 |
+
5. `app_gradio.py`์์ PC์ฉ ์ฑํ
UI ์ ๊ณต
|
| 12 |
+
|
| 13 |
+
## ํ์ผ๋ณ ์ญํ
|
| 14 |
+
|
| 15 |
+
### `megumin_agent/bootstrap.py`
|
| 16 |
+
|
| 17 |
+
- `.env` ๋ก๋
|
| 18 |
+
- ๋ก์ปฌ `adk-python/src` ๊ฒฝ๋ก ๋ฑ๋ก
|
| 19 |
+
- Hugging Face dataset repo์์ ๋ฐ์ดํฐ ํ์ผ ๋ค์ด๋ก๋
|
| 20 |
+
- ๋ค์ด๋ก๋ ์คํจ ์ ๋ก์ปฌ `data/processed`๋ฅผ fallback์ผ๋ก ์ฌ์ฉ
|
| 21 |
+
|
| 22 |
+
๋ค์ด๋ก๋ ๋์:
|
| 23 |
+
|
| 24 |
+
- `megumin_qa_dataset.json`
|
| 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/retrieval.py`
|
| 34 |
+
|
| 35 |
+
- QA JSON ๋ ์ฝ๋ ๋ก๋
|
| 36 |
+
- Gemini ์๋ฒ ๋ฉ ๊ธฐ๋ฐ FAISS ๊ฒ์
|
| 37 |
+
- question-only ์ธ๋ฑ์ค์ question+answer ์ธ๋ฑ์ค๋ฅผ ๋ ๋ค ์กฐํ
|
| 38 |
+
- ๋ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ํฉ์ณ ์ ์๊ฐ ๋์ ํ๋ณด top-k๋ฅผ ๋ฐํ
|
| 39 |
+
|
| 40 |
+
๋ฐ์ดํฐ ๊ณ์ธต:
|
| 41 |
+
|
| 42 |
+
- ํ๋ฅด์๋ ๊ณ์ธต: `megumin_qa_dataset.json`
|
| 43 |
+
- ์ฌ์ค ๊ณ์ธต: `namuwiki_qa.json`
|
| 44 |
+
|
| 45 |
+
### `megumin_agent/agent.py`
|
| 46 |
+
|
| 47 |
+
- ๋ฉ๊ตฌ๋ฐ ํ๋ฅด์๋ ํ๋กฌํํธ ์ ์
|
| 48 |
+
- `retrieve_megumin_examples` tool ์ ์
|
| 49 |
+
- ํ๋ฅด์๋์ฉ top-3, ์ฌ์ค์ฉ top-3๋ฅผ ๊ฐ๊ฐ ์์ง
|
| 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 |
+
- `Runner`์ `InMemorySessionService` ์์ฑ
|
| 62 |
+
- ์ง๋ฌธ 1ํ ์คํ ๋จ์์ธ `chat_once()` ์ ๊ณต
|
| 63 |
+
- ์ต๊ทผ 6ํด์ ๋จ๊ธฐ๊ณ , ๊ทธ ์ด์ ๋ํ๋ `conversation_summary`๋ก ์์ถ
|
| 64 |
+
|
| 65 |
+
### `app_gradio.py`
|
| 66 |
+
|
| 67 |
+
- PC์ฉ 3ํจ๋ ๋ ์ด์์ ์ ๊ณต
|
| 68 |
+
- ์ผ์ชฝ: ๋ฉ๊ตฌ๋ฐ ํ๋กํ, ํ๋ฅด์๋ ์ค๋ช
, ์์ ์ง๋ฌธ
|
| 69 |
+
- ๊ฐ์ด๋ฐ: ๋ฐํฌ๋ช
์ฑํ
ํจ๋
|
| 70 |
+
- ์ค๋ฅธ์ชฝ: ๋ฉ๊ตฌ๋ฐ ๋น์ฃผ์ผ ํจ๋
|
| 71 |
+
- ๋ฐฐ๊ฒฝ์๋ ํ๋ฆฟํ ๋ฉ๊ตฌ๋ฐ ์ผ๋ฌ์คํธ์ ํญ๋ ฌ ๋ถ์๊ธฐ ๋ ์ด์ด๋ฅผ ๋ฐฐ์น
|
| 72 |
+
|
| 73 |
+
### `app.py`
|
| 74 |
+
|
| 75 |
+
- Hugging Face Spaces ์ง์
์
|
| 76 |
+
- `app_gradio.py`์ `demo`๋ฅผ ๊ทธ๋๋ก ๋ก๋
|
| 77 |
+
|
| 78 |
+
## ๋ํ ํ๋ฆ
|
| 79 |
+
|
| 80 |
+
์ฌ์ฉ์ ์
๋ ฅ์ด ๋ค์ด์ค๋ฉด:
|
| 81 |
+
|
| 82 |
+
1. `app_gradio.py`๊ฐ `chat_once()` ํธ์ถ
|
| 83 |
+
2. `chat.py`๊ฐ ADK Runner๋ก ์ธ์
์คํ
|
| 84 |
+
3. `agent.py`์ tool์ด retrieval ์ํ
|
| 85 |
+
4. `retrieval.py`๊ฐ
|
| 86 |
+
- ํ๋ฅด์๋ ๋ฐ์ดํฐ top-3
|
| 87 |
+
- ์ฌ์ค ๋ฐ์ดํฐ top-3
|
| 88 |
+
๋ฅผ ๊ฐ๊ฐ ๊ฒ์
|
| 89 |
+
5. Agent๊ฐ ๋ ์ข
๋ฅ์ ๊ทผ๊ฑฐ๋ฅผ ํจ๊ป ์ฐธ๊ณ ํด ๋ฉ๊ตฌ๋ฐ ๋งํฌ๋ก ๋ต๋ณ
|
| 90 |
+
6. ์ธ์
์ข
๋ฃ ํ ์ค๋๋ ์ด๋ฒคํธ๋ฅผ ์์ฝ ์ํ๋ก ์์ถ
|
| 91 |
+
|
| 92 |
+
## ์ธ์
๊ณผ ๋ฉ๋ชจ๋ฆฌ
|
| 93 |
+
|
| 94 |
+
ํ์ฌ ์ ์ฅ ๋ฐฉ์์ `InMemorySessionService`์
๋๋ค.
|
| 95 |
+
|
| 96 |
+
- ์๋ฒ ํ๋ก์ธ์ค๊ฐ ์ด์ ์๋ ๋์๋ง ์ ์ง
|
| 97 |
+
- ์ฌ์์ ์ ์ด๊ธฐํ
|
| 98 |
+
- ์ต๊ทผ 6ํด๋ง ์ ์ง
|
| 99 |
+
- ์ค๋๋ ๋ด์ฉ์ ์งง์ summary๋ก state์ ๋จ๊น
|
| 100 |
+
|
| 101 |
+
## UI ๋ชฉ์
|
| 102 |
+
|
| 103 |
+
ํ์ฌ UI๋ ๋ชจ๋ฐ์ผ ์ ์ฉ์ด ์๋๋ผ PC ํ๋ฉด ๊ธฐ์ค์
๋๋ค.
|
| 104 |
+
|
| 105 |
+
- ์บ๋ฆญํฐ์ ์ค์ ๋ก ๋ง์ฃผ ๋ณด๊ณ ๋ํํ๋ ๋๋
|
| 106 |
+
- ๋ฐํฌ๋ช
์ ๋ฆฌ ํจ๋ ์ค์ฌ ๊ตฌ์ฑ
|
| 107 |
+
- ๋ฉ๊ตฌ๋ฐ ์ธ๊ณ๊ด๊ณผ ์ฑ๋ด ์ฌ์ฉ๋ฒ์ ํ ํ๋ฉด์์ ์๋ด
|
| 108 |
+
|
docs/data-collection-spec.md
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Data Collection Spec
|
| 2 |
+
|
| 3 |
+
## ๊ฐ์
|
| 4 |
+
|
| 5 |
+
์ด ํ๋ก์ ํธ๋ ๋ฉ๊ตฌ๋ฐ ์ฑ๋ด์ RAG ์์์ ๋ ๊ณ์ธต์ผ๋ก ๊ด๋ฆฌํ๋ค.
|
| 6 |
+
|
| 7 |
+
- ์คํ์ผ/ํ๋ฅด์๋์ฉ ๋ฐ์ดํฐ
|
| 8 |
+
- ์: `megumin_qa_dataset.json`
|
| 9 |
+
- ์ฌ์ค/์ค์ ์ฉ ๋ฐ์ดํฐ
|
| 10 |
+
- ์: `namuwiki_qa.json`
|
| 11 |
+
|
| 12 |
+
์ฌ์ค/์ค์ ์ฉ ๋ฐ์ดํฐ๋ ๋๋ฌด์ํค ๋ฌธ์๋ฅผ ์ ๋ณ ์์งํด QA JSON์ผ๋ก ๋ณํํ๊ณ , ์ดํ FAISS ์ธ๋ฑ์ค๋ก ๊ฒ์ํ๋ค.
|
| 13 |
+
|
| 14 |
+
## ์์ง ๋์
|
| 15 |
+
|
| 16 |
+
๋๋ฌด์ํค ๋ฌธ์๋ ๋ณ์นญ์ผ๋ก ์
๋ ฅํ ์ ์์ผ๋ฉฐ, ์ค์ ๊ฒ์ ์์๋ ์ ์ ๋ฌธ์๋ช
์ผ๋ก ๋ณํํ๋ค.
|
| 17 |
+
|
| 18 |
+
์:
|
| 19 |
+
|
| 20 |
+
- `์นด์ฆ๋ง` -> `์ฌํ ์นด์ฆ๋ง`
|
| 21 |
+
- `์์ฟ ์` -> `์์ฟ ์(์ด ๋ฉ์ง ์ธ๊ณ์ ์ถ๋ณต์!)`
|
| 22 |
+
- `๋คํฌ๋์ค` -> `๋คํฌ๋์ค(์ด ๋ฉ์ง ์ธ๊ณ์ ์ถ๋ณต์!)`
|
| 23 |
+
- `์ธ๊ณ๊ด` -> `์ด ๋ฉ์ง ์ธ๊ณ์ ์ถ๋ณต์!/์ค์ `
|
| 24 |
+
- `์ง์ญ` -> `์ด ๋ฉ์ง ์ธ๊ณ์ ์ถ๋ณต์!/์ง์ญ`
|
| 25 |
+
|
| 26 |
+
์ ์ฅ ์ `source.title`์ ์งง์ ํ์๋ช
์ผ๋ก ์ ๊ทํํ๋ค.
|
| 27 |
+
|
| 28 |
+
์:
|
| 29 |
+
|
| 30 |
+
- `์ฌํ ์นด์ฆ๋ง` -> `์นด์ฆ๋ง`
|
| 31 |
+
- `์์ฟ ์(์ด ๋ฉ์ง ์ธ๊ณ์ ์ถ๋ณต์!)` -> `์์ฟ ์`
|
| 32 |
+
- `์ด ๋ฉ์ง ์ธ๊ณ์ ์ถ๋ณต์!/์ค์ ` -> `์ธ๊ณ๊ด`
|
| 33 |
+
- `์ด ๋ฉ์ง ์ธ๊ณ์ ์ถ๋ณต์!/์ง์ญ` -> `์ธ๊ณ๊ด`
|
| 34 |
+
|
| 35 |
+
## ๋ณํ ๊ท์น
|
| 36 |
+
|
| 37 |
+
- ์ถ๋ ฅ ํฌ๋งท์ QA JSON ์ ์ง
|
| 38 |
+
- `question`์ ์ฌ์ฉ์ ์ง๋ฌธํ์ด ์๋๋ผ ๊ฒ์์ฉ ์์ ๋ชฉ ์์ฝ
|
| 39 |
+
- `answer`๋ ์ค๋ฆฝ ์์ฝํ ๋ณธ๋ฌธ
|
| 40 |
+
- ํ, ์ด๋ฏธ์ง, ๋ถํ์ํ ์ฅ์ ์์๋ ์ ์ธ
|
| 41 |
+
- chunk ๊ธธ์ด๋ ์ฝ 200์ ๋ด์ธ
|
| 42 |
+
- chunk overlap์ 1~2๋ฌธ์ฅ
|
| 43 |
+
|
| 44 |
+
## ์ ์ฅ ํ์ผ
|
| 45 |
+
|
| 46 |
+
- `data/processed/namuwiki_qa.json`
|
| 47 |
+
- ๋๋ฌด์ํค ๊ธฐ๋ฐ ํตํฉ QA ๋ฐ์ดํฐ
|
| 48 |
+
- `data/processed/megumin_qa_dataset.json`
|
| 49 |
+
- ๊ธฐ์กด ๋ฉ๊ตฌ๋ฐ ์คํ์ผ/ํ๋ฅด์๋ QA ๋ฐ์ดํฐ
|
| 50 |
+
- `data/processed/megumin_questions.faiss`
|
| 51 |
+
- ์คํ์ผ ๋ฐ์ดํฐ question ์ธ๋ฑ์ค
|
| 52 |
+
- `data/processed/megumin_question_answer.faiss`
|
| 53 |
+
- ์คํ์ผ ๋ฐ์ดํฐ question+answer ์ธ๋ฑ์ค
|
| 54 |
+
- `data/processed/megumin_questions_meta.json`
|
| 55 |
+
- ์คํ์ผ ๋ฐ์ดํฐ ์ธ๋ฑ์ค์ ์๋ฌธ ๋ ์ฝ๋ ๋งคํ
|
| 56 |
+
- `data/processed/namuwiki_questions.faiss`
|
| 57 |
+
- ๋๋ฌด์ํค ๋ฐ์ดํฐ question ์ธ๋ฑ์ค
|
| 58 |
+
- `data/processed/namuwiki_question_answer.faiss`
|
| 59 |
+
- ๋๋ฌด์ํค ๋ฐ์ดํฐ question+answer ์ธ๋ฑ์ค
|
| 60 |
+
- `data/processed/namuwiki_questions_meta.json`
|
| 61 |
+
- ๋๋ฌด์ํค ๋ฐ์ดํฐ ์ธ๋ฑ์ค์ ์๋ฌธ ๋ ์ฝ๋ ๋งคํ
|
| 62 |
+
|
| 63 |
+
## ๋ณํฉ ์ ์ฅ ๊ท์น
|
| 64 |
+
|
| 65 |
+
`crawl_namuwiki_to_qa.py`๋ ์ถ๋ ฅ ํ์ผ์ด ์ด๋ฏธ ์กด์ฌํ๋ฉด ๊ธฐ์กด `items`์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณํฉํ๋ค.
|
| 66 |
+
|
| 67 |
+
- ์ฐ์ ์ค๋ณต ๊ธฐ์ค: `chunk_id`
|
| 68 |
+
- ๋ณด์กฐ ๊ธฐ์ค: `source.url + chunk_index + question`
|
| 69 |
+
|
| 70 |
+
๋ณํฉ ํ ์๋ณ์๋ ๋ค์ ๊ท์น์ผ๋ก ์ ๊ทํํ๋ค.
|
| 71 |
+
|
| 72 |
+
- `chunk_id`
|
| 73 |
+
- title๋ณ ์ฐ์ ๋ฒํธ ์ ์ง
|
| 74 |
+
- ์: `๋ฉ๊ตฌ๋ฐ_0000`, `์นด์ฆ๋ง_0185`
|
| 75 |
+
- `chunk_index`
|
| 76 |
+
- ์ ์ฒด ํ์ผ ๊ธฐ์ค ์ฐ์ ๋ฒํธ
|
| 77 |
+
- ์: `0`, `135`, `320`
|
| 78 |
+
|
| 79 |
+
## ๊ด๋ จ ์คํฌ๋ฆฝํธ
|
| 80 |
+
|
| 81 |
+
- `scripts/crawl_namuwiki_to_qa.py`
|
| 82 |
+
- ๋๋ฌด์ํค ๋ฌธ์๋ฅผ QA JSON์ผ๋ก ๋ณํ
|
| 83 |
+
- `scripts/build_faiss_index.py`
|
| 84 |
+
- ์คํ์ผ/๋๋ฌด์ํค ๋ฐ์ดํฐ ๊ฐ๊ฐ์ ๋ํด question ์ธ๋ฑ์ค์ question+answer ์ธ๋ฑ์ค๋ฅผ ์์ฑ
|
| 85 |
+
- `scripts/expand_persona_from_namuwiki.py`
|
| 86 |
+
- ์ฌ์ค/์ค์ QA๋ฅผ ๋ฉ๊ตฌ๋ฐ ์คํ์ผ QA ์ด์์ผ๋ก ํ์ฅ
|
| 87 |
+
|
| 88 |
+
## ์ด์ ๋ฉ๋ชจ
|
| 89 |
+
|
| 90 |
+
- ๋๋ฌด์ํค ๊ธฐ๋ฐ ๋ฐ์ดํฐ๋ ์ฌ์ค/์ค์ ๋ณด๊ฐ์ฉ์ด๋ค.
|
| 91 |
+
- ๊ธฐ์กด `megumin_qa_dataset.json`์ ๋ฉ๊ตฌ๋ฐ ๋งํฌ์ ๊ฐ์ ์ ์ ์ง์ ๋ ์ค์ํ๋ค.
|
| 92 |
+
- ์ต์ข
Agent๋ ๋ ๋ฐ์ดํฐ์์ ํจ๊ป ๊ฒ์ํด ์ฌ์ฉํ๋ค.
|