UnHook
보이스피싱·스미싱 의심 상황을 대화로 파악하고, 피해 단계(링크 클릭 → 정보 노출 → 앱 설치 → 송금)에 맞는 대응 절차를 안내하는 금융사기 대응 AI Agent. URL 검사·발신번호 대조·대응 절차 RAG·신고 접수(HITL) 4개 Tool과 Middleware로 구성한 6인 팀 실습.
주요 기여
6인 팀에서 대응 절차 RAG와 시연 화면을 맡았습니다. 절차 순서는 임베딩 유사도에 맡기지 않고 코드에서 고정했고, 모델이 URL 검사 도구를 자꾸 건너뛰길래 프롬프트를 손보는 대신 tool_choice로 강제 호출하게 바꿨습니다.
6명이 설계서 하나를 기준으로 작업 묶음 6개를 나눠 하루 안에 통합해야 했습니다. 대응 절차 안내는 '지급정지 → 112 → 개인정보노출자 등록'처럼 순서가 곧 내용인데, 임베딩 유사도로 정렬하면 노이즈에 순서가 흔들립니다. 연결해 보니 gpt-5-nano가 URL이 있어도 URL 검사 Tool을 부르지 않는 문제도 있었습니다.
출처가 다른 금감원·KISA·경찰청 원문을 피해 단계별 절차로 검색하되 순서는 코드가 소유하게 하고, 시연 화면에서 Agent 전체(Tool·Middleware·마스킹)가 실제로 도는 것을 보이는 것.
오전에 저장소를 초기화하고 설계서를 마크다운으로 옮기며 정합성을 검토했습니다. 이 과정에서 Tool 2개(피해 상태 갱신, 과거 신고 이력 조회)를 Middleware로 옮기자고 제안해 반영했습니다 — 둘 다 입력 파라미터 없이 코드로 판정 가능한 결정적 작업이라, 모델에게 호출 여부를 맡기면 빠뜨렸을 때 반복 피해 경고가 통째로 누락되기 때문입니다. RAG는 출처별 원문 4개를 절차 단위로 31개 청크로 만들고, 같은 (사기 유형, 피해 단계) 조합에 여러 출처가 공존하도록 설계했습니다(조합당 문서가 1개면 유사도 검색이 dict 조회와 다를 게 없습니다). 최종 순서는 유사도가 아니라 step_order 순서표로 정렬하고, 순서는 JSON 한 곳에서만 관리해 출처 간 충돌을 없앴습니다. 필터는 3단계로 완화(유형+단계 일치 → 단계 일치 → 로컬 폴백)하고, search_playbook()은 임베딩 실패·인덱스 미적재·잘못된 입력 어떤 경우에도 예외를 밖으로 내지 않고 폴백을 돌려줍니다. 테스트 15개는 가짜 임베딩을 주입해 키·네트워크 없이 실행됩니다. Streamlit 시연 화면(680줄)은 채팅 UI, 사이드바 피해 상태, 신고 접수 승인 버튼(HITL — 누른 턴에서만 실행), Tool 호출·결과 뷰로 구성했습니다.
1) 유사도 임계치를 얼마로 둘지, 2) '대응 절차와 신고 기관'이라는 검색 문구가 신고 쪽으로 치우쳐 KISA의 기기 위생 단계(악성앱 삭제·소액결제 차단) 점수를 떨어뜨리는 문제, 3) gpt-5-nano가 프롬프트를 '최종 JSON 전에 반드시 호출'로 강화하고 reasoning_effort를 올려도 URL 검사 Tool을 불안정하게 건너뛰는 문제, 4) 구조화 출력에서 필수 필드가 빠져 검증 단계에서 턴이 실패하는 문제.
임계치는 실측으로 정했습니다 — 필터 통과 청크 최저 0.257·중앙값 0.41이라 0.25로 두고, 관련성은 메타데이터 필터가 가르고 임계치는 깨진 결과를 거르는 안전망이라는 역할 분리를 주석과 설계서에 남겼습니다. 검색 문구는 행동 동사(차단·삭제·확인·신고·지급정지·변경)를 열거하는 문장으로 바꿨습니다. Tool 누락은 wrap_model_call 미들웨어 force_url_check를 추가해, 턴 입력에 URL이 있고 아직 그 턴에 검사 결과가 없으면 첫 모델 호출의 tool_choice를 코드로 강제했습니다. 구조화 출력은 OpenAI strict JSON schema(모든 property required, additionalProperties false)로 막고 출력 토큰 상한을 800 → 4000으로 올렸습니다.
검색과 순서는 다른 문제였습니다. 임베딩은 '무엇이 관련 있나'에는 쓸 만하지만 '무엇이 먼저인가'를 맡기면 안 됩니다. 모델이 Tool을 '부르도록 부탁'하는 것과 '부르게 만드는 것'도 다릅니다 — HelpDesk AI에서 얻은 '프롬프트는 예의를, 코드는 권한을'과 같은 결론에 팀 코드에서 다시 닿았습니다. 6명이 하루에 통합하려면 설계서 한 벌이 먼저여야 했고, 오전에 정합성 검토에 쓴 시간이 오후 통합 비용을 줄였습니다. 하루짜리 팀 실습이며 Guardrail·PII 마스킹·Middleware 코어·Tool·Agent 통합은 팀원들이 담당했습니다.