Multi-channel customer service auto-responder with FAQ matching, escalation, and daily summaries.
---
name: cs-autoresponder
description: Multi-channel customer service auto-responder with FAQ matching, escalation, and daily summaries.
homepage: https://github.com/openclaw/skills
metadata:
{
"openclaw":
{
"emoji": "๐ง",
"requires": { "bins": ["node"] },
"install":
[
{
"id": "node-brew",
"kind": "brew",
"formula": "node",
"bins": ["node"],
"label": "Install Node.js (brew)",
},
],
},
}
disable-model-invocation: true
---
# ๐ง CS Auto-Responder
๊ณ ๊ฐ์ฌ์ฉ CS ์๋์๋ต ์คํฌ. ๋ฉํฐ์ฑ๋ ๊ณ ๊ฐ ๋ฌธ์๋ฅผ ์์ ํ๊ณ , FAQ ๊ธฐ๋ฐ ์๋ ์๋ต, ์์ค์ปฌ๋ ์ด์
, ์ผ์ผ ์์ฝ์ ์ ๊ณตํฉ๋๋ค.
## ํต์ฌ ๊ธฐ๋ฅ
1. **๋ฉํฐ์ฑ๋ ์์ ** โ ์นด์นด์คํก ์๋ฆผํก, ์ธ์คํ DM, ์ด๋ฉ์ผ ๋ฑ์์ ๊ณ ๊ฐ ๋ฌธ์ ๊ฐ์ง
2. **FAQ ๋งค์นญ** โ ๊ณ ๊ฐ์ฌ๋ณ FAQ DB (JSON)์์ ์๋ฏธ ๊ธฐ๋ฐ ๋งค์นญ โ ์๋ ๋ต๋ณ
3. **์์ค์ปฌ๋ ์ด์
** โ ๋ณต์กํ ๋ฌธ์ / ๋ถ๋ง ๊ฐ์ง ์ ์ฌ์ฅ๋ํํ
Discord/์นดํก ์๋ฆผ
4. **์๋ต ํค ์ปค์คํ
** โ ๊ณ ๊ฐ์ฌ ๋ธ๋๋ ํค์ ๋ง์ถ ๋ต๋ณ ์์ฑ
5. **๋ก๊ทธ ๊ธฐ๋ก** โ ๋ชจ๋ CS ๋ํ ๋ก๊ทธ ์ ์ฅ (์ผ๋ณ)
6. **๋์๋ณด๋ ์์ฝ** โ ์ผ์ผ CS ์์ฝ (์ด ๋ฌธ์์, ์๋์ฒ๋ฆฌ์จ, ์์ค์ปฌ๋ ์ด์
๊ฑด์)
## ์ด๊ธฐ ์ค์
### 1. ๊ณ ๊ฐ์ฌ ์ค์ ํ์ผ ์์ฑ
```bash
cd {baseDir}
cp config/template.json config/๊ณ ๊ฐ์ฌ๋ช
.json
```
`config/๊ณ ๊ฐ์ฌ๋ช
.json` ํธ์ง:
- `clientId`: ๊ณ ์ ID
- `name`: ๊ณ ๊ฐ์ฌ ์ด๋ฆ
- `channels`: ์ฐ๋ํ ์ฑ๋ (kakao, instagram, email)
- `tone`: ์๋ต ํค (formal, friendly, casual)
- `escalationTarget`: Discord ์ฑ๋ ID ๋๋ ์นดํก ๋ฒํธ
- `faqPath`: FAQ DB ํ์ผ ๊ฒฝ๋ก
### 2. FAQ DB ์์ฑ
```bash
cp config/faq-template.json config/๊ณ ๊ฐ์ฌ๋ช
-faq.json
```
FAQ ํญ๋ชฉ ์ถ๊ฐ (JSON ๋ฐฐ์ด):
```json
[
{
"id": "faq001",
"question": "์์
์๊ฐ์ด ์ด๋ป๊ฒ ๋๋์?",
"keywords": ["์์
์๊ฐ", "๋ช์", "์ธ์ ", "์ด์"],
"answer": "์ ํฌ๋ ํ์ผ 10:00-22:00, ์ฃผ๋ง 12:00-20:00 ์์
ํฉ๋๋ค.",
"category": "์ด์์ ๋ณด"
}
]
```
## ์ฌ์ฉ๋ฒ
### ์ฑ๋ ๋ชจ๋ํฐ๋ง ์์
```bash
node {baseDir}/scripts/monitor.js --config config/๊ณ ๊ฐ์ฌ๋ช
.json
```
๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ (pm2 ๊ถ์ฅ):
```bash
pm2 start {baseDir}/scripts/monitor.js --name cs-mufi -- --config config/๊ณ ๊ฐ์ฌ๋ช
.json
pm2 logs cs-mufi
```
### ์๋ ์๋ต ํ
์คํธ
```bash
node {baseDir}/scripts/respond.js \
--config config/๊ณ ๊ฐ์ฌ๋ช
.json \
--channel instagram \
--user "iam.dawn.kim" \
--message "์์
์๊ฐ ์๋ ค์ฃผ์ธ์"
```
### ์ผ์ผ ๋์๋ณด๋ ์์ฝ
```bash
node {baseDir}/scripts/dashboard.js --config config/๊ณ ๊ฐ์ฌ๋ช
.json --date 2026-02-18
```
์ถ๋ ฅ ์์:
```
๐ CS ๋์๋ณด๋ - MUFI ํฌํ ๋ถ์ค (2026-02-18)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
์ด ๋ฌธ์์: 47๊ฑด
์๋ ์ฒ๋ฆฌ: 38๊ฑด (80.9%)
์์ค์ปฌ๋ ์ด์
: 9๊ฑด (19.1%)
์นดํ
๊ณ ๋ฆฌ๋ณ:
โข ์ด์์ ๋ณด: 18๊ฑด
โข ๊ฐ๊ฒฉ/์์ฝ: 15๊ฑด
โข ๊ธฐ์ ๋ฌธ์ : 9๊ฑด
โข ๋ถ๋ง/ํ๋ถ: 5๊ฑด
์ฑ๋๋ณ:
โข Instagram DM: 28๊ฑด
โข ์นด์นด์คํก: 13๊ฑด
โข ์ด๋ฉ์ผ: 6๊ฑด
ํ๊ท ์๋ต์๊ฐ: 3.2์ด
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
```
### ์์ค์ปฌ๋ ์ด์
์๋ ๋ฐ์ก
```bash
node {baseDir}/scripts/escalate.js \
--config config/๊ณ ๊ฐ์ฌ๋ช
.json \
--channel instagram \
--user "angry_customer" \
--message "ํ๋ถ ์์ฒญํฉ๋๋ค" \
--reason "ํ๋ถ ์์ฒญ"
```
## ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ
```
cs-autoresponder/
โโโ SKILL.md
โโโ scripts/
โ โโโ monitor.js # ์ฑ๋ ๋ชจ๋ํฐ๋ง ๋ฉ์ธ ๋ฃจํ
โ โโโ respond.js # FAQ ๋งค์นญ & ์๋ ์๋ต
โ โโโ escalate.js # ์์ค์ปฌ๋ ์ด์
์๋ฆผ
โ โโโ dashboard.js # ์ผ์ผ ์์ฝ ๋์๋ณด๋
โโโ lib/
โ โโโ channels.js # ์ฑ๋ ์ด๋ํฐ (mock API)
โ โโโ matcher.js # ์๋ฏธ ๊ธฐ๋ฐ FAQ ๋งค์นญ
โ โโโ logger.js # ๋ํ ๋ก๊ทธ ๊ธฐ๋ก
โโโ config/
โ โโโ template.json # ๊ณ ๊ฐ์ฌ ์ค์ ํ
ํ๋ฆฟ
โ โโโ faq-template.json # FAQ DB ํ
ํ๋ฆฟ
โโโ logs/
โโโ YYYY-MM-DD/ # ์ผ๋ณ ๋ํ ๋ก๊ทธ (clientId๋ณ)
```
## ์ฑ๋ ์ด๋ํฐ (Mock)
ํ์ฌ๋ mock API๋ก ๋์. Production ์ฐ๋ ์ `lib/channels.js` ์์ :
- **์นด์นด์คํก**: Kakao Alimtalk API
- **Instagram**: `tools/insta-cli/v2.js` ํ์ฉ
- **์ด๋ฉ์ผ**: himalaya ๋๋ Gmail API
## ์๋ฏธ ๊ธฐ๋ฐ ๋งค์นญ ๋ก์ง
`lib/matcher.js`๋ ๊ฐ๋จํ ํค์๋ ๋งค์นญ์ ์ฌ์ฉ:
1. ๊ณ ๊ฐ ๋ฌธ์๋ฅผ ์๋ฌธ์๋ก ๋ณํ
2. FAQ ํค์๋์ ๋น๊ต (๋ถ๋ถ ์ผ์น)
3. ๋งค์นญ ์ ์ ๊ณ์ฐ (์ฌ๋ฌ ํค์๋ ๋งค์นญ ์ ๊ฐ์ค์น ์ฆ๊ฐ)
4. ์๊ณ๊ฐ(0.6) ์ด์์ด๋ฉด ์๋ ์๋ต, ๋ฏธ๋ง์ด๋ฉด ์์ค์ปฌ๋ ์ด์
Production ์ OpenAI Embeddings ๋๋ Claude ํ์ฉ ๊ถ์ฅ.
## ์์ค์ปฌ๋ ์ด์
์กฐ๊ฑด
๋ค์ ์กฐ๊ฑด ์ค ํ๋๋ผ๋ ํด๋นํ๋ฉด ์์ค์ปฌ๋ ์ด์
:
- FAQ ๋งค์นญ ์ ์ < 0.6
- ๋ถ์ ํค์๋ ๊ฐ์ง (ํ๋ถ, ๋ถ๋ง, ํ๋จ, ์ค๋ง, ์ต์
)
- ๊ณ ๊ฐ์ด "๋ด๋น์", "์ฌ๋", "์ฌ์ฅ๋" ์์ฒญ
- ์ฐ์ 3ํ ์ด์ ๋์ผ ๊ณ ๊ฐ ๋ฌธ์
## ๋ก๊ทธ ํ์
`logs/YYYY-MM-DD/{clientId}.jsonl`:
```jsonl
{"timestamp":"2026-02-18T12:34:56.789Z","channel":"instagram","user":"iam.dawn.kim","message":"์์
์๊ฐ?","response":"ํ์ผ 10-22์ ์์
ํฉ๋๋ค","faqId":"faq001","score":0.85,"escalated":false}
{"timestamp":"2026-02-18T12:40:11.123Z","channel":"kakao","user":"010-1234-5678","message":"ํ๋ถํ๊ณ ์ถ์ด์","response":null,"faqId":null,"score":0.0,"escalated":true,"reason":"ํ๋ถ ํค์๋"}
```
## ์ฃผ์์ฌํญ
- **ํค ์ผ๊ด์ฑ**: ๊ณ ๊ฐ์ฌ๋ณ ํค ์ค์ ์ ์ค์ํ์ธ์
- **๊ฐ์ธ์ ๋ณด**: ๋ก๊ทธ์ ๋ฏผ๊ฐํ ์ ๋ณด(์ฃผ๋ฏผ๋ฒํธ, ์นด๋๋ฒํธ) ์ ์ฅ ๊ธ์ง
- **์๋ต ์๋**: FAQ ๋งค์นญ์ 3์ด ์ด๋ด ์๋ต ๋ชฉํ
- **์์ค์ปฌ๋ ์ด์
ํผ๋ก**: ๋๋ฌด ๋ง์ ์์ค์ปฌ๋ ์ด์
์ ํผ๋ก๊ฐ ์ ๋ฐ โ FAQ ์ง์ ๋ณด๊ฐ
## ํ์ฅ ๊ฐ๋ฅ์ฑ
- [ ] OpenAI Embeddings ๊ธฐ๋ฐ ์๋ฏธ ๋งค์นญ
- [ ] ๋ํ ์ปจํ
์คํธ ์ ์ง (์ธ์
๊ด๋ฆฌ)
- [ ] A/B ํ
์คํธ (์๋ต ํค ์คํ)
- [ ] ๋ฉํฐํด ๋ํ ์ง์
- [ ] ์๋ FAQ ํ์ต (๊ณ ๋น๋ ์ง๋ฌธ ๊ฐ์ง)
- [ ] ๊ณ ๊ฐ ๋ง์กฑ๋ ์ค๋ฌธ (์๋ต ํ ๋ณ์ )
---
**Note**: ์ด ์คํฌ์ mock API๋ก ์ ์๋์์ต๋๋ค. Production ํ๊ฒฝ์์๋ ์ค์ ์ฑ๋ API ์ฐ๋์ด ํ์ํฉ๋๋ค.
don't have the plugin yet? install it then click "run inline in claude" again.