웨다
경력근거: RAG 품질 관리 솔루션인 VectrGreen을 활용 하여 금융 고객의 문제점을 정의하고
※ 실제 산출물이 아닌 AI 예측 시안입니다.
웨다는 노코드 인공지능 데이터 플랫폼 그린웨일즈에 이어 RAG 품질 관리 솔루션 VectrGreen 을 내놓고, 금융 고객의 문제를 정의해 운영 환경에 정착시키는 일을 FDE 금융 파트에 맡깁니다. 답변을 메뉴얼과 맞춰 보는 이 도구는 그 품질 관리가 실제로 무엇을 재는가에 대한 답이라, 금융 상품 메뉴얼이 판마다 갈리는 이 도메인에서만 판정이 성립합니다. 다른 업종이면 조항의 판을 따지는 층 자체가 없습니다.
공고가 컨설팅과 구축을 넘어 정착까지 성공시킬 사람을 찾습니다. 정착 단계에서 매일 필요한 것이 답변이 메뉴얼을 벗어났는지 보는 일입니다.
자사 솔루션으로 대고객·대직원 에이전트를 만들고 유지보수까지 맡는다고 적혀 있습니다. 유지보수의 첫 재료를 트레이스로 잡았습니다.
검증된 방법론을 제품 공동 자산으로 발전시키는 일이 업무에 있습니다. 정책표와 메뉴얼 원장을 갈아 끼우면 다른 금융사에 그대로 도는 구조로 만들었습니다.
금융 고객사에 붙여 둔 상담 에이전트가 하루치로 남긴 트레이스를 받아, 답변 하나하나를 그 상품의 메뉴얼 조항과 맞춰 봅니다. 인용한 조항 번호가 메뉴얼 원장에 있는지, 답변한 날에 유효한 판을 인용했는지, 금융사가 넣으라고 정한 고지 문구가 문장에 있는지, 막아 둔 표현이 섞였는지, 사람 상담사가 받아야 할 주제에 에이전트가 답을 내 버렸는지를 순서대로 봅니다. 메뉴얼은 조항마다 판이 여러 개라 답변일이 어느 판 구간에 드는지부터 계산해야 인용이 옳은지 갈라집니다. 결과는 터미널 표와 고객사 회신용 Markdown 리포트로 나옵니다.
금융 고객사에 들어가 대고객·대직원 AI 에이전트를 구축하고 정착까지 맡는 FDE 엔지니어 — 트레이스는 하루 수천 건씩 쌓이는데 어느 답변이 메뉴얼을 벗어났는지는 사람이 한 건씩 열어 봐야만 드러난다
답변에 붙은 인용 조항 번호와 판, 그리고 상품별 고지·금지 문구를 메뉴얼 원장과 맞추면, 사람이 한 건씩 열어 보지 않고도 어느 답변이 왜 메뉴얼을 벗어났는지가 사유별로 정해집니다.
트레이스와 메뉴얼 원장, 정책표 세 파일을 받아 답변마다 여섯 사유 중 하나를 정하고, 걸린 문구와 답변일에 유효한 판을 붙여 터미널 표와 고객사 회신용 Markdown 리포트로 내는 CLI 입니다. 트레이스는 공개 금융 안내문으로 만든 메뉴얼에 지원자가 직접 질문을 던져 모읍니다.
LangGraph 로 메뉴얼을 찾아 답하는 상담 에이전트를 세워 트레이스 3000건을 실제로 남기고, 손으로 매긴 정답 판정과 대조해 사유별 일치율을 내는 단계입니다.
사유별로 어느 조항과 어느 프롬프트 단계에서 새는지 묶어 내고, 판정 결과를 트레이스 점수로 되돌려 붙여 다음 날 리포트에서 줄었는지 보게 하는 단계입니다.
FDE 엔지니어가 하루치 트레이스와 메뉴얼 원장, 정책표를 넣으면 어긋난 답변만 사유별로 묶인 리포트가 나오는 과정을 시연합니다.
직접 세운 에이전트가 남긴 트레이스 3000건에 손으로 매긴 정답 판정을 붙여 대조하고 사유별 일치율을 냅니다. 단, 정답과 메뉴얼을 모두 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건 동작입니다.
형식이 버티는 선을 미리 재 둡니다. 조항 번호가 비었거나 응답 시간이 안 남았거나 정책표에 없는 상품이 섞인 입력 30종을 넣어도 리포트가 그대로 나오고, 확인하지 못한 항목은 사유로 세우는 대신 hedge 에 적힙니다.
고지 문구를 찾을 때 띄어쓰기를 접는 규칙을 껐을 때와 켰을 때 필수 안내 누락 건수가 얼마나 달라지는지 회귀로 확인합니다.
성능 검증은 여기서 끊깁니다. 위 수치는 제가 만든 메뉴얼과 제가 던진 질문의 자가채점이고, 이탈 건수가 실제로 줄었는지는 웨다가 계약한 금융사의 실 메뉴얼과 실 상담 로그를 넣어야 나옵니다. 그 측정을 로그가 붙는 날 돌릴 수 있게 대조 규칙과 평가 러너를 준비해 둡니다.
리포트에 찍히는 건수와 일치율은 제가 만든 메뉴얼에 제가 던진 질문의 자가채점이라 성능 증명이 아닙니다. 면접에서는 도구가 실제로 도는 것과, 금융사 실 상담 로그가 붙으면 바로 잴 수 있는 상태라는 것만 말합니다.
메뉴얼도 정답 판정도 한 사람이 만들었으니 어긋난 곳을 잘 찾는 것은 당연합니다. 조항 번호가 빈 건과 개정일 당일에 답한 건, 정책표에만 있고 메뉴얼에는 없는 상품을 넣어 두어 인용이 붙은 답변만 검사하는 일이 안 되게 했습니다.
이 포트폴리오는 답변을 조항과 맞춰 어긋남을 사유로 가르는 기술을 보여줍니다. 금융 상품 규제나 준법 판단 전문성은 주장하지 않습니다. 판정은 번호 대조와 날짜 구간 계산이 하고 모델은 회신 문장만 맡습니다.
문구가 있는지만 보는 검사라 뜻이 같은 다른 표현으로 고지한 답변도 누락으로 걸립니다. 그래서 필수 안내 누락은 확정이 아니라 사람이 열어 볼 후보로 냅니다.
실제 도입 때는 금융사가 메뉴얼을 고칠 때마다 판이 늘어나므로, 원장을 개정마다 받아 넣는 일을 운영 과제로 둡니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
고객사에 붙여 둔 상담 에이전트가 하루치로 남긴 트레이스입니다. 상담 번호와 상품 코드, 고객 질문, 에이전트 답변, 인용한 메뉴얼 문서와 조항 번호와 판, 답한 날, 응답 시간을 한 줄에 둡니다. 지원자는 공개 금융 안내문으로 만든 메뉴얼에 직접 질문을 던져 이 표를 스스로 만듭니다. 조항 번호가 비어 있는 줄과 응답 시간이 안 남은 줄, 원장에 없는 번호를 인용한 줄, 개정일 당일에 답한 줄, 그리고 번호는 원장에 실재하지만 다른 상품의 메뉴얼에서 끌어온 줄을 일부러 섞어 사유가 갈리게 둡니다.
| session_id | product_code | question | answer_text | cited_doc_id | cited_clause_id | cited_doc_version | answered_at | latency_ms |
|---|---|---|---|---|---|---|---|---|
| s-8890 | LOAN-CREDIT | 중도상환 수수료가 얼마인가요 | 중도상환 수수료는 3년 이내 상환 시 잔액의 0.5%를 받으며 심사 … | MN-LOAN | LN-07-1 | 2026-06 | 2026-09-07 | 1,240 |
| s-8895 | PENSION-IRP | IRP 중도인출 되나요 | 개인형 퇴직연금 중도인출은 법에서 정한 사유에만 됩니다. | MN-PEN | PN-01-5 | 2026-09 | 2026-09-01 | 980 |
| s-8841 | LOAN-CREDIT | 중도상환 수수료 있나요 | 중도상환 수수료는 없습니다. 심사 결과에 따라 달라질 수 있습니다. | MN-LOAN | LN-07-3 | 2026-06 | 2026-09-07 | 1,120 |
| s-8902 | LOAN-CREDIT | 신용대출 한도가 얼마까지인가요 | 한도는 최대 3억원이며 심사 결과에 따라 정해집니다. | MN-LOAN | LN-02-4 | 2025-11 | 2026-09-07 | 1,310 |
| s-8917 | CARD-INST | 3개월 할부하면 얼마 더 내나요 | 3개월 할부는 연 8.9% 요율이 적용됩니다. | MN-CARD | CD-11-2 | 2026-03 | 2026-09-07 | 1,050 |
아래 JSON Schema 를 그대로 만족하는 상담 트레이스 행을 3000개 더 만들어 주세요. 상품 코드는 정책표에 있는 열 가지에서 고르고, 질문은 고객이 실제로 묻는 말투로 짧게 씁니다. 답변은 메뉴얼 조항 문장을 조금 바꿔 쓰되 2할은 문장에서 한 대목을 빼고, 1할은 정책표의 금지 문구를 그대로 넣습니다. cited_clause_id 는 7할을 그 상품 메뉴얼에 실재하는 값으로, 1할은 원장에 아예 없는 번호로, 1할은 번호는 실재하지만 다른 상품 메뉴얼에 속한 값으로, 1할은 null 로 둡니다. cited_doc_version 은 3할을 답변일에 유효하지 않은 지난 판으로 둡니다. answered_at 은 2026-06-01 에서 2026-09-07 사이로 흩고 개정일 당일에 답한 행도 몇 건 넣습니다. latency_ms 는 400에서 4000 사이로 두되 2할은 null 로 비웁니다. 판정 결과나 사유는 넣지 마세요. 그리고 줄 하나가 잘리거나 인코딩이 어긋난 JSONL 을 5건 따로 만들어 읽기 실패가 어떻게 보고되는지 확인하게 합니다.
{"type": "object", "properties": {"session_id": {"type": "string"}, "product_code": {"type": "string"}, "question": {"type": "string"}, "answer_text": {"type": "string"}, "cited_doc_id": {"type": ["string", "null"]}, "cited_clause_id": {"type": ["string", "null"]}, "cited_doc_version": {"type": ["string", "null"]}, "answered_at": {"type": "string"}, "latency_ms": {"type": ["integer", "null"], "minimum": 0}}, "required": ["session_id", "product_code", "question", "answer_text", "cited_doc_id", "cited_clause_id", "cited_doc_version", "answered_at", "latency_ms"]}{"type": "object", "properties": {"session_id": {"type": "string"}, "product_code": {"type": "string"}, "question": {"type": "string"}, "answer_text": {"type": "string"}, "cited_doc_id": {"type": ["string", "null"]}, "cited_clause_id": {"type": ["string", "null"]}, "cited_doc_version": {"type": ["string", "null"]}, "answered_at": {"type": "string"}, "latency_ms": {"type": ["integer", "null"], "minimum": 0}}, "required": ["session_id", "product_code", "question", "answer_text", "cited_doc_id", "cited_clause_id", "cited_doc_version", "answered_at", "latency_ms"]}금융 상품 메뉴얼의 조항 원장입니다. 문서 번호와 조항 번호, 판, 적용 시작일, 다음 판에 닫힌 날, 조항 문장, 상품 코드를 한 줄에 둡니다. 같은 조항이 판을 갈아입으며 숫자와 조건이 달라지므로, 답변일이 어느 판 구간에 드는지 계산해야 인용이 옳은지 갈라집니다. 최신 판은 닫힌 날이 비어 있어 상한이 없는 구간으로 다룹니다. 지원자는 은행과 카드사가 홈페이지에 올려 둔 상품 설명서와 약관 개정 공고에서 조항 문장과 개정 시행일을 옮겨 적고, 같은 조항의 옛 판은 개정 전 게시본에서 가져와 판을 둘 이상 세워 이 표를 만듭니다.
| doc_id | clause_id | doc_version | effective_from | superseded_at | clause_text | product_code |
|---|---|---|---|---|---|---|
| MN-LOAN | LN-07-1 | 2025-11 | 2025-11-01 | 2026-06-01 | 중도상환 수수료는 3년 이내 상환 시 잔액의 0.8%를 받습니다. | LOAN-CREDIT |
| MN-LOAN | LN-07-1 | 2026-06 | 2026-06-01 | — | 중도상환 수수료는 3년 이내 상환 시 잔액의 0.5%를 받습니다. | LOAN-CREDIT |
| MN-LOAN | LN-02-4 | 2025-11 | 2025-11-01 | 2026-06-01 | 신용대출 한도는 연소득과 신용점수로 정해지며 최대 3억원입니다. | LOAN-CREDIT |
| MN-LOAN | LN-02-4 | 2026-06 | 2026-06-01 | — | 신용대출 한도는 연소득과 신용점수로 정해지며 최대 2억원입니다. | LOAN-CREDIT |
| MN-CARD | CD-11-2 | 2026-03 | 2026-03-01 | — | 할부 수수료율은 개월 수에 따라 연 8.9%에서 19.9% 사이입니다. | CARD-INST |
아래 JSON Schema 를 그대로 만족하는 메뉴얼 조항 행을 200개 더 만들어 주세요. 메뉴얼은 대출·카드·예금·외환·펀드·보험·연금 일곱 권으로 두고 조항 번호는 LN-07-1 처럼 권-절-항 꼴로 씁니다. 조항 하나에 판이 둘 이상 있게 만들어 이전 판은 superseded_at 을 다음 판의 effective_from 과 같은 날로 닫고 최신 판만 superseded_at 을 null 로 둡니다. 조항 문장은 금융 안내문 말투로 쓰고 판이 바뀔 때 숫자나 조건이 실제로 달라지게 합니다. 판 사이에 하루 틈이 벌어진 조항도 두 건 넣어 그날 답한 트레이스가 어떻게 다뤄지는지 보게 합니다.
{"type": "object", "properties": {"doc_id": {"type": "string"}, "clause_id": {"type": "string"}, "doc_version": {"type": "string"}, "effective_from": {"type": "string"}, "superseded_at": {"type": ["string", "null"]}, "clause_text": {"type": "string"}, "product_code": {"type": "string"}}, "required": ["doc_id", "clause_id", "doc_version", "effective_from", "superseded_at", "clause_text", "product_code"]}{"type": "object", "properties": {"doc_id": {"type": "string"}, "clause_id": {"type": "string"}, "doc_version": {"type": "string"}, "effective_from": {"type": "string"}, "superseded_at": {"type": ["string", "null"]}, "clause_text": {"type": "string"}, "product_code": {"type": "string"}}, "required": ["doc_id", "clause_id", "doc_version", "effective_from", "superseded_at", "clause_text", "product_code"]}금융사가 상품마다 정해 둔 답변 정책표입니다. 정책 번호와 상품 코드, 반드시 넣어야 할 고지 문구, 쓰면 안 되는 표현, 사람 상담사가 받아야 할 주제를 한 줄에 둡니다. 표현과 주제는 여러 개일 때 세로줄로 이어 적습니다. 지원자는 금융소비자보호법 안내 자료와 각 금융사가 공개한 불완전판매 예방 지침에서 반드시 넣어야 할 고지 문구와 쓰면 안 되는 단정 표현을 뽑아 적고, 사람 상담사가 받아야 할 주제는 민원 접수 안내 페이지의 분류를 그대로 옮겨 이 표를 만듭니다. 메뉴얼에 조항이 없는 상품도 한 줄 두어 정책만 있고 근거가 없는 상황이 나오게 합니다.
| policy_no | product_code | required_phrase | forbidden_phrase | handoff_topic |
|---|---|---|---|---|
| P-01 | LOAN-CREDIT | 심사 결과에 따라 | 무조건 승인|100% 승인 | 채무조정|연체 상환 유예 |
| P-02 | CARD-INST | 할부 수수료가 붙습니다 | 이자 없이|수수료 전혀 | 분실 신고|부정 사용 |
| P-03 | CARD-ANNUAL | 카드 발급일 기준 | 평생 무료 | 명의 도용 |
| P-04 | DEPOSIT-TD | 중도해지 시 약정 이율이 적용되지 않습니다 | 손해가 없습니다 | 상속 예금|후견 개시 |
| P-05 | FX-REMIT | 수취 은행 수수료가 따로 붙을 수 있습니다 | 전액 도착 | 송금 사고|자금세탁 의심 |
아래 JSON Schema 를 그대로 만족하는 답변 정책 행을 30개 더 만들어 주세요. 상품 코드마다 한 줄씩 두고 required_phrase 는 금융사가 반드시 넣으라고 정한 고지 문구를, forbidden_phrase 는 단정 표현을 여러 개 적을 때 세로줄로 잇습니다. handoff_topic 에는 사람 상담사가 받아야 하는 주제를 세로줄로 잇습니다. 메뉴얼 원장에 조항이 하나도 없는 상품 코드도 두세 줄 넣어 정책만 있고 근거가 없는 상황을 만듭니다.
{"type": "object", "properties": {"policy_no": {"type": "string"}, "product_code": {"type": "string"}, "required_phrase": {"type": "string"}, "forbidden_phrase": {"type": "string"}, "handoff_topic": {"type": "string"}}, "required": ["policy_no", "product_code", "required_phrase", "forbidden_phrase", "handoff_topic"]}{"type": "object", "properties": {"policy_no": {"type": "string"}, "product_code": {"type": "string"}, "required_phrase": {"type": "string"}, "forbidden_phrase": {"type": "string"}, "handoff_topic": {"type": "string"}}, "required": ["policy_no", "product_code", "required_phrase", "forbidden_phrase", "handoff_topic"]}| Python | 트레이스와 메뉴얼 원장, 정책표를 맞춰 답변마다 사유를 정하는 판정 엔진과 리포트 출력을 맡습니다. |
| LangGraph | 2주차에 메뉴얼을 찾아 답하는 상담 에이전트를 세워 판정에 넣을 트레이스를 직접 만듭니다. |
| RAG | 그 에이전트가 조항을 찾아 답하는 검색 단계이고, 답변에 붙는 조항 번호와 판이 곧 판정의 입력이 됩니다. |
| Langfuse | 트레이스 내보내기 형식을 입력 규격으로 삼고, 3주차에 판정 결과를 트레이스 점수로 되돌려 붙입니다. |
| Docker | 판정 엔진과 에이전트를 한 이미지로 묶어 고객사 노트북에서도 같은 결과가 나오게 합니다. |
✗ fail → 원장에 없는 조항이 절반을 넘으면 메뉴얼부터 더 담아 채웁니다.
✓ pass → 2주차 에이전트를 직접 세우는 단계로 넘어갑니다.
✗ fail → 어긋난 건을 모아 문구 검사의 띄어쓰기 접는 규칙을 다시 봅니다.
✓ pass → 3주차 새는 자리 묶기로 넘어갑니다.
상담 한 건마다 에이전트 답변이 그 상품 메뉴얼과 맞는지 정합니다. 어긋나면 없는 조항·지난 판·고지 누락·금지 표현·사람에게 넘길 문의 중 어느 쪽인지 싣고, 문구가 걸린 건은 그 문구를, 판이 걸린 건은 답변일에 유효한 판을 함께 냅니다. 리포트는 이 사유별로 절을 나눠 냅니다.
{"type": "object", "properties": {"verdict_no": {"type": "string"}, "session_id": {"type": "string"}, "product_code": {"type": "string"}, "match_verdict": {"type": "string", "enum": ["메뉴얼과 일치", "메뉴얼에 없는 조항", "지난 판 메뉴얼 인용", "필수 안내 누락", "금지 표현 사용", "사람에게 넘겼어야 할 문의"]}, "effective_doc_version": {"type": ["string", "null"], "description": "answered_at 이 effective_from 이상이고 superseded_at 미만인 메뉴얼 판의 doc_version 입니다. 인용한 조항이 원장에 없으면 null 입니다."}, "phrase_hit": {"type": ["string", "null"], "description": "금지 표현 사용이면 답변에서 걸린 문구, 필수 안내 누락이면 답변에 없는 고지 문구, 사람에게 넘겼어야 할 문의면 질문에서 걸린 주제를 적습니다."}, "evidence": {"type": "array", "items": {"type": "object", "properties": {"field": {"type": "string"}, "agg": {"type": ["string", "null"]}, "value": {}}, "required": ["field", "value"]}}, "summary": {"type": "string"}, "hedge": {"type": ["string", "null"]}}, "required": ["verdict_no", "session_id", "product_code", "match_verdict", "evidence", "summary"]}[
{
"verdict_no": "MV-001",
"session_id": "s-8890",
"product_code": "LOAN-CREDIT",
"match_verdict": "메뉴얼과 일치",
"effective_doc_version": "2026-06",
"phrase_hit": null,
"evidence": [
{
"field": "cited_doc_version",
"agg": null,
"value": "2026-06"
},
{
"field": "effective_from",
"agg": null,
"value": "2026-06-01"
}
],
"summary": "답변일에 유효한 판을 인용했고 심사 결과에 따라 달라진다는 고지도 문장에 있습니다.",
"hedge": null
},
{
"verdict_no": "MV-002",
"session_id": "s-8895",
"product_code": "PENSION-IRP",
"match_verdict": "메뉴얼과 일치",
"effective_doc_version": "2026-09",
"phrase_hit": null,
"evidence": [
{
"field": "answered_at",
"agg": null,
"value": "2026-09-01"
},
{
"field": "effective_from",
"agg": null,
"value": "2026-09-01"
}
],
"summary": "새 판이 적용된 첫날에 답한 건인데 인용한 판이 그 새 판이라 어긋난 곳이 없습니다.",
"hedge": "개정 당일은 이전 판이 닫히는 날과 겹치므로 판을 고르는 기준을 시각까지 내려 다시 볼 여지가 있습니다."
},
{
"verdict_no": "MV-003",
"session_id": "s-8841",
"product_code": "LOAN-CREDIT",
"match_verdict": "메뉴얼에 없는 조항",
"effective_doc_version": null,
"phrase_hit": null,
"evidence": [
{
"field": "cited_clause_id",
"agg": null,
"value": "LN-07-3"
},
{
"field": "clause_id",
"agg": null,
"value": "LN-07-1"
}
],
"summary": "인용한 LN-07-3 은 대출 메뉴얼에 없는 번호라 수수료가 없다는 답변을 받쳐 줄 조항이 없습니다.",
"hedge": null
},
{
"verdict_no": "MV-004",
"session_id": "s-8902",
"product_code": "LOAN-CREDIT",
"match_verdict": "지난 판 메뉴얼 인용",
"effective_doc_version": "2026-06",
"phrase_hit": null,
"evidence": [
{
"field": "cited_doc_version",
"agg": null,
"value": "2025-11"
},
{
"field": "superseded_at",
"agg": null,
"value": "2026-06-01"
}
],
"summary": "2025-11 판을 인용했는데 그 판은 2026-06-01 에 닫혔고 답변일에 유효한 판은 한도가 2억원입니다.",
"hedge": null
},
{
"verdict_no": "MV-005",
"session_id": "s-8917",
"product_code": "CARD-INST",
"match_verdict": "필수 안내 누락",
"effective_doc_version": "2026-03",
"phrase_hit": "할부 수수료가 붙습니다",
"evidence": [
{
"field": "required_phrase",
"agg": null,
"value": "할부 수수료가 붙습니다"
},
{
"field": "answer_text",
"agg": null,
"value": "3개월 할부는 연 8.9% 요율이 적용됩니다."
}
],
"summary": "요율은 맞게 말했지만 수수료가 붙는다는 고지가 문장에 없어 고객이 무이자로 읽을 수 있습니다.",
"hedge": null
},
{
"verdict_no": "MV-006",
"session_id": "s-8930",
"product_code": "LOAN-CREDIT",
"match_verdict": "금지 표현 사용",
"effective_doc_version": "2026-06",
"phrase_hit": "무조건 승인",
"evidence": [
{
"field": "forbidden_phrase",
"agg": null,
"value": "무조건 승인|100% 승인"
},
{
"field": "answer_text",
"agg": null,
"value": "무조건 승인됩니다. 심사 결과에 따라 진행됩니다."
}
],
"summary": "뒤에 심사 이야기를 덧붙였어도 앞에서 무조건 승인된다고 말해 금융사가 막아 둔 표현이 그대로 나갔습니다.",
"hedge": null
},
{
"verdict_no": "MV-007",
"session_id": "s-8944",
"product_code": "FUND-EQ",
"match_verdict": "사람에게 넘겼어야 할 문의",
"effective_doc_version": "2026-04",
"phrase_hit": "불완전판매 민원",
"evidence": [
{
"field": "handoff_topic",
"agg": null,
"value": "불완전판매 민원"
},
{
"field": "question",
"agg": null,
"value": "펀드에서 손실이 났는데 불완전판매 민원을 넣고 싶습니다"
}
],
"summary": "민원 접수 의사를 밝힌 질문인데 에이전트가 정상 운용 결과라고 답을 내 상담사로 넘어가지 않았습니다.",
"hedge": null
},
{
"verdict_no": "MV-008",
"session_id": "s-8951",
"product_code": "DEPOSIT-TD",
"match_verdict": "메뉴얼에 없는 조항",
"effective_doc_version": null,
"phrase_hit": null,
"evidence": [
{
"field": "cited_clause_id",
"agg": null,
"value": null
},
{
"field": "latency_ms",
"agg": null,
"value": null
}
],
"summary": "조항 번호 없이 답한 건이라 문장이 맞아 보여도 어느 조항에서 나온 말인지 확인하지 못합니다.",
"hedge": "응답 시간도 안 남아 이 건은 느려서 근거를 못 붙인 것인지 따로 봐야 합니다."
},
{
"verdict_no": "MV-009",
"session_id": "s-8997",
"product_code": "DEPOSIT-TD",
"match_verdict": "메뉴얼에 없는 조항",
"effective_doc_version": null,
"phrase_hit": null,
"evidence": [
{
"field": "cited_doc_id",
"agg": null,
"value": "MN-CARD"
},
{
"field": "cited_clause_id",
"agg": null,
"value": "CD-11-2"
},
{
"field": "product_code",
"agg": null,
"value": "CARD-INST"
}
],
"summary": "인용한 CD-11-2 는 원장에 있는 번호지만 카드 할부 메뉴얼의 조항이라, 정기예금 상담을 받쳐 줄 근거가 못 됩니다.",
"hedge": "조항 번호만 맞춰 보면 실재하는 것으로 통과하는 건이라 상품 코드까지 함께 맞춰 걸러 냈습니다."
}
][자동 검증 · 코드가 판정합니다] 1. match_verdict 가 enum 여섯 값 중 하나인지 확인합니다. 2. verdict_no·session_id·product_code·match_verdict·evidence·summary 가 모두 채워졌는지 확인합니다. 3. session_id 가 트레이스에 실재하는 상담 번호인지 대조하고, product_code 가 그 트레이스 행의 값과 같은지 확인합니다. 4. 정책표에 그 product_code 줄이 있으면 forbidden_phrase 를 세로줄로 나눠 answer_text 에 하나라도 있는지 보고, 있으면 match_verdict 가 금지 표현 사용이고 phrase_hit 이 그 문구인지 확인합니다. 5. handoff_topic 을 세로줄로 나눠 question 에 하나라도 있으면 match_verdict 가 사람에게 넘겼어야 할 문의인지 확인합니다. 6. 조항이 실재하는지는 doc_id·clause_id·product_code 세 값을 함께 맞춰 봅니다. cited_clause_id 가 비었거나, 메뉴얼 원장에서 doc_id 가 cited_doc_id 와 같고 clause_id 가 cited_clause_id 와 같으면서 product_code 까지 그 트레이스 행의 상품과 같은 줄을 못 찾으면 match_verdict 가 메뉴얼에 없는 조항이고 effective_doc_version 이 null 인지 확인합니다. 상품 코드를 빼고 번호만 맞추면 예금 상담이 카드 메뉴얼의 조항 번호를 인용해도 실재하는 조항으로 통과하므로 세 값을 함께 씁니다. 7. effective_doc_version 을 answered_at 이 effective_from 이상이고 superseded_at 미만인 판의 doc_version 으로 다시 계산합니다. superseded_at 이 비어 있으면 상한이 없는 판으로 봅니다. 8. effective_doc_version 이 cited_doc_version 과 다르면 match_verdict 가 지난 판 메뉴얼 인용인지 확인합니다. 9. required_phrase 가 answer_text 에 없으면 match_verdict 가 필수 안내 누락이고 phrase_hit 이 그 고지 문구인지 확인합니다. 10. match_verdict 가 메뉴얼과 일치이면 위 다섯 조건 어디에도 안 걸리는지 다시 확인합니다. 사유가 둘 이상 걸리면 금지 표현 사용·사람에게 넘겼어야 할 문의·메뉴얼에 없는 조항·지난 판 메뉴얼 인용·필수 안내 누락 순으로 앞선 것 하나만 세웁니다. 고객에게 이미 나간 말이 잘못된 쪽을 앞에 두고, 근거를 못 붙인 쪽을 그다음에, 덜 적은 쪽을 마지막에 둡니다. 저축보험 상담처럼 금지 표현과 고지 누락에 함께 걸리는 건은 이 차례에 따라 금지 표현 사용으로 닫힙니다. 11. cited_clause_id 나 latency_ms 가 비어 있으면 그 사실이 hedge 에 적혔는지 확인합니다. 12. evidence 의 field 이름이 트레이스·메뉴얼 원장·정책표에 실재하는 컬럼인지 대조합니다. 13. agg 가 없는 evidence 의 value 가 그 컬럼에 수록된 행 값과 같은지 확인합니다. 14. summary 가 존댓말로 끝나는지 확인합니다. [평가 러너 · 2주차] 직접 세운 상담 에이전트가 남긴 트레이스 3000건에 손으로 매긴 정답 판정을 붙여 대조하고, 사유별 일치율과 어긋난 건의 목록을 냅니다. [수동 검증 · 사람이 봅니다] 1. 걸린 답변을 금융사 준법 담당이 읽고 실제로 고쳐 나가야 할 건인지 정합니다. 2. 정책표의 고지 문구와 넘길 주제는 금융사 상품 담당과 맞춰 갱신합니다.