๊ณ ๊ฐ์ ๋น์ ํ ์์ฝ ๋ฉ์์ง๋ฅผ ๊ตฌ์กฐํํ์ฌ ์์ฝ ๋ฌธ์, ๋ณ๊ฒฝ, ์ทจ์, ๊ฒฐ์ ํ์ธ, ์ผ์ ๋ฑ๋ก๊น์ง ์๋ ์ฒ๋ฆฌํ๋
๋ค์ผ์ต ์ฌ์ฅ๋์ ์ํ AI ์์ฝ ์๋ ๋งค๋์
Team Nailgent
ยท 26-1 ๋ฐ์ดํฐ์ข
ํฉ๋ถ์ ์บก์คํค ํ๋ก์ ํธ
ยท ๐ 2026 Low-Code AI Challenge Hackathon 3rd place
| Role | Name | GitHub |
|---|---|---|
| AI / Agent | ๊น๋ฏธ์ง | @miji0 |
| AI / Agent | ๊น์ง์ | @sallysooo |
| Backend / Infra | ๋จ๋ฏผ์ | @minseo0313 |
| Frontend / Design | ์ ๊ต์ | @kyooonnnggg |
Reservia๋ 1์ธ ๋ค์ผ์ต๊ณผ ์๊ท๋ชจ ์์ฝ ๊ธฐ๋ฐ ์ ์ข ์ ์ฌ์ฅ๋๋ค์ ์ํ AI ์์ฝ ์๋ํ ์๋น์ค์ ๋๋ค. ๊ณ ๊ฐ์ ์นด์นด์คํก์ด๋ ์น ์ฑํ ์์ ํ์์ฒ๋ผ ์์ ๋กญ๊ฒ ๋ฌธ์ํ๊ณ , ์์คํ ์ ํด๋น ๋ฉ์์ง์์ ์์ฝ์ ํ์ํ ์ ๋ณด๋ฅผ ์ถ์ถํ์ฌ ์์ฝ ๊ฐ๋ฅ ์ฌ๋ถ ํ์ธ, ๋๋ฝ ์ ๋ณด ์ฌ์ง๋ฌธ, ์์ฝ๊ธ ๊ฒฐ์ ํ์ธ, Google Calendar ๋ฑ๋ก, ์์ฝ ๋ณ๊ฒฝ ๋ฐ ์ทจ์๊น์ง ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
๊ธฐ์กด ์์ฝ ์๋น์ค๋ ์ ํด์ง ์ ๋ ฅ ์์์ ๋ง์ถฐ ๋ ์ง์ ์๊ฐ์ ์ ํํ๋ ๋ฐฉ์์ ๊ฐ๊น์ต๋๋ค. ํ์ง๋ง ์ค์ ๋ค์ผ์ต ์์ฝ ๋ฌธ์๋ ๋ค์์ฒ๋ผ ํจ์ฌ ์์ ๋กญ๊ณ ๋ณต์กํฉ๋๋ค.
๋ด์ผ ์คํ 3์์ ์ ค ์ ๊ฑฐํ๊ณ ์ ค๋ค์ผ ๊ฐ๋ฅํด์?
์ฒซ๋ฐฉ๋ฌธ์ด๊ณ ์ด๋ฆ์ ๊น์ง์์์.
Reservia๋ ์ด๋ฐ ์์ฐ์ด ๋ฉ์์ง๋ฅผ ์ฝ๊ณ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐํ๋ ์ ๋ณด๋ก ๋ณํํฉ๋๋ค.
{
"intent": "booking",
"slots": {
"name": "๊น์ง์",
"reserve_date": "2026-05-30",
"reserve_time": "15:00",
"service_code": "GEL_NAIL",
"off_removal": true,
"past_visit": false
},
"missing_fields": ["phone_num"],
"next_action": "ask_missing_field"
}๊ทธ๋ฆฌ๊ณ ํ์ํ ์ ๋ณด๊ฐ ๋ถ์กฑํ๋ฉด ๊ณ ๊ฐ์๊ฒ ์๋์ผ๋ก ๋ค์ ์ง๋ฌธํฉ๋๋ค.
์๋
ํ์ธ์ ๊น์ง์ ๊ณ ๊ฐ๋ ๐
์์ฝ์ ๋์๋๋ฆฌ๊ธฐ ์ํด ์ ํ๋ฒํธ๋ ํจ๊ป ์๋ ค์ฃผ์๊ฒ ์ด์?
์๊ท๋ชจ ๋ค์ผ์ต ์ฌ์ฅ๋์ ์์ ์ค์๋ ๊ณ์ ๋ค์ด์ค๋ ์์ฝ ๋ฌธ์๋ฅผ ์ง์ ํ์ธํด์ผ ํฉ๋๋ค. ๊ณ ๊ฐ ๋ฌธ์๋ ์นด์นด์คํก, ๋ค์ด๋ฒ ํกํก, ์ธ์คํ๊ทธ๋จ DM ๋ฑ ์ฌ๋ฌ ์ฑ๋๋ก ํฉ์ด์ ธ ์๊ณ , ๋ฌธ์ ํ์๋ ๋ชจ๋ ๋ค๋ฆ ๋๋ค.
๋ฐ๋ณต์ ์ผ๋ก ๋ฐ์ํ๋ ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
| ๋ฌธ์ | ์ค๋ช |
|---|---|
| ๋น์ ํ ๋ฌธ์ | ๊ณ ๊ฐ์ด ์ ํด์ง ์์ ์์ด ์์ ๋กญ๊ฒ ์์ฝ ์์ฒญ์ ๋ณด๋ ๋๋ค. |
| ๋ฐ๋ณต ํ์ธ | ์ด๋ฆ, ์ ํ๋ฒํธ, ํฌ๋ง ์๊ฐ, ์์ ์ต์ , ์ ๊ฑฐ ์ฌ๋ถ ๋ฑ์ ๋งค๋ฒ ๋ค์ ํ์ธํด์ผ ํฉ๋๋ค. |
| ์์ฝ ๊ฐ๋ฅ ์ฌ๋ถ ํ์ธ | ์ฌ์ฅ๋์ด ์ง์ ์บ๋ฆฐ๋๋ฅผ ๋ณด๊ณ ๊ฐ๋ฅํ ์๊ฐ๋๋ฅผ ํ์ธํด์ผ ํฉ๋๋ค. |
| ๋ณ๊ฒฝ/์ทจ์ ์ฒ๋ฆฌ | ๊ธฐ์กด ์์ฝ์ ์ฐพ์์ ๋ณ๊ฒฝ ๊ฐ๋ฅ ์ฌ๋ถ์ ์ ์ฑ ์ ํ์ธํด์ผ ํฉ๋๋ค. |
| ์ ์ ๊ธ ํ์ธ | ์์ฝ๊ธ ์ ๊ธ ์ฌ๋ถ๋ฅผ ํ์ธํ ๋ค ์ต์ข ์์ฝ ํ์ ์ ํด์ผ ํฉ๋๋ค. |
| ์ ๋ณด ๊ด๋ฆฌ ์ด๋ ค์ | ๊ฐ๊ฒฉํ, ์ด์์๊ฐ, ์์ฝ ์ ์ฑ ์ด ๋ฐ๋๋ฉด ๊ณ ๊ฐ ์๋ ๋ด์ฉ๋ ํจ๊ป ์์ ํด์ผ ํฉ๋๋ค. |
Reservia๋ ์ด๋ฌํ ์์์ ์ AI์ ์๋ํ ์ํฌํ๋ก์ฐ๋ก ์ฐ๊ฒฐํ์ฌ ์ฌ์ฅ๋์ ์์ฝ ์๋ ๋ถ๋ด์ ์ค์ด๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
- 1์ธ ๋ค์ผ์ต ์ฌ์ฅ๋
- ์๊ท๋ชจ ๋ค์ผ์ต ์ง์
- ์์ฝ ๋ฌธ์์ ์ต์ ์ ํ์ ์ง์ ๊ด๋ฆฌํ๋ ๋ทฐํฐ์ต ์ด์์
Reservia์ ๊ตฌ์กฐ๋ ๋ค์ผ์ต๋ฟ ์๋๋ผ ๋ค์๊ณผ ๊ฐ์ ์์ฝ ๊ธฐ๋ฐ ์ ์ข ์ผ๋ก ํ์ฅํ ์ ์์ต๋๋ค.
- ์ผ์ดํฌ์ต
- ๊ฝ์ง
- ๊ณต๋ฐฉ ํด๋์ค
- ์์คํ ํฑ / ์๋์น / ์์ฑ์ต
- ์๋ฐ์ด ํด๋์ค
- ๋ ํ ์คํ๋์ค
- ๊ธฐํ ๋ง์ถคํ ์์ฝ์ด ํ์ํ ์์๊ณต์ธ ์ ์ข
๊ณ ๊ฐ์ด ์ ํด์ง ์์ ์์ด ์์ ๋กญ๊ฒ ์์ฑํ ๋ฉ์์ง๋ฅผ ๋ถ์ํฉ๋๋ค. ์์คํ ์ ๊ณ ๊ฐ ๋ฉ์์ง์์ ์์ฝ ์๋์ ํ์ํ slot์ ์ถ์ถํ๊ณ , ๋๋ฝ๋ ์ ๋ณด๊ฐ ์์ผ๋ฉด ์๋์ผ๋ก ์ฌ์ง๋ฌธํฉ๋๋ค.
์์:
๊ณ ๊ฐ: ๋ด์ผ 3์์ ์ ค ์ ๊ฑฐํ๊ณ ์ ค๋ค์ผ ๊ฐ๋ฅํด์?
์์คํ
: ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ์ธํด๋๋ฆด๊ฒ์. ์ฑํจ๊ณผ ์ ํ๋ฒํธ๋ ํจ๊ป ์๋ ค์ฃผ์๊ฒ ์ด์?
๊ณ ๊ฐ์ด ์์ฒญํ ์๊ฐ์ด ์ด๋ฏธ ์์ฝ๋์ด ์๊ฑฐ๋ ์์ ์๊ฐ๊ณผ ๋ง์ง ์๋ ๊ฒฝ์ฐ, ์์ฝ ๋ฐ์ดํฐ์ Policy Engine์ ํตํด ๊ฐ๋ฅํ ๋์ฒด ์๊ฐ๋๋ฅผ ์ ์ํฉ๋๋ค.
์์:
์์ฒญํ์ ์คํ 3์๋ ์ด๋ฏธ ์์ฝ์ด ์์ด์.
๋์ ์คํ 4์, 5์ 30๋ถ, 7์ ์์ฝ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ํ์๋ ์๊ฐ๋๋ฅผ ์ ํํด์ฃผ์ธ์ ๐
์์ฝ์ ๋ฐ๋ก ํ์ ๋์ง ์๊ณ , ์์ฝ๊ธ ๊ฒฐ์ ํ์ธ ์ดํ ์ต์ข ํ์ ๋ฉ๋๋ค. Toss Payments ์นํ ์ฐ๋์ ํตํด ์๋ ์ฒ๋ฆฌ๋ฉ๋๋ค.
๊ฒฐ์ ํ๋ฆ:
๊ฒฝ๋ก A โ ๊ณ ๊ฐ์ด "๊ฒฐ์ ์๋ฃ" ๋ฉ์์ง ์ ์ก ์ (์ฃผ ๊ฒฝ๋ก)
- ์์ฝ ์์ฑ โ
booking_id,order_id(booking_{id}_{timestamp}) state ์ ์ฅ โ ๊ฒฐ์ ๋งํฌ์ ํจ๊ป "30๋ถ ์ด๋ด ๋ฏธ๊ฒฐ์ ์ ์๋ ์ทจ์" ์๋ด ์ ์ก - ๊ณ ๊ฐ์ด Toss ๊ฒฐ์ ์๋ฃ ํ "๊ฒฐ์ ์๋ฃ" ๋ฉ์์ง ์ ์ก
- Toss API ์ง์ ์กฐํ (
GET /v1/payments/orders/{order_id}) status: DONE์ด๋ฉด ๊ฒฐ์ ํ์ ์๋ต- Toss ์กฐํ ๊ฒฐ๊ณผ๊ฐ ์๊ฑฐ๋ ๋ฏธ๊ฒฐ์ ๋ฉด ๋ฐฑ์๋
payment_status์กฐํ๋ก fallbackPAIDโ ๊ฒฐ์ ํ์ ์๋ตCANCELLED(30๋ถ ๋ด ๋ฏธ๊ฒฐ์ ๋ก ์๋ ์ทจ์๋จ) โ ์ทจ์ ์๋ด + "์์ฝ ๋ฌธ์"๋ก ์ฌ์์ฝ ์ ๋- ๊ทธ ์ธ(
PENDING) โ "์์ง ๊ฒฐ์ ๊ฐ ํ์ธ๋์ง ์์์ต๋๋ค" ์๋ด
๊ฒฝ๋ก B โ Toss successUrl ๋ฆฌ๋ค์ด๋ ํธ ์ (๋ฐฑ์๋ ์ฒ๋ฆฌ)
- ๊ณ ๊ฐ์ด Toss ๊ฒฐ์ ์๋ฃ โ successUrl๋ก ๋ฆฌ๋ค์ด๋ ํธ (
paymentKey,orderId,amountํฌํจ) - ๋ฐฑ์๋ successUrl ํธ๋ค๋ฌ:
POST /api/v1/payments/confirmํธ์ถ - Toss ์ต์ข
์น์ธ (
POST /v1/payments/confirm) โstatus: DONE - ๋ฐฑ์๋ ๊ฒฐ์ ์ํ ์
๋ฐ์ดํธ (
PATCH /api/v1/payments/{id})
๊ฒฝ๋ก C โ Toss ์นํ ์์ ์ (๋ณด์กฐ ๊ฒฝ๋ก)
- Toss๊ฐ
POST /toss/webhook์ผ๋ก ๊ฒฐ์ ์๋ฃ ์ด๋ฒคํธ ์ ์ก - ์๋ช ๊ฒ์ฆ (TOSS_SECRET_KEY ๊ธฐ๋ฐ Basic auth)
- Toss API ์ฌ์กฐํ๋ก ๊ฒฐ์ ์ํ ํ์ธ (
status: DONE, ๊ธ์ก ๊ฒ์ฆ) - ๋ฐฑ์๋ ๊ฒฐ์ ์ํ ์
๋ฐ์ดํธ (
PATCH /api/v1/payments/{id}) - LangGraph ํด๋น ์ ์ thread ์ํ ๊ฐฑ์ (
booking_status: payment_confirmed) - ์นด์นด์ค ์ฑ๋ ํธ์ ๋ฐ์ก (๋น์ฆ๋์ค ์ฑ๋ ์ธ์ฆ ํ ํ์ฑํ ์์ )
๊ณ ๊ฐ์ด ์์ฝ ๋ณ๊ฒฝ์ด๋ ์ทจ์๋ฅผ ์์ฒญํ๋ฉด ๊ธฐ์กด ์์ฝ์ ์กฐํํ๊ณ , ์ ์ฑ ์ ๋ฐ๋ผ ๋ณ๊ฒฝ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ๋จํฉ๋๋ค. ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์์ฝ ์ ๋ณด๋ฅผ ์์ ํ๊ณ , ๋ถ๊ฐ๋ฅํ๊ฑฐ๋ ์ ๋งคํ ๊ฒฝ์ฐ ์ฌ์ฅ๋ ๊ฒํ ๋ก ๋๊น๋๋ค.
์ทจ์ ์ ๊ฒฐ์ ์ํ์ ๋ฐ๋ผ ์๋ ๋ถ๊ธฐ๋ฉ๋๋ค.
- ๊ฒฐ์ ์๋ฃ(PAID):
POST /api/v1/payments/{id}/refundํธ์ถ โ ๋ฐฑ์๋๊ฐ Toss ํ๋ถ ์ฒ๋ฆฌ ๋ฐ ์์ฝ ์ญ์ - ๋ฏธ๊ฒฐ์ :
DELETE /api/v1/bookings/{id}ํธ์ถ โ ์์ฝ ์ญ์ - ํ๋ถ ์๋ฃ ์ ๊ณ ๊ฐ์๊ฒ "์์ฝ๊ธ์ 3~5์ผ ๋ด ํ๋ถ๋ฉ๋๋ค. (๊ฒฐ์ ์ฌ์ ๋ฐ๋ผ ์์ด)" ์๋ด
์ด์์๊ฐ, ๊ฐ๊ฒฉ, ์์น, ์์ฝ๊ธ, ์์ ์ต์
๋ฑ ์ผ๋ฐ ๋ฌธ์๋ GET /api/v1/shopinfo๋ก ๊ฐ์ ธ์จ ์ต ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก LLM์ด 1์ฐจ ๋ต๋ณ์ ์๋ํฉ๋๋ค. ์ฌ์ฅ๋์ด ๋ฑ๋กํ ์ ์ฑ
๊ณผ ๊ฐ๊ฒฉ ์ ๋ณด๋ก ๋ต๋ณํ ์ ์๋ ๊ฒฝ์ฐ ์ฆ์ ์๋ตํ๊ณ , ์ต ์ ๋ณด์ ์๋ ๋ด์ฉ์ SSE๋ฅผ ํตํด ์ฌ์ฅ๋์๊ฒ ์๋ฆผ์ ์ ์กํ ๋ค ๋๊ธฐ ์๋ด ๋ฉ์์ง๋ฅผ ๋ฐํํฉ๋๋ค.
์ฌ์ฅ๋์ ์น ๋์๋ณด๋์์ ๋ค์ ์ ๋ณด๋ฅผ ํ์ธํ๊ณ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- ์ต ์ ๋ณด ๊ด๋ฆฌ
- ๊ณ ๊ฐ ๋ชฉ๋ก ๊ด๋ฆฌ
- ์์ฝ ๋ชฉ๋ก ๊ด๋ฆฌ
- ์ผ์ ๊ด๋ฆฌ
- ์์ฝ ์ํ ํ์ธ
- ๊ฒฐ์ ์ํ ํ์ธ
- ๊ณ ๊ฐ์ด ์ ๋ก๋ํ ๋ค์ผ ๋์์ธ ์ด๋ฏธ์ง ํ์ธ
Reservia๋ ๊ณ ๊ฐ ๋ฉ์์ง๋ฅผ ๋จ์ํ LLM์ ์ ๋ฌํด ๋ต๋ณํ๋ ์ฑ๋ด์ด ์๋๋๋ค. ๊ณ ๊ฐ ์ ๋ ฅ์ ๊ตฌ์กฐํํ๊ณ , ์์ฝ ์ ๋ฌด์ ํ์ํ ์ฌ๋ฌ ์์คํ ์ ์ฐ๊ฒฐํ๋ AI workflow automation system์ ๋๋ค.
์ ์ฒด ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
flowchart LR
A[Customer Message<br/>KakaoTalk] --> B[Kakao Webhook]
B --> C[FastAPI]
C --> D[LangGraph]
D --> E[Intake Agent<br/>GPT-4o]
E --> F[Router]
F --> H[Inquiry]
F --> I[Booking Agent]
F --> J[Cancel Agent]
F --> K[Change Agent]
F --> L[Payment Agent]
F --> Q[Response]
I --> M[Reservation API]
I --> N[Policy Engine]
I --> O[Toss Payments API]
J --> M
K --> M
H --> Q
I --> Q
J --> Q
K --> Q
L --> Q
Q --> R[Customer Reply]
Q --> S[Owner Dashboard]
LangGraph๋ Reservia์ ํต์ฌ ์๋ํ ํ๋ฆ์ ์ฐ๊ฒฐํ๋ orchestration layer์ ๋๋ค. ๊ณ ๊ฐ ๋ฉ์์ง๊ฐ ์นด์นด์ค ์นํ ์ ํตํด FastAPI ์๋ฒ๋ก ๋ค์ด์ค๋ฉด, LangGraph workflow๊ฐ Intake Agent์ Router๋ฅผ ๊ฑฐ์ณ ๋ชฉ์ ์ ๋ง๋ ๋ ธ๋๋ก ์ฐ๊ฒฐํฉ๋๋ค.
| Step | Component | Role |
|---|---|---|
| 1 | Kakao Webhook | ๊ณ ๊ฐ ๋ฉ์์ง ์์ |
| 2 | FastAPI + LangGraph | ๋ฉ์์ง ํ์ฑ ๋ฐ ์ํฌํ๋ก์ฐ ์คํ |
| 3 | Intake Agent (GPT-4o) | ์๋ ๋ถ๋ฅ, slot ์ถ์ถ, ๊ธฐ์กด ๊ณ ๊ฐ DB ๋ณด์ |
| 4 | Router | Inquiry, Booking, Cancel, Change, Payment ๋ ธ๋๋ก ๋ถ๊ธฐ (๊ทธ ์ธ intent๋ Response๋ก ์งํ) |
| 5 | Inquiry Agent | ๊ฐ๊ฒฉ, ์ด์์๊ฐ, ์ ์ฑ ๋ฑ ๊ธฐํ ๋ฌธ์ ์๋ โ ์ฒ๋ฆฌ ๋ถ๊ฐ ์ SSE๋ก ์ฌ์ฅ๋ ์๋ฆผ |
| 6 | Booking Agent | ์ ๊ท ์์ฝ ๋ฑ๋ก ๋ฐ ๊ฐ๋ฅ ์ฌ๋ถ ํ์ธ + ๊ฒฐ์ ๋งํฌ ์์ฑ |
| 7 | Policy Engine | DB ๊ธฐ๋ฐ ์์ ์๊ฐยทํด๋ฌด์ผยท์์ ์์์๊ฐ ๊ฒ์ฆ, ์์ฝ ๊ฐ๋ฅ ์ฌ๋ถ ํ๋จ |
| 8 | Payments Flow | ์์ฝ ์์ฑ ์ ๊ฒฐ์ ๋งํฌ ๋ฐ์ก โ successUrl ๋ฆฌ๋ค์ด๋ ํธ โ Toss confirm โ ๊ฒฐ์ ํ์ โ ๋ฐฑ์๋ DB ์ ๋ฐ์ดํธ |
| 9 | Cancel / Change Agent | ๊ธฐ์กด ์์ฝ ์กฐํ ํ ์ทจ์ ๋๋ ๋ณ๊ฒฝ ์ฒ๋ฆฌ |
| 10 | Response | ๊ณ ๊ฐ์๊ฒ ์ต์ข ์๋ต ๋ฐํ (Greeting/Unknown ๋ฑ fallback intent์ ๊ณ ์ ์๋ต ํฌํจ) |
LangGraph workflow์์๋ ๊ณ ๊ฐ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ์ํ๊ฐ์ ์ ์งํฉ๋๋ค.
| Field | Description |
|---|---|
kakao_user_id |
์นด์นด์ค ์ฌ์ฉ์ ์๋ณ์ |
user_input |
๊ณ ๊ฐ์ ์๋ณธ ๋ฉ์์ง |
intent |
์์ฝ, ๋ฌธ์, ๋ณ๊ฒฝ, ์ทจ์ ๋ฑ ๊ณ ๊ฐ ์๋ |
slots |
์ด๋ฆ, ์ ํ๋ฒํธ, ๋ ์ง, ์๊ฐ, ์์ ์ต์ ๋ฑ ์ถ์ถ๋ ์ ๋ณด |
missing_fields |
์์ฝ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ถ๊ฐ๋ก ํ์ํ ์ ๋ณด |
is_bookable |
ํ์ฌ ์์ฒญ์ด ์์ฝ ๊ฐ๋ฅํ ์ํ์ธ์ง ์ฌ๋ถ |
booking_status |
์์ฝ ์ํ |
booking_id |
์์ฝ ์์ฑ ํ ์ ์ฅ๋๋ ์์ฝ ID (๊ฒฐ์ ํ์ธ์ ์ฌ์ฉ) |
order_id |
Toss ๊ฒฐ์ ์กฐํ์ฉ ์ฃผ๋ฌธ๋ฒํธ (booking_{id}_{timestamp}, ๊ฒฐ์ ํ์ธ์ ์ฌ์ฉ) |
policy_check_results |
์ ์ฑ ๊ฒ์ฆ ๊ฒฐ๊ณผ ๋ฐ ์กฐํ๋ ์์ฝ ์ ๋ณด |
next_action |
๋ค์์ ์ํํด์ผ ํ ์์ |
response_draft |
๊ณ ๊ฐ์๊ฒ ๋ณด๋ผ ์๋ต ์ด์ |
Intake Agent๋ ๋ชจ๋ ๊ณ ๊ฐ ๋ฉ์์ง๊ฐ ์ฒ์ ๋์ฐฉํ๋ ์ง์ ์ ์ ๋๋ค.
์ฃผ์ ์ญํ :
- ๊ณ ๊ฐ ์๋ ๋ถ๋ฅ
- ์์ฝ ๊ด๋ จ slot ์ถ์ถ
- ๋๋ฝ ์ ๋ณด ๊ฐ์ง
- ๊ธฐ์กด ๊ณ ๊ฐ ์ฌ๋ถ ํ์ธ
- ๋ค์ workflow ๋ถ๊ธฐ ๊ฒฐ์
๋ณ๋์ LangGraph ๋ ธ๋๊ฐ ์๋๋ผ, Intake Agent๊ฐ ๋น ๋ฉ์์ง(์: ์นด์นด์คํก ์ฑ๋ ์ถ๊ฐ ์ ์ต์ด ์ง์ )๋ฅผ ๋ฐ์์ ๋ ๋ถ๋ฅํ๋ intent์ ๋๋ค. Router๋ฅผ ๊ฑฐ์ณ Response ๋ ธ๋๋ก ๋ฐ๋ก ์ ๋ฌ๋์ด ๊ณ ์ ๋ ํ์ ๋ฉ์์ง๋ฅผ ๋ฐํํฉ๋๋ค.
์ฃผ์ ์ญํ :
- ์ ๊ท ๊ณ ๊ฐ ํ์ ๋ฉ์์ง ์ ๊ณต
- ๊ธฐ๋ณธ ์์ฝ ์ ์ฐจ ์๋ด
- ํ์ํ ์ ๋ณด ์ ๋ ฅ ์ ๋
์์ฝ ์ธ์ ์ผ๋ฐ ๋ฌธ์๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. GET /api/v1/shopinfo๋ก ์ต ์ ๋ณด๋ฅผ ์กฐํํ ๋ค LLM์ด ๋ต๋ณ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ๋จํฉ๋๋ค.
์ฃผ์ ์ญํ :
- "๊ธฐํ", "๋ฌธ์์", "๊ถ๊ธํ๊ฑฐ ์์ด์" ๋ฑ ํธ๋ฆฌ๊ฑฐ ์ ๋ ฅ ๊ฐ์ง(LLM ํ๋จ) โ ์ค์ ์ง๋ฌธ ์ ๋
- ์ต ์ ๋ณด ๊ธฐ๋ฐ LLM 1์ฐจ ๋ต๋ณ ์๋, ๊ฐ๋ฅ ์ ์ฆ์ ์๋ต
- ์ต ์ ๋ณด์ ์๋ ๋ด์ฉ์
notify_owner()SSE ์๋ฆผ ์ ์ก ํ ๋๊ธฐ ์๋ด (human-in-the-loop)
์ ๊ท ์์ฝ์ ๋ด๋นํฉ๋๋ค.
์ฃผ์ ์ญํ :
- ์์ฝ slot ๊ฒ์ฆ
- ์์ ์ต์ ํ์ธ
- ์ต ์ด์์๊ฐ ํ์ธ
- ์์ฝ ๊ฐ๋ฅ ์๊ฐ ์กฐํ
- ์์ฝ draft ์์ฑ
- ์์ฝ๊ธ ๊ฒฐ์ ๋๊ธฐ ์ํ ์ฒ๋ฆฌ
- ๊ฒฐ์ ํ์ธ ํ ์์ฝ ํ์
๊ณ ๊ฐ์ ์์ฝ ์ทจ์ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
์ฃผ์ ์ญํ :
- kakao_user_id ๊ธฐ๋ฐ ๊ธฐ์กด ๊ณ ๊ฐ DB ์กฐํ๋ก ์ด๋ฆ ์๋ ๋ณด์
- ์ด๋ฆ์ผ๋ก ๋ฏธ๋ ์์ฝ ์ค ๊ฐ์ฅ ์ต๊ทผ์ ์์ฑ๋ 1๊ฑด ์๋ ์ ํ
- ์์ฝ ํ์ธ ๋ฉ์์ง ํ ๊ณ ๊ฐ ์๋ต(๋ง์์/์๋์)์ผ๋ก ๋ถ๊ธฐ
- ๋ง์์ โ ๊ฒฐ์ ์๋ฃ(PAID)๋ฉด ํ๋ถ ์ฒ๋ฆฌ, ๋ฏธ๊ฒฐ์ ๋ฉด ์์ฝ ์ญ์ / ์๋์ โ ๋ ์ง/์๊ฐ ์ฌ์์ฒญ
๊ณ ๊ฐ์ ์์ฝ ๋ณ๊ฒฝ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
์ฃผ์ ์ญํ :
- kakao_user_id ๊ธฐ๋ฐ ๊ธฐ์กด ๊ณ ๊ฐ DB ์กฐํ๋ก ์ด๋ฆ ์๋ ๋ณด์
- ์ด๋ฆ์ผ๋ก ๋ฏธ๋ ์์ฝ ์ค ๊ฐ์ฅ ์ต๊ทผ์ ์์ฑ๋ 1๊ฑด ์๋ ์ ํ
- ์์ฝ ์ฐพ์ผ๋ฉด ์ ๋ ์ง/์๊ฐ๋ง ์์ฒญ (์ด๋ฆ/์ ํ๋ฒํธ ์ฌ์์ฒญ ์์)
- ์ ์๊ฐ๋ ๊ฐ๋ฅ ์ฌ๋ถ ํ์ธ ํ ์์ฝ ์ ๋ณด ์์
๋ณ๋์ Exception Handler ๋ ธ๋๋ ์์ผ๋ฉฐ, ์์ธ ์ํฉ์ ๊ฐ ๋ ธ๋ ๋ด๋ถ์์ ์ฒ๋ฆฌ๋ฉ๋๋ค.
- ๋ชจํธํ ์์ฒญ (
unknownintent): Router๊ฐ Response๋ก ์งํ โ ๊ณ ์ ์๋ด ๋ฉ์์ง ๋ฐํ +notify_owner()๋ก ์ฌ์ฅ๋์๊ฒ SSE ์๋ฆผ - ์์ฝ ์ ์ฑ ๊ณผ ์ถฉ๋ / ์์ฒญ ์๊ฐ ๋ถ๊ฐ: BookingยทChange Agent๊ฐ ๋์ฒด ์๊ฐ๋๋ฅผ ์ ์
- backend error ๋ฐ์: ๊ฐ Agent๊ฐ
booking_status: backend_error์next_action: human_review(๋๋retry_or_human_review)๋ฅผ ๋ฐํํ๊ณ , ๊ณ ๊ฐ์๊ฒ๋ "ํ์ธ ํ ์๋ด๋๋ฆด๊ฒ์" ์๋ด - ๊ธฐ์กด ์์ฝ์ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ: CancelยทChange Agent๊ฐ ๋ ์ง/์๊ฐ ์ฌ์ง๋ฌธ์ผ๋ก ์ฌ์์ฒญ
- ์ด๋ฏธ์ง/๋์์ธ ์์ฒญ: ์นด์นด์ค IMAGE_UPLOAD ํธ๋ฆฌ๊ฑฐ ์ ์ด๋ฏธ์ง๋ฅผ ๋ฐฑ์๋์ ์ ๋ก๋ํด ์์ฝ์ ์ฒจ๋ถ
์๋์ผ๋ก ํ์ ํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ ์์คํ ์ ์ฌ์ฅ๋ ๊ฒํ ๋ก ๋๊น๋๋ค.
Reservia๋ ๊ณ ๊ฐ ์๋ ์๋ํ๋ฟ ์๋๋ผ, ์ฌ์ฅ๋์ด ์์ฝ๊ณผ ์ต ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ ์ ์๋ dashboard๋ฅผ ์ ๊ณตํฉ๋๋ค.
๐ https://reservia-five.vercel.app/
์ฌ์ฅ๋์ ๋ค์ ์ ๋ณด๋ฅผ ์ง์ ๋ฑ๋กํ๊ฑฐ๋ ์์ ํ ์ ์์ต๋๋ค.
- ์ด์์๊ฐ
- ์์ฝ๊ธ
- ๊ฐ๊ฒ ์์น
- ์์ฝ ์์
- ๋ํ ๊ฐ๊ฒฉ
- ์์ฝ ๋ฉํธ
- ์ ์ฑ ์๋ด
- ๊ฐ๊ฒฉํ/์๋ด๋ฌธ ์ด๋ฏธ์ง
๊ณ ๊ฐ ํญ์์๋ ๊ณ ๊ฐ ์ด๋ฆ, ์ ํ๋ฒํธ, ์์ฝ ์ด๋ ฅ, ๋ ธ์ผ ์ฌ๋ถ ๋ฑ์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์์ฝ ํญ์์๋ ์์ฝ ๋ชฉ๋ก๊ณผ ์์ฝ ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
๊ด๋ฆฌ ๊ฐ๋ฅํ ์ ๋ณด ์์:
- ๊ณ ๊ฐ๋ช
- ์์ ๋ช
- ์์ฝ ๋ ์ง ๋ฐ ์๊ฐ
- ์์ฝ๊ธ ์ํ
- ์์ฝ ์ํ
- ๊ณ ๊ฐ์ด ์ ๋ก๋ํ ๋ค์ผ ๋์์ธ ์ด๋ฏธ์ง
์ผ์ ํญ์์๋ Google Calendar์ ์ฐ๋๋ ์์ฝ ์ผ์ ์ ํ์ธํ ์ ์์ต๋๋ค. ํ์ ๋ ์์ฝ์ ์บ๋ฆฐ๋์ ์๋ ๋ฑ๋ก๋์ด ์ฌ์ฅ๋์ด ์ค์๊ฐ์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค.
Agent๊ฐ ์๋์ผ๋ก ์๋ตํ๊ธฐ ์ด๋ ค์ด ์ํฉ(์ต ์ ๋ณด๋ก ๋ต๋ณ ๋ถ๊ฐํ ๊ธฐํ ๋ฌธ์, ์๋๋ฅผ ํ์
ํ ์ ์๋ ๋ฉ์์ง ๋ฑ)์ด ๋ฐ์ํ๋ฉด POST /api/v1/sse/notify๋ฅผ ํธ์ถํด ๋ฐฑ์๋์ ์๋ฆฝ๋๋ค. ๋ฐฑ์๋๋ ์ด๋ฅผ SSE๋ก ๋์๋ณด๋์ pushํ์ฌ, ์ฌ์ฅ๋์ด ๋ณ๋ ์๋ก๊ณ ์นจ ์์ด "ooo ๊ณ ๊ฐ์ด ์๋ต์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค" ์๋ฆผ์ ์ค์๊ฐ์ผ๋ก ํ์ธํ๊ณ ์ง์ ์๋ํ ์ ์์ต๋๋ค (human-in-the-loop).
Reservia๋ ๋ค์ ์ธ๋ถ ์์คํ ๊ณผ ์ฐ๋๋ฉ๋๋ค.
| Integration | Purpose |
|---|---|
| Kakao Webhook | ๊ณ ๊ฐ ๋ฉ์์ง ์์ |
| OpenAI GPT-4o | ์์ฐ์ด ์ดํด ๋ฐ slot ์ถ์ถ |
| Customer DB | ๊ณ ๊ฐ ์ ๋ณด ๋ฐ ๊ธฐ์กด ์์ฝ ์กฐํ |
| Reservation API | ์์ฝ ์์ฑ, ๋ณ๊ฒฝ, ์ทจ์ |
| Policy Engine | ์์ ์๊ฐ, ์์ฝ ๊ฐ๋ฅ ์ฌ๋ถ, ์์ธ ์กฐ๊ฑด ํ๋จ |
| Toss Payments API | ์์ฝ๊ธ ๊ฒฐ์ ํ์ธ |
| Google Calendar API | ํ์ ์์ฝ ์ผ์ ๋ฑ๋ก |
| SSE Notification | ์ฒ๋ฆฌ ๋ถ๊ฐ/๋ชจํธํ ๋ฌธ์ ๋ฐ์ ์ ์ฌ์ฅ๋์๊ฒ ์ค์๊ฐ ์๋ฆผ |
| Frontend Dashboard | ์ฌ์ฅ๋์ฉ ๊ด๋ฆฌ ํ๋ฉด ์ ๊ณต |
- ์นด์นด์คํก/์น ๊ธฐ๋ฐ ๊ณ ๊ฐ ๋ฉ์์ง ์์
- ์์ฐ์ด ์๋ ๋ถ๋ฅ
- ์์ฝ slot ์ถ์ถ
- ๋๋ฝ ์ ๋ณด ์ฌ์ง๋ฌธ
- ์ ๊ท ์์ฝ ์ฒ๋ฆฌ
- ์์ฝ ๊ฐ๋ฅ ์๊ฐ ํ์ธ
- ๋์ฒด ์๊ฐ๋ ์ ์
- ์์ฝ๊ธ ๊ฒฐ์ ํ์ธ
- Google Calendar ๋ฑ๋ก
- ์์ฝ ๋ณ๊ฒฝ/์ทจ์ ์ฒ๋ฆฌ
- ๊ฐ๊ฒฉํ/์ด์์ ๋ณด ๊ธฐ๋ฐ ๊ธฐํ ๋ฌธ์ ์๋
- ์ฌ์ฅ๋์ฉ ๊ด๋ฆฌ์ ํ๋ฉด
- ๋ณต์ ๋์์ด๋ ์ต์ ๋ฐฐ์
- ๊ณ ๋๋ ๋ค์ผ ๋์์ธ ์ด๋ฏธ์ง ์๋ ํ๋ณ
- ์ฌ๋ฌ ์ง์ ๋์ ์ด์
- ๋ชจ๋ ์ ์ข ์ ๋ํ ์์ ์ผ๋ฐํ
- ๋ค์ผ์ต ์ธ ์์ฝ ์ ์ข ํ์ฅ
- ์ ์ข ๋ณ ์ ์ฑ ํ ํ๋ฆฟ ์ ๊ณต
- ๊ณ ๊ฐ ์ฌ๋ฐฉ๋ฌธ/๋ ธ์ผ ์ด๋ ฅ ๊ธฐ๋ฐ ์์ฝ ์ ์ฑ ๊ณ ๋ํ
- ๊ฐ๊ฒฉํ/์๋ด๋ฌธ ์๋ ํ์ฑ ์ ํ๋ ๊ฐ์
- ๊ณ ๊ฐ ๋ง์ถคํ ์ถ์ฒ ์๋ต ์์ฑ
- ๋ณต์ ์ง์/๋์์ด๋ ์ค์ผ์ค๋ง ์ง์
- CRM ๋ฐ ๋ง์ผํ ์๋ํ ์ฐ๋


