RAG_AgenticServer_Small / docs /project_plan.md
jeongsoo's picture
init
1c2d73c
# RAG ์ฑ—๋ด‡ + LocalPCAgent ํ†ตํ•ฉ ํ”„๋กœ์ ํŠธ ๊ณ„ํš
## ํ”„๋กœ์ ํŠธ ๊ฐœ์š”
๊ธฐ์กด RAG ์ฑ—๋ด‡(Flask ๊ธฐ๋ฐ˜)์— LocalPCAgent ์ œ์–ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ํ†ตํ•ฉ ์ž‘์—…์ž…๋‹ˆ๋‹ค. Gradio UI ์ฝ”๋“œ์˜ ๊ธฐ๋Šฅ์„ Flask+HTML/JS ๊ตฌ์กฐ์— ์ด์‹ํ•ฉ๋‹ˆ๋‹ค.
## ์™„๋ฃŒ๋œ ์ž‘์—…
- [x] ๊ธฐ๋ณธ Flask ๊ธฐ๋ฐ˜ RAG ์ฑ—๋ด‡ ๋ฐฑ์—”๋“œ ๊ตฌํ˜„
- [x] LocalPCAgent ์ œ์–ด๋ฅผ ์œ„ํ•œ API ์—”๋“œํฌ์ธํŠธ ์ถ”๊ฐ€ (`app_device_routes.py`)
- [x] Flask ๋ฐฑ์—”๋“œ์™€ LocalPCAgent ๊ฐ„ ํ†ต์‹  ๋กœ์ง ๊ตฌํ˜„
- [x] ์›น UI์— LocalPCAgent ์ œ์–ด ํ™”๋ฉด ์ถ”๊ฐ€ (HTML/CSS)
- [x] ์›น UI์—์„œ LocalPCAgent ์ œ์–ด ๊ธฐ๋Šฅ์„ ์œ„ํ•œ JavaScript ๋กœ์ง ๊ตฌํ˜„
- [x] ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ ์ •๋ฆฌ ๋ฐ ์ตœ์ ํ™”
- ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ ๋ฐ ์ฝ”๋“œ ์ œ๊ฑฐ
- ๋ชจ๋“ˆํ™”๋œ ์ฝ”๋“œ ๊ตฌ์กฐ ๊ฐœ์„ 
## ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์ •๋ฆฌ
- ์ฃผ์š” ์‹คํ–‰ ํŒŒ์ผ์„ ํ™•์ธํ•˜๊ณ  `app_revised.py`๋ฅผ ์ฃผ ํŒŒ์ผ๋กœ ์„ ํƒ
- ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ 'app' ํŒจํ‚ค์ง€๋กœ ๋ชจ๋“ˆํ™”:
- ์žฅ์น˜ ์ œ์–ด ๋ผ์šฐํ„ฐ: `app/app_device_routes.py`
- ๊ธฐ๋ณธ API ๋ผ์šฐํ„ฐ: `app/app_routes.py`
- ๊ฒ€์ƒ‰๊ธฐ ์ดˆ๊ธฐํ™”: `app/init_retriever.py`
- ํ”„๋ŸฐํŠธ์—”๋“œ ์ฝ”๋“œ ํ†ตํ•ฉ:
- `templates/index.html`์— ์žฅ์น˜ ์ œ์–ด UI ์„น์…˜
- `static/js/app-device.js`์— ์žฅ์น˜ ์ œ์–ด JavaScript ์ฝ”๋“œ
- `static/css/device-style.css`์— ์žฅ์น˜ ์ œ์–ด ์Šคํƒ€์ผ
## ํ˜„์žฌ ์ƒํƒœ
์ฝ”๋“œ ๊ฒ€ํ†  ๊ฒฐ๊ณผ ๋Œ€๋ถ€๋ถ„์˜ ํ†ตํ•ฉ ์ž‘์—…์ด ์ด๋ฏธ ์™„๋ฃŒ๋œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค:
- Flask ๋ฐฑ์—”๋“œ์— LocalPCAgent API ์—”๋“œํฌ์ธํŠธ๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค (`app_device_routes.py`)
- ํ”„๋ก ํŠธ์—”๋“œ UI์— ์žฅ์น˜ ์ œ์–ด ํƒญ์ด ์ถ”๊ฐ€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค (`index.html`)
- ์žฅ์น˜ ์ œ์–ด๋ฅผ ์œ„ํ•œ JavaScript ๋กœ์ง์ด ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค (`app-device.js`)
- ๊ธฐ๋ณธ ๊ธฐ๋Šฅ๊ณผ ์‚ฌ์šฉ์ž ์ •์˜ ๋ช…๋ น์–ด ์‹คํ–‰ ๊ธฐ๋Šฅ์ด ๋ชจ๋‘ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค
## ์ถ”๊ฐ€ ๊ฐœ๋ฐœ ๊ณ„ํš: ์žฅ์น˜ ๋ชฉ๋ก ์กฐํšŒ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
### ๊ฐœ๋ฐœ ๋ชฉํ‘œ
๋กœ์ปฌPC์— ์—ฐ๊ฒฐ๋œ ์žฅ์น˜(ํŠนํžˆ COM ํฌํŠธ์™€ USB ์žฅ์น˜)๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
### ๊ตฌํ˜„ ์š”๊ตฌ์‚ฌํ•ญ
1. **๋กœ์ปฌPC ์žฅ์น˜ ์กฐํšŒ Python ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ**
- COM ํฌํŠธ ๋ฐ USB ์žฅ์น˜ ๋ชฉ๋ก ์กฐํšŒ
- ์žฅ์น˜๋ณ„ ์ƒ์„ธ ์ •๋ณด(์ œ์กฐ์‚ฌ, ์ œํ’ˆ๋ช…, ์‹œ๋ฆฌ์–ผ ๋ฒˆํ˜ธ ๋“ฑ) ์ˆ˜์ง‘
- ๋ฉ€ํ‹ฐ ํ”Œ๋žซํผ ์ง€์›(Windows, Linux, macOS)
2. **LocalPCAgent API ํ™•์žฅ**
- ์žฅ์น˜ ๋ชฉ๋ก ์กฐํšŒ API ์—”๋“œํฌ์ธํŠธ ์ถ”๊ฐ€
- ์กฐํšŒ ๊ฒฐ๊ณผ ํšจ์œจ์ ์ธ ์ „์†ก ๋ฐฉ์‹ ๊ตฌํ˜„
3. **UI ํ™•์žฅ**
- ์žฅ์น˜ ์ œ์–ด ํƒญ์— ์žฅ์น˜ ๋ชฉ๋ก ์กฐํšŒ ์„น์…˜ ์ถ”๊ฐ€
- ์กฐํšŒ ๊ฒฐ๊ณผ ํ‘œ์‹œ UI ๊ตฌํ˜„
- ์žฅ์น˜ ํƒ€์ž…๋ณ„ ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ ๊ตฌํ˜„
### ๊ธฐ์ˆ  ์Šคํƒ
- ๋ฐฑ์—”๋“œ: Python(`pyserial`, `pyusb`), Flask
- ํ”„๋ก ํŠธ์—”๋“œ: HTML, CSS, JavaScript
- ํ†ต์‹ : REST API, JSON ํฌ๋งท
### ๊ตฌํ˜„ ๊ณ„ํš
1. **๋กœ์ปฌPC ์žฅ์น˜ ์กฐํšŒ Python ์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ**
- `scan_devices.py` ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ
- ํ…Œ์ŠคํŠธ ๋ฐ ๋””๋ฒ„๊น…
2. **LocalPCAgent์— ํ†ตํ•ฉ**
- LocalPCAgent ํ”„๋กœ๊ทธ๋žจ ๋ชฉ๋ก์— ๋“ฑ๋ก
- API ์—”๋“œํฌ์ธํŠธ ํ…Œ์ŠคํŠธ
3. **Flask ๋ฐฑ์—”๋“œ API ํ™•์žฅ**
- `app_device_routes.py`์— ์žฅ์น˜ ์กฐํšŒ API ์ถ”๊ฐ€
- ๋ฐ์ดํ„ฐ ํฌ๋งท ๋ฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ตฌํ˜„
4. **ํ”„๋ก ํŠธ์—”๋“œ UI ๊ฐœ๋ฐœ**
- `index.html`์— ์žฅ์น˜ ๋ชฉ๋ก ์กฐํšŒ ์„น์…˜ ์ถ”๊ฐ€
- `app-device.js`์— ์žฅ์น˜ ์กฐํšŒ ๊ด€๋ จ ํ•จ์ˆ˜ ์ถ”๊ฐ€
- ํ•„์š”์‹œ CSS ์Šคํƒ€์ผ ์ถ”๊ฐ€
## ๋‚จ์€ ์ž‘์—…
- [ ] ๋กœ์ปฌPC ์žฅ์น˜ ์กฐํšŒ Python ์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ
- [ ] LocalPCAgent ์„œ๋ฒ„์— ์žฅ์น˜ ์กฐํšŒ ๊ธฐ๋Šฅ ํ†ตํ•ฉ
- [ ] Flask ๋ฐฑ์—”๋“œ ์žฅ์น˜ ์กฐํšŒ API ๊ตฌํ˜„
- [ ] ํ”„๋ก ํŠธ์—”๋“œ UI ํ™•์žฅ
- [ ] ์ „์ฒด ์‹œ์Šคํ…œ ํ…Œ์ŠคํŠธ ๋ฐ ๋””๋ฒ„๊น…
- [ ] ์ตœ์ข… ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ ๋ฌธ์„œํ™” ๋ณด์™„
## ํŒŒ์ผ ๊ตฌ์กฐ
- `app_revised.py`: ๋ฉ”์ธ Flask ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
- `app.py`: ๋‹จ์ˆœํ™”๋œ ์ง„์ž…์  (app_revised.py ํ˜ธ์ถœ)
- `app/`: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋“ˆ
- `__init__.py`: ํŒจํ‚ค์ง€ ์ดˆ๊ธฐํ™”
- `app_device_routes.py`: LocalPCAgent ์ œ์–ด API ๋ผ์šฐํŠธ
- `app_routes.py`: ๊ธฐ๋ณธ RAG ์ฑ—๋ด‡ API ๋ผ์šฐํŠธ
- `init_retriever.py`: RAG ๋ชจ๋ธ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ
- `static/`: ์ •์  ํŒŒ์ผ
- `css/`: ์Šคํƒ€์ผ์‹œํŠธ
- `style.css`: ๊ธฐ๋ณธ ์Šคํƒ€์ผ
- `device-style.css`: ์žฅ์น˜ ์ œ์–ด ์Šคํƒ€์ผ
- `js/`: JavaScript ํŒŒ์ผ
- `app.js`: ๋ฉ”์ธ JavaScript
- `app-core.js`: ํ•ต์‹ฌ ๊ธฐ๋Šฅ
- `app-device.js`: ์žฅ์น˜ ์ œ์–ด ๊ธฐ๋Šฅ
- `app-docs.js`: ๋ฌธ์„œ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ
- `app-llm.js`: LLM ๊ด€๋ จ ๊ธฐ๋Šฅ
- `templates/`: HTML ํ…œํ”Œ๋ฆฟ
- `index.html`: ๋ฉ”์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŽ˜์ด์ง€
- `login.html`: ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€
- `loading.html`: ๋กœ๋”ฉ ํŽ˜์ด์ง€
- `docs/`: ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ
- `project_plan.md`: ํ”„๋กœ์ ํŠธ ๊ณ„ํš ๋ฌธ์„œ
- `cleanup_plan.md`: ์ฝ”๋“œ ์ •๋ฆฌ ๊ณ„ํš ๋ฌธ์„œ
- **์‹ ๊ทœ ํŒŒ์ผ:**
- `LocalPCAgent/programs/scan_devices.py`: ์žฅ์น˜ ์กฐํšŒ Python ์Šคํฌ๋ฆฝํŠธ
## LocalPCAgent ํ†ตํ•ฉ ์š”์•ฝ
- **๋ฐฑ์—”๋“œ API**: `app/app_device_routes.py`์— ๊ตฌํ˜„
- `/api/device/status`: ์žฅ์น˜ ์„œ๋ฒ„ ์ƒํƒœ ํ™•์ธ
- `/api/device/connect`: ์‚ฌ์šฉ์ž ์ง€์ • URL ์—ฐ๊ฒฐ
- `/api/device/list`: ์žฅ์น˜ ๋ชฉ๋ก ์กฐํšŒ
- `/api/device/programs`: ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๊ทธ๋žจ ๋ชฉ๋ก ์กฐํšŒ
- `/api/device/programs/<program_id>/execute`: ๋“ฑ๋ก๋œ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰
- `/api/device/execute-custom`: ์‚ฌ์šฉ์ž ์ •์˜ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰
- **์ถ”๊ฐ€ ์˜ˆ์ •:** `/api/device/scan-ports`: COM ํฌํŠธ ๋ฐ USB ์žฅ์น˜ ๋ชฉ๋ก ์กฐํšŒ
- **ํ”„๋ŸฐํŠธ์—”๋“œ**: ๊ธฐ๋Šฅ ์™„์„ฑ
- ์žฅ์น˜ ์ œ์–ด ํƒญ UI: `templates/index.html`์— ๊ตฌํ˜„
- JavaScript ๋กœ์ง: `static/js/app-device.js`์— ๊ตฌํ˜„
- ์Šคํƒ€์ผ: `static/css/device-style.css`์— ๊ตฌํ˜„
## ์ฃผ์˜์‚ฌํ•ญ
- JavaScript๋Š” ์ง์ ‘ LocalPCAgent์™€ ํ†ต์‹ ํ•˜์ง€ ์•Š๊ณ  Flask ๋ฐฑ์—”๋“œ๋ฅผ ํ†ตํ•ด ํ†ต์‹ 
- ๋ชจ๋“  ์žฅ์น˜ ๊ด€๋ จ API๋Š” ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ (`login_required` ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์ ์šฉ)
- ๋กœ๊น… ์ฝ”๋“œ ์œ ์ง€ํ•˜์—ฌ ๋””๋ฒ„๊น… ์šฉ์ดํ•˜๊ฒŒ ํ•จ