
Pakistan Notice Helper 구축하기: 매우 국지적인 안전 문제를 위한 작은 AI 도구
요약
파키스탄의 사기 메시지 문제를 해결하기 위해 Qwen3.5 4B 소형 모델을 활용한 'Pakistan Notice Helper' 구축 사례를 소개합니다. 텍스트와 스크린샷을 분석하여 위험도를 분류하고, 우르두어 지원을 통해 지역 맞춤형 안전 가이드를 제공합니다.
핵심 포인트
- Qwen3.5 4B 모델을 llama.cpp로 구동하여 효율적인 소형 모델 스택 구축
- 단순 진위 확인이 아닌 위험 분류(Triage) 및 안전 단계 안내에 집중
- 영어와 우르두어(RTL 레이아웃 포함)를 지원하는 지역 맞춤형 설계
- Hugging Face Space와 Gradio를 활용한 실용적인 프로토타입 구현
Build Small Hackathon에서 저는 단순한 데모를 넘어 실용적이고, 지역적이며, 유용한 무언가를 만들고 싶었습니다.
그 결과물은 Pakistan Notice Helper입니다. 이는 파키스탄 사람들이 링크를 클릭하거나, 번호로 전화를 걸거나, OTP (One-Time Password)를 공유하거나, 결제를 하기 전에 의심스러운 메시지를 이해할 수 있도록 돕는 안전 중심의 AI 도구입니다.
이 아이디어는 흔한 문제에서 시작되었습니다. 사람들은 은행, 택배, 세무 당국, 교통 경찰, 공공 서비스, 이동 통신사 또는 정부 부처에서 보낸 것처럼 보이는 메시지를 정기적으로 받습니다. 어떤 것은 실제 메시지이지만, 많은 것들은 사기(Scam)입니다. 어려운 점은 항상 메시지를 읽는 것이 아닙니다. 진짜 어려운 점은 그다음에 무엇을 해야 할지 아는 것입니다.
Pakistan Notice Helper는 진위 여부 확인기(Authenticity checker)가 아닙니다. 메시지가 공식적으로 진짜인지 아니면 사기인지 단정 짓지 않습니다. 대신, 이는 분류 도구(Triage tool)로서 작동합니다. 텍스트나 스크린샷을 입력받아 위험 라벨(Risk label), 짧은 설명, 눈에 띄는 위험 신호(Red flags), 그리고 안전한 다음 단계(Safe next steps)를 반환합니다.
이 프로젝트는 파키스탄의 사기성 통지 및 의심스러운 메시지라는 특정 지역 문제에 집중하기 때문에 Backyard AI 트랙에 부합합니다.
저는 거대한 범용 어시스턴트를 만드는 대신, 범위가 명확하고 제품의 동작이 잘 정의되어 있으며 인터페이스가 실제 사용자를 중심으로 설계되었을 때 작은 모델(Small model)이 어디까지 갈 수 있는지 확인하고 싶었습니다.
처음에는 더 큰 Qwen 모델을 테스트했지만, 최종 프로덕션 선택은 llama.cpp를 통한 Qwen3.5 4B Q8이 되었습니다.
이 모델은 저의 10개 사례 평가에서 모든 고위험 사기 사례와 두 가지 스크린샷 사례를 통과했습니다. 이는 소형 모델 기반 안전 어시스턴트로서 실용적인 선택이 되었습니다.
이 프로젝트는 다음을 사용합니다:
Hugging Face Space
→ 커스텀 Gradio 프론트엔드 (frontend)
→ 큐잉된 Gradio 서버 엔드포인트 (queued Gradio Server endpoint)
...
이를 통해 해커톤의 32B 모델 제한을 준수하면서 텍스트와 스크린샷을 모두 처리할 수 있는 소형 모델 스택(Small-model stack)을 구축할 수 있었습니다.
Pakistan Notice Helper는 **영어와 우르두어 (Urdu)**를 모두 지원합니다. 파키스탄의 의심스러운 메시지는 종종 영어, 우르두어, 로만 우르두어 (Roman Urdu), 또는 이 세 가지가 혼합된 형태로 작성되기 때문에, 이는 가장 중요한 제품 결정 중 하나였습니다.
우르두어 모드는 단순히 인터페이스만 번역된 것이 아닙니다. 사용자가 우르두어로 전환하면 앱은 레이아웃을 오른쪽에서 왼쪽으로 읽는 방식(right-to-left)으로 변경하고, 제목, 레이블, 위험 카드, 유효성 검사 메시지, 결과 제어 항목을 번역하며, 모델에게도 명확한 우르두어 스크립트로 평가 내용을 생성하도록 요청합니다.
즉, 사용자는 의심스러운 메시지를 제출하고 위험 레이블, 설명, 레드 플래그 (red flags), 안전한 다음 단계, 그리고 적절한 경우 선택적인 답장 초안을 포함한 전체 안전 응답을 우르두어로 받을 수 있습니다. 지역 맞춤형 안전 도구로서 이는 매우 중요한데, 사람들이 가장 편안하게 사용하는 언어로 작성되었을 때 조언을 더 신뢰하고 실행하기 쉽기 때문입니다.
앱은 다음과 같은 경고 징후를 탐색합니다:
- 긴급한 위협 또는 계정 정지 관련 문구;
- OTP, PIN, 비밀번호, CVV, CNIC 상세 정보 또는 카드 데이터 요청;
- 의심스러운 결제 링크 또는 개인 휴대전화 번호;
- 은행, 통신사, 택배사, 세무 당국 또는 경찰 사칭;
- 선불 수수료를 요구하는 경품, 환불, 일자리 또는 혜택.
그 후 도구는 사용자가 의심스러운 메시지 내의 링크나 전화번호를 사용하는 대신, 독립적으로 찾아낸 공식 채널을 통해 확인하는 것과 같은 더 안전한 다음 단계를 제시합니다.
이 프로젝트를 통해 소형 모델 (small models)로 구축하는 것은 가장 높은 벤치마크 점수를 쫓는 것이 아니라, 품질, 속도, 비용, 그리고 제품 안전성 사이의 적절한 균형을 찾는 일이라는 것을 배웠습니다.
가장 큰 교훈 중 하나는 작업 범위가 신중하게 제한될 때 소형 모델이 놀라울 정도로 잘 작동할 수 있다는 점이었습니다.
Pakistan Notice Helper는 범용 사기 조사관이 될 필요가 없습니다. 눈에 보이는 위험 신호를 식별하고, 과도한 주장을 피하며, 안전한 다음 단계를 제공하면 됩니다. 이로 인해 제품의 범위 (scope), 프롬프트 디자인 (prompt design), 그리고 출력 규약 (output contract)은 모델 자체만큼이나 중요해졌습니다.
이 앱은 다음과 같이 말하도록 설계되었습니다: "이것은 위험해 보입니다. 여기 경고 징후들이 있습니다. 그리고 다음에는 안전하게 무엇을 해야 합니다." 이 앱은 "이것은 확실히 진짜입니다" 또는 "이것은 확실히 가짜입니다"라고 말하도록 설계된 것이 아닙니다.
저는 Qwen3.6 27B로 시작했고, 품질은 매우 뛰어났습니다. 테스트 결과, 의심스러운 메시지를 매우 잘 처리했으며 강력하고 신뢰할 수 있는 설명을 생성했습니다.
문제는 배포 비용과 실용성이었습니다. 이 모델은 훨씬 더 많은 VRAM, 더 큰 GPU 머신, 그리고 콜드 스타트 (cold start) 시 더 긴 복구 시간을 요구했습니다. 불규칙한 트래픽이 발생하는 해커톤 데모용으로는 이상적이지 않았습니다. 작동은 했지만, 제가 만들고자 했던 작고 집중된 도구의 성격에 비해 너무 비싸고 무거웠습니다.
품질 측면에서, 이 작업에 대해 더 큰 모델의 점수를 95/100 정도로 매기겠습니다. 하지만 품질만으로는 충분하지 않았습니다. 비용, 속도, 콜드 스타트 (cold start), 그리고 앱이 응답성을 유지할 수 있는지 여부도 고려해야 했습니다.
그 후, 저는 더 로컬에서 실행 가능하고 서빙 비용 (serving cost)을 줄일 수 있기를 바라며 훨씬 더 작은 시각-언어 모델 (vision-language model)인 MiniCPM-V 4.6 Q8로 전환을 시도했습니다.
그 실험은 잘 되지 않았습니다. GPU에서 매우 느렸고, ZeroGPU를 통해 실행하려고 했을 때 할당량 (quota) 및 실행 시간 (runtime) 문제에 직면했습니다. 인터페이스상에 약 35분의 할당량이 남아 있다고 표시되었음에도 불구하고, 앱은 안정적으로 작동하지 않았습니다. 무엇이 이러한 문제를 일으켰는지 아직 완전히 확신할 수는 없지만, 배포를 불안정하게 만들었습니다.
그 후 저는 다시 되돌아가서 Modal을 통해 모델을 배포했습니다. 배포 자체는 빨랐고 몇 초 이내에 응답을 시작했지만, 모델 품질이 충분히 좋지 않았습니다. 의심스러운 메시지를 탐지하는 데 어려움을 겪었고 너무 많은 테스트 케이스에서 실패했기 때문에 결국 포기해야 했습니다.
그다음 저는 Artificial Analysis의 소형 오픈 소스 모델 순위를 살펴봤고, 이 프로젝트에 가장 적합한 모델을 찾아냈습니다: 바로 Qwen3.5 4B입니다.
이 모델은 '작게 만들기 (Build Small)' 정신을 유지할 수 있을 만큼 충분히 작았고, 앱 경험을 제공하기에 충분히 빨랐으며, 제가 필요로 하는 안전 행동을 수행할 수 있을 만큼 충분히 유능했습니다. Qwen3.6 27B와 비교했을 때, 이 작업에 대해 저는 약 80/100점을 주겠으며, 더 큰 모델은 95/100점에 더 가까웠습니다.
하지만 그 트레이드오프 (tradeoff)는 합리적이었습니다.
4B 모델은 서빙 (serving) 비용이 더 저렴하고, 로딩이 더 빠르며, 배포가 더 쉽고, 더 작은 Modal 머신에서도 실용적이었습니다. 모델 품질, 속도, 비용, 그리고 콜드 스타트 (cold-start) 동작의 이러한 균형은 Pakistan Notice Helper를 위한 '골디락스 (Goldilocks)' 모델로 만들어 주었습니다.
초기 버전 중 일부는 유용한 방식으로 실패하기도 했습니다.
사고 모드 (Thinking mode)가 최종적인 구조화된 JSON을 반환하기 전에 500-토큰 출력 예산을 모두 소비해 버렸기 때문에, 프로덕션 (production) 환경에서는 사고 모드를 비활성화했습니다. 밀도가 높은 로만 우르두어 (Roman Urdu) 스크린샷 하나가 원래의 완료 제한 (completion limit)에 도달했기에, 이제 이미지 요청에는 더 큰 토큰 예산이 할당됩니다.
또 다른 모델 응답은 검증되지 않은 공식적인 형태의 도메인을 제안했습니다. 이는 심각한 제품 문제였기에, 저는 시스템 프롬프트 (system prompt)를 업데이트하여 허구의 URL, 전화번호
이 프로젝트에서는 Qwen3.6 27B가 가장 뛰어난 원시 품질 (raw quality)을 보여주었지만, 제품으로서의 균형 (product balance) 측면에서는 Qwen3.5 4B가 가장 좋았습니다. 모델이 작고, 빠르며, 비용 효율적이었고, 명확하게 정의된 작업(task)을 수행하기에 충분히 훌륭했기 때문입니다.
그러한 트레이드오프 (tradeoff)야말로 이 프로젝트가 'Build Small' 취지에 딱 맞는다고 느끼게 해준 핵심 요소였습니다.
Codex는 프로젝트 전반에 걸쳐 제가 훨씬 더 빠르게 움직일 수 있도록 도왔으며, 특히 이번 프로젝트가 단순한 모델 데모가 아니었기에 그 역할이 더욱 컸습니다. Pakistan Notice Helper는 커스텀 프론트엔드 (frontend), Gradio 백엔드 (backend), Modal에서 호스팅되는 llama.cpp 서버, 스크린샷 지원, 우르두어 (Urdu) 모드, 테스트, 문서화, 그리고 더 안전한 출력 파이프라인 (output pipeline)이 필요했습니다.
전체 코드는 GitHub 저장소 (repository)에서 확인할 수 있습니다.
저는 Codex를 단순한 코드 생성기가 아닌 엔지니어링 협업 도구로 사용했습니다. Codex는 기존 저장소를 검토하고, 변경 사항을 구현하며, 테스트를 실행하고, 문제를 디버깅(debug)하며, 문서를 업데이트하고, Modal, Gradio, llama.cpp 설정이 배포된 시스템과 일치하도록 유지하는 데 도움을 주었습니다.
가장 유용했던 부분 중 하나는 Gradio 서버를 통해 Hugging Face Spaces 호환성을 유지하면서도 커스텀 HTML, CSS, JavaScript 인터페이스를 구축한 것이었습니다. 기본 Gradio 컴포넌트 레이아웃을 사용하는 대신, 이 앱은 백그라운드에서 Gradio의 큐잉된 API 경로 (queued API routes) 및 SSE 프로토콜 (SSE protocol)과 통신하는 제품 스타일의 프론트엔드를 사용합니다.
이를 통해 최종적인 Space는 표준적인 모델 플레이그라운드 (model playground)가 아닌, 실제 지역 안전 도구처럼 느껴지게 되었습니다. Codex는 영어/우르두어 전환, 모바일 레이아웃 수정, 결과 카드, 캐시된 예시, 트레이스 제어 (trace controls), 그리고 배포 흐름을 위한 더 깔끔한 문서화 등 반복적인 UI 개선 작업도 도와주었습니다.
저에게 가장 큰 이점은 반복 주기 (iteration)의 속도였습니다. 원하는 제품 동작을 설명하고, 구현 내용을 검토하고, 테스트한 다음, 프론트엔드, 백엔드, 모델 엔드포인트 (model endpoint), 그리고 안전 제약 조건 (safety constraints)이 조화롭게 작동할 때까지 앱을 계속해서 개선할 수 있었습니다.
또한, 사용자의 개인 콘텐츠를 노출하지 않으면서도 사람들이 앱이 어떻게 사용되고 있는지 이해할 수 있도록 선택적인 공개 트레이스 (public trace) 기능을 추가했습니다.
트레이스 (trace) 옵션은 앱 내부에서 확인할 수 있으며, 각 요청을 보내기 전에 비활성화할 수 있습니다. 활성화 시, 사용자의 전체 메시지나 스크린샷이 아닌 제한된 요청 수준의 메타데이터 (metadata)만 기록합니다. 텍스트는 비식별화 (redacted) 및 제한되며, 이미지는 고정된 요약 (summaries)을 통해 표현되고 저장되지 않습니다.
트레이스에는 원본 스크린샷, 링크, 식별자 (identifiers), 생성된 설명, 답장 초안 (reply drafts), 오류, 자격 증명 (credentials), 그리고 개인적인 세부 정보를 실수로 반복할 수 있는 모든 자유 형식의 모델 출력 (free-form model output)이 제외됩니다.
또한 사람들이 스키마 (schema)를 검토하고 어떤 종류의 메타데이터가 공유되는지 확인할 수 있도록 트레이스 데이터셋 (trace dataset)을 공개했습니다.
데이터셋은 여기에서 확인할 수 있습니다:
이것이 중요한 이유는 민감한 정보가 원본 입력값 외의 곳에서도 유출될 수 있기 때문입니다. 모델의 설명, 답장 초안, 추출된 전화번호, URL 또는 예외 메시지 (exception message)는 원본 메시지가 제거된 상태에서도 개인 정보를 반복할 수 있습니다. 이를 방지하기 위해, 트레이스 시스템은 제한된 카테고리, 불리언 (booleans), 카운트 (counts) 및 고정된 요약만을 게시합니다.
앱은 추론 (inference)을 위해 여전히 라이브 텍스트와 이미지를 비공개 Modal 엔드포인트 (endpoint)로 전송하므로, 이를 익명 로컬 추론 (anonymous local inference)이라고 제시하지는 않습니다. 사용자에게는 민감한 개인 데이터를 제출하지 말라고 경고하며, 각 요청 전에 공개 트레이스 공유를 끌 수 있습니다.
작은 규모의 평가 스위트 (evaluation suite)는 실제 환경의 정확도 추정치는 아니지만, 회귀 테스트 (regression testing)에는 유용했습니다.
최종 평가는 다음과 같습니다:
| 측정 항목 | 결과 |
|---|---|
| 초기 엄격 통과 (Initial strict passes) | 10개 중 9개 |
| ... | |
| 가장 중요한 결과는 점수 그 자체가 아니었습니다. 프롬프트 (prompt), 출력 계약 (output-contract), 그리고 UI 수정 후에 범위가 지정된 4B 모델 (scoped 4B model)이 제가 필요로 하는 안전 동작을 유지할 수 있었다는 점이었습니다. |
다음 주요 기능은 에이전트 방식의 검증 워크플로우 (agentic verification workflow)가 될 것입니다.
현재 Pakistan Notice Helper는 분류 (triage) 단계에서 멈춥니다. 제출된 텍스트나 스크린샷을 읽고, 눈에 보이는 위험 신호를 식별하며, 안전한 다음 단계를 제시합니다. 다음 버전에서는 앱이 한 단계 더 나아가 해당 공고가 원본인지, 복사된 것인지, 아니면 이미 온라인에서 사기로 논의되고 있는 것인지 검증하는 것을 돕기를 원합니다.
해당 워크플로우 (workflow)를 위해, 저는 웹 검색 및 웹 스크래핑 (web scraping)을 위해 Olostep을 사용할 계획입니다. 에이전트 (agent)는 웹을 검색하여 현재의 사기 경고를 찾고, 다른 사람들에 의해 유사한 메시지가 보고되었는지 확인하며, 사칭되고 있는 조직을 식별하고, 해당 주장을 독립적으로 발견된 공식 출처와 비교할 수 있습니다.
또한 저는 이 검증 워크플로우 (workflow)를 관리하기 위해 OpenAI Agents SDK를 사용할 계획입니다. 에이전트 (agent)는 단순히 무작위로 브라우징하지 않을 것입니다. 대신 통제된 프로세스 (process)를 따를 것입니다: 예상되는 조직을 추출하고, 관련 경고를 검색하며, 관련 페이지를 스크래핑 (scrape)하고, 출처의 순위를 매긴 다음, 모델의 평가와 함께 증거를 제시하는 방식입니다.
이 워크플로우 (workflow)에는 엄격한 안전 경계 (safety boundaries)가 필요합니다. 에이전트 (agent)는 의심스러운 메시지 내에 포함된 링크, 전화번호 또는 연락처 정보를 절대로 신뢰해서는 안 됩니다. 오직 독립적으로 발견된 출처만을 사용해야 하며, 증거와 추론 (inference)을 명확하게 분리해야 합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Hugging Face Blog의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기