이 글은 Hacktoberfest 오픈 소스 AI 챌린지 4주차: 기계 속의 유령에 제출하는 글입니다.
배의 구급실에 있는 유령은 진단을 요구하지 않습니다.
그것은 가득 찬 통, 긴 바다 횡단, 그리고 부족했던 일종의 영양분을 기억합니다. 박물관 어딘가에는 그 이야기를 설명할 수 있는 전시물이 있습니다.
당신에게는 등불이 있습니다. 또한 AI 안내원도 가지고 있습니다.
둘 중 어느 것도 증거 없이 무엇이 진실인지 결정할 수는 없습니다.
내가 만든 것
Afterlight는 의료 역사를 다루는 작고 플레이 가능한 박물관입니다. 여섯 개의 방은 기록된 에피소드에서 영감을 받은 가상의 속삭임들을 담고 있습니다. 당신은 하나의 속삭임을 조사하고, 출처가 연결된 증거를 검토하며, 신중한 해석을 선택합니다. 기억을 복원하면 여권에 등불이 켜집니다.
이 박물관은 의학에 관심 있는 방문객과 학습자들을 위한 것이지만, 날짜 목록보다는 이야기를 더 쉽게 기억할 수 있을 것입니다. 이는 임상 도구나 검증된 교육 개입(validated teaching intervention)이 아닌 교육용 프로토타입입니다.
저는 **기계 속의 유령 (Ghost in the Machine)**을 오늘날 우리가 인식하는 의학 안에 남아있는 과거, 즉 버려진 설명들, 놀라운 관찰들, 조용한 협력자들, 그리고 하나의 유명한 초상화에 담을 수 없는 공중 보건 활동으로 해석했습니다.
점프 스케어, 그래픽 시술, 또는 사망한 환자와의 시뮬레이션 대화는 없습니다. 모든 속삭임은 새로 쓰인 허구로 명확하게 표시되어 있습니다. 기록 보관소(archive)가 역사적 주장이 존재하는 곳입니다.
The real Afterlight museum, with six medical-history rooms and a lantern-bearing illustrated ghost
이 방들은 여섯 개의 에피소드와 연결됩니다:
궁극적인 목표는 단순히 이름을 인식하는 것 그 이상입니다. 페니실린 전시는 무언가를 알아차리는 것과 그것을 의약품으로 개발하는 것을 구별하도록 요구합니다. 마지막 전시실은 세계적인 성취를 누가 기억해야 하는지 묻습니다. 기억을 복원하려면 적절한 전시물 및 뒷받침되는 해석이 필요합니다.
데모
Afterlight 진입하기 →
먼저 배의 의무실부터 시도해 보세요:
- 가상의 속삭임을 읽습니다.
- 편집 가능한 일반 언어 단서를 사용하거나, 자신만의 설명으로 대체합니다.
- 로컬 AI로 증거 찾기를 클릭합니다. 처음 사용할 경우 오픈 모델과 런타임(runtime)이 다운로드됩니다.
- 선택하기 전에 제안된 전시물의 큐레이터 메모와 출처를 열람합니다.
- 해석 질문에 답하고 기억을 복원합니다.
모델 로딩이 불가능한 경우, AI 없이 탐색하기를 통해 여섯 개의 전시장 전체가 열립니다. 이 경로는 수동 탐색으로 표시되며, 인터페이스는 추론(inference)이 발생했다고 가장하지 않습니다.
계정은 없습니다. 사용자의 기록(lanterns)은 브라우저에 저장됩니다. 작은 JSON 형식의 여권을 다운로드하여 나중에 가져올 수 있으며, 초기화 시 확인 절차를 거칩니다. 이 여권은 인증된 점수가 아닌 개인적이고 수정 가능한 진행 상황을 나타냅니다. 타이머, 연속 기록 페널티 또는 리더보드가 조용한 박물관을 숙제처럼 만들지 않습니다.
A real Afterlight investigation with local-model steps and source-linked evidence suggestions
코드 (Code)
GitHub: faraz-shamim/afterlight-museum · MIT 애플리케이션 코드
이 저장소에는 6개의 방으로 구성된 아카이브, 검증기(verifier), 여권 유효성 검사, 브라우저 워커, 배포 지침, 테스트, 실제 검색 결과 및 이미지 출처가 포함되어 있습니다. 이 프로젝트는 2026년 10월 27일의 Week 4 챌린지를 위해 시작되었습니다.
제작 과정 (How I Built It)
즉흥적인 것이 아닌, 정보를 검색하는 가이드
Afterlight는 오픈 Xenova/all-MiniLM-L6-v2 모델을 Transformers.js를 통해 사용하며, 브라우저 워커 내부에서 q8 CPU WASM 추론(inference)을 실행합니다.
정확한 버전은 751bff37182d3f1213fa05d7196b954e230abad9입니다. 로더는 토크나이저 에셋과 모델 요청 모두를 이 버전에 고정합니다. ONNX 엔진과 라이선스 공지사항은 애플리케이션과 함께 제공됩니다.
이 모델은 각 전시품의 주제, 제목 및 요약을 임베딩(embed)하고, 방문객의 단서 역시 임베딩합니다. 코사인 유사도(Cosine similarity)가 6개의 전시품 순위를 매깁니다. 이 AI 기반 검색 기능은 방문객이 먼저 정확한 역사적 이름을 알 필요 없이 설명과 에피소드를 연결할 수 있게 합니다.
아카이브 가이드는 자신의 작동 방식을 공개합니다: 무엇이 임베딩되었는지, 임베딩 지속 시간, 모델 버전, 그리고 검증 도구의 제한적인 역할까지입니다. 첫 번째 임베딩 단계에는 로딩 시간이 포함될 수 있습니다. 어떠한 생성형 모델(generative model)도 역사적 사실을 채워 넣지 않으며, 유사도 점수는 절대 전시품이 정확하다는 확률로 제시되지 않습니다.
결국 인간이 소스를 열고 선택합니다.
내 가이드를 속인 유령
저는 여섯 가지 시적인 속삭임(poetic whispers)과 여섯 가지 평이한 의역(plain paraphrases)을 실제 브라우저 모델에 테스트했습니다. 이 **열두 개의 개발용 스모크 프로브(development smoke probes)**를 거친 결과, 예상되는 전시품 순위는 다음과 같습니다:
| 검색 결과 | 횟수 |
|---|
| 첫 번째 | 12개 중 11개 |
| 상위 세 개 이내 | 12개 중 12개 |
이 수치들은 작고, 저자가 만든 여섯 개의 전시품 컬렉션을 설명할 뿐입니다. 이것은 독립적인 홀드아웃(holdout), 일반 검색 벤치마크, 의료 정확도 결과 또는 개선된 학습의 증거가 절대 아닙니다. 모든 질의와 순위는 여기에 기록됩니다.
흥미로운 실패 사례는 마지막 방이었습니다. 그 속삭임은 문을 두드리는 것, 사라진 이야기를 추적하는 것, 그리고 빈 병동에 대한 언급을 포함했습니다. MiniLM은 페니실린을 첫 번째로, 천연두를 세 번째로 배치했습니다.
저는 이 실패 사례를 남겨두었습니다. 모호한 시적인 표현이 평범한 단서보다 더 어려운 검색 문제입니다. 그리고 이 실수는 상호작용의 경계를 눈에 보이게 만듭니다: 제안은 사용자에게 조사하도록 유도해야 하며, 스스로 출처로서의 권위를 조용히 부여해서는 안 됩니다.
관련 없는 단서를 사용했을 때도 모델은 여전히 동일한 여섯 개의 전시품을 순위화합니다. 이곳은 개방형 의료 검색 엔진이 아니라, 한정된 박물관 가이드입니다.
Render는 공적인 출입구이자 제한된 도구
인간의 안내를 받는 검색 워크플로우에는 작은 서버 측 도구가 있습니다:
fictional whisper
→ 로컬 모델이 출처 카드 검색
→ 방문자가 증거 + 해석 선택
...
Render는 프런트 엔드, 압축된 브라우저 추론 에셋(browser inference assets), 그리고 상태 비저장(stateless) /api/verify 엔드포인트를 하나의 Node 웹 서비스에 호스팅합니다. 모델 자체는 방문자의 장치에서 실행됩니다.
이 도구는 정확히 세 가지 필드를 받습니다: 알려진 방 ID, 알려진 전시품 ID, 그리고 제한된 답변 인덱스. 이는 추가 필드, 임의의 ID, 잘못된 JSON 형식, 과도한 페이로드(payload)를 거부합니다. 이 도구는 작성자가 만든 게임 답변을 확인하며; 진단을 검증하거나 새로운 역사적 주장을 확립하지 않습니다. 브라우저 역시 오프라인 폴백(fallback)을 위한 동일한 결정론적 검증기(deterministic verifier)를 가지고 있습니다.
이 배포는 호스팅된 모델 API 키, 데이터베이스 또는 GPU 없이도 공개 데모를 실행할 수 있도록 유지합니다. 검색 텍스트나 임베딩 벡터가 검증 엔드포인트로 전송되지 않습니다.
배포에는 Render의 무료(Free) 컴퓨팅 플랜이 사용됩니다. 무료 호스팅은 콜드 스타트(cold starts)와 공유 사용량 제한이 있으므로, 저는 이를 프로토타입 호스팅으로 간주하며, 운영 시간 보장이나 무제한 무료 트래픽을 약속하지 않습니다.
박물관 전체 관람 경로 검증
본 프로젝트는 로컬 환경과 공개 Render 배포 환경 모두에서 실제 모델 추론(model inference)을 포함하여 18개의 통과하는 단위/API 테스트와 19개의 통과하는 브라우저 체크를 거쳤습니다:
- 총 108개의 방/전시물/답변 조합 중, 의도된 6개 조합만이 방 복원을 수행합니다.
- 잘못된 증거 및 지원되지 않는 해석은 등불 수여를 거부합니다.
- 모든 6가지의 방 여정(room journeys), 실제 검증 요청, 보이는 출처 노트, 그리고 완성된 여권이 포함됩니다.
- 다운로드/가져오기, 유효하지 않은 파일 거부, 새로고침 지속성 유지 및 취소 가능한 초기화 기능입니다.
- 박물관, 아카이브, 여권, 조사 레이아웃은 390px 너비로 설정되었습니다.
- 오프라인 새로고침, 캐시된 실제 모델 추론(cached real-model inference), 로컬 검증기(local verifier)를 사용한 키보드 자동 완성 기능입니다.
- 관찰된 아웃바운드 요청에는 나타나지 않는 합성 개인 마커가 존재하며; 툴 페이로드(tool payloads)는 허용된 필드만 포함합니다.
- 불변 모델 개정(Immutable model-revision) 요청과 처리되지 않은 브라우저 예외가 없습니다.
전체 스위트(suite)는 GitHub Actions에서 리눅스 환경에서도 독립적으로 통과했습니다. 저장소에는 로컬 및 라이브 브라우저 보고서와 검증된 배포 커밋이 포함되어 있습니다.
이는 합성 소프트웨어 테스트입니다. 저는 학생 체험을 실행하거나, 유지율(retention)을 측정했거나, 6개의 소규모 전시물이 의학의 완전한 역사를 구성한다고 주장하지 않았습니다.
[The actual Afterlight passport after all six memories have been restored](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi0symx500fnoywfgyrra.png
개방형 혁신은 왜 중요할까요?
이 박물관에서 유용한 개방성은 실용적입니다. 즉, 가이드가 네트워크 연결이 끊겨도 계속 작동할 수 있다는 것입니다.
앱과 모델이 캐시되면, 테스트된 흐름(tested flow)은 오프라인 재로딩을 견디고 여전히 추론(inference)을 수행합니다. 모델의 가중치(weights), 개정 버전(revision), 그리고 실행 시간(runtime)은 검사할 수 있습니다. 전시 아카이브는 일반적인 소스 파일입니다. 다른 개발자는 폐쇄된 추론 서비스에서 토큰을 구매하지 않고도 요약을 변경하거나, 해석을 추가하거나, 검색기(retriever)를 교체하거나, 진단(diagnostic)을 재실행할 수 있습니다.
또한 방문객의 단서를 애플리케이션 서버에 보관하지 않을 수 있게 해줍니다. 이것은 익명성을 주장하는 것이 아니라 특정 데이터 경계(data boundary)를 의미합니다. 호스트와 모델 제공자는 여전히 일반적인 다운로드/요청 메타데이터를 볼 수 있으며, 외부 소스 링크는 인터넷 연결이 필요합니다. 브라우저 저장소는 삭제될 수 있고, 첫 방문에는 연결이 필요합니다.
아카이브의 소스 레이블은 AI를 사용할 수 없을 때에도 계속 접근 가능합니다. 이것은 주제와도 관련됩니다. 과거를 기억하는 것이 독점적인 대화 엔드포인트(proprietary conversation endpoint)가 계속 존재하는 것에 의존해서는 안 됩니다.
저는 이 분위기가 부드럽기를 바랐습니다. 오래된 설명이 명확해질 때 방은 더 밝아지고, 마지막 공간은 영웅적인 초상화 하나가 아닌 커뮤니티와 협업자들에게 속합니다. 기계는 레이블을 찾는 것을 돕고; 방문객은 그것을 벽에 걸지 여부를 결정합니다.
상(Prize) 부문
Render를 활용한 최우수 사례(Best Use of Render) — 로컬 AI 가이드의 프론트 엔드, 브라우저 런타임 에셋 및 경계가 지정된 증거 검증 도구를 호스팅합니다. 이것이 제가 참가하는 유일한 파트너 부문입니다.
크레딧 및 경계
이것은 새로운 4주차 게임입니다. 이 게임의 방(rooms), 가상의 목소리(fictional voices), 아카이브(archive), 퍼즐 판정(puzzle judgments), 여권(passport), 사용자 인터페이스(UI), 그리고 테스트는 이번 챌린지를 위해 작성되었습니다. 일반적인 고정된 MiniLM 로딩, WASM 패키징/압축 및 Express/서비스 워커 스캐폴딩은 저의 MIT 프로젝트인 RecallSloth와 ReferralGlass에서 각색되었으며, 해당 고지 사항들은 유지되었습니다. 이전 제품들은 재제출되지 않습니다.