TrustIntern: 5.5시간 만에 인턴십 제안 사기 탐지기를 만들고 에이전트들이 증거를 모았습니다
요약
TrustIntern은 인턴십 제안의 사기 여부를 탐지하는 조사 데스크 시스템입니다. 회사 정보, 이메일, 오퍼 레터 등을 입력하면 고정 검사와 Gemma 4 기반 리서치 에이전트 팀을 가동하여 증거를 수집합니다. 이를 통해 '사기 확률' 대신 근거 기반의 '휴리스틱 지표 점수'를 제공하며, 대학이나 플랫폼에 유료 API로 판매할 계획입니다.
핵심 포인트
- Gemma 4 플래너가 에이전트 팀을 결정하여 조사 수행
- 고정 검사와 리서치 에이전트를 결합한 다단계 분석 시스템
- 사기 여부 단정 대신 증거 기반의 '휴리스틱 지표 점수' 제공
- 대학 및 구인 플랫폼에 유료 API 형태로 서비스 확장 가능
[Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle]에 제출하는 글입니다.
제가 만든 것
인도에서는 매번 취업 시즌마다 많은 학생들이 이런 메시지 중 하나를 받습니다. (이것은 제가 작성한 합성 예시이며, 패턴 자체가 실제 내용입니다.)
"축하합니다! 저희 인턴십 프로그램에 선정되셨습니다. 좌석을 확정하려면 ₹1,999 등록비를 납부해 주십시오. 본인 인증을 위해 Aadhaar와 수신된 OTP를 공유해 주세요. 이 혜택은 24시간 동안만 유효합니다."
이 메시지는 한 달 된 웹사이트를 가진 회사에서 온 Gmail 주소로 옵니다. 그리고 이것은 작동합니다. 왜냐하면 첫 경력직 이력을 쌓으려는 학생이야말로 멈춰서 의심해 볼 가능성이 가장 낮은 사람이기 때문입니다.
TrustIntern은 인턴십 제안에 대한 조사 데스크입니다. 회사 이름, 리크루터의 이메일 주소, 웹사이트, 그리고 메시지를 붙여넣으면, 오퍼 레터를 PDF나 스크린샷으로 첨부할 수 있습니다. TrustIntern은 다음을 수행합니다:
- 고정 검사(이메일 도메인 대 회사명 일치 여부, RDAP를 통한 도메인 연식, 웹사이트 자체, 메시지 문구 등)를 실행하고,
- Gemma 4 플래너가 어떤 에이전트를 가동할지 결정하여, 소규모 리서치 에이전트(research agents) 팀을 보내 회사, 리크루터 및 공개된 불만 사항을 조사하게 하며,
- **Gemma 4 비전(vision)**으로 오퍼 레터나 스크린샷을 읽고,
- 수동으로 재계산할 수 있는 위험 점수를 반환합니다. 모든 점수는 특정 증거와 연결되어 있습니다.
모든 보고서에는 "사기 확률이 아닌 휴리스틱 지표 점수(Heuristic indicator score)"라고 명시되어 있습니다. 이 시스템은 증거를 보여줄 뿐, 누구도 사기꾼이라고 단정 짓지 않습니다.
부업 (The side hustle)
누가 이것에 돈을 지불할까요? 학생들은 아닙니다. 그리고 그것이 의도된 바입니다.
- 학생: 무료. 피해를 입는 사람들은 보호 비용을 지불할 필요가 없어야 합니다. 로컬 Gemma를 사용하면 거의 비용이 들지 않습니다.
- 대학 및 취업 지원 부서: 유료. 학생들의 WhatsApp 그룹에서 돌아다니는 채용 공고들을 대량으로 검증하고, 공고별 공유 가능한 보고서를 제공합니다.
- 구인 게시판 및 인턴십 플랫폼: 유료 API. 공고가 실제로 올라오기 전에 목록과 리크루터 계정을 스크리닝합니다.
- 사후 분석 보고서 (Postmortem report): 이미 사기를 당한 사람을 위한 일회성 유료 보고서입니다. 어떤 일이 발생했는지 증거 기반으로 작성된 문서로, 이를 대학, 플랫폼 또는 사이버 범죄 포털에 제출하는 민원과 첨부할 수 있습니다.
마지막 아이디어는 제가 생각한 것이 아닙니다. 첫 번째 테스터에게서 얻은 것입니다 (자세한 내용은 아래에서 다룹니다).
데모
🔗 실시간: https://trustintern.charancodes.com
녹화 영상에서 저는
조사(investigate)를 실행하면, 실시간으로 SSE를 통해 결과가 스트리밍됩니다: 검사기(checkers), 이후 생성된 에이전트들(spawned agents), 그리고 발견 사항(findings).
발견 사항은 숫자로 시작하여 산술 계산을 보여줍니다:
90 = 25 선불 수수료(upfront fee)
+ 20 이메일 도메인 불일치(email domain mismatch)
+ 20 민감 데이터 요청(sensitive data request)
...
각 점수는 해당 문장과 연결됩니다. 아무것도 빼지지 않으며, 총점은 100점으로 제한됩니다.
모든 내용을 PDF로 다운로드하세요:
코드
GitHub logo compteccharan / TrustIntern
TrustIntern은 회사 세부 정보, 채용 담당자, 웹사이트, 커뮤니케이션, 문서 및 디지털 증거를 분석하여 설명 가능한 위험 평가를 생성함으로써 인턴십 및 일자리 기회의 진위성과 사기 위험을 평가하는 AI 기반 플랫폼입니다.
TrustIntern 🕵️
학생들에게 인턴십 제안이 사기인지 아닌지 알려주고, 그 작동 방식을 보여주는 조사 데스크.
TrustIntern은 회사 이름, 채용 담당자 이메일, 웹사이트, 메시지 텍스트, 그리고 오퍼 레터 PDF 또는 스크린샷을 분석합니다. 소규모 연구 에이전트 팀을 운영하고 **설명 가능한 위험 점수(explainable risk score)**를 반환하며, 모든 점수는 특정 증거와 연결됩니다. 보고서는 PDF로 다운로드할 수 있습니다.
확률적 사기 여부가 아닌 휴리스틱 지표 점수입니다.
실시간 데모: https://trustintern.charancodes.com
작동 방식 (How it works)
- **고정 검사기(Fixed checkers)**가 이메일 도메인, 도메인 연령(RDAP), 웹사이트 및 메시지 텍스트를 확인합니다.
- **Gemma 4 계획 수립(plans)**을 통해 어떤 리서치 에이전트를 실행할지 결정합니다: 회사(company), 채용 담당자(recruiter), 불만 사항(complaints), 도메인(domain), 문서(document), 후속 조치(follow-up). 승인된 에이전트 유형만 실행되며, 최대 8개의 에이전트와 깊이 2까지 가능합니다.
- **Gemma 4 비전(vision)**은 제안서(PDF 또는 스크린샷)를 읽고 일관되지 않은 부분을 표시합니다.
- 결정론적 점수 계산(Deterministic scoring)(
backend/app/scoring.py)이 고정된 지표 점수를 합산합니다: 선불 수수료 25점, 도메인 불일치 20점, 민감한 정보 등...
MIT 라이선스입니다. 스코어링 규칙을 포함한 API 계약은 backend/CONTRACT.md에 있습니다.
제작 과정 (How I Built It)
아키텍처 (Architecture)
┌──────────────────────────────────────────┐
Student ─▶ │ 조사 데스크 (Investigation desk) (Vite + React, jsPDF)│
└───────────────┬──────────────────────────┘
...
스택(Stack): FastAPI, Python 에이전트 (requests, BeautifulSoup, pypdf, pypdfium2), Gemma 4, React 18 + Vite, jsPDF, Vercel, GitHub Actions CI.
Gemma 4가 사고를 하고, 규칙이 계산을 한다 (Gemma 4 does the thinking, rules do the math)
Gemma 4는 두 가지 역할을 수행합니다:
- 계획 수립자(Planner). 고정 검사기들이 발견한 내용을 읽고 다음으로 어떤 리서치 에이전트를 실행할지 결정합니다. 채용 담당자의 이름이 나오면, 채용 담당자 에이전트가 이를 추적합니다. 이상한 도메인이 나오면, 도메인 에이전트가 작동합니다. 계획 수립자는
registry.py에 있는 승인 목록(allowlist)에서만 선택할 수 있습니다: _
개인 노트북에서 **Ollama를 통해 gemma4:e2b**를 실행했는데 빨랐습니다. 호스팅된 데모는 제 노트북에 도달할 수 없기 때문에 **Google의 Gemini API를 통해 제공되는 Gemma 4 (gemma-4-26b-a4b-it)**로 대체됩니다. 같은 오픈 웨이트 계열입니다. 만약 어떤 모델도 접근할 수 없다면, 휴리스틱 플래너(heuristic planner)가 작동하여 조사도 완료됩니다.
제가 절대 어기지 않도록 한 규칙은 CONTRACT.md의 '점수 산정 경계 (협상 불가)'에 명시되어 있습니다:
Gemma / OSINT는 지표 포인트를 임의로 만들지 않는다.
gemma_client.py의 문서 문자열(docstring)에는 네 단어로 이렇게 적혀 있습니다: '절대 점수화하지 않는다.' Gemma는 증거를 해석하고, scoring.py가 고정된 포인트를 합산합니다. 라이브 조회 기능을 끄고 의심스러운 샘플을 실행하면 테스트에 의해 고정된 90점을 얻게 됩니다.
제가 계획하지 않았던 방향 전환
제 에이전트에게 실제 Reddit과 LinkedIn 데이터를 대상으로 '실제 테스트 케이스를 실행하고 OSINT AI와 휴리스틱이 유효한지 확인해 달라'고 요청했을 때, 현실이 저항했습니다:
나는 작업을 분담했고("백엔드만 구축하고, 다른 멤버가 프런트엔드를 구축한다"), 에이전트는 이 분할을 계약서로 만들었습니다: "백엔드가 점수를 소유한다.". 그리고 나는 그것을 잠갔습니다: "최종 계획으로 확정하자. 내가 최종 검토를 하고 구축을 시작하자.". 각 워커 에이전트는 대문자로 된 하나의 지침과 함께 계획 파일을 받았습니다: "계획 파일을 수정하지 마십시오." Gemma 워커는 또한 _"잠긴 샘플 점수(suspicious=90 with live_lookups=false)"_를 유지해야 했습니다.
전체 Gemma 멀티모달 멀티-에이전트 OSINT + SSE 계획을 구현하십시오. 수정하지 마십시오.
당신은
전체 Gemma 멀티모달 멀티-에이전트 OSINT + SSE 계획을 구현하십시오. 계획 파일을 수정하지 마십시오.
계획 (진실의 원천): [home].cursor\plans\gemma_multi-agent_osint_fbf50735.plan.md
작업 공간: [home]\Documents\CODEWORKS\trustintern
기존 백엔드는 backend/ (FastAPI, analyze.py, scoring.py, CONTRACT.md)에서 작동합니다. 이를 확장하되 — sync POST /api/investigations 또는 잠긴 샘플 점수(suspicious=90 with live_lookups=false)를 깨지 마십시오.
모든 todo를 완료하고, 진행하면서 TodoWrite merge=true를 통해 업데이트하십시오:
- agent-schema — AgentSpec/AgentEvent, registry, SSE bus
- orchestrator — 고정된 검사기 우선, 플래너 스폰 루프, 최대 8개 에이전트, 깊이 2, ~45초 벽시계 시간
- gemma-planner — google-genai, GEMINI_API_KEY, GEMMA_MODEL=gemma-4-26b-a4b-it, 휴리스틱 폴백, 멀티모달 PDF 페이지 경로
- osint-workers — 회사, 리크루터, 도메인, document_mm, 검색, 안전한 가져오기로 후속 조치
- sse-api — POST /api/investigations/runs + GET .../events SSE; 보고서 + agent_trace 영구 저장; CONTRACT.md 업데이트
- tests — 휴리스틱 스폰, 알 수 없는 agent_type 거부, SSE 시퀀스, suspicious는 여전히 90
계획의 중요 규칙:
- Gemma는 절대 점수 포인트를 할당하지 않습니다 — scoring.py만 합니다
- 플래너로부터 온 알 수 없는 agent_type → 에러 이벤트, 절대 실행 금지
- 레지스트리는 허용 목록(allowlist)만 사용
- 샘플을 위해 sync investigations 엔드포인트를 유지
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기


