72일차 정답 추가 (실습 정답본 · answers · VIBE-A · tbench)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
baf72561f7
commit
d88c5122d5
105 files changed
+24165
No files matched your search
@@ -0,0 +1,47 @@
|
||||
$ uv run tools/flow.py call base-helpdesk requests/faq-vpn.json -v
|
||||
HTTP 200 · 4.4s
|
||||
→ request POST /webhook/base-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
]
|
||||
}
|
||||
|
||||
$ uv run tools/flow.py bench base-helpdesk requests/faq-vpn.json -n 5
|
||||
POST http://localhost:5678/webhook/base-helpdesk × 5
|
||||
✔ #1 · HTTP 200 · 2.98s · route=자동 답변
|
||||
✔ #2 · HTTP 200 · 2.52s · route=자동 답변
|
||||
✔ #3 · HTTP 200 · 2.69s · route=자동 답변
|
||||
✔ #4 · HTTP 200 · 2.84s · route=자동 답변
|
||||
✔ #5 · HTTP 200 · 2.54s · route=자동 답변
|
||||
p50 2.69s · p95 2.98s · max 2.98s · failures 0/5
|
||||
report: runs/bench-base-helpdesk-20261024-174234.json
|
||||
|
||||
$ uv run tools/flow.py bench base-helpdesk requests/ticket-own.json -n 5
|
||||
POST http://localhost:5678/webhook/base-helpdesk × 5
|
||||
✔ #1 · HTTP 200 · 3.04s · route=자동 답변
|
||||
✔ #2 · HTTP 200 · 3.14s · route=자동 답변
|
||||
✔ #3 · HTTP 200 · 2.61s · route=자동 답변
|
||||
✔ #4 · HTTP 200 · 3.36s · route=자동 답변
|
||||
✔ #5 · HTTP 200 · 2.68s · route=자동 답변
|
||||
p50 3.04s · p95 3.36s · max 3.36s · failures 0/5
|
||||
report: runs/bench-base-helpdesk-20261024-174249.json
|
||||
|
||||
$ uv run tools/flow.py bench base-helpdesk requests/off-topic.json -n 5
|
||||
POST http://localhost:5678/webhook/base-helpdesk × 5
|
||||
✔ #1 · HTTP 200 · 2.90s · route=자동 답변
|
||||
✔ #2 · HTTP 200 · 2.55s · route=자동 답변
|
||||
✔ #3 · HTTP 200 · 2.62s · route=자동 답변
|
||||
✔ #4 · HTTP 200 · 2.56s · route=자동 답변
|
||||
✔ #5 · HTTP 200 · 2.44s · route=자동 답변
|
||||
p50 2.56s · p95 2.90s · max 2.90s · failures 0/5
|
||||
report: runs/bench-base-helpdesk-20261024-174302.json
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
{
|
||||
"cases": "lab01.json",
|
||||
"webhook": "base-helpdesk",
|
||||
"passed": 1,
|
||||
"total": 4,
|
||||
"results": [
|
||||
{
|
||||
"case": "VPN FAQ · 단계별 시간",
|
||||
"webhook": "base-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"timings has none of ['answer_ms']"
|
||||
],
|
||||
"seconds": 3.5,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주십시오.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "VPN FAQ · 전체 시간 · LLM 호출 수",
|
||||
"webhook": "base-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"timings has none of ['total_ms']",
|
||||
"steps has none of ['answer']",
|
||||
"llm_calls has none of ['1', '2', '3']"
|
||||
],
|
||||
"seconds": 2.9,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 시도해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주십시오.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 현황",
|
||||
"webhook": "base-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"timings has none of ['answer_ms']"
|
||||
],
|
||||
"seconds": 2.8,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": []
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "빈 질문",
|
||||
"webhook": "base-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.0,
|
||||
"status": 400,
|
||||
"request": {
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
},
|
||||
"response": {
|
||||
"error": "question is required"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
POST http://localhost:5678/webhook/base-helpdesk · 4 case(s) × 1
|
||||
✘ VPN FAQ · 단계별 시간 · 3.5s · timings has none of ['answer_ms']
|
||||
→ request POST /webhook/base-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주십시오.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
]
|
||||
}
|
||||
✘ VPN FAQ · 전체 시간 · LLM 호출 수 · 2.9s · timings has none of ['total_ms']; steps has none of ['answer']; llm_calls has none of ['1', '2', '3']
|
||||
→ request POST /webhook/base-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 시도해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주십시오.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
]
|
||||
}
|
||||
✘ 접수 현황 · 2.8s · timings has none of ['answer_ms']
|
||||
→ request POST /webhook/base-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": []
|
||||
}
|
||||
✔ 빈 질문 · 0.0s
|
||||
→ request POST /webhook/base-helpdesk
|
||||
{
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 400
|
||||
{
|
||||
"error": "question is required"
|
||||
}
|
||||
Passed 1/4
|
||||
report: runs/lab01-20261024-174311.json
|
||||
@@ -0,0 +1,137 @@
|
||||
{
|
||||
"cases": "lab01.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 3,
|
||||
"total": 4,
|
||||
"results": [
|
||||
{
|
||||
"case": "VPN FAQ · 단계별 시간",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 4.3,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 1210,
|
||||
"data_ms": 29,
|
||||
"answer_ms": 1119,
|
||||
"review_ms": 1042,
|
||||
"total_ms": 3426
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "VPN FAQ · 전체 시간 · LLM 호출 수",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.8,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 753,
|
||||
"data_ms": 19,
|
||||
"answer_ms": 1058,
|
||||
"review_ms": 890,
|
||||
"total_ms": 2731
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 현황",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"answer has none of ['처리 중']"
|
||||
],
|
||||
"seconds": 3.3,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 인증서 발급 승인 대기 중이며, 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 929,
|
||||
"data_ms": 21,
|
||||
"answer_ms": 1118,
|
||||
"review_ms": 1029,
|
||||
"total_ms": 3108
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "빈 질문",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.0,
|
||||
"status": 400,
|
||||
"request": {
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
},
|
||||
"response": {
|
||||
"error": "question is required"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
|
||||
✔ VPN FAQ · 단계별 시간 · 4.3s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 1210,
|
||||
"data_ms": 29,
|
||||
"answer_ms": 1119,
|
||||
"review_ms": 1042,
|
||||
"total_ms": 3426
|
||||
}
|
||||
}
|
||||
✔ VPN FAQ · 전체 시간 · LLM 호출 수 · 2.8s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 753,
|
||||
"data_ms": 19,
|
||||
"answer_ms": 1058,
|
||||
"review_ms": 890,
|
||||
"total_ms": 2731
|
||||
}
|
||||
}
|
||||
✘ 접수 현황 · 3.3s · answer has none of ['처리 중']
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 인증서 발급 승인 대기 중이며, 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 929,
|
||||
"data_ms": 21,
|
||||
"answer_ms": 1118,
|
||||
"review_ms": 1029,
|
||||
"total_ms": 3108
|
||||
}
|
||||
}
|
||||
✔ 빈 질문 · 0.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 400
|
||||
{
|
||||
"error": "question is required"
|
||||
}
|
||||
Passed 3/4
|
||||
report: runs/lab01-20261024-174333.json
|
||||
@@ -0,0 +1,33 @@
|
||||
$ uv run tools/flow.py call my-helpdesk requests/faq-vpn.json -v
|
||||
HTTP 200 · 2.7s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 클라이언트를 최신 버전으로 업데이트하시고, 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주십시오.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 616,
|
||||
"data_ms": 18,
|
||||
"answer_ms": 1124,
|
||||
"review_ms": 920,
|
||||
"total_ms": 2698
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
$ uv run tools/flow.py bench my-helpdesk requests/faq-vpn-nocache.json -n 5
|
||||
POST http://localhost:5678/webhook/my-helpdesk × 5
|
||||
✔ #1 · HTTP 200 · 2.57s · route=자동 답변, llm_calls=3, cached=false
|
||||
✔ #2 · HTTP 200 · 3.08s · route=자동 답변, llm_calls=3, cached=false
|
||||
✔ #3 · HTTP 200 · 2.91s · route=자동 답변, llm_calls=3, cached=false
|
||||
✔ #4 · HTTP 200 · 2.99s · route=자동 답변, llm_calls=3, cached=false
|
||||
✔ #5 · HTTP 200 · 2.80s · route=자동 답변, llm_calls=3, cached=false
|
||||
p50 2.91s · p95 3.08s · max 3.08s · failures 0/5
|
||||
report: runs/bench-my-helpdesk-20261024-174351.json
|
||||
|
||||
$ uv run tools/flow.py bench my-helpdesk requests/ticket-own.json -n 5
|
||||
POST http://localhost:5678/webhook/my-helpdesk × 5
|
||||
✔ #1 · HTTP 200 · 2.86s · route=자동 답변, llm_calls=3, cached=false
|
||||
✔ #2 · HTTP 200 · 3.05s · route=자동 답변, llm_calls=3, cached=false
|
||||
✔ #3 · HTTP 200 · 3.12s · route=자동 답변, llm_calls=3, cached=false
|
||||
✔ #4 · HTTP 200 · 2.94s · route=자동 답변, llm_calls=3, cached=false
|
||||
✔ #5 · HTTP 200 · 2.99s · route=자동 답변, llm_calls=3, cached=false
|
||||
p50 2.99s · p95 3.12s · max 3.12s · failures 0/5
|
||||
report: runs/bench-my-helpdesk-20261024-174406.json
|
||||
|
||||
$ uv run tools/flow.py bench my-helpdesk requests/off-topic.json -n 5
|
||||
POST http://localhost:5678/webhook/my-helpdesk × 5
|
||||
✔ #1 · HTTP 200 · 2.38s · route=자동 답변, llm_calls=3, cached=false
|
||||
✔ #2 · HTTP 200 · 2.36s · route=자동 답변, llm_calls=3, cached=false
|
||||
✔ #3 · HTTP 200 · 2.48s · route=자동 답변, llm_calls=3, cached=false
|
||||
✔ #4 · HTTP 200 · 2.49s · route=자동 답변, llm_calls=3, cached=false
|
||||
✔ #5 · HTTP 200 · 2.84s · route=자동 답변, llm_calls=3, cached=false
|
||||
p50 2.48s · p95 2.84s · max 2.84s · failures 0/5
|
||||
report: runs/bench-my-helpdesk-20261024-174419.json
|
||||
|
||||
$ uv run tools/flow.py call my-helpdesk requests/ticket-own.json -v
|
||||
HTTP 200 · 2.8s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 인증서 발급 승인 대기 중이며, 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 818,
|
||||
"data_ms": 43,
|
||||
"answer_ms": 877,
|
||||
"review_ms": 895,
|
||||
"total_ms": 2647
|
||||
}
|
||||
}
|
||||
|
||||
$ uv run tools/flow.py call my-helpdesk requests/off-topic.json -v
|
||||
HTTP 200 · 2.5s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "오늘 점심 메뉴 추천해 주세요",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "other",
|
||||
"answer": "찾으시는 정보를 확인하지 못했습니다. 점심 메뉴 추천은 담당 직원에게 문의해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 732,
|
||||
"data_ms": 19,
|
||||
"answer_ms": 740,
|
||||
"review_ms": 978,
|
||||
"total_ms": 2482
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,166 @@
|
||||
{
|
||||
"cases": "lab01-challenge.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 0,
|
||||
"total": 4,
|
||||
"results": [
|
||||
{
|
||||
"case": "FAQ · 접수 시간 따로",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"timings has none of ['faq_ms']"
|
||||
],
|
||||
"seconds": 2.7,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 595,
|
||||
"data_ms": 18,
|
||||
"answer_ms": 1005,
|
||||
"review_ms": 1012,
|
||||
"total_ms": 2643
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 조회 시간",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"timings has none of ['ticket_ms']"
|
||||
],
|
||||
"seconds": 2.6,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 716,
|
||||
"data_ms": 19,
|
||||
"answer_ms": 958,
|
||||
"review_ms": 881,
|
||||
"total_ms": 2594
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "가장 오래 걸린 단계",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"slowest_step has none of ['classify', 'answer', 'review']"
|
||||
],
|
||||
"seconds": 3.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 991,
|
||||
"data_ms": 18,
|
||||
"answer_ms": 1024,
|
||||
"review_ms": 991,
|
||||
"total_ms": 3037
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 현황도 같은 모양",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"answer has none of ['처리 중']",
|
||||
"slowest_step has none of ['classify', 'answer', 'review']"
|
||||
],
|
||||
"seconds": 2.8,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 인증서 발급 승인 대기 중이며, 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 803,
|
||||
"data_ms": 36,
|
||||
"answer_ms": 884,
|
||||
"review_ms": 1043,
|
||||
"total_ms": 2781
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
|
||||
✘ FAQ · 접수 시간 따로 · 2.7s · timings has none of ['faq_ms']
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 595,
|
||||
"data_ms": 18,
|
||||
"answer_ms": 1005,
|
||||
"review_ms": 1012,
|
||||
"total_ms": 2643
|
||||
}
|
||||
}
|
||||
✘ 접수 조회 시간 · 2.6s · timings has none of ['ticket_ms']
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 716,
|
||||
"data_ms": 19,
|
||||
"answer_ms": 958,
|
||||
"review_ms": 881,
|
||||
"total_ms": 2594
|
||||
}
|
||||
}
|
||||
✘ 가장 오래 걸린 단계 · 3.1s · slowest_step has none of ['classify', 'answer', 'review']
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 991,
|
||||
"data_ms": 18,
|
||||
"answer_ms": 1024,
|
||||
"review_ms": 991,
|
||||
"total_ms": 3037
|
||||
}
|
||||
}
|
||||
✘ 접수 현황도 같은 모양 · 2.8s · answer has none of ['처리 중']; slowest_step has none of ['classify', 'answer', 'review']
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 인증서 발급 승인 대기 중이며, 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 803,
|
||||
"data_ms": 36,
|
||||
"answer_ms": 884,
|
||||
"review_ms": 1043,
|
||||
"total_ms": 2781
|
||||
}
|
||||
}
|
||||
Passed 0/4
|
||||
report: runs/lab01-challenge-20261024-174435.json
|
||||
@@ -0,0 +1,165 @@
|
||||
{
|
||||
"cases": "lab01-challenge.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 4,
|
||||
"total": 4,
|
||||
"results": [
|
||||
{
|
||||
"case": "FAQ · 접수 시간 따로",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 4.5,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 1365,
|
||||
"faq_ms": 16,
|
||||
"ticket_ms": 14,
|
||||
"answer_ms": 1196,
|
||||
"review_ms": 993,
|
||||
"total_ms": 3614
|
||||
},
|
||||
"slowest_step": "classify"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 조회 시간",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.7,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 774,
|
||||
"faq_ms": 17,
|
||||
"ticket_ms": 13,
|
||||
"answer_ms": 971,
|
||||
"review_ms": 815,
|
||||
"total_ms": 2601
|
||||
},
|
||||
"slowest_step": "answer"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "가장 오래 걸린 단계",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 3.0,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 시도해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주십시오.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 680,
|
||||
"faq_ms": 17,
|
||||
"ticket_ms": 10,
|
||||
"answer_ms": 1044,
|
||||
"review_ms": 1007,
|
||||
"total_ms": 2769
|
||||
},
|
||||
"slowest_step": "answer"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 현황도 같은 모양",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 3.0,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 723,
|
||||
"faq_ms": 13,
|
||||
"ticket_ms": 11,
|
||||
"answer_ms": 1029,
|
||||
"review_ms": 1162,
|
||||
"total_ms": 2951
|
||||
},
|
||||
"slowest_step": "review"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
|
||||
✔ FAQ · 접수 시간 따로 · 4.5s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 1365,
|
||||
"faq_ms": 16,
|
||||
"ticket_ms": 14,
|
||||
"answer_ms": 1196,
|
||||
"review_ms": 993,
|
||||
"total_ms": 3614
|
||||
},
|
||||
"slowest_step": "classify"
|
||||
}
|
||||
✔ 접수 조회 시간 · 2.7s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 774,
|
||||
"faq_ms": 17,
|
||||
"ticket_ms": 13,
|
||||
"answer_ms": 971,
|
||||
"review_ms": 815,
|
||||
"total_ms": 2601
|
||||
},
|
||||
"slowest_step": "answer"
|
||||
}
|
||||
✔ 가장 오래 걸린 단계 · 3.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 시도해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주십시오.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 680,
|
||||
"faq_ms": 17,
|
||||
"ticket_ms": 10,
|
||||
"answer_ms": 1044,
|
||||
"review_ms": 1007,
|
||||
"total_ms": 2769
|
||||
},
|
||||
"slowest_step": "answer"
|
||||
}
|
||||
✔ 접수 현황도 같은 모양 · 3.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 723,
|
||||
"faq_ms": 13,
|
||||
"ticket_ms": 11,
|
||||
"answer_ms": 1029,
|
||||
"review_ms": 1162,
|
||||
"total_ms": 2951
|
||||
},
|
||||
"slowest_step": "review"
|
||||
}
|
||||
Passed 4/4
|
||||
report: runs/lab01-challenge-20261024-174502.json
|
||||
@@ -0,0 +1,141 @@
|
||||
{
|
||||
"cases": "lab01.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 4,
|
||||
"total": 4,
|
||||
"results": [
|
||||
{
|
||||
"case": "VPN FAQ · 단계별 시간",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.9,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 844,
|
||||
"faq_ms": 16,
|
||||
"ticket_ms": 9,
|
||||
"answer_ms": 990,
|
||||
"review_ms": 927,
|
||||
"total_ms": 2807
|
||||
},
|
||||
"slowest_step": "answer"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "VPN FAQ · 전체 시간 · LLM 호출 수",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.8,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 715,
|
||||
"faq_ms": 16,
|
||||
"ticket_ms": 14,
|
||||
"answer_ms": 1064,
|
||||
"review_ms": 988,
|
||||
"total_ms": 2810
|
||||
},
|
||||
"slowest_step": "answer"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 현황",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 3.0,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 810,
|
||||
"faq_ms": 16,
|
||||
"ticket_ms": 11,
|
||||
"answer_ms": 1014,
|
||||
"review_ms": 1058,
|
||||
"total_ms": 2925
|
||||
},
|
||||
"slowest_step": "review"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "빈 질문",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.0,
|
||||
"status": 400,
|
||||
"request": {
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
},
|
||||
"response": {
|
||||
"error": "question is required"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
|
||||
✔ VPN FAQ · 단계별 시간 · 2.9s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 844,
|
||||
"faq_ms": 16,
|
||||
"ticket_ms": 9,
|
||||
"answer_ms": 990,
|
||||
"review_ms": 927,
|
||||
"total_ms": 2807
|
||||
},
|
||||
"slowest_step": "answer"
|
||||
}
|
||||
✔ VPN FAQ · 전체 시간 · LLM 호출 수 · 2.8s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 715,
|
||||
"faq_ms": 16,
|
||||
"ticket_ms": 14,
|
||||
"answer_ms": 1064,
|
||||
"review_ms": 988,
|
||||
"total_ms": 2810
|
||||
},
|
||||
"slowest_step": "answer"
|
||||
}
|
||||
✔ 접수 현황 · 3.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 810,
|
||||
"faq_ms": 16,
|
||||
"ticket_ms": 11,
|
||||
"answer_ms": 1014,
|
||||
"review_ms": 1058,
|
||||
"total_ms": 2925
|
||||
},
|
||||
"slowest_step": "review"
|
||||
}
|
||||
✔ 빈 질문 · 0.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 400
|
||||
{
|
||||
"error": "question is required"
|
||||
}
|
||||
Passed 4/4
|
||||
report: runs/lab01-20261024-174511.json
|
||||
@@ -0,0 +1,180 @@
|
||||
{
|
||||
"cases": "lab01-challenge2.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 0,
|
||||
"total": 4,
|
||||
"results": [
|
||||
{
|
||||
"case": "예산 안 (넉넉한 예산)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"over_budget = null (expected false)",
|
||||
"budget_ms = null (expected 60000)",
|
||||
"llm_ms has none of ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']"
|
||||
],
|
||||
"seconds": 2.9,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true,
|
||||
"budget_ms": 60000
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 628,
|
||||
"faq_ms": 11,
|
||||
"ticket_ms": 11,
|
||||
"answer_ms": 1142,
|
||||
"review_ms": 1028,
|
||||
"total_ms": 2862
|
||||
},
|
||||
"slowest_step": "answer"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예산 넘음 (0.5초 예산)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"over_budget = null (expected true)",
|
||||
"budget_ms = null (expected 500)"
|
||||
],
|
||||
"seconds": 2.7,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true,
|
||||
"budget_ms": 500
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 658,
|
||||
"faq_ms": 14,
|
||||
"ticket_ms": 11,
|
||||
"answer_ms": 1013,
|
||||
"review_ms": 930,
|
||||
"total_ms": 2640
|
||||
},
|
||||
"slowest_step": "answer"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예산을 안 주면 3초",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"budget_ms = null (expected 3000)",
|
||||
"llm_ms has none of ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']"
|
||||
],
|
||||
"seconds": 3.6,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주십시오.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 650,
|
||||
"faq_ms": 14,
|
||||
"ticket_ms": 13,
|
||||
"answer_ms": 1767,
|
||||
"review_ms": 1061,
|
||||
"total_ms": 3520
|
||||
},
|
||||
"slowest_step": "answer"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 현황도 같은 모양",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"budget_ms = null (expected 3000)",
|
||||
"llm_ms has none of ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']"
|
||||
],
|
||||
"seconds": 2.8,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 772,
|
||||
"faq_ms": 14,
|
||||
"ticket_ms": 12,
|
||||
"answer_ms": 895,
|
||||
"review_ms": 1006,
|
||||
"total_ms": 2719
|
||||
},
|
||||
"slowest_step": "review"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
|
||||
✘ 예산 안 (넉넉한 예산) · 2.9s · over_budget = null (expected false); budget_ms = null (expected 60000); llm_ms has none of ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true,
|
||||
"budget_ms": 60000
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 628,
|
||||
"faq_ms": 11,
|
||||
"ticket_ms": 11,
|
||||
"answer_ms": 1142,
|
||||
"review_ms": 1028,
|
||||
"total_ms": 2862
|
||||
},
|
||||
"slowest_step": "answer"
|
||||
}
|
||||
✘ 예산 넘음 (0.5초 예산) · 2.7s · over_budget = null (expected true); budget_ms = null (expected 500)
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true,
|
||||
"budget_ms": 500
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 658,
|
||||
"faq_ms": 14,
|
||||
"ticket_ms": 11,
|
||||
"answer_ms": 1013,
|
||||
"review_ms": 930,
|
||||
"total_ms": 2640
|
||||
},
|
||||
"slowest_step": "answer"
|
||||
}
|
||||
✘ 예산을 안 주면 3초 · 3.6s · budget_ms = null (expected 3000); llm_ms has none of ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주십시오.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 650,
|
||||
"faq_ms": 14,
|
||||
"ticket_ms": 13,
|
||||
"answer_ms": 1767,
|
||||
"review_ms": 1061,
|
||||
"total_ms": 3520
|
||||
},
|
||||
"slowest_step": "answer"
|
||||
}
|
||||
✘ 접수 현황도 같은 모양 · 2.8s · budget_ms = null (expected 3000); llm_ms has none of ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 772,
|
||||
"faq_ms": 14,
|
||||
"ticket_ms": 12,
|
||||
"answer_ms": 895,
|
||||
"review_ms": 1006,
|
||||
"total_ms": 2719
|
||||
},
|
||||
"slowest_step": "review"
|
||||
}
|
||||
Passed 0/4
|
||||
report: runs/lab01-challenge2-20261024-174523.json
|
||||
@@ -0,0 +1,179 @@
|
||||
{
|
||||
"cases": "lab01-challenge2.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 4,
|
||||
"total": 4,
|
||||
"results": [
|
||||
{
|
||||
"case": "예산 안 (넉넉한 예산)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 4.2,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true,
|
||||
"budget_ms": 60000
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 1208,
|
||||
"faq_ms": 17,
|
||||
"ticket_ms": 14,
|
||||
"answer_ms": 1230,
|
||||
"review_ms": 857,
|
||||
"total_ms": 3357
|
||||
},
|
||||
"slowest_step": "answer",
|
||||
"llm_ms": 3295,
|
||||
"budget_ms": 60000,
|
||||
"over_budget": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예산 넘음 (0.5초 예산)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.7,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true,
|
||||
"budget_ms": 500
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 667,
|
||||
"faq_ms": 15,
|
||||
"ticket_ms": 11,
|
||||
"answer_ms": 980,
|
||||
"review_ms": 916,
|
||||
"total_ms": 2609
|
||||
},
|
||||
"slowest_step": "answer",
|
||||
"llm_ms": 2563,
|
||||
"budget_ms": 500,
|
||||
"over_budget": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예산을 안 주면 3초",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 3.2,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 761,
|
||||
"faq_ms": 18,
|
||||
"ticket_ms": 18,
|
||||
"answer_ms": 1027,
|
||||
"review_ms": 1185,
|
||||
"total_ms": 3023
|
||||
},
|
||||
"slowest_step": "review",
|
||||
"llm_ms": 2973,
|
||||
"budget_ms": 3000,
|
||||
"over_budget": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 현황도 같은 모양",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.9,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 795,
|
||||
"faq_ms": 13,
|
||||
"ticket_ms": 14,
|
||||
"answer_ms": 1017,
|
||||
"review_ms": 1046,
|
||||
"total_ms": 2904
|
||||
},
|
||||
"slowest_step": "review",
|
||||
"llm_ms": 2858,
|
||||
"budget_ms": 3000,
|
||||
"over_budget": false
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,150 @@
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
|
||||
✔ 예산 안 (넉넉한 예산) · 4.2s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true,
|
||||
"budget_ms": 60000
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 1208,
|
||||
"faq_ms": 17,
|
||||
"ticket_ms": 14,
|
||||
"answer_ms": 1230,
|
||||
"review_ms": 857,
|
||||
"total_ms": 3357
|
||||
},
|
||||
"slowest_step": "answer",
|
||||
"llm_ms": 3295,
|
||||
"budget_ms": 60000,
|
||||
"over_budget": false
|
||||
}
|
||||
✔ 예산 넘음 (0.5초 예산) · 2.7s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true,
|
||||
"budget_ms": 500
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 667,
|
||||
"faq_ms": 15,
|
||||
"ticket_ms": 11,
|
||||
"answer_ms": 980,
|
||||
"review_ms": 916,
|
||||
"total_ms": 2609
|
||||
},
|
||||
"slowest_step": "answer",
|
||||
"llm_ms": 2563,
|
||||
"budget_ms": 500,
|
||||
"over_budget": true
|
||||
}
|
||||
✔ 예산을 안 주면 3초 · 3.2s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 761,
|
||||
"faq_ms": 18,
|
||||
"ticket_ms": 18,
|
||||
"answer_ms": 1027,
|
||||
"review_ms": 1185,
|
||||
"total_ms": 3023
|
||||
},
|
||||
"slowest_step": "review",
|
||||
"llm_ms": 2973,
|
||||
"budget_ms": 3000,
|
||||
"over_budget": true
|
||||
}
|
||||
✔ 접수 현황도 같은 모양 · 2.9s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 795,
|
||||
"faq_ms": 13,
|
||||
"ticket_ms": 14,
|
||||
"answer_ms": 1017,
|
||||
"review_ms": 1046,
|
||||
"total_ms": 2904
|
||||
},
|
||||
"slowest_step": "review",
|
||||
"llm_ms": 2858,
|
||||
"budget_ms": 3000,
|
||||
"over_budget": false
|
||||
}
|
||||
Passed 4/4
|
||||
report: runs/lab01-challenge2-20261024-174548.json
|
||||
@@ -0,0 +1,177 @@
|
||||
{
|
||||
"cases": "lab01-challenge.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 4,
|
||||
"total": 4,
|
||||
"results": [
|
||||
{
|
||||
"case": "FAQ · 접수 시간 따로",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.7,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 603,
|
||||
"faq_ms": 9,
|
||||
"ticket_ms": 10,
|
||||
"answer_ms": 969,
|
||||
"review_ms": 1043,
|
||||
"total_ms": 2677
|
||||
},
|
||||
"slowest_step": "review",
|
||||
"llm_ms": 2615,
|
||||
"budget_ms": 3000,
|
||||
"over_budget": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 조회 시간",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.6,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 614,
|
||||
"faq_ms": 13,
|
||||
"ticket_ms": 13,
|
||||
"answer_ms": 1019,
|
||||
"review_ms": 876,
|
||||
"total_ms": 2543
|
||||
},
|
||||
"slowest_step": "answer",
|
||||
"llm_ms": 2509,
|
||||
"budget_ms": 3000,
|
||||
"over_budget": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "가장 오래 걸린 단계",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.9,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 687,
|
||||
"faq_ms": 17,
|
||||
"ticket_ms": 10,
|
||||
"answer_ms": 1146,
|
||||
"review_ms": 965,
|
||||
"total_ms": 2838
|
||||
},
|
||||
"slowest_step": "answer",
|
||||
"llm_ms": 2798,
|
||||
"budget_ms": 3000,
|
||||
"over_budget": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 현황도 같은 모양",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.9,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 767,
|
||||
"faq_ms": 15,
|
||||
"ticket_ms": 9,
|
||||
"answer_ms": 1053,
|
||||
"review_ms": 1007,
|
||||
"total_ms": 2865
|
||||
},
|
||||
"slowest_step": "answer",
|
||||
"llm_ms": 2827,
|
||||
"budget_ms": 3000,
|
||||
"over_budget": false
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,148 @@
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
|
||||
✔ FAQ · 접수 시간 따로 · 2.7s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 603,
|
||||
"faq_ms": 9,
|
||||
"ticket_ms": 10,
|
||||
"answer_ms": 969,
|
||||
"review_ms": 1043,
|
||||
"total_ms": 2677
|
||||
},
|
||||
"slowest_step": "review",
|
||||
"llm_ms": 2615,
|
||||
"budget_ms": 3000,
|
||||
"over_budget": false
|
||||
}
|
||||
✔ 접수 조회 시간 · 2.6s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 614,
|
||||
"faq_ms": 13,
|
||||
"ticket_ms": 13,
|
||||
"answer_ms": 1019,
|
||||
"review_ms": 876,
|
||||
"total_ms": 2543
|
||||
},
|
||||
"slowest_step": "answer",
|
||||
"llm_ms": 2509,
|
||||
"budget_ms": 3000,
|
||||
"over_budget": false
|
||||
}
|
||||
✔ 가장 오래 걸린 단계 · 2.9s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 687,
|
||||
"faq_ms": 17,
|
||||
"ticket_ms": 10,
|
||||
"answer_ms": 1146,
|
||||
"review_ms": 965,
|
||||
"total_ms": 2838
|
||||
},
|
||||
"slowest_step": "answer",
|
||||
"llm_ms": 2798,
|
||||
"budget_ms": 3000,
|
||||
"over_budget": false
|
||||
}
|
||||
✔ 접수 현황도 같은 모양 · 2.9s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 767,
|
||||
"faq_ms": 15,
|
||||
"ticket_ms": 9,
|
||||
"answer_ms": 1053,
|
||||
"review_ms": 1007,
|
||||
"total_ms": 2865
|
||||
},
|
||||
"slowest_step": "answer",
|
||||
"llm_ms": 2827,
|
||||
"budget_ms": 3000,
|
||||
"over_budget": false
|
||||
}
|
||||
Passed 4/4
|
||||
report: runs/lab01-challenge-20261024-174559.json
|
||||
@@ -0,0 +1,150 @@
|
||||
{
|
||||
"cases": "lab01.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 4,
|
||||
"total": 4,
|
||||
"results": [
|
||||
{
|
||||
"case": "VPN FAQ · 단계별 시간",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 3.0,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 785,
|
||||
"faq_ms": 14,
|
||||
"ticket_ms": 9,
|
||||
"answer_ms": 1053,
|
||||
"review_ms": 1031,
|
||||
"total_ms": 2902
|
||||
},
|
||||
"slowest_step": "answer",
|
||||
"llm_ms": 2869,
|
||||
"budget_ms": 3000,
|
||||
"over_budget": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "VPN FAQ · 전체 시간 · LLM 호출 수",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.7,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 750,
|
||||
"faq_ms": 15,
|
||||
"ticket_ms": 14,
|
||||
"answer_ms": 984,
|
||||
"review_ms": 895,
|
||||
"total_ms": 2672
|
||||
},
|
||||
"slowest_step": "answer",
|
||||
"llm_ms": 2629,
|
||||
"budget_ms": 3000,
|
||||
"over_budget": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 현황",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 3.4,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 938,
|
||||
"faq_ms": 10,
|
||||
"ticket_ms": 9,
|
||||
"answer_ms": 981,
|
||||
"review_ms": 1355,
|
||||
"total_ms": 3310
|
||||
},
|
||||
"slowest_step": "review",
|
||||
"llm_ms": 3274,
|
||||
"budget_ms": 3000,
|
||||
"over_budget": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "빈 질문",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.0,
|
||||
"status": 400,
|
||||
"request": {
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
},
|
||||
"response": {
|
||||
"error": "question is required"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,121 @@
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
|
||||
✔ VPN FAQ · 단계별 시간 · 3.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 785,
|
||||
"faq_ms": 14,
|
||||
"ticket_ms": 9,
|
||||
"answer_ms": 1053,
|
||||
"review_ms": 1031,
|
||||
"total_ms": 2902
|
||||
},
|
||||
"slowest_step": "answer",
|
||||
"llm_ms": 2869,
|
||||
"budget_ms": 3000,
|
||||
"over_budget": false
|
||||
}
|
||||
✔ VPN FAQ · 전체 시간 · LLM 호출 수 · 2.7s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 750,
|
||||
"faq_ms": 15,
|
||||
"ticket_ms": 14,
|
||||
"answer_ms": 984,
|
||||
"review_ms": 895,
|
||||
"total_ms": 2672
|
||||
},
|
||||
"slowest_step": "answer",
|
||||
"llm_ms": 2629,
|
||||
"budget_ms": 3000,
|
||||
"over_budget": false
|
||||
}
|
||||
✔ 접수 현황 · 3.4s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"classify_ms": 938,
|
||||
"faq_ms": 10,
|
||||
"ticket_ms": 9,
|
||||
"answer_ms": 981,
|
||||
"review_ms": 1355,
|
||||
"total_ms": 3310
|
||||
},
|
||||
"slowest_step": "review",
|
||||
"llm_ms": 3274,
|
||||
"budget_ms": 3000,
|
||||
"over_budget": true
|
||||
}
|
||||
✔ 빈 질문 · 0.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 400
|
||||
{
|
||||
"error": "question is required"
|
||||
}
|
||||
Passed 4/4
|
||||
report: runs/lab01-20261024-174609.json
|
||||
@@ -0,0 +1,332 @@
|
||||
{
|
||||
"cases": "lab02.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 7,
|
||||
"total": 9,
|
||||
"results": [
|
||||
{
|
||||
"case": "예제 1 · 프린터 FAQ는 규칙으로",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 3.8,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하시고, 인쇄 대기열을 비운 후 다시 시도해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주십시오.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 41,
|
||||
"answer_ms": 1766,
|
||||
"review_ms": 1115,
|
||||
"total_ms": 2945
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 1 · 접수 번호는 규칙으로",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.5,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 32,
|
||||
"answer_ms": 1041,
|
||||
"review_ms": 1209,
|
||||
"total_ms": 2295
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 1 · 없는 접수 번호",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-9999 접수 건은 어떻게 됐나요?",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-9999 접수 건은 현재 확인되지 않습니다. 담당 직원이 확인 후 도움을 드리겠습니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 23,
|
||||
"answer_ms": 1209,
|
||||
"review_ms": 797,
|
||||
"total_ms": 2040
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 1 · 규칙으로 모르면 LLM이 분류",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.4,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "죄송합니다만, 해당 정보를 찾지 못했습니다. 담당 직원이 곧 도움을 드리겠습니다. 감사합니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 21,
|
||||
"classify_ms": 582,
|
||||
"answer_ms": 908,
|
||||
"review_ms": 877,
|
||||
"total_ms": 2401
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · 처음 묻는 VPN",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.3,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 20,
|
||||
"answer_ms": 1202,
|
||||
"review_ms": 994,
|
||||
"total_ms": 2234
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · 같은 질문 (띄어쓰기·대소문자 다름)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"took 1.9s (expected at most 1s)",
|
||||
"cached = false (expected true)",
|
||||
"llm_calls = 2 (expected 0)"
|
||||
],
|
||||
"seconds": 1.9,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
|
||||
"user": "최유진"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 문제가 계속되면 담당 직원에게 문의해 주십시오.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 24,
|
||||
"answer_ms": 967,
|
||||
"review_ms": 890,
|
||||
"total_ms": 1898
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · no_cache면 캐시 안 씀",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.3,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 17,
|
||||
"answer_ms": 1128,
|
||||
"review_ms": 1048,
|
||||
"total_ms": 2213
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · 접수 현황은 캐시 안 함 (1)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.2,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 30,
|
||||
"answer_ms": 829,
|
||||
"review_ms": 1300,
|
||||
"total_ms": 2171
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · 접수 현황은 캐시 안 함 (2)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"answer has none of ['처리 중']"
|
||||
],
|
||||
"seconds": 2.0,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 인증서 발급 승인 대기 중이며, 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 20,
|
||||
"answer_ms": 951,
|
||||
"review_ms": 940,
|
||||
"total_ms": 1924
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,268 @@
|
||||
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 2}
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 9 case(s) × 1
|
||||
✔ 예제 1 · 프린터 FAQ는 규칙으로 · 3.8s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하시고, 인쇄 대기열을 비운 후 다시 시도해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주십시오.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 41,
|
||||
"answer_ms": 1766,
|
||||
"review_ms": 1115,
|
||||
"total_ms": 2945
|
||||
}
|
||||
}
|
||||
✔ 예제 1 · 접수 번호는 규칙으로 · 2.5s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 32,
|
||||
"answer_ms": 1041,
|
||||
"review_ms": 1209,
|
||||
"total_ms": 2295
|
||||
}
|
||||
}
|
||||
✔ 예제 1 · 없는 접수 번호 · 2.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-9999 접수 건은 어떻게 됐나요?",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-9999 접수 건은 현재 확인되지 않습니다. 담당 직원이 확인 후 도움을 드리겠습니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 23,
|
||||
"answer_ms": 1209,
|
||||
"review_ms": 797,
|
||||
"total_ms": 2040
|
||||
}
|
||||
}
|
||||
✔ 예제 1 · 규칙으로 모르면 LLM이 분류 · 2.4s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "죄송합니다만, 해당 정보를 찾지 못했습니다. 담당 직원이 곧 도움을 드리겠습니다. 감사합니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 21,
|
||||
"classify_ms": 582,
|
||||
"answer_ms": 908,
|
||||
"review_ms": 877,
|
||||
"total_ms": 2401
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · 처음 묻는 VPN · 2.3s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 20,
|
||||
"answer_ms": 1202,
|
||||
"review_ms": 994,
|
||||
"total_ms": 2234
|
||||
}
|
||||
}
|
||||
✘ 예제 2 · 같은 질문 (띄어쓰기·대소문자 다름) · 1.9s · took 1.9s (expected at most 1s); cached = false (expected true); llm_calls = 2 (expected 0)
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
|
||||
"user": "최유진"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 문제가 계속되면 담당 직원에게 문의해 주십시오.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 24,
|
||||
"answer_ms": 967,
|
||||
"review_ms": 890,
|
||||
"total_ms": 1898
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · no_cache면 캐시 안 씀 · 2.3s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 17,
|
||||
"answer_ms": 1128,
|
||||
"review_ms": 1048,
|
||||
"total_ms": 2213
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · 접수 현황은 캐시 안 함 (1) · 2.2s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 30,
|
||||
"answer_ms": 829,
|
||||
"review_ms": 1300,
|
||||
"total_ms": 2171
|
||||
}
|
||||
}
|
||||
✘ 예제 2 · 접수 현황은 캐시 안 함 (2) · 2.0s · answer has none of ['처리 중']
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 인증서 발급 승인 대기 중이며, 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 20,
|
||||
"answer_ms": 951,
|
||||
"review_ms": 940,
|
||||
"total_ms": 1924
|
||||
}
|
||||
}
|
||||
Passed 7/9
|
||||
report: runs/lab02-20261024-174642.json
|
||||
@@ -0,0 +1,10 @@
|
||||
$ uv run tools/flow.py bench my-helpdesk requests/faq-printer.json -n 5
|
||||
POST http://localhost:5678/webhook/my-helpdesk × 5
|
||||
✔ #1 · HTTP 200 · 2.50s · route=자동 답변, llm_calls=2, cached=false
|
||||
✔ #2 · HTTP 200 · 2.45s · route=자동 답변, llm_calls=2, cached=false
|
||||
✔ #3 · HTTP 200 · 2.51s · route=자동 답변, llm_calls=2, cached=false
|
||||
✔ #4 · HTTP 200 · 2.39s · route=자동 답변, llm_calls=2, cached=false
|
||||
✔ #5 · HTTP 200 · 2.12s · route=자동 답변, llm_calls=2, cached=false
|
||||
p50 2.45s · p95 2.51s · max 2.51s · failures 0/5
|
||||
report: runs/bench-my-helpdesk-20261024-174654.json
|
||||
|
||||
@@ -0,0 +1,319 @@
|
||||
{
|
||||
"cases": "lab02.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 9,
|
||||
"total": 9,
|
||||
"results": [
|
||||
{
|
||||
"case": "예제 1 · 프린터 FAQ는 규칙으로",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 3.9,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하시고, 인쇄 대기열을 비운 후 다시 시도해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주십시오.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 76,
|
||||
"answer_ms": 1837,
|
||||
"review_ms": 1048,
|
||||
"total_ms": 2981
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 1 · 접수 번호는 규칙으로",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 32,
|
||||
"answer_ms": 911,
|
||||
"review_ms": 1002,
|
||||
"total_ms": 1957
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 1 · 없는 접수 번호",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.0,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-9999 접수 건은 어떻게 됐나요?",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-9999 접수 건은 현재 확인되지 않습니다. 담당 직원이 확인 후 도움을 드리겠습니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 40,
|
||||
"answer_ms": 1008,
|
||||
"review_ms": 870,
|
||||
"total_ms": 1932
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 1 · 규칙으로 모르면 LLM이 분류",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.6,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "죄송합니다만, 해당 정보를 찾지 못했습니다. 담당 직원이 곧 도움을 드리겠습니다. 감사합니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 32,
|
||||
"classify_ms": 767,
|
||||
"answer_ms": 810,
|
||||
"review_ms": 962,
|
||||
"total_ms": 2586
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · 처음 묻는 VPN",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.2,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 58,
|
||||
"answer_ms": 1140,
|
||||
"review_ms": 929,
|
||||
"total_ms": 2143
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · 같은 질문 (띄어쓰기·대소문자 다름)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
|
||||
"user": "최유진"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"cached": true,
|
||||
"steps": [
|
||||
"cache"
|
||||
],
|
||||
"timings": {
|
||||
"total_ms": 34
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · no_cache면 캐시 안 씀",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.3,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 33,
|
||||
"answer_ms": 1024,
|
||||
"review_ms": 1125,
|
||||
"total_ms": 2194
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · 접수 현황은 캐시 안 함 (1)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.2,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 35,
|
||||
"answer_ms": 964,
|
||||
"review_ms": 1161,
|
||||
"total_ms": 2173
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · 접수 현황은 캐시 안 함 (2)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.2,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 27,
|
||||
"answer_ms": 886,
|
||||
"review_ms": 1239,
|
||||
"total_ms": 2168
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,261 @@
|
||||
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 0}
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 9 case(s) × 1
|
||||
✔ 예제 1 · 프린터 FAQ는 규칙으로 · 3.9s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하시고, 인쇄 대기열을 비운 후 다시 시도해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직원에게 문의해 주십시오.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 76,
|
||||
"answer_ms": 1837,
|
||||
"review_ms": 1048,
|
||||
"total_ms": 2981
|
||||
}
|
||||
}
|
||||
✔ 예제 1 · 접수 번호는 규칙으로 · 2.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 32,
|
||||
"answer_ms": 911,
|
||||
"review_ms": 1002,
|
||||
"total_ms": 1957
|
||||
}
|
||||
}
|
||||
✔ 예제 1 · 없는 접수 번호 · 2.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-9999 접수 건은 어떻게 됐나요?",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-9999 접수 건은 현재 확인되지 않습니다. 담당 직원이 확인 후 도움을 드리겠습니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 40,
|
||||
"answer_ms": 1008,
|
||||
"review_ms": 870,
|
||||
"total_ms": 1932
|
||||
}
|
||||
}
|
||||
✔ 예제 1 · 규칙으로 모르면 LLM이 분류 · 2.6s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "죄송합니다만, 해당 정보를 찾지 못했습니다. 담당 직원이 곧 도움을 드리겠습니다. 감사합니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 32,
|
||||
"classify_ms": 767,
|
||||
"answer_ms": 810,
|
||||
"review_ms": 962,
|
||||
"total_ms": 2586
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · 처음 묻는 VPN · 2.2s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 58,
|
||||
"answer_ms": 1140,
|
||||
"review_ms": 929,
|
||||
"total_ms": 2143
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · 같은 질문 (띄어쓰기·대소문자 다름) · 0.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
|
||||
"user": "최유진"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"cached": true,
|
||||
"steps": [
|
||||
"cache"
|
||||
],
|
||||
"timings": {
|
||||
"total_ms": 34
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · no_cache면 캐시 안 씀 · 2.3s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 33,
|
||||
"answer_ms": 1024,
|
||||
"review_ms": 1125,
|
||||
"total_ms": 2194
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · 접수 현황은 캐시 안 함 (1) · 2.2s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 35,
|
||||
"answer_ms": 964,
|
||||
"review_ms": 1161,
|
||||
"total_ms": 2173
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · 접수 현황은 캐시 안 함 (2) · 2.2s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 27,
|
||||
"answer_ms": 886,
|
||||
"review_ms": 1239,
|
||||
"total_ms": 2168
|
||||
}
|
||||
}
|
||||
Passed 9/9
|
||||
report: runs/lab02-20261024-174725.json
|
||||
@@ -0,0 +1,134 @@
|
||||
{
|
||||
"cases": "lab01.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 3,
|
||||
"total": 4,
|
||||
"results": [
|
||||
{
|
||||
"case": "VPN FAQ · 단계별 시간",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 34,
|
||||
"answer_ms": 1125,
|
||||
"review_ms": 852,
|
||||
"total_ms": 2029
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "VPN FAQ · 전체 시간 · LLM 호출 수",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.2,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 30,
|
||||
"answer_ms": 1182,
|
||||
"review_ms": 890,
|
||||
"total_ms": 2114
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 현황",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"answer has none of ['처리 중']"
|
||||
],
|
||||
"seconds": 2.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 인증서 발급 승인 대기 중이며, 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 50,
|
||||
"answer_ms": 884,
|
||||
"review_ms": 1046,
|
||||
"total_ms": 1992
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "빈 질문",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.0,
|
||||
"status": 400,
|
||||
"request": {
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
},
|
||||
"response": {
|
||||
"error": "question is required"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
|
||||
✔ VPN FAQ · 단계별 시간 · 2.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 34,
|
||||
"answer_ms": 1125,
|
||||
"review_ms": 852,
|
||||
"total_ms": 2029
|
||||
}
|
||||
}
|
||||
✔ VPN FAQ · 전체 시간 · LLM 호출 수 · 2.2s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 30,
|
||||
"answer_ms": 1182,
|
||||
"review_ms": 890,
|
||||
"total_ms": 2114
|
||||
}
|
||||
}
|
||||
✘ 접수 현황 · 2.1s · answer has none of ['처리 중']
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 인증서 발급 승인 대기 중이며, 10월 20일에 완료될 예정입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 50,
|
||||
"answer_ms": 884,
|
||||
"review_ms": 1046,
|
||||
"total_ms": 1992
|
||||
}
|
||||
}
|
||||
✔ 빈 질문 · 0.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 400
|
||||
{
|
||||
"error": "question is required"
|
||||
}
|
||||
Passed 3/4
|
||||
report: runs/lab01-20261024-174732.json
|
||||
@@ -0,0 +1,3 @@
|
||||
$ curl -s localhost:8800/cache-stats; echo
|
||||
{"entries": 2, "hits": 4, "misses": 8}
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
$ curl -s -XPOST localhost:8800/cache-clear; echo
|
||||
{"cleared": 2}
|
||||
|
||||
$ uv run tools/flow.py bench my-helpdesk requests/faq-vpn.json -n 5
|
||||
POST http://localhost:5678/webhook/my-helpdesk × 5
|
||||
✔ #1 · HTTP 200 · 2.07s · route=자동 답변, llm_calls=2, cached=false
|
||||
✔ #2 · HTTP 200 · 0.06s · route=자동 답변, llm_calls=0, cached=true
|
||||
✔ #3 · HTTP 200 · 0.05s · route=자동 답변, llm_calls=0, cached=true
|
||||
✔ #4 · HTTP 200 · 0.04s · route=자동 답변, llm_calls=0, cached=true
|
||||
✔ #5 · HTTP 200 · 0.05s · route=자동 답변, llm_calls=0, cached=true
|
||||
p50 0.05s · p95 2.07s · max 2.07s · failures 0/5
|
||||
report: runs/bench-my-helpdesk-20261024-174734.json
|
||||
|
||||
$ uv run tools/flow.py bench my-helpdesk requests/faq-vpn-nocache.json -n 5
|
||||
POST http://localhost:5678/webhook/my-helpdesk × 5
|
||||
✔ #1 · HTTP 200 · 1.99s · route=자동 답변, llm_calls=2, cached=false
|
||||
✔ #2 · HTTP 200 · 1.98s · route=자동 답변, llm_calls=2, cached=false
|
||||
✔ #3 · HTTP 200 · 2.21s · route=자동 답변, llm_calls=2, cached=false
|
||||
✔ #4 · HTTP 200 · 1.97s · route=자동 답변, llm_calls=2, cached=false
|
||||
✔ #5 · HTTP 200 · 2.24s · route=자동 답변, llm_calls=2, cached=false
|
||||
p50 1.99s · p95 2.24s · max 2.24s · failures 0/5
|
||||
report: runs/bench-my-helpdesk-20261024-174745.json
|
||||
|
||||
$ curl -s localhost:8800/cache-stats; echo
|
||||
{"entries": 1, "hits": 9, "misses": 1}
|
||||
|
||||
@@ -0,0 +1,177 @@
|
||||
{
|
||||
"cases": "lab02-challenge.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 1,
|
||||
"total": 5,
|
||||
"results": [
|
||||
{
|
||||
"case": "VPN · LLM 한 번 · 2.5초 안",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"llm_calls = 2 (expected 1)"
|
||||
],
|
||||
"seconds": 2.2,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 33,
|
||||
"answer_ms": 1054,
|
||||
"review_ms": 1038,
|
||||
"total_ms": 2141
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "비밀번호 · LLM 한 번",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"llm_calls = 2 (expected 1)"
|
||||
],
|
||||
"seconds": 2.0,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "비밀번호를 잊어버렸어요. 재설정은 어떻게 하나요?",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "사내 포털 로그인 화면의 '비밀번호 찾기'에서 휴대폰 인증 후 새 비밀번호를 설정하시면 됩니다. 추가 도움이 필요하시면 언제든 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-001"
|
||||
],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 72,
|
||||
"answer_ms": 943,
|
||||
"review_ms": 950,
|
||||
"total_ms": 1984
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 현황 · LLM 한 번",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"llm_calls = 2 (expected 1)"
|
||||
],
|
||||
"seconds": 2.3,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 26,
|
||||
"answer_ms": 932,
|
||||
"review_ms": 1241,
|
||||
"total_ms": 2213
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "규칙으로 모르면 분류 + 답 두 번",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"llm_calls = 3 (expected 2)"
|
||||
],
|
||||
"seconds": 2.8,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "죄송합니다만, 해당 정보를 찾지 못했습니다. 담당 직원이 곧 도움을 드리겠습니다. 감사합니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 27,
|
||||
"classify_ms": 730,
|
||||
"answer_ms": 1041,
|
||||
"review_ms": 926,
|
||||
"total_ms": 2736
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "빈 질문은 LLM 없이",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.0,
|
||||
"status": 400,
|
||||
"request": {
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
},
|
||||
"response": {
|
||||
"error": "question is required"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,135 @@
|
||||
✔ before: POST /webhook/my-helpdesk · HTTP 200 · 2.0s · {"route": "자동 답변", "category": "faq", "answer": "프린터 전원과 네트워크 연결을 확인하시고, 인쇄 대기열을 비운 후 다시 시도해 보시기 바랍니다. 추가 도움이 필요하시면 담당 직
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 5 case(s) × 1
|
||||
✘ VPN · LLM 한 번 · 2.5초 안 · 2.2s · llm_calls = 2 (expected 1)
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 후 다시 접속해 보시기 바랍니다. 추가 도움이 필요하시면 담당자에게 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 33,
|
||||
"answer_ms": 1054,
|
||||
"review_ms": 1038,
|
||||
"total_ms": 2141
|
||||
}
|
||||
}
|
||||
✘ 비밀번호 · LLM 한 번 · 2.0s · llm_calls = 2 (expected 1)
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "비밀번호를 잊어버렸어요. 재설정은 어떻게 하나요?",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "사내 포털 로그인 화면의 '비밀번호 찾기'에서 휴대폰 인증 후 새 비밀번호를 설정하시면 됩니다. 추가 도움이 필요하시면 언제든 문의해 주시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-001"
|
||||
],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 72,
|
||||
"answer_ms": 943,
|
||||
"review_ms": 950,
|
||||
"total_ms": 1984
|
||||
}
|
||||
}
|
||||
✘ 접수 현황 · LLM 한 번 · 2.3s · llm_calls = 2 (expected 1)
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 완료 예정일은 10월 20일입니다. 추가 문의 사항이 있으시면 010-2718-2818로 연락해 주시기 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 26,
|
||||
"answer_ms": 932,
|
||||
"review_ms": 1241,
|
||||
"total_ms": 2213
|
||||
}
|
||||
}
|
||||
✘ 규칙으로 모르면 분류 + 답 두 번 · 2.8s · llm_calls = 3 (expected 2)
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "죄송합니다만, 해당 정보를 찾지 못했습니다. 담당 직원이 곧 도움을 드리겠습니다. 감사합니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 3,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 27,
|
||||
"classify_ms": 730,
|
||||
"answer_ms": 1041,
|
||||
"review_ms": 926,
|
||||
"total_ms": 2736
|
||||
}
|
||||
}
|
||||
✔ 빈 질문은 LLM 없이 · 0.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 400
|
||||
{
|
||||
"error": "question is required"
|
||||
}
|
||||
Passed 1/5
|
||||
report: runs/lab02-challenge-20261024-174756.json
|
||||
@@ -0,0 +1,10 @@
|
||||
$ uv run tools/flow.py bench my-helpdesk requests/faq-vpn-nocache.json -n 5
|
||||
POST http://localhost:5678/webhook/my-helpdesk × 5
|
||||
✔ #1 · HTTP 200 · 2.26s · route=자동 답변, llm_calls=2, cached=false
|
||||
✔ #2 · HTTP 200 · 2.45s · route=자동 답변, llm_calls=2, cached=false
|
||||
✔ #3 · HTTP 200 · 2.11s · route=자동 답변, llm_calls=2, cached=false
|
||||
✔ #4 · HTTP 200 · 2.22s · route=자동 답변, llm_calls=2, cached=false
|
||||
✔ #5 · HTTP 200 · 2.03s · route=자동 답변, llm_calls=2, cached=false
|
||||
p50 2.22s · p95 2.45s · max 2.45s · failures 0/5
|
||||
report: runs/bench-my-helpdesk-20261024-174807.json
|
||||
|
||||
@@ -0,0 +1,491 @@
|
||||
{
|
||||
"cases": "lab02-challenge.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 15,
|
||||
"total": 15,
|
||||
"results": [
|
||||
{
|
||||
"case": "VPN · LLM 한 번 · 2.5초 안",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 37,
|
||||
"answer_ms": 986,
|
||||
"review_ms": 11,
|
||||
"total_ms": 1046
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "VPN · LLM 한 번 · 2.5초 안",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 2,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 28,
|
||||
"answer_ms": 1057,
|
||||
"review_ms": 14,
|
||||
"total_ms": 1107
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "VPN · LLM 한 번 · 2.5초 안",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 3,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.2,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 41,
|
||||
"answer_ms": 952,
|
||||
"review_ms": 20,
|
||||
"total_ms": 1023
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "비밀번호 · LLM 한 번",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.0,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "비밀번호를 잊어버렸어요. 재설정은 어떻게 하나요?",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "사내 포털 로그인 화면의 '비밀번호 찾기'에서 휴대폰 인증 후 새 비밀번호를 설정하시면 됩니다. 도움이 필요하시면 언제든 문의해 주세요.",
|
||||
"sources": [
|
||||
"FAQ-001"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 81,
|
||||
"answer_ms": 868,
|
||||
"review_ms": 16,
|
||||
"total_ms": 974
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "비밀번호 · LLM 한 번",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 2,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.9,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "비밀번호를 잊어버렸어요. 재설정은 어떻게 하나요?",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "사내 포털 로그인 화면의 '비밀번호 찾기'에서 휴대폰 인증 후 새 비밀번호를 설정하시면 됩니다. 추가 도움이 필요하시면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-001"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 32,
|
||||
"answer_ms": 824,
|
||||
"review_ms": 15,
|
||||
"total_ms": 881
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "비밀번호 · LLM 한 번",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 3,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.9,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "비밀번호를 잊어버렸어요. 재설정은 어떻게 하나요?",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "사내 포털 로그인 화면의 '비밀번호 찾기'에서 휴대폰 인증 후 새 비밀번호를 설정하시면 됩니다. 추가 도움이 필요하시면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-001"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 48,
|
||||
"answer_ms": 811,
|
||||
"review_ms": 12,
|
||||
"total_ms": 879
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 현황 · LLM 한 번",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.9,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 29,
|
||||
"answer_ms": 798,
|
||||
"review_ms": 15,
|
||||
"total_ms": 848
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 현황 · LLM 한 번",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 2,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.0,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 28,
|
||||
"answer_ms": 924,
|
||||
"review_ms": 12,
|
||||
"total_ms": 971
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 현황 · LLM 한 번",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 3,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 30,
|
||||
"answer_ms": 1001,
|
||||
"review_ms": 45,
|
||||
"total_ms": 1096
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "규칙으로 모르면 분류 + 답 두 번",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.6,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 23,
|
||||
"classify_ms": 723,
|
||||
"answer_ms": 838,
|
||||
"review_ms": 15,
|
||||
"total_ms": 1606
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "규칙으로 모르면 분류 + 답 두 번",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 2,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.4,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 27,
|
||||
"classify_ms": 594,
|
||||
"answer_ms": 698,
|
||||
"review_ms": 13,
|
||||
"total_ms": 1339
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "규칙으로 모르면 분류 + 답 두 번",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 3,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.6,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 30,
|
||||
"classify_ms": 746,
|
||||
"answer_ms": 801,
|
||||
"review_ms": 15,
|
||||
"total_ms": 1599
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "빈 질문은 LLM 없이",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.0,
|
||||
"status": 400,
|
||||
"request": {
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
},
|
||||
"response": {
|
||||
"error": "question is required"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "빈 질문은 LLM 없이",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 2,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.1,
|
||||
"status": 400,
|
||||
"request": {
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
},
|
||||
"response": {
|
||||
"error": "question is required"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "빈 질문은 LLM 없이",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 3,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.0,
|
||||
"status": 400,
|
||||
"request": {
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
},
|
||||
"response": {
|
||||
"error": "question is required"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,397 @@
|
||||
✔ before: POST /webhook/my-helpdesk · HTTP 200 · 2.4s · {"route": "자동 답변", "category": "faq", "answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 5 case(s) × 3
|
||||
✔ VPN · LLM 한 번 · 2.5초 안 #1 · 1.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 37,
|
||||
"answer_ms": 986,
|
||||
"review_ms": 11,
|
||||
"total_ms": 1046
|
||||
}
|
||||
}
|
||||
✔ VPN · LLM 한 번 · 2.5초 안 #2 · 1.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 28,
|
||||
"answer_ms": 1057,
|
||||
"review_ms": 14,
|
||||
"total_ms": 1107
|
||||
}
|
||||
}
|
||||
✔ VPN · LLM 한 번 · 2.5초 안 #3 · 1.2s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 41,
|
||||
"answer_ms": 952,
|
||||
"review_ms": 20,
|
||||
"total_ms": 1023
|
||||
}
|
||||
}
|
||||
✔ 비밀번호 · LLM 한 번 #1 · 1.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "비밀번호를 잊어버렸어요. 재설정은 어떻게 하나요?",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "사내 포털 로그인 화면의 '비밀번호 찾기'에서 휴대폰 인증 후 새 비밀번호를 설정하시면 됩니다. 도움이 필요하시면 언제든 문의해 주세요.",
|
||||
"sources": [
|
||||
"FAQ-001"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 81,
|
||||
"answer_ms": 868,
|
||||
"review_ms": 16,
|
||||
"total_ms": 974
|
||||
}
|
||||
}
|
||||
✔ 비밀번호 · LLM 한 번 #2 · 0.9s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "비밀번호를 잊어버렸어요. 재설정은 어떻게 하나요?",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "사내 포털 로그인 화면의 '비밀번호 찾기'에서 휴대폰 인증 후 새 비밀번호를 설정하시면 됩니다. 추가 도움이 필요하시면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-001"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 32,
|
||||
"answer_ms": 824,
|
||||
"review_ms": 15,
|
||||
"total_ms": 881
|
||||
}
|
||||
}
|
||||
✔ 비밀번호 · LLM 한 번 #3 · 0.9s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "비밀번호를 잊어버렸어요. 재설정은 어떻게 하나요?",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "사내 포털 로그인 화면의 '비밀번호 찾기'에서 휴대폰 인증 후 새 비밀번호를 설정하시면 됩니다. 추가 도움이 필요하시면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-001"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 48,
|
||||
"answer_ms": 811,
|
||||
"review_ms": 12,
|
||||
"total_ms": 879
|
||||
}
|
||||
}
|
||||
✔ 접수 현황 · LLM 한 번 #1 · 0.9s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 29,
|
||||
"answer_ms": 798,
|
||||
"review_ms": 15,
|
||||
"total_ms": 848
|
||||
}
|
||||
}
|
||||
✔ 접수 현황 · LLM 한 번 #2 · 1.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 28,
|
||||
"answer_ms": 924,
|
||||
"review_ms": 12,
|
||||
"total_ms": 971
|
||||
}
|
||||
}
|
||||
✔ 접수 현황 · LLM 한 번 #3 · 1.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 30,
|
||||
"answer_ms": 1001,
|
||||
"review_ms": 45,
|
||||
"total_ms": 1096
|
||||
}
|
||||
}
|
||||
✔ 규칙으로 모르면 분류 + 답 두 번 #1 · 1.6s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 23,
|
||||
"classify_ms": 723,
|
||||
"answer_ms": 838,
|
||||
"review_ms": 15,
|
||||
"total_ms": 1606
|
||||
}
|
||||
}
|
||||
✔ 규칙으로 모르면 분류 + 답 두 번 #2 · 1.4s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 27,
|
||||
"classify_ms": 594,
|
||||
"answer_ms": 698,
|
||||
"review_ms": 13,
|
||||
"total_ms": 1339
|
||||
}
|
||||
}
|
||||
✔ 규칙으로 모르면 분류 + 답 두 번 #3 · 1.6s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 30,
|
||||
"classify_ms": 746,
|
||||
"answer_ms": 801,
|
||||
"review_ms": 15,
|
||||
"total_ms": 1599
|
||||
}
|
||||
}
|
||||
✔ 빈 질문은 LLM 없이 #1 · 0.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 400
|
||||
{
|
||||
"error": "question is required"
|
||||
}
|
||||
✔ 빈 질문은 LLM 없이 #2 · 0.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 400
|
||||
{
|
||||
"error": "question is required"
|
||||
}
|
||||
✔ 빈 질문은 LLM 없이 #3 · 0.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 400
|
||||
{
|
||||
"error": "question is required"
|
||||
}
|
||||
Passed 15/15
|
||||
report: runs/lab02-challenge-20261024-174837.json
|
||||
@@ -0,0 +1,319 @@
|
||||
{
|
||||
"cases": "lab02.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 9,
|
||||
"total": 9,
|
||||
"results": [
|
||||
{
|
||||
"case": "예제 1 · 프린터 FAQ는 규칙으로",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 28,
|
||||
"answer_ms": 999,
|
||||
"review_ms": 15,
|
||||
"total_ms": 1047
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 1 · 접수 번호는 규칙으로",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.9,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 29,
|
||||
"answer_ms": 802,
|
||||
"review_ms": 50,
|
||||
"total_ms": 899
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 1 · 없는 접수 번호",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.0,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-9999 접수 건은 어떻게 됐나요?",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-9999 접수 건은 찾지 못했습니다. 담당 직원이 도와드릴 예정입니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 28,
|
||||
"answer_ms": 901,
|
||||
"review_ms": 15,
|
||||
"total_ms": 951
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 1 · 규칙으로 모르면 LLM이 분류",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.6,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 30,
|
||||
"classify_ms": 572,
|
||||
"answer_ms": 898,
|
||||
"review_ms": 14,
|
||||
"total_ms": 1522
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · 처음 묻는 VPN",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.2,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 26,
|
||||
"answer_ms": 1106,
|
||||
"review_ms": 11,
|
||||
"total_ms": 1149
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · 같은 질문 (띄어쓰기·대소문자 다름)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
|
||||
"user": "최유진"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"cached": true,
|
||||
"steps": [
|
||||
"cache"
|
||||
],
|
||||
"timings": {
|
||||
"total_ms": 21
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · no_cache면 캐시 안 씀",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 22,
|
||||
"answer_ms": 1013,
|
||||
"review_ms": 21,
|
||||
"total_ms": 1063
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · 접수 현황은 캐시 안 함 (1)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 처리 중이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 25,
|
||||
"answer_ms": 989,
|
||||
"review_ms": 33,
|
||||
"total_ms": 1069
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · 접수 현황은 캐시 안 함 (2)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.9,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 24,
|
||||
"answer_ms": 786,
|
||||
"review_ms": 17,
|
||||
"total_ms": 838
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,261 @@
|
||||
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 1}
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 9 case(s) × 1
|
||||
✔ 예제 1 · 프린터 FAQ는 규칙으로 · 1.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 28,
|
||||
"answer_ms": 999,
|
||||
"review_ms": 15,
|
||||
"total_ms": 1047
|
||||
}
|
||||
}
|
||||
✔ 예제 1 · 접수 번호는 규칙으로 · 0.9s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 29,
|
||||
"answer_ms": 802,
|
||||
"review_ms": 50,
|
||||
"total_ms": 899
|
||||
}
|
||||
}
|
||||
✔ 예제 1 · 없는 접수 번호 · 1.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-9999 접수 건은 어떻게 됐나요?",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-9999 접수 건은 찾지 못했습니다. 담당 직원이 도와드릴 예정입니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 28,
|
||||
"answer_ms": 901,
|
||||
"review_ms": 15,
|
||||
"total_ms": 951
|
||||
}
|
||||
}
|
||||
✔ 예제 1 · 규칙으로 모르면 LLM이 분류 · 1.6s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 30,
|
||||
"classify_ms": 572,
|
||||
"answer_ms": 898,
|
||||
"review_ms": 14,
|
||||
"total_ms": 1522
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · 처음 묻는 VPN · 1.2s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 26,
|
||||
"answer_ms": 1106,
|
||||
"review_ms": 11,
|
||||
"total_ms": 1149
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · 같은 질문 (띄어쓰기·대소문자 다름) · 0.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
|
||||
"user": "최유진"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"cached": true,
|
||||
"steps": [
|
||||
"cache"
|
||||
],
|
||||
"timings": {
|
||||
"total_ms": 21
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · no_cache면 캐시 안 씀 · 1.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 22,
|
||||
"answer_ms": 1013,
|
||||
"review_ms": 21,
|
||||
"total_ms": 1063
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · 접수 현황은 캐시 안 함 (1) · 1.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 처리 중이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 25,
|
||||
"answer_ms": 989,
|
||||
"review_ms": 33,
|
||||
"total_ms": 1069
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · 접수 현황은 캐시 안 함 (2) · 0.9s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 24,
|
||||
"answer_ms": 786,
|
||||
"review_ms": 17,
|
||||
"total_ms": 838
|
||||
}
|
||||
}
|
||||
Passed 9/9
|
||||
report: runs/lab02-20261024-174846.json
|
||||
@@ -0,0 +1,132 @@
|
||||
{
|
||||
"cases": "lab01.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 4,
|
||||
"total": 4,
|
||||
"results": [
|
||||
{
|
||||
"case": "VPN FAQ · 단계별 시간",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.2,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 32,
|
||||
"answer_ms": 1122,
|
||||
"review_ms": 11,
|
||||
"total_ms": 1173
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "VPN FAQ · 전체 시간 · LLM 호출 수",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.3,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 28,
|
||||
"answer_ms": 1219,
|
||||
"review_ms": 14,
|
||||
"total_ms": 1268
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 현황",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.0,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 28,
|
||||
"answer_ms": 907,
|
||||
"review_ms": 15,
|
||||
"total_ms": 956
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "빈 질문",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.0,
|
||||
"status": 400,
|
||||
"request": {
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
},
|
||||
"response": {
|
||||
"error": "question is required"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
|
||||
✔ VPN FAQ · 단계별 시간 · 1.2s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 32,
|
||||
"answer_ms": 1122,
|
||||
"review_ms": 11,
|
||||
"total_ms": 1173
|
||||
}
|
||||
}
|
||||
✔ VPN FAQ · 전체 시간 · LLM 호출 수 · 1.3s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 28,
|
||||
"answer_ms": 1219,
|
||||
"review_ms": 14,
|
||||
"total_ms": 1268
|
||||
}
|
||||
}
|
||||
✔ 접수 현황 · 1.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 28,
|
||||
"answer_ms": 907,
|
||||
"review_ms": 15,
|
||||
"total_ms": 956
|
||||
}
|
||||
}
|
||||
✔ 빈 질문 · 0.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 400
|
||||
{
|
||||
"error": "question is required"
|
||||
}
|
||||
Passed 4/4
|
||||
report: runs/lab01-20261024-174849.json
|
||||
@@ -0,0 +1,10 @@
|
||||
$ uv run tools/flow.py bench my-helpdesk requests/faq-vpn-nocache.json -n 5
|
||||
POST http://localhost:5678/webhook/my-helpdesk × 5
|
||||
✔ #1 · HTTP 200 · 1.32s · route=자동 답변, llm_calls=1, cached=false
|
||||
✔ #2 · HTTP 200 · 1.14s · route=자동 답변, llm_calls=1, cached=false
|
||||
✔ #3 · HTTP 200 · 1.11s · route=자동 답변, llm_calls=1, cached=false
|
||||
✔ #4 · HTTP 200 · 1.12s · route=자동 답변, llm_calls=1, cached=false
|
||||
✔ #5 · HTTP 200 · 1.05s · route=자동 답변, llm_calls=1, cached=false
|
||||
p50 1.12s · p95 1.32s · max 1.32s · failures 0/5
|
||||
report: runs/bench-my-helpdesk-20261024-174855.json
|
||||
|
||||
@@ -0,0 +1,223 @@
|
||||
{
|
||||
"cases": "lab02-challenge2.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 4,
|
||||
"total": 6,
|
||||
"results": [
|
||||
{
|
||||
"case": "처음 묻는 VPN (캐시 없음)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 39,
|
||||
"answer_ms": 947,
|
||||
"review_ms": 16,
|
||||
"total_ms": 1009
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "다른 말로 묻는 VPN → FAQ 번호 캐시",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"took 1.2s (expected at most 1s)",
|
||||
"cached = false (expected true)",
|
||||
"cache_by = null (expected faq)",
|
||||
"llm_calls = 1 (expected 0)"
|
||||
],
|
||||
"seconds": 1.2,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 연결이 계속 끊어지는데요",
|
||||
"user": "최유진"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 연결이 계속 끊어질 경우, VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 현재 접수된 관련 티켓은 없습니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 27,
|
||||
"answer_ms": 1067,
|
||||
"review_ms": 14,
|
||||
"total_ms": 1117
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "같은 말은 질문 캐시",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"cache_by = null (expected question)"
|
||||
],
|
||||
"seconds": 0.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
|
||||
"user": "최유진"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"cached": true,
|
||||
"steps": [
|
||||
"cache"
|
||||
],
|
||||
"timings": {
|
||||
"total_ms": 14
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "no_cache면 FAQ 번호 캐시도 안 씀",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 연결이 계속 끊어지는데요",
|
||||
"user": "최유진",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 연결이 계속 끊어질 경우, VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 21,
|
||||
"answer_ms": 1014,
|
||||
"review_ms": 9,
|
||||
"total_ms": 1051
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "다른 FAQ는 따로 (프린터 처음)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 26,
|
||||
"answer_ms": 1041,
|
||||
"review_ms": 17,
|
||||
"total_ms": 1091
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 현황은 캐시 안 함",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.9,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 25,
|
||||
"answer_ms": 869,
|
||||
"review_ms": 13,
|
||||
"total_ms": 913
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,176 @@
|
||||
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 2}
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 6 case(s) × 1
|
||||
✔ 처음 묻는 VPN (캐시 없음) · 1.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 39,
|
||||
"answer_ms": 947,
|
||||
"review_ms": 16,
|
||||
"total_ms": 1009
|
||||
}
|
||||
}
|
||||
✘ 다른 말로 묻는 VPN → FAQ 번호 캐시 · 1.2s · took 1.2s (expected at most 1s); cached = false (expected true); cache_by = null (expected faq); llm_calls = 1 (expected 0)
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 연결이 계속 끊어지는데요",
|
||||
"user": "최유진"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 연결이 계속 끊어질 경우, VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 현재 접수된 관련 티켓은 없습니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 27,
|
||||
"answer_ms": 1067,
|
||||
"review_ms": 14,
|
||||
"total_ms": 1117
|
||||
}
|
||||
}
|
||||
✘ 같은 말은 질문 캐시 · 0.1s · cache_by = null (expected question)
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
|
||||
"user": "최유진"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"cached": true,
|
||||
"steps": [
|
||||
"cache"
|
||||
],
|
||||
"timings": {
|
||||
"total_ms": 14
|
||||
}
|
||||
}
|
||||
✔ no_cache면 FAQ 번호 캐시도 안 씀 · 1.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 연결이 계속 끊어지는데요",
|
||||
"user": "최유진",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 연결이 계속 끊어질 경우, VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 21,
|
||||
"answer_ms": 1014,
|
||||
"review_ms": 9,
|
||||
"total_ms": 1051
|
||||
}
|
||||
}
|
||||
✔ 다른 FAQ는 따로 (프린터 처음) · 1.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 26,
|
||||
"answer_ms": 1041,
|
||||
"review_ms": 17,
|
||||
"total_ms": 1091
|
||||
}
|
||||
}
|
||||
✔ 접수 현황은 캐시 안 함 · 0.9s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 25,
|
||||
"answer_ms": 869,
|
||||
"review_ms": 13,
|
||||
"total_ms": 913
|
||||
}
|
||||
}
|
||||
Passed 4/6
|
||||
report: runs/lab02-challenge2-20261024-174901.json
|
||||
@@ -0,0 +1,217 @@
|
||||
{
|
||||
"cases": "lab02-challenge2.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 6,
|
||||
"total": 6,
|
||||
"results": [
|
||||
{
|
||||
"case": "처음 묻는 VPN (캐시 없음)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.5,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 71,
|
||||
"answer_ms": 1556,
|
||||
"review_ms": 23,
|
||||
"total_ms": 1665
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "다른 말로 묻는 VPN → FAQ 번호 캐시",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 연결이 계속 끊어지는데요",
|
||||
"user": "최유진"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"cached": true,
|
||||
"cache_by": "faq",
|
||||
"steps": [
|
||||
"faq",
|
||||
"rule",
|
||||
"cache"
|
||||
],
|
||||
"timings": {
|
||||
"total_ms": 44
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "같은 말은 질문 캐시",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.0,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
|
||||
"user": "최유진"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"cached": true,
|
||||
"cache_by": "question",
|
||||
"steps": [
|
||||
"cache"
|
||||
],
|
||||
"timings": {
|
||||
"total_ms": 19
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "no_cache면 FAQ 번호 캐시도 안 씀",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.2,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 연결이 계속 끊어지는데요",
|
||||
"user": "최유진",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 연결이 계속 끊어질 경우, VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 현재 접수된 관련 티켓은 없습니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 27,
|
||||
"answer_ms": 1052,
|
||||
"review_ms": 20,
|
||||
"total_ms": 1110
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "다른 FAQ는 따로 (프린터 처음)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.2,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 42,
|
||||
"answer_ms": 1035,
|
||||
"review_ms": 14,
|
||||
"total_ms": 1102
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 현황은 캐시 안 함",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 34,
|
||||
"answer_ms": 796,
|
||||
"review_ms": 14,
|
||||
"total_ms": 852
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,177 @@
|
||||
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 3}
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 6 case(s) × 1
|
||||
✔ 처음 묻는 VPN (캐시 없음) · 2.5s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 71,
|
||||
"answer_ms": 1556,
|
||||
"review_ms": 23,
|
||||
"total_ms": 1665
|
||||
}
|
||||
}
|
||||
✔ 다른 말로 묻는 VPN → FAQ 번호 캐시 · 0.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 연결이 계속 끊어지는데요",
|
||||
"user": "최유진"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"cached": true,
|
||||
"cache_by": "faq",
|
||||
"steps": [
|
||||
"faq",
|
||||
"rule",
|
||||
"cache"
|
||||
],
|
||||
"timings": {
|
||||
"total_ms": 44
|
||||
}
|
||||
}
|
||||
✔ 같은 말은 질문 캐시 · 0.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
|
||||
"user": "최유진"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"cached": true,
|
||||
"cache_by": "question",
|
||||
"steps": [
|
||||
"cache"
|
||||
],
|
||||
"timings": {
|
||||
"total_ms": 19
|
||||
}
|
||||
}
|
||||
✔ no_cache면 FAQ 번호 캐시도 안 씀 · 1.2s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 연결이 계속 끊어지는데요",
|
||||
"user": "최유진",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 연결이 계속 끊어질 경우, VPN 클라이언트를 최신 버전으로 업데이트하고 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 현재 접수된 관련 티켓은 없습니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 27,
|
||||
"answer_ms": 1052,
|
||||
"review_ms": 20,
|
||||
"total_ms": 1110
|
||||
}
|
||||
}
|
||||
✔ 다른 FAQ는 따로 (프린터 처음) · 1.2s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 42,
|
||||
"answer_ms": 1035,
|
||||
"review_ms": 14,
|
||||
"total_ms": 1102
|
||||
}
|
||||
}
|
||||
✔ 접수 현황은 캐시 안 함 · 1.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 34,
|
||||
"answer_ms": 796,
|
||||
"review_ms": 14,
|
||||
"total_ms": 852
|
||||
}
|
||||
}
|
||||
Passed 6/6
|
||||
report: runs/lab02-challenge2-20261024-174920.json
|
||||
@@ -0,0 +1,173 @@
|
||||
{
|
||||
"cases": "lab02-challenge.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 5,
|
||||
"total": 5,
|
||||
"results": [
|
||||
{
|
||||
"case": "VPN · LLM 한 번 · 2.5초 안",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 27,
|
||||
"answer_ms": 1017,
|
||||
"review_ms": 16,
|
||||
"total_ms": 1067
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "비밀번호 · LLM 한 번",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.0,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "비밀번호를 잊어버렸어요. 재설정은 어떻게 하나요?",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "사내 포털 로그인 화면의 '비밀번호 찾기'에서 휴대폰 인증 후 새 비밀번호를 설정하시면 됩니다. 도움이 필요하시면 언제든 문의해 주세요.",
|
||||
"sources": [
|
||||
"FAQ-001"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 27,
|
||||
"answer_ms": 840,
|
||||
"review_ms": 40,
|
||||
"total_ms": 928
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 현황 · LLM 한 번",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.9,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 28,
|
||||
"answer_ms": 835,
|
||||
"review_ms": 19,
|
||||
"total_ms": 891
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "규칙으로 모르면 분류 + 답 두 번",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.7,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 27,
|
||||
"classify_ms": 842,
|
||||
"answer_ms": 771,
|
||||
"review_ms": 11,
|
||||
"total_ms": 1659
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "빈 질문은 LLM 없이",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.0,
|
||||
"status": 400,
|
||||
"request": {
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
},
|
||||
"response": {
|
||||
"error": "question is required"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,139 @@
|
||||
✔ before: POST /webhook/my-helpdesk · HTTP 200 · 1.1s · {"route": "자동 답변", "category": "faq", "answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 5 case(s) × 1
|
||||
✔ VPN · LLM 한 번 · 2.5초 안 · 1.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 27,
|
||||
"answer_ms": 1017,
|
||||
"review_ms": 16,
|
||||
"total_ms": 1067
|
||||
}
|
||||
}
|
||||
✔ 비밀번호 · LLM 한 번 · 1.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "비밀번호를 잊어버렸어요. 재설정은 어떻게 하나요?",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "사내 포털 로그인 화면의 '비밀번호 찾기'에서 휴대폰 인증 후 새 비밀번호를 설정하시면 됩니다. 도움이 필요하시면 언제든 문의해 주세요.",
|
||||
"sources": [
|
||||
"FAQ-001"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 27,
|
||||
"answer_ms": 840,
|
||||
"review_ms": 40,
|
||||
"total_ms": 928
|
||||
}
|
||||
}
|
||||
✔ 접수 현황 · LLM 한 번 · 0.9s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 28,
|
||||
"answer_ms": 835,
|
||||
"review_ms": 19,
|
||||
"total_ms": 891
|
||||
}
|
||||
}
|
||||
✔ 규칙으로 모르면 분류 + 답 두 번 · 1.7s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 27,
|
||||
"classify_ms": 842,
|
||||
"answer_ms": 771,
|
||||
"review_ms": 11,
|
||||
"total_ms": 1659
|
||||
}
|
||||
}
|
||||
✔ 빈 질문은 LLM 없이 · 0.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 400
|
||||
{
|
||||
"error": "question is required"
|
||||
}
|
||||
Passed 5/5
|
||||
report: runs/lab02-challenge-20261024-174926.json
|
||||
@@ -0,0 +1,328 @@
|
||||
{
|
||||
"cases": "lab02.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 9,
|
||||
"total": 9,
|
||||
"results": [
|
||||
{
|
||||
"case": "예제 1 · 프린터 FAQ는 규칙으로",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.2,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 33,
|
||||
"answer_ms": 1111,
|
||||
"review_ms": 17,
|
||||
"total_ms": 1168
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 1 · 접수 번호는 규칙으로",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.0,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 처리 중이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 27,
|
||||
"answer_ms": 895,
|
||||
"review_ms": 16,
|
||||
"total_ms": 945
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 1 · 없는 접수 번호",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-9999 접수 건은 어떻게 됐나요?",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-9999 접수 건은 찾지 못했습니다. 담당 직원이 도와드릴 예정입니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 25,
|
||||
"answer_ms": 946,
|
||||
"review_ms": 17,
|
||||
"total_ms": 998
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 1 · 규칙으로 모르면 LLM이 분류",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.7,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 25,
|
||||
"classify_ms": 623,
|
||||
"answer_ms": 1026,
|
||||
"review_ms": 14,
|
||||
"total_ms": 1699
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · 처음 묻는 VPN",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.2,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 27,
|
||||
"answer_ms": 1112,
|
||||
"review_ms": 23,
|
||||
"total_ms": 1168
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · 같은 질문 (띄어쓰기·대소문자 다름)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.0,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
|
||||
"user": "최유진"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"cached": true,
|
||||
"cache_by": "question",
|
||||
"steps": [
|
||||
"cache"
|
||||
],
|
||||
"timings": {
|
||||
"total_ms": 15
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · no_cache면 캐시 안 씀",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.2,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 21,
|
||||
"answer_ms": 1065,
|
||||
"review_ms": 32,
|
||||
"total_ms": 1137
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · 접수 현황은 캐시 안 함 (1)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.0,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 30,
|
||||
"answer_ms": 936,
|
||||
"review_ms": 15,
|
||||
"total_ms": 988
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · 접수 현황은 캐시 안 함 (2)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.9,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 31,
|
||||
"answer_ms": 822,
|
||||
"review_ms": 14,
|
||||
"total_ms": 873
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,270 @@
|
||||
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 4}
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 9 case(s) × 1
|
||||
✔ 예제 1 · 프린터 FAQ는 규칙으로 · 1.2s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 33,
|
||||
"answer_ms": 1111,
|
||||
"review_ms": 17,
|
||||
"total_ms": 1168
|
||||
}
|
||||
}
|
||||
✔ 예제 1 · 접수 번호는 규칙으로 · 1.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 처리 중이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 27,
|
||||
"answer_ms": 895,
|
||||
"review_ms": 16,
|
||||
"total_ms": 945
|
||||
}
|
||||
}
|
||||
✔ 예제 1 · 없는 접수 번호 · 1.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-9999 접수 건은 어떻게 됐나요?",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-9999 접수 건은 찾지 못했습니다. 담당 직원이 도와드릴 예정입니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 25,
|
||||
"answer_ms": 946,
|
||||
"review_ms": 17,
|
||||
"total_ms": 998
|
||||
}
|
||||
}
|
||||
✔ 예제 1 · 규칙으로 모르면 LLM이 분류 · 1.7s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 25,
|
||||
"classify_ms": 623,
|
||||
"answer_ms": 1026,
|
||||
"review_ms": 14,
|
||||
"total_ms": 1699
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · 처음 묻는 VPN · 1.2s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 27,
|
||||
"answer_ms": 1112,
|
||||
"review_ms": 23,
|
||||
"total_ms": 1168
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · 같은 질문 (띄어쓰기·대소문자 다름) · 0.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
|
||||
"user": "최유진"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"cached": true,
|
||||
"cache_by": "question",
|
||||
"steps": [
|
||||
"cache"
|
||||
],
|
||||
"timings": {
|
||||
"total_ms": 15
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · no_cache면 캐시 안 씀 · 1.2s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 21,
|
||||
"answer_ms": 1065,
|
||||
"review_ms": 32,
|
||||
"total_ms": 1137
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · 접수 현황은 캐시 안 함 (1) · 1.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 30,
|
||||
"answer_ms": 936,
|
||||
"review_ms": 15,
|
||||
"total_ms": 988
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · 접수 현황은 캐시 안 함 (2) · 0.9s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"cache_by": null,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 31,
|
||||
"answer_ms": 822,
|
||||
"review_ms": 14,
|
||||
"total_ms": 873
|
||||
}
|
||||
}
|
||||
Passed 9/9
|
||||
report: runs/lab02-20261024-174935.json
|
||||
@@ -0,0 +1,53 @@
|
||||
$ uv run tools/flow.py fault faq slow
|
||||
✔ fault switch: {"faq": "slow", "tickets": "ok", "slow_seconds": 8.0}
|
||||
|
||||
$ uv run tools/flow.py call my-helpdesk '{"question": "비밀번호를 잊어버렸어요", "no_cache": true}' -v
|
||||
HTTP 200 · 11.5s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "비밀번호를 잊어버렸어요",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "사내 포털 로그인 화면의 '비밀번호 찾기'에서 휴대폰 인증 후 새 비밀번호를 설정하시면 됩니다. 추가 도움이 필요하시면 언제든 문의해 주세요.",
|
||||
"sources": [
|
||||
"FAQ-001"
|
||||
],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"review"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 8144,
|
||||
"answer_ms": 1518,
|
||||
"review_ms": 1013,
|
||||
"total_ms": 10701
|
||||
}
|
||||
}
|
||||
|
||||
$ uv run tools/flow.py fault faq error
|
||||
✔ fault switch: {"faq": "error", "tickets": "ok", "slow_seconds": 8.0}
|
||||
|
||||
$ uv run tools/flow.py call my-helpdesk '{"question": "비밀번호를 잊어버렸어요", "no_cache": true}' -v
|
||||
HTTP 500 · 0.3s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "비밀번호를 잊어버렸어요",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 500
|
||||
{
|
||||
"message": "Error in workflow"
|
||||
}
|
||||
|
||||
$ uv run tools/flow.py fault all ok
|
||||
✔ fault switch: {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
{
|
||||
"cases": "lab03.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 4,
|
||||
"total": 4,
|
||||
"results": [
|
||||
{
|
||||
"case": "평소",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 3.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 605,
|
||||
"answer_ms": 1634,
|
||||
"review_ms": 13,
|
||||
"total_ms": 2270
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "FAQ가 느릴 때 (8초)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 4.6,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "비밀번호를 잊어버렸어요",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "data_api_down"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "FAQ가 오류일 때 (500)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.6,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "비밀번호를 잊어버렸어요",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "data_api_down"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "캐시에 있으면 FAQ가 멈춰도 답",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"cached": true,
|
||||
"steps": [
|
||||
"cache"
|
||||
],
|
||||
"timings": {
|
||||
"total_ms": 21
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
|
||||
✔ 평소 · 3.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 605,
|
||||
"answer_ms": 1634,
|
||||
"review_ms": 13,
|
||||
"total_ms": 2270
|
||||
}
|
||||
}
|
||||
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "slow", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ FAQ가 느릴 때 (8초) · 4.6s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "비밀번호를 잊어버렸어요",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "data_api_down"
|
||||
}
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "error", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ FAQ가 오류일 때 (500) · 0.6s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "비밀번호를 잊어버렸어요",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "data_api_down"
|
||||
}
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 4}
|
||||
✔ before: POST /webhook/my-helpdesk · HTTP 200 · 2.1s · {"route": "자동 답변", "category": "faq", "answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리
|
||||
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "error", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ 캐시에 있으면 FAQ가 멈춰도 답 · 0.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"cached": true,
|
||||
"steps": [
|
||||
"cache"
|
||||
],
|
||||
"timings": {
|
||||
"total_ms": 21
|
||||
}
|
||||
}
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
Passed 4/4
|
||||
report: runs/lab03-20261024-175023.json
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
@@ -0,0 +1,319 @@
|
||||
{
|
||||
"cases": "lab02.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 9,
|
||||
"total": 9,
|
||||
"results": [
|
||||
{
|
||||
"case": "예제 1 · 프린터 FAQ는 규칙으로",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.8,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 585,
|
||||
"answer_ms": 1071,
|
||||
"review_ms": 20,
|
||||
"total_ms": 1687
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 1 · 접수 번호는 규칙으로",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.2,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 71,
|
||||
"answer_ms": 1030,
|
||||
"review_ms": 19,
|
||||
"total_ms": 1128
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 1 · 없는 접수 번호",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.8,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-9999 접수 건은 어떻게 됐나요?",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-9999 접수 건은 찾지 못했습니다. 담당 직원이 도와드릴 예정입니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 555,
|
||||
"answer_ms": 1179,
|
||||
"review_ms": 24,
|
||||
"total_ms": 1774
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 1 · 규칙으로 모르면 LLM이 분류",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.2,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 554,
|
||||
"classify_ms": 650,
|
||||
"answer_ms": 927,
|
||||
"review_ms": 14,
|
||||
"total_ms": 2152
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · 처음 묻는 VPN",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.7,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 553,
|
||||
"answer_ms": 1015,
|
||||
"review_ms": 28,
|
||||
"total_ms": 1605
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · 같은 질문 (띄어쓰기·대소문자 다름)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
|
||||
"user": "최유진"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"cached": true,
|
||||
"steps": [
|
||||
"cache"
|
||||
],
|
||||
"timings": {
|
||||
"total_ms": 19
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · no_cache면 캐시 안 씀",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.7,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류는 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 551,
|
||||
"answer_ms": 1081,
|
||||
"review_ms": 34,
|
||||
"total_ms": 1685
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · 접수 현황은 캐시 안 함 (1)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.2,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 31,
|
||||
"answer_ms": 1062,
|
||||
"review_ms": 14,
|
||||
"total_ms": 1114
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · 접수 현황은 캐시 안 함 (2)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 47,
|
||||
"answer_ms": 977,
|
||||
"review_ms": 15,
|
||||
"total_ms": 1049
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,261 @@
|
||||
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 1}
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 9 case(s) × 1
|
||||
✔ 예제 1 · 프린터 FAQ는 규칙으로 · 1.8s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 585,
|
||||
"answer_ms": 1071,
|
||||
"review_ms": 20,
|
||||
"total_ms": 1687
|
||||
}
|
||||
}
|
||||
✔ 예제 1 · 접수 번호는 규칙으로 · 1.2s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 71,
|
||||
"answer_ms": 1030,
|
||||
"review_ms": 19,
|
||||
"total_ms": 1128
|
||||
}
|
||||
}
|
||||
✔ 예제 1 · 없는 접수 번호 · 1.8s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-9999 접수 건은 어떻게 됐나요?",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-9999 접수 건은 찾지 못했습니다. 담당 직원이 도와드릴 예정입니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 555,
|
||||
"answer_ms": 1179,
|
||||
"review_ms": 24,
|
||||
"total_ms": 1774
|
||||
}
|
||||
}
|
||||
✔ 예제 1 · 규칙으로 모르면 LLM이 분류 · 2.2s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 554,
|
||||
"classify_ms": 650,
|
||||
"answer_ms": 927,
|
||||
"review_ms": 14,
|
||||
"total_ms": 2152
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · 처음 묻는 VPN · 1.7s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 553,
|
||||
"answer_ms": 1015,
|
||||
"review_ms": 28,
|
||||
"total_ms": 1605
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · 같은 질문 (띄어쓰기·대소문자 다름) · 0.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
|
||||
"user": "최유진"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"cached": true,
|
||||
"steps": [
|
||||
"cache"
|
||||
],
|
||||
"timings": {
|
||||
"total_ms": 19
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · no_cache면 캐시 안 씀 · 1.7s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류는 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 551,
|
||||
"answer_ms": 1081,
|
||||
"review_ms": 34,
|
||||
"total_ms": 1685
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · 접수 현황은 캐시 안 함 (1) · 1.2s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 31,
|
||||
"answer_ms": 1062,
|
||||
"review_ms": 14,
|
||||
"total_ms": 1114
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · 접수 현황은 캐시 안 함 (2) · 1.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 47,
|
||||
"answer_ms": 977,
|
||||
"review_ms": 15,
|
||||
"total_ms": 1049
|
||||
}
|
||||
}
|
||||
Passed 9/9
|
||||
report: runs/lab02-20261024-175036.json
|
||||
@@ -0,0 +1,19 @@
|
||||
$ uv run tools/flow.py llm down
|
||||
✔ OpenAI credential: broken key (drill). Restore with: uv run tools/flow.py llm up
|
||||
|
||||
$ uv run tools/flow.py call my-helpdesk requests/faq-vpn-nocache.json -v
|
||||
HTTP 500 · 1.3s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 500
|
||||
{
|
||||
"message": "Error in workflow"
|
||||
}
|
||||
|
||||
$ uv run tools/flow.py llm up
|
||||
✔ OpenAI credential: real key from .env restored
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
{
|
||||
"cases": "lab03-llm-down.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 1,
|
||||
"total": 4,
|
||||
"results": [
|
||||
{
|
||||
"case": "VPN · FAQ 원문으로",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"status 500 (expected 200)",
|
||||
"route = null (expected 간단 답변)",
|
||||
"answer has none of ['인증서']"
|
||||
],
|
||||
"seconds": 0.9,
|
||||
"status": 500,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"message": "Error in workflow"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 현황 · 상태 그대로",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"status 500 (expected 200)",
|
||||
"route = null (expected 간단 답변)",
|
||||
"answer has none of ['처리 중']"
|
||||
],
|
||||
"seconds": 0.4,
|
||||
"status": 500,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"message": "Error in workflow"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "모르는 질문 · 담당자",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"status 500 (expected 200)",
|
||||
"route = null (expected 담당자 연결)"
|
||||
],
|
||||
"seconds": 0.9,
|
||||
"status": 500,
|
||||
"request": {
|
||||
"question": "오늘 점심 메뉴 추천해 주세요",
|
||||
"user": "이준호"
|
||||
},
|
||||
"response": {
|
||||
"message": "Error in workflow"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "빈 질문",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.0,
|
||||
"status": 400,
|
||||
"request": {
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
},
|
||||
"response": {
|
||||
"error": "question is required"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 2}
|
||||
✔ OpenAI credential: broken key (drill). Restore with: uv run tools/flow.py llm up
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
|
||||
✘ VPN · FAQ 원문으로 · 0.9s · status 500 (expected 200); route = null (expected 간단 답변); answer has none of ['인증서']
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 500
|
||||
{
|
||||
"message": "Error in workflow"
|
||||
}
|
||||
✘ 접수 현황 · 상태 그대로 · 0.4s · status 500 (expected 200); route = null (expected 간단 답변); answer has none of ['처리 중']
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 500
|
||||
{
|
||||
"message": "Error in workflow"
|
||||
}
|
||||
✘ 모르는 질문 · 담당자 · 0.9s · status 500 (expected 200); route = null (expected 담당자 연결)
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "오늘 점심 메뉴 추천해 주세요",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 500
|
||||
{
|
||||
"message": "Error in workflow"
|
||||
}
|
||||
✔ 빈 질문 · 0.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 400
|
||||
{
|
||||
"error": "question is required"
|
||||
}
|
||||
Passed 1/4
|
||||
report: runs/lab03-llm-down-20261024-175047.json
|
||||
✔ OpenAI credential: real key from .env restored
|
||||
@@ -0,0 +1,90 @@
|
||||
{
|
||||
"cases": "lab03-llm-down.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 4,
|
||||
"total": 4,
|
||||
"results": [
|
||||
{
|
||||
"case": "VPN · FAQ 원문으로",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.6,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "간단 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속합니다. (자동 답변 기능을 잠시 쓸 수 없어 FAQ 원문으로 안내합니다.)",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"reason": "llm_down"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 현황 · 상태 그대로",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.3,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "간단 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 접수 건은 현재 '처리 중' 상태입니다. 인증서 발급 승인 대기 중이며 10월 20일 완료 예정입니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 0,
|
||||
"reason": "llm_down"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "모르는 질문 · 담당자",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.8,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "오늘 점심 메뉴 추천해 주세요",
|
||||
"user": "이준호"
|
||||
},
|
||||
"response": {
|
||||
"route": "담당자 연결",
|
||||
"category": "other",
|
||||
"answer": "지금은 자동 답변을 할 수 없어 담당자에게 연결합니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 0,
|
||||
"reason": "llm_down"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "빈 질문",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.0,
|
||||
"status": 400,
|
||||
"request": {
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
},
|
||||
"response": {
|
||||
"error": "question is required"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 0}
|
||||
✔ OpenAI credential: broken key (drill). Restore with: uv run tools/flow.py llm up
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
|
||||
✔ VPN · FAQ 원문으로 · 2.6s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "간단 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속합니다. (자동 답변 기능을 잠시 쓸 수 없어 FAQ 원문으로 안내합니다.)",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"reason": "llm_down"
|
||||
}
|
||||
✔ 접수 현황 · 상태 그대로 · 0.3s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "간단 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 접수 건은 현재 '처리 중' 상태입니다. 인증서 발급 승인 대기 중이며 10월 20일 완료 예정입니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 0,
|
||||
"reason": "llm_down"
|
||||
}
|
||||
✔ 모르는 질문 · 담당자 · 0.8s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "오늘 점심 메뉴 추천해 주세요",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "담당자 연결",
|
||||
"category": "other",
|
||||
"answer": "지금은 자동 답변을 할 수 없어 담당자에게 연결합니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 0,
|
||||
"reason": "llm_down"
|
||||
}
|
||||
✔ 빈 질문 · 0.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 400
|
||||
{
|
||||
"error": "question is required"
|
||||
}
|
||||
Passed 4/4
|
||||
report: runs/lab03-llm-down-20261024-175108.json
|
||||
✔ OpenAI credential: real key from .env restored
|
||||
@@ -0,0 +1,319 @@
|
||||
{
|
||||
"cases": "lab02.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 9,
|
||||
"total": 9,
|
||||
"results": [
|
||||
{
|
||||
"case": "예제 1 · 프린터 FAQ는 규칙으로",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.8,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 568,
|
||||
"answer_ms": 1078,
|
||||
"review_ms": 12,
|
||||
"total_ms": 1679
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 1 · 접수 번호는 규칙으로",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 처리 중이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 38,
|
||||
"answer_ms": 969,
|
||||
"review_ms": 15,
|
||||
"total_ms": 1032
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 1 · 없는 접수 번호",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.7,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-9999 접수 건은 어떻게 됐나요?",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-9999 접수 건은 찾지 못했습니다. 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 546,
|
||||
"answer_ms": 1011,
|
||||
"review_ms": 46,
|
||||
"total_ms": 1632
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 1 · 규칙으로 모르면 LLM이 분류",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.2,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 560,
|
||||
"classify_ms": 881,
|
||||
"answer_ms": 734,
|
||||
"review_ms": 23,
|
||||
"total_ms": 2206
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · 처음 묻는 VPN",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.9,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 560,
|
||||
"answer_ms": 1222,
|
||||
"review_ms": 12,
|
||||
"total_ms": 1803
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · 같은 질문 (띄어쓰기·대소문자 다름)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
|
||||
"user": "최유진"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"cached": true,
|
||||
"steps": [
|
||||
"cache"
|
||||
],
|
||||
"timings": {
|
||||
"total_ms": 20
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · no_cache면 캐시 안 씀",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.7,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 560,
|
||||
"answer_ms": 1041,
|
||||
"review_ms": 17,
|
||||
"total_ms": 1625
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · 접수 현황은 캐시 안 함 (1)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.0,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 처리 중이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 27,
|
||||
"answer_ms": 934,
|
||||
"review_ms": 19,
|
||||
"total_ms": 986
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "예제 2 · 접수 현황은 캐시 안 함 (2)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.2,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 31,
|
||||
"answer_ms": 1016,
|
||||
"review_ms": 43,
|
||||
"total_ms": 1110
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,261 @@
|
||||
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 0}
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 9 case(s) × 1
|
||||
✔ 예제 1 · 프린터 FAQ는 규칙으로 · 1.8s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 568,
|
||||
"answer_ms": 1078,
|
||||
"review_ms": 12,
|
||||
"total_ms": 1679
|
||||
}
|
||||
}
|
||||
✔ 예제 1 · 접수 번호는 규칙으로 · 1.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 처리 중이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 38,
|
||||
"answer_ms": 969,
|
||||
"review_ms": 15,
|
||||
"total_ms": 1032
|
||||
}
|
||||
}
|
||||
✔ 예제 1 · 없는 접수 번호 · 1.7s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-9999 접수 건은 어떻게 됐나요?",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-9999 접수 건은 찾지 못했습니다. 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 546,
|
||||
"answer_ms": 1011,
|
||||
"review_ms": 46,
|
||||
"total_ms": 1632
|
||||
}
|
||||
}
|
||||
✔ 예제 1 · 규칙으로 모르면 LLM이 분류 · 2.2s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "회의실 화면 공유가 안 되는데 누구에게 물어보나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "찾지 못했습니다. 담당 직원이 도움을 드리겠습니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 2,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"classify",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 560,
|
||||
"classify_ms": 881,
|
||||
"answer_ms": 734,
|
||||
"review_ms": 23,
|
||||
"total_ms": 2206
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · 처음 묻는 VPN · 1.9s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 560,
|
||||
"answer_ms": 1222,
|
||||
"review_ms": 12,
|
||||
"total_ms": 1803
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · 같은 질문 (띄어쓰기·대소문자 다름) · 0.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": " vpn 접속이 자꾸 끊겨요. 어떻게 하나요? ",
|
||||
"user": "최유진"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"cached": true,
|
||||
"steps": [
|
||||
"cache"
|
||||
],
|
||||
"timings": {
|
||||
"total_ms": 20
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · no_cache면 캐시 안 씀 · 1.7s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 560,
|
||||
"answer_ms": 1041,
|
||||
"review_ms": 17,
|
||||
"total_ms": 1625
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · 접수 현황은 캐시 안 함 (1) · 1.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 처리 중이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락 바랍니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 27,
|
||||
"answer_ms": 934,
|
||||
"review_ms": 19,
|
||||
"total_ms": 986
|
||||
}
|
||||
}
|
||||
✔ 예제 2 · 접수 현황은 캐시 안 함 (2) · 1.2s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 31,
|
||||
"answer_ms": 1016,
|
||||
"review_ms": 43,
|
||||
"total_ms": 1110
|
||||
}
|
||||
}
|
||||
Passed 9/9
|
||||
report: runs/lab02-20261024-175123.json
|
||||
@@ -0,0 +1,112 @@
|
||||
{
|
||||
"cases": "lab03.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 4,
|
||||
"total": 4,
|
||||
"results": [
|
||||
{
|
||||
"case": "평소",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.7,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 571,
|
||||
"answer_ms": 1006,
|
||||
"review_ms": 16,
|
||||
"total_ms": 1600
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "FAQ가 느릴 때 (8초)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 4.6,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "비밀번호를 잊어버렸어요",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "data_api_down"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "FAQ가 오류일 때 (500)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.6,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "비밀번호를 잊어버렸어요",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "data_api_down"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "캐시에 있으면 FAQ가 멈춰도 답",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"cached": true,
|
||||
"steps": [
|
||||
"cache"
|
||||
],
|
||||
"timings": {
|
||||
"total_ms": 21
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
|
||||
✔ 평소 · 1.7s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 571,
|
||||
"answer_ms": 1006,
|
||||
"review_ms": 16,
|
||||
"total_ms": 1600
|
||||
}
|
||||
}
|
||||
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "slow", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ FAQ가 느릴 때 (8초) · 4.6s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "비밀번호를 잊어버렸어요",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "data_api_down"
|
||||
}
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "error", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ FAQ가 오류일 때 (500) · 0.6s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "비밀번호를 잊어버렸어요",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "data_api_down"
|
||||
}
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 2}
|
||||
✔ before: POST /webhook/my-helpdesk · HTTP 200 · 1.9s · {"route": "자동 답변", "category": "faq", "answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리
|
||||
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "error", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ 캐시에 있으면 FAQ가 멈춰도 답 · 0.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"cached": true,
|
||||
"steps": [
|
||||
"cache"
|
||||
],
|
||||
"timings": {
|
||||
"total_ms": 21
|
||||
}
|
||||
}
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
Passed 4/4
|
||||
report: runs/lab03-20261024-175132.json
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
@@ -0,0 +1,119 @@
|
||||
{
|
||||
"cases": "lab03-ticket.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 2,
|
||||
"total": 4,
|
||||
"results": [
|
||||
{
|
||||
"case": "평소 접수 현황",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.0,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 처리 중이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 33,
|
||||
"answer_ms": 915,
|
||||
"review_ms": 12,
|
||||
"total_ms": 970
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 API 500 · 접수 질문은 담당자",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"reason = data_api_down (expected tickets_down)"
|
||||
],
|
||||
"seconds": 0.6,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "data_api_down"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 API 500 · FAQ 질문은 그대로 답",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"route = 담당자 연결 (expected 자동 답변)",
|
||||
"category = null (expected faq)",
|
||||
"answer has none of ['인증서']"
|
||||
],
|
||||
"seconds": 0.6,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "data_api_down"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "없는 접수 번호는 그대로 (404는 고장이 아님)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.6,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-9999 접수 건은 어떻게 됐나요?",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-9999 접수 건은 찾지 못했습니다. 담당 직원이 도와드릴 예정입니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 564,
|
||||
"answer_ms": 978,
|
||||
"review_ms": 10,
|
||||
"total_ms": 1558
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 1}
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
|
||||
✔ 평소 접수 현황 · 1.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 처리 중이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 33,
|
||||
"answer_ms": 915,
|
||||
"review_ms": 12,
|
||||
"total_ms": 970
|
||||
}
|
||||
}
|
||||
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "error", "slow_seconds": 8.0}
|
||||
✘ 접수 API 500 · 접수 질문은 담당자 · 0.6s · reason = data_api_down (expected tickets_down)
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "data_api_down"
|
||||
}
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "error", "slow_seconds": 8.0}
|
||||
✘ 접수 API 500 · FAQ 질문은 그대로 답 · 0.6s · route = 담당자 연결 (expected 자동 답변); category = null (expected faq); answer has none of ['인증서']
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "data_api_down"
|
||||
}
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ 없는 접수 번호는 그대로 (404는 고장이 아님) · 1.6s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-9999 접수 건은 어떻게 됐나요?",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-9999 접수 건은 찾지 못했습니다. 담당 직원이 도와드릴 예정입니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 564,
|
||||
"answer_ms": 978,
|
||||
"review_ms": 10,
|
||||
"total_ms": 1558
|
||||
}
|
||||
}
|
||||
Passed 2/4
|
||||
report: runs/lab03-ticket-20261024-175136.json
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
@@ -0,0 +1,133 @@
|
||||
{
|
||||
"cases": "lab03-ticket.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 4,
|
||||
"total": 4,
|
||||
"results": [
|
||||
{
|
||||
"case": "평소 접수 현황",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.4,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 102,
|
||||
"answer_ms": 1458,
|
||||
"review_ms": 13,
|
||||
"total_ms": 1594
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 API 500 · 접수 질문은 담당자",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "담당자 연결",
|
||||
"category": "ticket",
|
||||
"answer": "접수 현황 시스템이 응답하지 않아 담당자에게 연결합니다. 잠시 뒤 다시 물어봐 주세요.",
|
||||
"reason": "tickets_down",
|
||||
"llm_calls": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 API 500 · FAQ 질문은 그대로 답",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 38,
|
||||
"answer_ms": 1023,
|
||||
"review_ms": 12,
|
||||
"total_ms": 1083
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "없는 접수 번호는 그대로 (404는 고장이 아님)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.3,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-9999 접수 건은 어떻게 됐나요?",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-9999 접수 건은 찾지 못했습니다. 담당 직원이 도와드릴 예정입니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 44,
|
||||
"answer_ms": 1192,
|
||||
"review_ms": 22,
|
||||
"total_ms": 1270
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 0}
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
|
||||
✔ 평소 접수 현황 · 2.4s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 티켓은 현재 \"처리 중\" 상태이며, 인증서 발급 승인 대기 중입니다. 10월 20일에 완료될 예정입니다. 추가 문의가 필요하면 연락처 010-2718-2818로 연락해 주세요.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 102,
|
||||
"answer_ms": 1458,
|
||||
"review_ms": 13,
|
||||
"total_ms": 1594
|
||||
}
|
||||
}
|
||||
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "error", "slow_seconds": 8.0}
|
||||
✔ 접수 API 500 · 접수 질문은 담당자 · 0.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "담당자 연결",
|
||||
"category": "ticket",
|
||||
"answer": "접수 현황 시스템이 응답하지 않아 담당자에게 연결합니다. 잠시 뒤 다시 물어봐 주세요.",
|
||||
"reason": "tickets_down",
|
||||
"llm_calls": 0
|
||||
}
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "error", "slow_seconds": 8.0}
|
||||
✔ 접수 API 500 · FAQ 질문은 그대로 답 · 1.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 38,
|
||||
"answer_ms": 1023,
|
||||
"review_ms": 12,
|
||||
"total_ms": 1083
|
||||
}
|
||||
}
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ 없는 접수 번호는 그대로 (404는 고장이 아님) · 1.3s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-9999 접수 건은 어떻게 됐나요?",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-9999 접수 건은 찾지 못했습니다. 담당 직원이 도와드릴 예정입니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 44,
|
||||
"answer_ms": 1192,
|
||||
"review_ms": 22,
|
||||
"total_ms": 1270
|
||||
}
|
||||
}
|
||||
Passed 4/4
|
||||
report: runs/lab03-ticket-20261024-175154.json
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
@@ -0,0 +1,112 @@
|
||||
{
|
||||
"cases": "lab03.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 4,
|
||||
"total": 4,
|
||||
"results": [
|
||||
{
|
||||
"case": "평소",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.2,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 61,
|
||||
"answer_ms": 1037,
|
||||
"review_ms": 14,
|
||||
"total_ms": 1120
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "FAQ가 느릴 때 (8초)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 4.8,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "비밀번호를 잊어버렸어요",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "data_api_down"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "FAQ가 오류일 때 (500)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.6,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "비밀번호를 잊어버렸어요",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "data_api_down"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "캐시에 있으면 FAQ가 멈춰도 답",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.0,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"cached": true,
|
||||
"steps": [
|
||||
"cache"
|
||||
],
|
||||
"timings": {
|
||||
"total_ms": 17
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
|
||||
✔ 평소 · 1.2s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 61,
|
||||
"answer_ms": 1037,
|
||||
"review_ms": 14,
|
||||
"total_ms": 1120
|
||||
}
|
||||
}
|
||||
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "slow", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ FAQ가 느릴 때 (8초) · 4.8s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "비밀번호를 잊어버렸어요",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "data_api_down"
|
||||
}
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "error", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ FAQ가 오류일 때 (500) · 0.6s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "비밀번호를 잊어버렸어요",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "data_api_down"
|
||||
}
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 0}
|
||||
✔ before: POST /webhook/my-helpdesk · HTTP 200 · 1.3s · {"route": "자동 답변", "category": "faq", "answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리
|
||||
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "error", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ 캐시에 있으면 FAQ가 멈춰도 답 · 0.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"cached": true,
|
||||
"steps": [
|
||||
"cache"
|
||||
],
|
||||
"timings": {
|
||||
"total_ms": 17
|
||||
}
|
||||
}
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
Passed 4/4
|
||||
report: runs/lab03-20261024-175202.json
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
@@ -0,0 +1,90 @@
|
||||
{
|
||||
"cases": "lab03-llm-down.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 4,
|
||||
"total": 4,
|
||||
"results": [
|
||||
{
|
||||
"case": "VPN · FAQ 원문으로",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.7,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "간단 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속합니다. (자동 답변 기능을 잠시 쓸 수 없어 FAQ 원문으로 안내합니다.)",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"reason": "llm_down"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "접수 현황 · 상태 그대로",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.5,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
},
|
||||
"response": {
|
||||
"route": "간단 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 접수 건은 현재 '처리 중' 상태입니다. 인증서 발급 승인 대기 중이며 10월 20일 완료 예정입니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 0,
|
||||
"reason": "llm_down"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "모르는 질문 · 담당자",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.3,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "오늘 점심 메뉴 추천해 주세요",
|
||||
"user": "이준호"
|
||||
},
|
||||
"response": {
|
||||
"route": "담당자 연결",
|
||||
"category": "other",
|
||||
"answer": "지금은 자동 답변을 할 수 없어 담당자에게 연결합니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 0,
|
||||
"reason": "llm_down"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "빈 질문",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.0,
|
||||
"status": 400,
|
||||
"request": {
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
},
|
||||
"response": {
|
||||
"error": "question is required"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 1}
|
||||
✔ OpenAI credential: broken key (drill). Restore with: uv run tools/flow.py llm up
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
|
||||
✔ VPN · FAQ 원문으로 · 0.7s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "간단 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속합니다. (자동 답변 기능을 잠시 쓸 수 없어 FAQ 원문으로 안내합니다.)",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"reason": "llm_down"
|
||||
}
|
||||
✔ 접수 현황 · 상태 그대로 · 0.5s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "T-1002 처리 상태 알려 주세요",
|
||||
"user": "박서연"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "간단 답변",
|
||||
"category": "ticket",
|
||||
"answer": "T-1002 접수 건은 현재 '처리 중' 상태입니다. 인증서 발급 승인 대기 중이며 10월 20일 완료 예정입니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 0,
|
||||
"reason": "llm_down"
|
||||
}
|
||||
✔ 모르는 질문 · 담당자 · 0.3s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "오늘 점심 메뉴 추천해 주세요",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "담당자 연결",
|
||||
"category": "other",
|
||||
"answer": "지금은 자동 답변을 할 수 없어 담당자에게 연결합니다.",
|
||||
"sources": [],
|
||||
"llm_calls": 0,
|
||||
"reason": "llm_down"
|
||||
}
|
||||
✔ 빈 질문 · 0.0s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "",
|
||||
"user": "이준호"
|
||||
}
|
||||
← response HTTP 400
|
||||
{
|
||||
"error": "question is required"
|
||||
}
|
||||
Passed 4/4
|
||||
report: runs/lab03-llm-down-20261024-175206.json
|
||||
✔ OpenAI credential: real key from .env restored
|
||||
@@ -0,0 +1,94 @@
|
||||
{
|
||||
"cases": "lab03-challenge.json",
|
||||
"webhook": "my-health",
|
||||
"passed": 4,
|
||||
"total": 4,
|
||||
"results": [
|
||||
{
|
||||
"case": "평소",
|
||||
"webhook": "my-health",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.2,
|
||||
"status": 200,
|
||||
"request": {},
|
||||
"response": {
|
||||
"status": "ok",
|
||||
"checks": {
|
||||
"data_api": true,
|
||||
"faq": true,
|
||||
"llm": true
|
||||
},
|
||||
"failed": [],
|
||||
"seconds": 1.4
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "FAQ 오류",
|
||||
"webhook": "my-health",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.0,
|
||||
"status": 200,
|
||||
"request": {},
|
||||
"response": {
|
||||
"status": "degraded",
|
||||
"checks": {
|
||||
"data_api": true,
|
||||
"faq": false,
|
||||
"llm": true
|
||||
},
|
||||
"failed": [
|
||||
"faq"
|
||||
],
|
||||
"seconds": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "FAQ 느림 (8초) · 점검은 빨리 끝남",
|
||||
"webhook": "my-health",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 3.0,
|
||||
"status": 200,
|
||||
"request": {},
|
||||
"response": {
|
||||
"status": "degraded",
|
||||
"checks": {
|
||||
"data_api": true,
|
||||
"faq": false,
|
||||
"llm": true
|
||||
},
|
||||
"failed": [
|
||||
"faq"
|
||||
],
|
||||
"seconds": 2.9
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "LLM 멈춤",
|
||||
"webhook": "my-health",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.4,
|
||||
"status": 200,
|
||||
"request": {},
|
||||
"response": {
|
||||
"status": "degraded",
|
||||
"checks": {
|
||||
"data_api": true,
|
||||
"faq": true,
|
||||
"llm": false
|
||||
},
|
||||
"failed": [
|
||||
"llm"
|
||||
],
|
||||
"seconds": 0.3
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
POST http://localhost:5678/webhook/my-health · 4 case(s) × 1
|
||||
✔ 평소 · 2.2s
|
||||
→ request POST /webhook/my-health
|
||||
{}
|
||||
← response HTTP 200
|
||||
{
|
||||
"status": "ok",
|
||||
"checks": {
|
||||
"data_api": true,
|
||||
"faq": true,
|
||||
"llm": true
|
||||
},
|
||||
"failed": [],
|
||||
"seconds": 1.4
|
||||
}
|
||||
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "error", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ FAQ 오류 · 1.0s
|
||||
→ request POST /webhook/my-health
|
||||
{}
|
||||
← response HTTP 200
|
||||
{
|
||||
"status": "degraded",
|
||||
"checks": {
|
||||
"data_api": true,
|
||||
"faq": false,
|
||||
"llm": true
|
||||
},
|
||||
"failed": [
|
||||
"faq"
|
||||
],
|
||||
"seconds": 1
|
||||
}
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "slow", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ FAQ 느림 (8초) · 점검은 빨리 끝남 · 3.0s
|
||||
→ request POST /webhook/my-health
|
||||
{}
|
||||
← response HTTP 200
|
||||
{
|
||||
"status": "degraded",
|
||||
"checks": {
|
||||
"data_api": true,
|
||||
"faq": false,
|
||||
"llm": true
|
||||
},
|
||||
"failed": [
|
||||
"faq"
|
||||
],
|
||||
"seconds": 2.9
|
||||
}
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ OpenAI credential: broken key (drill). Restore with: uv run tools/flow.py llm up
|
||||
✔ LLM 멈춤 · 0.4s
|
||||
→ request POST /webhook/my-health
|
||||
{}
|
||||
← response HTTP 200
|
||||
{
|
||||
"status": "degraded",
|
||||
"checks": {
|
||||
"data_api": true,
|
||||
"faq": true,
|
||||
"llm": false
|
||||
},
|
||||
"failed": [
|
||||
"llm"
|
||||
],
|
||||
"seconds": 0.3
|
||||
}
|
||||
✔ OpenAI credential: real key from .env restored
|
||||
Passed 4/4
|
||||
report: runs/lab03-challenge-20261024-175230.json
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
@@ -0,0 +1,123 @@
|
||||
{
|
||||
"cases": "lab03-challenge2.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 3,
|
||||
"total": 4,
|
||||
"results": [
|
||||
{
|
||||
"case": "평소",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.3,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 72,
|
||||
"answer_ms": 1098,
|
||||
"review_ms": 18,
|
||||
"total_ms": 1212
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "FAQ 느림 · 처음 한 번은 기다린 뒤 담당자",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 4.6,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "비밀번호를 잊어버렸어요",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "data_api_down"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "FAQ 느림 · 다음 질문은 기다리지 않음 (차단기 열림)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": false,
|
||||
"problems": [
|
||||
"took 4.6s (expected at most 1s)",
|
||||
"reason = data_api_down (expected breaker_open)"
|
||||
],
|
||||
"seconds": 4.6,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "data_api_down"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "FAQ가 돌아오고 차단기를 비우면 평소대로",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.2,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 43,
|
||||
"answer_ms": 1092,
|
||||
"review_ms": 15,
|
||||
"total_ms": 1161
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 0}
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
|
||||
✔ 평소 · 1.3s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 72,
|
||||
"answer_ms": 1098,
|
||||
"review_ms": 18,
|
||||
"total_ms": 1212
|
||||
}
|
||||
}
|
||||
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "slow", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ FAQ 느림 · 처음 한 번은 기다린 뒤 담당자 · 4.6s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "비밀번호를 잊어버렸어요",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "data_api_down"
|
||||
}
|
||||
✘ FAQ 느림 · 다음 질문은 기다리지 않음 (차단기 열림) · 4.6s · took 4.6s (expected at most 1s); reason = data_api_down (expected breaker_open)
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "data_api_down"
|
||||
}
|
||||
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 0}
|
||||
✔ FAQ가 돌아오고 차단기를 비우면 평소대로 · 1.2s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 43,
|
||||
"answer_ms": 1092,
|
||||
"review_ms": 15,
|
||||
"total_ms": 1161
|
||||
}
|
||||
}
|
||||
Passed 3/4
|
||||
report: runs/lab03-challenge2-20261024-175242.json
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ after: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 0}
|
||||
@@ -0,0 +1,121 @@
|
||||
{
|
||||
"cases": "lab03-challenge2.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 4,
|
||||
"total": 4,
|
||||
"results": [
|
||||
{
|
||||
"case": "평소",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 2.7,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 114,
|
||||
"answer_ms": 1678,
|
||||
"review_ms": 14,
|
||||
"total_ms": 1827
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "FAQ 느림 · 처음 한 번은 기다린 뒤 담당자",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 4.8,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "비밀번호를 잊어버렸어요",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "data_api_down"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "FAQ 느림 · 다음 질문은 기다리지 않음 (차단기 열림)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "breaker_open",
|
||||
"llm_calls": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "FAQ가 돌아오고 차단기를 비우면 평소대로",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 52,
|
||||
"answer_ms": 1005,
|
||||
"review_ms": 18,
|
||||
"total_ms": 1084
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 0}
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
|
||||
✔ 평소 · 2.7s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 114,
|
||||
"answer_ms": 1678,
|
||||
"review_ms": 14,
|
||||
"total_ms": 1827
|
||||
}
|
||||
}
|
||||
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "slow", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ FAQ 느림 · 처음 한 번은 기다린 뒤 담당자 · 4.8s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "비밀번호를 잊어버렸어요",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "data_api_down"
|
||||
}
|
||||
✔ FAQ 느림 · 다음 질문은 기다리지 않음 (차단기 열림) · 0.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "breaker_open",
|
||||
"llm_calls": 0
|
||||
}
|
||||
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 1}
|
||||
✔ FAQ가 돌아오고 차단기를 비우면 평소대로 · 1.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 52,
|
||||
"answer_ms": 1005,
|
||||
"review_ms": 18,
|
||||
"total_ms": 1084
|
||||
}
|
||||
}
|
||||
Passed 4/4
|
||||
report: runs/lab03-challenge2-20261024-175304.json
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ after: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 0}
|
||||
@@ -0,0 +1,113 @@
|
||||
{
|
||||
"cases": "lab03.json",
|
||||
"webhook": "my-helpdesk",
|
||||
"passed": 4,
|
||||
"total": 4,
|
||||
"results": [
|
||||
{
|
||||
"case": "평소",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 1.2,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 77,
|
||||
"answer_ms": 1000,
|
||||
"review_ms": 16,
|
||||
"total_ms": 1104
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "FAQ가 느릴 때 (8초)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 4.6,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "비밀번호를 잊어버렸어요",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "data_api_down"
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "FAQ가 오류일 때 (500)",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "비밀번호를 잊어버렸어요",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
},
|
||||
"response": {
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "breaker_open",
|
||||
"llm_calls": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"case": "캐시에 있으면 FAQ가 멈춰도 답",
|
||||
"webhook": "my-helpdesk",
|
||||
"run": 1,
|
||||
"passed": true,
|
||||
"problems": [],
|
||||
"seconds": 0.1,
|
||||
"status": 200,
|
||||
"request": {
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진"
|
||||
},
|
||||
"response": {
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"cached": true,
|
||||
"steps": [
|
||||
"cache"
|
||||
],
|
||||
"timings": {
|
||||
"total_ms": 21
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
POST http://localhost:5678/webhook/my-helpdesk · 4 case(s) × 1
|
||||
✔ 평소 · 1.2s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "VPN 접속이 자꾸 끊겨요. 어떻게 하나요?",
|
||||
"user": "이준호",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "VPN 접속 오류가 발생하면 VPN 클라이언트를 최신 버전으로 업데이트하고, 인증서 만료 여부를 확인한 뒤 다시 접속해 보시기 바랍니다. 추가 도움이 필요하면 담당자가 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-003"
|
||||
],
|
||||
"llm_calls": 1,
|
||||
"cached": false,
|
||||
"steps": [
|
||||
"rule",
|
||||
"faq",
|
||||
"ticket",
|
||||
"answer",
|
||||
"check"
|
||||
],
|
||||
"timings": {
|
||||
"data_ms": 77,
|
||||
"answer_ms": 1000,
|
||||
"review_ms": 16,
|
||||
"total_ms": 1104
|
||||
}
|
||||
}
|
||||
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "slow", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ FAQ가 느릴 때 (8초) · 4.6s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "비밀번호를 잊어버렸어요",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "data_api_down"
|
||||
}
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "error", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ FAQ가 오류일 때 (500) · 0.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "비밀번호를 잊어버렸어요",
|
||||
"user": "한지훈",
|
||||
"no_cache": true
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "담당자 연결",
|
||||
"answer": "사내 데이터 시스템이 응답하지 않아 담당자에게 연결합니다.",
|
||||
"reason": "breaker_open",
|
||||
"llm_calls": 0
|
||||
}
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ before: POST http://localhost:8800/cache-clear · HTTP 200 · 0.0s · {"cleared": 1}
|
||||
✔ before: POST /webhook/my-helpdesk · HTTP 200 · 1.3s · {"route": "자동 답변", "category": "faq", "answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리
|
||||
✔ before: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "error", "tickets": "ok", "slow_seconds": 8.0}
|
||||
✔ 캐시에 있으면 FAQ가 멈춰도 답 · 0.1s
|
||||
→ request POST /webhook/my-helpdesk
|
||||
{
|
||||
"question": "프린터 출력이 안 돼요",
|
||||
"user": "최유진"
|
||||
}
|
||||
← response HTTP 200
|
||||
{
|
||||
"route": "자동 답변",
|
||||
"category": "faq",
|
||||
"answer": "프린터 전원과 네트워크 연결을 확인하고, 인쇄 대기열을 비운 뒤 다시 출력해 보세요. 추가 도움이 필요하면 담당 직원이 도와드리겠습니다.",
|
||||
"sources": [
|
||||
"FAQ-004"
|
||||
],
|
||||
"llm_calls": 0,
|
||||
"cached": true,
|
||||
"steps": [
|
||||
"cache"
|
||||
],
|
||||
"timings": {
|
||||
"total_ms": 21
|
||||
}
|
||||
}
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
Passed 4/4
|
||||
report: runs/lab03-20261024-175311.json
|
||||
✔ after: POST http://localhost:8800/admin/fault · HTTP 200 · 0.0s · {"faq": "ok", "tickets": "ok", "slow_seconds": 8.0}
|
||||
@@ -0,0 +1,13 @@
|
||||
$ uv run tools/flow.py doctor
|
||||
! n8n install folder /Users/mcchae/day65-n8n
|
||||
→ day 65 SETUP-N8N 5단계 (get.n8n.io 설치). 다른 곳에 설치했다면 Last3Mon/65/n8n/.env 에 N8N_HOME=<폴더>
|
||||
✔ n8n container day65-n8n-n8n-1
|
||||
✔ n8n http://localhost:5678
|
||||
✔ data API http://localhost:8800
|
||||
✔ fault switch /admin/fault (day 72 data API)
|
||||
✔ n8n → http://data-api:8800
|
||||
✔ credential 'OpenAI (.env)' (openAiCourse0001)
|
||||
✔ node catalog (for check)
|
||||
✔ CLI coding agent: codex, claude, agy
|
||||
ready
|
||||
|
||||
@@ -0,0 +1,586 @@
|
||||
{
|
||||
"name": "72 IT helpdesk + step timings (answer)",
|
||||
"nodes": [
|
||||
{
|
||||
"name": "Question webhook",
|
||||
"type": "n8n-nodes-base.webhook",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"httpMethod": "POST",
|
||||
"path": "my-helpdesk",
|
||||
"responseMode": "responseNode",
|
||||
"options": {}
|
||||
},
|
||||
"webhookId": "de518e93-ed19-541f-a6fc-687a4efaf1b2",
|
||||
"position": [
|
||||
0,
|
||||
300
|
||||
],
|
||||
"id": "f7a423a6-a6a2-57a3-954f-e8540a1ce022"
|
||||
},
|
||||
{
|
||||
"name": "Has question?",
|
||||
"type": "n8n-nodes-base.if",
|
||||
"typeVersion": 2.2,
|
||||
"parameters": {
|
||||
"conditions": {
|
||||
"options": {
|
||||
"caseSensitive": true,
|
||||
"leftValue": "",
|
||||
"typeValidation": "loose",
|
||||
"version": 2
|
||||
},
|
||||
"conditions": [
|
||||
{
|
||||
"id": "c1",
|
||||
"leftValue": "={{ $json.body.question }}",
|
||||
"rightValue": "",
|
||||
"operator": {
|
||||
"type": "string",
|
||||
"operation": "notEmpty",
|
||||
"singleValue": true
|
||||
}
|
||||
}
|
||||
],
|
||||
"combinator": "and"
|
||||
},
|
||||
"options": {}
|
||||
},
|
||||
"position": [
|
||||
220,
|
||||
300
|
||||
],
|
||||
"id": "6dce76b0-2dd0-5181-99be-b0b894c87c8b"
|
||||
},
|
||||
{
|
||||
"name": "Reject empty",
|
||||
"type": "n8n-nodes-base.respondToWebhook",
|
||||
"typeVersion": 1.1,
|
||||
"parameters": {
|
||||
"respondWith": "json",
|
||||
"responseBody": "{ \"error\": \"question is required\" }",
|
||||
"options": {
|
||||
"responseCode": 400
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
440,
|
||||
560
|
||||
],
|
||||
"id": "75371917-2483-583e-9135-5c663a18b08b"
|
||||
},
|
||||
{
|
||||
"name": "Start clock",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "return [{ json: { t: Date.now() } }];"
|
||||
},
|
||||
"position": [
|
||||
440,
|
||||
300
|
||||
],
|
||||
"id": "34377f95-81c5-5aa3-9e2c-6b63a8e5ae54"
|
||||
},
|
||||
{
|
||||
"name": "Classify",
|
||||
"type": "@n8n/n8n-nodes-langchain.agent",
|
||||
"typeVersion": 3.1,
|
||||
"parameters": {
|
||||
"promptType": "define",
|
||||
"text": "={{ $('Question webhook').first().json.body.question }}",
|
||||
"options": {
|
||||
"systemMessage": "You sort one company IT help-desk question. Categories: faq (how to fix or use something: password, account lock, VPN, printer, mail box, software install), ticket (asks about the status of an IT request ticket like T-1002), other (anything else). Return only JSON, no code fence: {\"category\": \"faq\"}",
|
||||
"maxIterations": 1
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
660,
|
||||
300
|
||||
],
|
||||
"id": "7a93b236-dbff-52c5-9397-61087bc0688d"
|
||||
},
|
||||
{
|
||||
"name": "Classify model",
|
||||
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
|
||||
"typeVersion": 1.2,
|
||||
"parameters": {
|
||||
"model": {
|
||||
"__rl": true,
|
||||
"mode": "id",
|
||||
"value": "gpt-4.1-mini"
|
||||
},
|
||||
"options": {
|
||||
"temperature": 0
|
||||
}
|
||||
},
|
||||
"credentials": {
|
||||
"openAiApi": {
|
||||
"id": "openAiCourse0001",
|
||||
"name": "OpenAI (.env)"
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
660,
|
||||
520
|
||||
],
|
||||
"id": "357e7611-4597-5ba3-a6ba-9a4d4d63cda7"
|
||||
},
|
||||
{
|
||||
"name": "Parse category",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "const raw = String($json.output ?? '').trim().replace(/^```(json)?\\s*|```$/g, '');\nlet category = 'other';\ntry { category = JSON.parse(raw).category ?? 'other'; } catch (error) { category = 'other'; }\nif (!['faq', 'ticket', 'other'].includes(category)) category = 'other';\nreturn [{ json: { category, by: 'llm' } }];"
|
||||
},
|
||||
"position": [
|
||||
880,
|
||||
300
|
||||
],
|
||||
"id": "9327634c-6764-5403-b7bc-3e666e7ae3d6"
|
||||
},
|
||||
{
|
||||
"name": "After classify",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
|
||||
},
|
||||
"position": [
|
||||
1100,
|
||||
300
|
||||
],
|
||||
"id": "8f3da4f6-ce34-5505-b543-e5d68d990a96"
|
||||
},
|
||||
{
|
||||
"name": "Search FAQ",
|
||||
"type": "n8n-nodes-base.httpRequest",
|
||||
"typeVersion": 4.2,
|
||||
"parameters": {
|
||||
"url": "http://data-api:8800/faq",
|
||||
"options": {},
|
||||
"sendQuery": true,
|
||||
"queryParameters": {
|
||||
"parameters": [
|
||||
{
|
||||
"name": "q",
|
||||
"value": "={{ $('Question webhook').first().json.body.question }}"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
1320,
|
||||
300
|
||||
],
|
||||
"id": "103c6254-01ea-5e80-81bb-7e3b9ea7beb5"
|
||||
},
|
||||
{
|
||||
"name": "After FAQ",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
|
||||
},
|
||||
"position": [
|
||||
1540,
|
||||
300
|
||||
],
|
||||
"id": "d03181b0-715d-5fae-98a0-92c52a2b3b3c"
|
||||
},
|
||||
{
|
||||
"name": "Get ticket",
|
||||
"type": "n8n-nodes-base.httpRequest",
|
||||
"typeVersion": 4.2,
|
||||
"parameters": {
|
||||
"url": "=http://data-api:8800/tickets/{{ (($('Question webhook').first().json.body.question.match(/T-?\\d{4}/i) || ['NONE'])[0]).toUpperCase().replace(/^T(\\d)/, 'T-$1') }}",
|
||||
"options": {
|
||||
"response": {
|
||||
"response": {
|
||||
"neverError": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"sendQuery": true,
|
||||
"queryParameters": {
|
||||
"parameters": [
|
||||
{
|
||||
"name": "requester",
|
||||
"value": "={{ $('Question webhook').first().json.body.user ?? '' }}"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
1760,
|
||||
300
|
||||
],
|
||||
"id": "f20b5c78-0224-5d55-8d77-0a9e98061a6b"
|
||||
},
|
||||
{
|
||||
"name": "After data",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
|
||||
},
|
||||
"position": [
|
||||
1980,
|
||||
300
|
||||
],
|
||||
"id": "cca89aef-ef17-5b5f-a3c3-a53e0d762b43"
|
||||
},
|
||||
{
|
||||
"name": "Answer",
|
||||
"type": "@n8n/n8n-nodes-langchain.agent",
|
||||
"typeVersion": 3.1,
|
||||
"parameters": {
|
||||
"promptType": "define",
|
||||
"text": "=질문: {{ $('Question webhook').first().json.body.question }}\n분류: {{ $('Parse category').first().json.category }}\nFAQ: {{ JSON.stringify($('Search FAQ').first().json.results ?? []) }}\n접수 건: {{ JSON.stringify($('Get ticket').first().json) }}",
|
||||
"options": {
|
||||
"systemMessage": "You are the company IT help desk. Answer in Korean in at most 3 sentences, using only the FAQ entries and the ticket record given. Never invent steps, dates or names. For a ticket, say its status and note. If the data does not answer the question, say \"찾지 못했습니다\" and that a staff member will help.",
|
||||
"maxIterations": 1
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
2200,
|
||||
300
|
||||
],
|
||||
"id": "d7ec1c62-265f-5d16-b67a-c5922305bb8a"
|
||||
},
|
||||
{
|
||||
"name": "Answer model",
|
||||
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
|
||||
"typeVersion": 1.2,
|
||||
"parameters": {
|
||||
"model": {
|
||||
"__rl": true,
|
||||
"mode": "id",
|
||||
"value": "gpt-4.1-mini"
|
||||
},
|
||||
"options": {
|
||||
"temperature": 0
|
||||
}
|
||||
},
|
||||
"credentials": {
|
||||
"openAiApi": {
|
||||
"id": "openAiCourse0001",
|
||||
"name": "OpenAI (.env)"
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
2200,
|
||||
520
|
||||
],
|
||||
"id": "5c7f8b81-cd4c-59a2-9899-9bdb4813f7ab"
|
||||
},
|
||||
{
|
||||
"name": "After answer",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
|
||||
},
|
||||
"position": [
|
||||
2420,
|
||||
300
|
||||
],
|
||||
"id": "43dab328-4901-5fd6-8238-6e0f836cc31d"
|
||||
},
|
||||
{
|
||||
"name": "Review",
|
||||
"type": "@n8n/n8n-nodes-langchain.agent",
|
||||
"typeVersion": 3.1,
|
||||
"parameters": {
|
||||
"promptType": "define",
|
||||
"text": "=초안: {{ $('Answer').first().json.output }}",
|
||||
"options": {
|
||||
"systemMessage": "You review a Korean IT help-desk answer before it is sent. Keep the facts exactly. Make it polite (합니다체), remove anything not supported by the data, keep at most 3 sentences. Return only the final answer text.",
|
||||
"maxIterations": 1
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
2640,
|
||||
300
|
||||
],
|
||||
"id": "a4583946-f582-5ad8-963b-b866b74e9ba4"
|
||||
},
|
||||
{
|
||||
"name": "Review model",
|
||||
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
|
||||
"typeVersion": 1.2,
|
||||
"parameters": {
|
||||
"model": {
|
||||
"__rl": true,
|
||||
"mode": "id",
|
||||
"value": "gpt-4.1-mini"
|
||||
},
|
||||
"options": {
|
||||
"temperature": 0
|
||||
}
|
||||
},
|
||||
"credentials": {
|
||||
"openAiApi": {
|
||||
"id": "openAiCourse0001",
|
||||
"name": "OpenAI (.env)"
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
2640,
|
||||
520
|
||||
],
|
||||
"id": "3be9acc9-4b3d-5a41-b6a4-00fa1b04d777"
|
||||
},
|
||||
{
|
||||
"name": "After review",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
|
||||
},
|
||||
"position": [
|
||||
2860,
|
||||
300
|
||||
],
|
||||
"id": "d07d9992-7e5e-5aab-b925-9387021bbaff"
|
||||
},
|
||||
{
|
||||
"name": "Build result",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "const ran = (name) => { try { return $(name).isExecuted; } catch (error) { return false; } };\nconst body = $('Question webhook').first().json.body;\nconst category = $('Parse category').first().json.category;\nconst answer = String($('Review').first().json.output ?? '').trim();\nconst results = $('Search FAQ').first().json.results ?? [];\nconst sources = category === 'faq' ? results.map((r) => r.id) : [];\nconst steps = [];\nif (ran('Rule classify')) steps.push('rule');\nif (ran('Classify')) steps.push('classify');\nsteps.push('faq', 'ticket', 'answer');\nsteps.push('review');\nconst llm_calls = (ran('Classify') ? 1 : 0) + 1 + 1;\nconst result = { route: '자동 답변', category, answer, sources };\nconst t = (name) => (ran(name) ? $(name).first().json.t : null);\nconst t0 = t('Start clock');\nconst marks = [['classify', t('After classify')], ['faq', t('After FAQ')], ['ticket', t('After data')], ['answer', t('After answer')], ['review', t('After review')]];\nconst timings = {};\nlet last = t0;\nfor (const [label, mark] of marks) {\n if (mark === null) continue;\n timings[`${label}_ms`] = mark - last;\n last = mark;\n}\ntimings.total_ms = Date.now() - t0;\nObject.assign(result, { llm_calls, cached: false, steps, timings });\nconst parts = Object.entries(timings).filter(([key]) => key !== 'total_ms');\nresult.slowest_step = parts.sort((a, b) => b[1] - a[1])[0][0].replace(/_ms$/, '');\nreturn [{ json: result }];"
|
||||
},
|
||||
"position": [
|
||||
3080,
|
||||
300
|
||||
],
|
||||
"id": "079e44f0-da3e-57dd-be6a-87025b6a320f"
|
||||
},
|
||||
{
|
||||
"name": "Send result",
|
||||
"type": "n8n-nodes-base.respondToWebhook",
|
||||
"typeVersion": 1.1,
|
||||
"parameters": {
|
||||
"respondWith": "json",
|
||||
"responseBody": "={{ $json }}",
|
||||
"options": {}
|
||||
},
|
||||
"position": [
|
||||
3300,
|
||||
300
|
||||
],
|
||||
"id": "8ac7b99c-d9fa-5a1e-a168-33eb7ab5e2a3"
|
||||
}
|
||||
],
|
||||
"connections": {
|
||||
"Question webhook": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Has question?",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Has question?": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Start clock",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
"node": "Reject empty",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Start clock": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Classify",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Classify model": {
|
||||
"ai_languageModel": [
|
||||
[
|
||||
{
|
||||
"node": "Classify",
|
||||
"type": "ai_languageModel",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Classify": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Parse category",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Parse category": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "After classify",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"After classify": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Search FAQ",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Search FAQ": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "After FAQ",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"After FAQ": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Get ticket",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Get ticket": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "After data",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"After data": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Answer",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Answer model": {
|
||||
"ai_languageModel": [
|
||||
[
|
||||
{
|
||||
"node": "Answer",
|
||||
"type": "ai_languageModel",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Answer": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "After answer",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"After answer": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Review",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Review model": {
|
||||
"ai_languageModel": [
|
||||
[
|
||||
{
|
||||
"node": "Review",
|
||||
"type": "ai_languageModel",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Review": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "After review",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"After review": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Build result",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Build result": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Send result",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"executionOrder": "v1"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,586 @@
|
||||
{
|
||||
"name": "72 IT helpdesk + time budget (answer)",
|
||||
"nodes": [
|
||||
{
|
||||
"name": "Question webhook",
|
||||
"type": "n8n-nodes-base.webhook",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"httpMethod": "POST",
|
||||
"path": "my-helpdesk",
|
||||
"responseMode": "responseNode",
|
||||
"options": {}
|
||||
},
|
||||
"webhookId": "de518e93-ed19-541f-a6fc-687a4efaf1b2",
|
||||
"position": [
|
||||
0,
|
||||
300
|
||||
],
|
||||
"id": "f7a423a6-a6a2-57a3-954f-e8540a1ce022"
|
||||
},
|
||||
{
|
||||
"name": "Has question?",
|
||||
"type": "n8n-nodes-base.if",
|
||||
"typeVersion": 2.2,
|
||||
"parameters": {
|
||||
"conditions": {
|
||||
"options": {
|
||||
"caseSensitive": true,
|
||||
"leftValue": "",
|
||||
"typeValidation": "loose",
|
||||
"version": 2
|
||||
},
|
||||
"conditions": [
|
||||
{
|
||||
"id": "c1",
|
||||
"leftValue": "={{ $json.body.question }}",
|
||||
"rightValue": "",
|
||||
"operator": {
|
||||
"type": "string",
|
||||
"operation": "notEmpty",
|
||||
"singleValue": true
|
||||
}
|
||||
}
|
||||
],
|
||||
"combinator": "and"
|
||||
},
|
||||
"options": {}
|
||||
},
|
||||
"position": [
|
||||
220,
|
||||
300
|
||||
],
|
||||
"id": "6dce76b0-2dd0-5181-99be-b0b894c87c8b"
|
||||
},
|
||||
{
|
||||
"name": "Reject empty",
|
||||
"type": "n8n-nodes-base.respondToWebhook",
|
||||
"typeVersion": 1.1,
|
||||
"parameters": {
|
||||
"respondWith": "json",
|
||||
"responseBody": "{ \"error\": \"question is required\" }",
|
||||
"options": {
|
||||
"responseCode": 400
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
440,
|
||||
560
|
||||
],
|
||||
"id": "75371917-2483-583e-9135-5c663a18b08b"
|
||||
},
|
||||
{
|
||||
"name": "Start clock",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "return [{ json: { t: Date.now() } }];"
|
||||
},
|
||||
"position": [
|
||||
440,
|
||||
300
|
||||
],
|
||||
"id": "34377f95-81c5-5aa3-9e2c-6b63a8e5ae54"
|
||||
},
|
||||
{
|
||||
"name": "Classify",
|
||||
"type": "@n8n/n8n-nodes-langchain.agent",
|
||||
"typeVersion": 3.1,
|
||||
"parameters": {
|
||||
"promptType": "define",
|
||||
"text": "={{ $('Question webhook').first().json.body.question }}",
|
||||
"options": {
|
||||
"systemMessage": "You sort one company IT help-desk question. Categories: faq (how to fix or use something: password, account lock, VPN, printer, mail box, software install), ticket (asks about the status of an IT request ticket like T-1002), other (anything else). Return only JSON, no code fence: {\"category\": \"faq\"}",
|
||||
"maxIterations": 1
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
660,
|
||||
300
|
||||
],
|
||||
"id": "7a93b236-dbff-52c5-9397-61087bc0688d"
|
||||
},
|
||||
{
|
||||
"name": "Classify model",
|
||||
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
|
||||
"typeVersion": 1.2,
|
||||
"parameters": {
|
||||
"model": {
|
||||
"__rl": true,
|
||||
"mode": "id",
|
||||
"value": "gpt-4.1-mini"
|
||||
},
|
||||
"options": {
|
||||
"temperature": 0
|
||||
}
|
||||
},
|
||||
"credentials": {
|
||||
"openAiApi": {
|
||||
"id": "openAiCourse0001",
|
||||
"name": "OpenAI (.env)"
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
660,
|
||||
520
|
||||
],
|
||||
"id": "357e7611-4597-5ba3-a6ba-9a4d4d63cda7"
|
||||
},
|
||||
{
|
||||
"name": "Parse category",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "const raw = String($json.output ?? '').trim().replace(/^```(json)?\\s*|```$/g, '');\nlet category = 'other';\ntry { category = JSON.parse(raw).category ?? 'other'; } catch (error) { category = 'other'; }\nif (!['faq', 'ticket', 'other'].includes(category)) category = 'other';\nreturn [{ json: { category, by: 'llm' } }];"
|
||||
},
|
||||
"position": [
|
||||
880,
|
||||
300
|
||||
],
|
||||
"id": "9327634c-6764-5403-b7bc-3e666e7ae3d6"
|
||||
},
|
||||
{
|
||||
"name": "After classify",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
|
||||
},
|
||||
"position": [
|
||||
1100,
|
||||
300
|
||||
],
|
||||
"id": "8f3da4f6-ce34-5505-b543-e5d68d990a96"
|
||||
},
|
||||
{
|
||||
"name": "Search FAQ",
|
||||
"type": "n8n-nodes-base.httpRequest",
|
||||
"typeVersion": 4.2,
|
||||
"parameters": {
|
||||
"url": "http://data-api:8800/faq",
|
||||
"options": {},
|
||||
"sendQuery": true,
|
||||
"queryParameters": {
|
||||
"parameters": [
|
||||
{
|
||||
"name": "q",
|
||||
"value": "={{ $('Question webhook').first().json.body.question }}"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
1320,
|
||||
300
|
||||
],
|
||||
"id": "103c6254-01ea-5e80-81bb-7e3b9ea7beb5"
|
||||
},
|
||||
{
|
||||
"name": "After FAQ",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
|
||||
},
|
||||
"position": [
|
||||
1540,
|
||||
300
|
||||
],
|
||||
"id": "d03181b0-715d-5fae-98a0-92c52a2b3b3c"
|
||||
},
|
||||
{
|
||||
"name": "Get ticket",
|
||||
"type": "n8n-nodes-base.httpRequest",
|
||||
"typeVersion": 4.2,
|
||||
"parameters": {
|
||||
"url": "=http://data-api:8800/tickets/{{ (($('Question webhook').first().json.body.question.match(/T-?\\d{4}/i) || ['NONE'])[0]).toUpperCase().replace(/^T(\\d)/, 'T-$1') }}",
|
||||
"options": {
|
||||
"response": {
|
||||
"response": {
|
||||
"neverError": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"sendQuery": true,
|
||||
"queryParameters": {
|
||||
"parameters": [
|
||||
{
|
||||
"name": "requester",
|
||||
"value": "={{ $('Question webhook').first().json.body.user ?? '' }}"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
1760,
|
||||
300
|
||||
],
|
||||
"id": "f20b5c78-0224-5d55-8d77-0a9e98061a6b"
|
||||
},
|
||||
{
|
||||
"name": "After data",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
|
||||
},
|
||||
"position": [
|
||||
1980,
|
||||
300
|
||||
],
|
||||
"id": "cca89aef-ef17-5b5f-a3c3-a53e0d762b43"
|
||||
},
|
||||
{
|
||||
"name": "Answer",
|
||||
"type": "@n8n/n8n-nodes-langchain.agent",
|
||||
"typeVersion": 3.1,
|
||||
"parameters": {
|
||||
"promptType": "define",
|
||||
"text": "=질문: {{ $('Question webhook').first().json.body.question }}\n분류: {{ $('Parse category').first().json.category }}\nFAQ: {{ JSON.stringify($('Search FAQ').first().json.results ?? []) }}\n접수 건: {{ JSON.stringify($('Get ticket').first().json) }}",
|
||||
"options": {
|
||||
"systemMessage": "You are the company IT help desk. Answer in Korean in at most 3 sentences, using only the FAQ entries and the ticket record given. Never invent steps, dates or names. For a ticket, say its status and note. If the data does not answer the question, say \"찾지 못했습니다\" and that a staff member will help.",
|
||||
"maxIterations": 1
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
2200,
|
||||
300
|
||||
],
|
||||
"id": "d7ec1c62-265f-5d16-b67a-c5922305bb8a"
|
||||
},
|
||||
{
|
||||
"name": "Answer model",
|
||||
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
|
||||
"typeVersion": 1.2,
|
||||
"parameters": {
|
||||
"model": {
|
||||
"__rl": true,
|
||||
"mode": "id",
|
||||
"value": "gpt-4.1-mini"
|
||||
},
|
||||
"options": {
|
||||
"temperature": 0
|
||||
}
|
||||
},
|
||||
"credentials": {
|
||||
"openAiApi": {
|
||||
"id": "openAiCourse0001",
|
||||
"name": "OpenAI (.env)"
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
2200,
|
||||
520
|
||||
],
|
||||
"id": "5c7f8b81-cd4c-59a2-9899-9bdb4813f7ab"
|
||||
},
|
||||
{
|
||||
"name": "After answer",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
|
||||
},
|
||||
"position": [
|
||||
2420,
|
||||
300
|
||||
],
|
||||
"id": "43dab328-4901-5fd6-8238-6e0f836cc31d"
|
||||
},
|
||||
{
|
||||
"name": "Review",
|
||||
"type": "@n8n/n8n-nodes-langchain.agent",
|
||||
"typeVersion": 3.1,
|
||||
"parameters": {
|
||||
"promptType": "define",
|
||||
"text": "=초안: {{ $('Answer').first().json.output }}",
|
||||
"options": {
|
||||
"systemMessage": "You review a Korean IT help-desk answer before it is sent. Keep the facts exactly. Make it polite (합니다체), remove anything not supported by the data, keep at most 3 sentences. Return only the final answer text.",
|
||||
"maxIterations": 1
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
2640,
|
||||
300
|
||||
],
|
||||
"id": "a4583946-f582-5ad8-963b-b866b74e9ba4"
|
||||
},
|
||||
{
|
||||
"name": "Review model",
|
||||
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
|
||||
"typeVersion": 1.2,
|
||||
"parameters": {
|
||||
"model": {
|
||||
"__rl": true,
|
||||
"mode": "id",
|
||||
"value": "gpt-4.1-mini"
|
||||
},
|
||||
"options": {
|
||||
"temperature": 0
|
||||
}
|
||||
},
|
||||
"credentials": {
|
||||
"openAiApi": {
|
||||
"id": "openAiCourse0001",
|
||||
"name": "OpenAI (.env)"
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
2640,
|
||||
520
|
||||
],
|
||||
"id": "3be9acc9-4b3d-5a41-b6a4-00fa1b04d777"
|
||||
},
|
||||
{
|
||||
"name": "After review",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
|
||||
},
|
||||
"position": [
|
||||
2860,
|
||||
300
|
||||
],
|
||||
"id": "d07d9992-7e5e-5aab-b925-9387021bbaff"
|
||||
},
|
||||
{
|
||||
"name": "Build result",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "const ran = (name) => { try { return $(name).isExecuted; } catch (error) { return false; } };\nconst body = $('Question webhook').first().json.body;\nconst category = $('Parse category').first().json.category;\nconst answer = String($('Review').first().json.output ?? '').trim();\nconst results = $('Search FAQ').first().json.results ?? [];\nconst sources = category === 'faq' ? results.map((r) => r.id) : [];\nconst steps = [];\nif (ran('Rule classify')) steps.push('rule');\nif (ran('Classify')) steps.push('classify');\nsteps.push('faq', 'ticket', 'answer');\nsteps.push('review');\nconst llm_calls = (ran('Classify') ? 1 : 0) + 1 + 1;\nconst result = { route: '자동 답변', category, answer, sources };\nconst t = (name) => (ran(name) ? $(name).first().json.t : null);\nconst t0 = t('Start clock');\nconst marks = [['classify', t('After classify')], ['faq', t('After FAQ')], ['ticket', t('After data')], ['answer', t('After answer')], ['review', t('After review')]];\nconst timings = {};\nlet last = t0;\nfor (const [label, mark] of marks) {\n if (mark === null) continue;\n timings[`${label}_ms`] = mark - last;\n last = mark;\n}\ntimings.total_ms = Date.now() - t0;\nObject.assign(result, { llm_calls, cached: false, steps, timings });\nconst parts = Object.entries(timings).filter(([key]) => key !== 'total_ms');\nresult.slowest_step = parts.sort((a, b) => b[1] - a[1])[0][0].replace(/_ms$/, '');\nconst budget_ms = Number(body.budget_ms ?? 3000);\nresult.llm_ms = ['classify', 'answer', 'review'].reduce((sum, label) => sum + (timings[`${label}_ms`] ?? 0), 0);\nresult.budget_ms = budget_ms;\nresult.over_budget = timings.total_ms > budget_ms;\nreturn [{ json: result }];"
|
||||
},
|
||||
"position": [
|
||||
3080,
|
||||
300
|
||||
],
|
||||
"id": "079e44f0-da3e-57dd-be6a-87025b6a320f"
|
||||
},
|
||||
{
|
||||
"name": "Send result",
|
||||
"type": "n8n-nodes-base.respondToWebhook",
|
||||
"typeVersion": 1.1,
|
||||
"parameters": {
|
||||
"respondWith": "json",
|
||||
"responseBody": "={{ $json }}",
|
||||
"options": {}
|
||||
},
|
||||
"position": [
|
||||
3300,
|
||||
300
|
||||
],
|
||||
"id": "8ac7b99c-d9fa-5a1e-a168-33eb7ab5e2a3"
|
||||
}
|
||||
],
|
||||
"connections": {
|
||||
"Question webhook": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Has question?",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Has question?": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Start clock",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
"node": "Reject empty",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Start clock": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Classify",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Classify model": {
|
||||
"ai_languageModel": [
|
||||
[
|
||||
{
|
||||
"node": "Classify",
|
||||
"type": "ai_languageModel",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Classify": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Parse category",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Parse category": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "After classify",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"After classify": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Search FAQ",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Search FAQ": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "After FAQ",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"After FAQ": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Get ticket",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Get ticket": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "After data",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"After data": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Answer",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Answer model": {
|
||||
"ai_languageModel": [
|
||||
[
|
||||
{
|
||||
"node": "Answer",
|
||||
"type": "ai_languageModel",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Answer": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "After answer",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"After answer": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Review",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Review model": {
|
||||
"ai_languageModel": [
|
||||
[
|
||||
{
|
||||
"node": "Review",
|
||||
"type": "ai_languageModel",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Review": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "After review",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"After review": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Build result",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Build result": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Send result",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"executionOrder": "v1"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,852 @@
|
||||
{
|
||||
"name": "72 IT helpdesk + one LLM call (answer)",
|
||||
"nodes": [
|
||||
{
|
||||
"name": "Question webhook",
|
||||
"type": "n8n-nodes-base.webhook",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"httpMethod": "POST",
|
||||
"path": "my-helpdesk",
|
||||
"responseMode": "responseNode",
|
||||
"options": {}
|
||||
},
|
||||
"webhookId": "de518e93-ed19-541f-a6fc-687a4efaf1b2",
|
||||
"position": [
|
||||
0,
|
||||
300
|
||||
],
|
||||
"id": "4a893fec-ca3a-5349-a7b1-a8de0ac4350c"
|
||||
},
|
||||
{
|
||||
"name": "Has question?",
|
||||
"type": "n8n-nodes-base.if",
|
||||
"typeVersion": 2.2,
|
||||
"parameters": {
|
||||
"conditions": {
|
||||
"options": {
|
||||
"caseSensitive": true,
|
||||
"leftValue": "",
|
||||
"typeValidation": "loose",
|
||||
"version": 2
|
||||
},
|
||||
"conditions": [
|
||||
{
|
||||
"id": "c1",
|
||||
"leftValue": "={{ $json.body.question }}",
|
||||
"rightValue": "",
|
||||
"operator": {
|
||||
"type": "string",
|
||||
"operation": "notEmpty",
|
||||
"singleValue": true
|
||||
}
|
||||
}
|
||||
],
|
||||
"combinator": "and"
|
||||
},
|
||||
"options": {}
|
||||
},
|
||||
"position": [
|
||||
220,
|
||||
300
|
||||
],
|
||||
"id": "da287ac6-5b2c-5d11-a358-2c0d575d61ce"
|
||||
},
|
||||
{
|
||||
"name": "Reject empty",
|
||||
"type": "n8n-nodes-base.respondToWebhook",
|
||||
"typeVersion": 1.1,
|
||||
"parameters": {
|
||||
"respondWith": "json",
|
||||
"responseBody": "{ \"error\": \"question is required\" }",
|
||||
"options": {
|
||||
"responseCode": 400
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
440,
|
||||
560
|
||||
],
|
||||
"id": "049a20b6-3c29-5159-a0e6-f5617cf9d8d9"
|
||||
},
|
||||
{
|
||||
"name": "Start clock",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "return [{ json: { t: Date.now() } }];"
|
||||
},
|
||||
"position": [
|
||||
440,
|
||||
300
|
||||
],
|
||||
"id": "3b52fb72-af9e-54d9-8928-a1f87966b69f"
|
||||
},
|
||||
{
|
||||
"name": "Cache key",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "const body = $('Question webhook').first().json.body;\nconst key = String(body.question ?? '').trim().toLowerCase().replace(/\\s+/g, ' ');\nreturn [{ json: { ...$json, key, use_cache: body.no_cache !== true } }];"
|
||||
},
|
||||
"position": [
|
||||
660,
|
||||
300
|
||||
],
|
||||
"id": "1aed5faa-1a89-578c-8093-61fe2e9a2555"
|
||||
},
|
||||
{
|
||||
"name": "Cache lookup",
|
||||
"type": "n8n-nodes-base.httpRequest",
|
||||
"typeVersion": 4.2,
|
||||
"parameters": {
|
||||
"url": "=http://data-api:8800/cache/{{ encodeURIComponent($json.key) }}",
|
||||
"options": {
|
||||
"response": {
|
||||
"response": {
|
||||
"neverError": true
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
880,
|
||||
300
|
||||
],
|
||||
"id": "33b97251-cad7-50a2-805b-ecc7d70001de"
|
||||
},
|
||||
{
|
||||
"name": "Cached?",
|
||||
"type": "n8n-nodes-base.if",
|
||||
"typeVersion": 2.2,
|
||||
"parameters": {
|
||||
"conditions": {
|
||||
"options": {
|
||||
"caseSensitive": true,
|
||||
"leftValue": "",
|
||||
"typeValidation": "loose",
|
||||
"version": 2
|
||||
},
|
||||
"conditions": [
|
||||
{
|
||||
"id": "c1",
|
||||
"leftValue": "={{ $json.value !== undefined && $('Cache key').first().json.use_cache }}",
|
||||
"rightValue": "",
|
||||
"operator": {
|
||||
"type": "boolean",
|
||||
"operation": "true",
|
||||
"singleValue": true
|
||||
}
|
||||
}
|
||||
],
|
||||
"combinator": "and"
|
||||
},
|
||||
"options": {}
|
||||
},
|
||||
"position": [
|
||||
1100,
|
||||
300
|
||||
],
|
||||
"id": "7ad20324-27b3-5f30-9637-a4fa4d977a53"
|
||||
},
|
||||
{
|
||||
"name": "Cached result",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "const value = $json.value;\nconst t0 = $('Start clock').first().json.t;\nreturn [{ json: { route: value.route, category: value.category, answer: value.answer, sources: value.sources ?? [],\n llm_calls: 0, cached: true, steps: ['cache'], timings: { total_ms: t0 ? Date.now() - t0 : 0 } } }];"
|
||||
},
|
||||
"position": [
|
||||
1320,
|
||||
40
|
||||
],
|
||||
"id": "b102773a-d6b3-5fd8-9ada-e250f648cc44"
|
||||
},
|
||||
{
|
||||
"name": "Send cached",
|
||||
"type": "n8n-nodes-base.respondToWebhook",
|
||||
"typeVersion": 1.1,
|
||||
"parameters": {
|
||||
"respondWith": "json",
|
||||
"responseBody": "={{ $json }}",
|
||||
"options": {}
|
||||
},
|
||||
"position": [
|
||||
1540,
|
||||
40
|
||||
],
|
||||
"id": "ff6ce5c6-903d-53f6-96f7-a17baabcc1b6"
|
||||
},
|
||||
{
|
||||
"name": "Search FAQ",
|
||||
"type": "n8n-nodes-base.httpRequest",
|
||||
"typeVersion": 4.2,
|
||||
"parameters": {
|
||||
"url": "http://data-api:8800/faq",
|
||||
"options": {},
|
||||
"sendQuery": true,
|
||||
"queryParameters": {
|
||||
"parameters": [
|
||||
{
|
||||
"name": "q",
|
||||
"value": "={{ $('Question webhook').first().json.body.question }}"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
1320,
|
||||
300
|
||||
],
|
||||
"id": "0e3e780d-eaa1-5c13-a60a-f3112a296820"
|
||||
},
|
||||
{
|
||||
"name": "Get ticket",
|
||||
"type": "n8n-nodes-base.httpRequest",
|
||||
"typeVersion": 4.2,
|
||||
"parameters": {
|
||||
"url": "=http://data-api:8800/tickets/{{ (($('Question webhook').first().json.body.question.match(/T-?\\d{4}/i) || ['NONE'])[0]).toUpperCase().replace(/^T(\\d)/, 'T-$1') }}",
|
||||
"options": {
|
||||
"response": {
|
||||
"response": {
|
||||
"neverError": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"sendQuery": true,
|
||||
"queryParameters": {
|
||||
"parameters": [
|
||||
{
|
||||
"name": "requester",
|
||||
"value": "={{ $('Question webhook').first().json.body.user ?? '' }}"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
1540,
|
||||
300
|
||||
],
|
||||
"id": "f345aacb-db55-5226-bf79-822fd2f814ca"
|
||||
},
|
||||
{
|
||||
"name": "After data",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
|
||||
},
|
||||
"position": [
|
||||
1760,
|
||||
300
|
||||
],
|
||||
"id": "4c8c6887-4a50-589b-abdf-c8741f1cf589"
|
||||
},
|
||||
{
|
||||
"name": "Rule classify",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "const question = String($('Question webhook').first().json.body.question ?? '');\nconst results = $('Search FAQ').first().json.results ?? [];\nlet category = 'unknown';\nif (/T-?\\d{4}/i.test(question)) category = 'ticket';\nelse if (results.length > 0) category = 'faq';\nreturn [{ json: { category, by: 'rule' } }];"
|
||||
},
|
||||
"position": [
|
||||
1980,
|
||||
300
|
||||
],
|
||||
"id": "b01cd9fc-72fc-5ace-860b-6d607bf1e570"
|
||||
},
|
||||
{
|
||||
"name": "Known?",
|
||||
"type": "n8n-nodes-base.if",
|
||||
"typeVersion": 2.2,
|
||||
"parameters": {
|
||||
"conditions": {
|
||||
"options": {
|
||||
"caseSensitive": true,
|
||||
"leftValue": "",
|
||||
"typeValidation": "loose",
|
||||
"version": 2
|
||||
},
|
||||
"conditions": [
|
||||
{
|
||||
"id": "c1",
|
||||
"leftValue": "={{ $json.category }}",
|
||||
"rightValue": "unknown",
|
||||
"operator": {
|
||||
"type": "string",
|
||||
"operation": "notEquals"
|
||||
}
|
||||
}
|
||||
],
|
||||
"combinator": "and"
|
||||
},
|
||||
"options": {}
|
||||
},
|
||||
"position": [
|
||||
2200,
|
||||
300
|
||||
],
|
||||
"id": "2d154b76-eb12-5038-a639-c5608c6bf788"
|
||||
},
|
||||
{
|
||||
"name": "Classify",
|
||||
"type": "@n8n/n8n-nodes-langchain.agent",
|
||||
"typeVersion": 3.1,
|
||||
"parameters": {
|
||||
"promptType": "define",
|
||||
"text": "={{ $('Question webhook').first().json.body.question }}",
|
||||
"options": {
|
||||
"systemMessage": "You sort one company IT help-desk question. Categories: faq (how to fix or use something: password, account lock, VPN, printer, mail box, software install), ticket (asks about the status of an IT request ticket like T-1002), other (anything else). Return only JSON, no code fence: {\"category\": \"faq\"}",
|
||||
"maxIterations": 1
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
2420,
|
||||
300
|
||||
],
|
||||
"id": "8ba05958-c916-52e4-95ef-0f38f92246c3"
|
||||
},
|
||||
{
|
||||
"name": "Classify model",
|
||||
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
|
||||
"typeVersion": 1.2,
|
||||
"parameters": {
|
||||
"model": {
|
||||
"__rl": true,
|
||||
"mode": "id",
|
||||
"value": "gpt-4.1-mini"
|
||||
},
|
||||
"options": {
|
||||
"temperature": 0
|
||||
}
|
||||
},
|
||||
"credentials": {
|
||||
"openAiApi": {
|
||||
"id": "openAiCourse0001",
|
||||
"name": "OpenAI (.env)"
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
2420,
|
||||
520
|
||||
],
|
||||
"id": "14555336-1d5b-5860-98cc-cc7febd5fdab"
|
||||
},
|
||||
{
|
||||
"name": "Parse category",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "const raw = String($json.output ?? '').trim().replace(/^```(json)?\\s*|```$/g, '');\nlet category = 'other';\ntry { category = JSON.parse(raw).category ?? 'other'; } catch (error) { category = 'other'; }\nif (!['faq', 'ticket', 'other'].includes(category)) category = 'other';\nreturn [{ json: { category, by: 'llm' } }];"
|
||||
},
|
||||
"position": [
|
||||
2640,
|
||||
300
|
||||
],
|
||||
"id": "53522d0c-94f5-5e97-84ca-dfc99cbea797"
|
||||
},
|
||||
{
|
||||
"name": "After classify",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
|
||||
},
|
||||
"position": [
|
||||
2860,
|
||||
300
|
||||
],
|
||||
"id": "ed776d70-2fb9-5b97-86c8-aa43796e8cb3"
|
||||
},
|
||||
{
|
||||
"name": "Answer",
|
||||
"type": "@n8n/n8n-nodes-langchain.agent",
|
||||
"typeVersion": 3.1,
|
||||
"parameters": {
|
||||
"promptType": "define",
|
||||
"text": "=질문: {{ $('Question webhook').first().json.body.question }}\n분류: {{ $json.category }}\nFAQ: {{ JSON.stringify($('Search FAQ').first().json.results ?? []) }}\n접수 건: {{ JSON.stringify($('Get ticket').first().json) }}",
|
||||
"options": {
|
||||
"systemMessage": "You are the company IT help desk. Answer in Korean in at most 3 sentences, using only the FAQ entries and the ticket record given. Never invent steps, dates or names. For a ticket, say its status and note. If the data does not answer the question, say \"찾지 못했습니다\" and that a staff member will help.",
|
||||
"maxIterations": 1
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
3080,
|
||||
300
|
||||
],
|
||||
"id": "3cd227a5-1bb5-50e6-9402-69206c7ca546"
|
||||
},
|
||||
{
|
||||
"name": "Answer model",
|
||||
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
|
||||
"typeVersion": 1.2,
|
||||
"parameters": {
|
||||
"model": {
|
||||
"__rl": true,
|
||||
"mode": "id",
|
||||
"value": "gpt-4.1-mini"
|
||||
},
|
||||
"options": {
|
||||
"temperature": 0
|
||||
}
|
||||
},
|
||||
"credentials": {
|
||||
"openAiApi": {
|
||||
"id": "openAiCourse0001",
|
||||
"name": "OpenAI (.env)"
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
3080,
|
||||
520
|
||||
],
|
||||
"id": "f3dad63e-7b9c-5d29-b79e-077754d581b7"
|
||||
},
|
||||
{
|
||||
"name": "After answer",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
|
||||
},
|
||||
"position": [
|
||||
3300,
|
||||
300
|
||||
],
|
||||
"id": "0432c08a-5b0d-5d75-8e06-eab20db15ab1"
|
||||
},
|
||||
{
|
||||
"name": "Review check",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "let answer = String($('Answer').first().json.output ?? '').trim();\nconst problems = [];\nif (!answer) problems.push('empty');\nif (!/[가-힣]/.test(answer)) problems.push('not_korean');\nif (answer.length > 400) { answer = answer.slice(0, 400); problems.push('too_long'); }\nreturn [{ json: { ...$json, answer, review_problems: problems } }];"
|
||||
},
|
||||
"position": [
|
||||
3520,
|
||||
300
|
||||
],
|
||||
"id": "c2d5b0e4-e7e1-5972-8b49-d2aa51694714"
|
||||
},
|
||||
{
|
||||
"name": "After review",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "return [{ json: { ...$json, t: Date.now() } }];"
|
||||
},
|
||||
"position": [
|
||||
3740,
|
||||
300
|
||||
],
|
||||
"id": "f031c87a-b44b-55fa-a122-05d93f51fa6e"
|
||||
},
|
||||
{
|
||||
"name": "Build result",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "const ran = (name) => { try { return $(name).isExecuted; } catch (error) { return false; } };\nconst body = $('Question webhook').first().json.body;\nconst category = $('Parse category').isExecuted ? $('Parse category').first().json.category : $('Rule classify').first().json.category;\nconst answer = $('Review check').first().json.answer;\nconst results = $('Search FAQ').first().json.results ?? [];\nconst sources = category === 'faq' ? results.map((r) => r.id) : [];\nconst steps = [];\nif (ran('Rule classify')) steps.push('rule');\nif (ran('Classify')) steps.push('classify');\nsteps.push('faq', 'ticket', 'answer');\nsteps.push('check');\nconst llm_calls = (ran('Classify') ? 1 : 0) + 1 + 0;\nconst result = { route: '자동 답변', category, answer, sources };\nconst t = (name) => (ran(name) ? $(name).first().json.t : null);\nconst t0 = t('Start clock');\nconst marks = [['data', t('After data')], ['classify', t('After classify')], ['answer', t('After answer')], ['review', t('After review')]];\nconst timings = {};\nlet last = t0;\nfor (const [label, mark] of marks) {\n if (mark === null) continue;\n timings[`${label}_ms`] = mark - last;\n last = mark;\n}\ntimings.total_ms = Date.now() - t0;\nObject.assign(result, { llm_calls, cached: false, steps, timings });\nreturn [{ json: result }];"
|
||||
},
|
||||
"position": [
|
||||
3960,
|
||||
300
|
||||
],
|
||||
"id": "fc92aa99-281c-5e7a-96fb-6868624c4f34"
|
||||
},
|
||||
{
|
||||
"name": "Cache it?",
|
||||
"type": "n8n-nodes-base.if",
|
||||
"typeVersion": 2.2,
|
||||
"parameters": {
|
||||
"conditions": {
|
||||
"options": {
|
||||
"caseSensitive": true,
|
||||
"leftValue": "",
|
||||
"typeValidation": "loose",
|
||||
"version": 2
|
||||
},
|
||||
"conditions": [
|
||||
{
|
||||
"id": "c1",
|
||||
"leftValue": "={{ $json.category === 'faq' && $('Cache key').first().json.use_cache }}",
|
||||
"rightValue": "",
|
||||
"operator": {
|
||||
"type": "boolean",
|
||||
"operation": "true",
|
||||
"singleValue": true
|
||||
}
|
||||
}
|
||||
],
|
||||
"combinator": "and"
|
||||
},
|
||||
"options": {}
|
||||
},
|
||||
"position": [
|
||||
4180,
|
||||
300
|
||||
],
|
||||
"id": "f14260a7-8d0f-5916-a219-c233bc484860"
|
||||
},
|
||||
{
|
||||
"name": "Store in cache",
|
||||
"type": "n8n-nodes-base.httpRequest",
|
||||
"typeVersion": 4.2,
|
||||
"parameters": {
|
||||
"url": "=http://data-api:8800/cache/{{ encodeURIComponent($('Cache key').first().json.key) }}",
|
||||
"options": {
|
||||
"response": {
|
||||
"response": {
|
||||
"neverError": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"method": "POST",
|
||||
"sendBody": true,
|
||||
"specifyBody": "json",
|
||||
"jsonBody": "={{ JSON.stringify({ value: { route: $json.route, category: $json.category, answer: $json.answer, sources: $json.sources }, ttl: 600 }) }}"
|
||||
},
|
||||
"position": [
|
||||
4400,
|
||||
180
|
||||
],
|
||||
"id": "8c73289d-f4b4-50c2-a71e-229d368e7b39"
|
||||
},
|
||||
{
|
||||
"name": "Result again",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "return [{ json: $('Build result').first().json }];"
|
||||
},
|
||||
"position": [
|
||||
4620,
|
||||
180
|
||||
],
|
||||
"id": "4033230f-4e3a-515a-a980-ed987bc3372e"
|
||||
},
|
||||
{
|
||||
"name": "Send result",
|
||||
"type": "n8n-nodes-base.respondToWebhook",
|
||||
"typeVersion": 1.1,
|
||||
"parameters": {
|
||||
"respondWith": "json",
|
||||
"responseBody": "={{ $json }}",
|
||||
"options": {}
|
||||
},
|
||||
"position": [
|
||||
4840,
|
||||
300
|
||||
],
|
||||
"id": "43408f1e-819c-54ef-bb7b-7039f738e6f1"
|
||||
}
|
||||
],
|
||||
"connections": {
|
||||
"Question webhook": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Has question?",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Has question?": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Start clock",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
"node": "Reject empty",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Start clock": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Cache key",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Cache key": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Cache lookup",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Cache lookup": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Cached?",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Cached?": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Cached result",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
"node": "Search FAQ",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Cached result": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Send cached",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Search FAQ": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Get ticket",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Get ticket": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "After data",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"After data": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Rule classify",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Rule classify": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Known?",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Known?": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Answer",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
"node": "Classify",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Classify model": {
|
||||
"ai_languageModel": [
|
||||
[
|
||||
{
|
||||
"node": "Classify",
|
||||
"type": "ai_languageModel",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Classify": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Parse category",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Parse category": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "After classify",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"After classify": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Answer",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Answer model": {
|
||||
"ai_languageModel": [
|
||||
[
|
||||
{
|
||||
"node": "Answer",
|
||||
"type": "ai_languageModel",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Answer": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "After answer",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"After answer": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Review check",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Review check": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "After review",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"After review": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Build result",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Build result": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Cache it?",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Cache it?": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Store in cache",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
"node": "Send result",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Store in cache": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Result again",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Result again": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Send result",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"executionOrder": "v1"
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,238 @@
|
||||
{
|
||||
"name": "72 Health check (answer)",
|
||||
"nodes": [
|
||||
{
|
||||
"name": "Health webhook",
|
||||
"type": "n8n-nodes-base.webhook",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"httpMethod": "POST",
|
||||
"path": "my-health",
|
||||
"responseMode": "responseNode",
|
||||
"options": {}
|
||||
},
|
||||
"webhookId": "bdf5dd1e-edb4-503e-b800-c8653ff5fbb4",
|
||||
"position": [
|
||||
0,
|
||||
300
|
||||
],
|
||||
"id": "cd5b6b9d-06a3-57ed-91ab-0ab44b344fde"
|
||||
},
|
||||
{
|
||||
"name": "Start",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "return [{ json: { t0: Date.now() } }];"
|
||||
},
|
||||
"position": [
|
||||
220,
|
||||
300
|
||||
],
|
||||
"id": "0445c332-e249-5cce-915d-fca703b570b8"
|
||||
},
|
||||
{
|
||||
"name": "Check data API",
|
||||
"type": "n8n-nodes-base.httpRequest",
|
||||
"typeVersion": 4.2,
|
||||
"parameters": {
|
||||
"url": "http://data-api:8800/health",
|
||||
"options": {
|
||||
"timeout": 2000
|
||||
}
|
||||
},
|
||||
"onError": "continueRegularOutput",
|
||||
"alwaysOutputData": true,
|
||||
"position": [
|
||||
440,
|
||||
300
|
||||
],
|
||||
"id": "8ce80344-ec8e-5bd5-9a2e-839d49d9f1e9"
|
||||
},
|
||||
{
|
||||
"name": "Check FAQ",
|
||||
"type": "n8n-nodes-base.httpRequest",
|
||||
"typeVersion": 4.2,
|
||||
"parameters": {
|
||||
"url": "http://data-api:8800/faq",
|
||||
"options": {
|
||||
"timeout": 2000
|
||||
},
|
||||
"sendQuery": true,
|
||||
"queryParameters": {
|
||||
"parameters": [
|
||||
{
|
||||
"name": "q",
|
||||
"value": "vpn"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"onError": "continueRegularOutput",
|
||||
"alwaysOutputData": true,
|
||||
"position": [
|
||||
660,
|
||||
300
|
||||
],
|
||||
"id": "a935db0a-fc45-5a01-aa52-405740f82e9f"
|
||||
},
|
||||
{
|
||||
"name": "Check LLM",
|
||||
"type": "@n8n/n8n-nodes-langchain.agent",
|
||||
"typeVersion": 3.1,
|
||||
"parameters": {
|
||||
"promptType": "define",
|
||||
"text": "Reply with the single word OK.",
|
||||
"options": {
|
||||
"systemMessage": "You are a health check. Reply with OK only.",
|
||||
"maxIterations": 1
|
||||
}
|
||||
},
|
||||
"onError": "continueRegularOutput",
|
||||
"alwaysOutputData": true,
|
||||
"position": [
|
||||
880,
|
||||
300
|
||||
],
|
||||
"id": "96a58520-65ae-548a-ac2f-0b41d004933f"
|
||||
},
|
||||
{
|
||||
"name": "Health model",
|
||||
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
|
||||
"typeVersion": 1.2,
|
||||
"parameters": {
|
||||
"model": {
|
||||
"__rl": true,
|
||||
"mode": "id",
|
||||
"value": "gpt-4.1-mini"
|
||||
},
|
||||
"options": {
|
||||
"temperature": 0,
|
||||
"timeout": 8000,
|
||||
"maxRetries": 0
|
||||
}
|
||||
},
|
||||
"credentials": {
|
||||
"openAiApi": {
|
||||
"id": "openAiCourse0001",
|
||||
"name": "OpenAI (.env)"
|
||||
}
|
||||
},
|
||||
"position": [
|
||||
880,
|
||||
520
|
||||
],
|
||||
"id": "5aa10812-b13e-5bae-831e-7ccd24e72e62"
|
||||
},
|
||||
{
|
||||
"name": "Summarize",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"parameters": {
|
||||
"jsCode": "const data_api = $('Check data API').first().json.status === 'ok';\nconst faq = Array.isArray($('Check FAQ').first().json.results);\nconst llm = /ok/i.test(String($('Check LLM').first().json.output ?? ''));\nconst checks = { data_api, faq, llm };\nconst failed = Object.entries(checks).filter(([, good]) => !good).map(([name]) => name);\nconst status = failed.length === 0 ? 'ok' : (data_api || llm ? 'degraded' : 'down');\nreturn [{ json: { status, checks, failed, seconds: Math.round((Date.now() - $('Start').first().json.t0) / 100) / 10 } }];"
|
||||
},
|
||||
"position": [
|
||||
1100,
|
||||
300
|
||||
],
|
||||
"id": "54ee87ba-881d-5ad1-a032-1262876fdd48"
|
||||
},
|
||||
{
|
||||
"name": "Send status",
|
||||
"type": "n8n-nodes-base.respondToWebhook",
|
||||
"typeVersion": 1.1,
|
||||
"parameters": {
|
||||
"respondWith": "json",
|
||||
"responseBody": "={{ $json }}",
|
||||
"options": {}
|
||||
},
|
||||
"position": [
|
||||
1320,
|
||||
300
|
||||
],
|
||||
"id": "2340a4f9-d3c9-5717-ad49-b782bcd9f808"
|
||||
}
|
||||
],
|
||||
"connections": {
|
||||
"Health model": {
|
||||
"ai_languageModel": [
|
||||
[
|
||||
{
|
||||
"node": "Check LLM",
|
||||
"type": "ai_languageModel",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Health webhook": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Start",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Start": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Check data API",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Check data API": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Check FAQ",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Check FAQ": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Check LLM",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Check LLM": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Summarize",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Summarize": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Send status",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"executionOrder": "v1"
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
Reference in new issue
Block a user