당신이 자는 동안, 협업은 계속됩니다.
시차가 큰 글로벌 팀에서 질문 하나에 이틀이 걸리는 문제를 풀어 본 팀입니다. 2026년 8월, 2주 동안 불침번(Bulchimbeon) 을 만들었습니다.
Important
이 조직의 모든 저장소는 2026-08-27 에 아카이브되었습니다. 읽기 전용이며 더 이상 개발되지 않습니다. 소스와 설계 문서는 그대로 보존되어 있고, 로컬에서 띄우는 절차도 여전히 동작합니다.
해외 파트너가 올려둔 프로젝트 문서를 근거로, AI가 한국어 질문에 각자의 언어로 즉답합니다. 다만 아는 척은 하지 않습니다.
모든 답변에 매칭률(근거 충족도, 0~100) 을 계산해 세 갈래로 나눕니다.
| 등급 | 매칭률 | 처리 |
|---|---|---|
| 🟢 즉답 | 80 이상 | 근거 인용과 함께 바로 답합니다 |
| 🟡 확인 대기 | 50~79 | 답을 주되 "담당자 확인 대기" 표시를 붙입니다 |
| 🔴 보류 | 50 미만 | 답하지 않고 담당자에게 넘깁니다 |
확신이 부족하면 지어내는 대신 사람에게 넘기고, 담당자가 확정한 답은 공식 Q&A 로 편입되어 다음 질문에 재사용됩니다. 같은 질문에 두 번 다시 24시간이 걸리지 않게 하는 것이 목표였습니다.
팀이 여러 아이디어를 내놓고 협의한 끝에 송정훈의 제안이 선택되어 시작했습니다.
| 저장소 | 무엇 | 스택 |
|---|---|---|
| bulchimbeon-infra | 👈 여기부터 보세요. 제품 전체 설명과, 백엔드·프론트를 서브모듈로 묶어 한 줄로 띄우는 배포 설정 | Docker Compose · Cloudflare Tunnel |
| bulchimbeon-backend | API 서버와 설계 킷. 검색·답변 파이프라인, 등급 판정, 데이터 모델 | FastAPI · PostgreSQL 18 + pgvector · OpenAI |
| bulchimbeon-frontend | 웹 화면. 질문 대화 · 확인 카드 큐 · 문서함 | React 19 · TypeScript · Tailwind v4 · Vite |
git clone --recurse-submodules https://github.com/LetsMakeTrouble/bulchimbeon-infra.git
cd bulchimbeon-infra
sh scripts/deploy.sh문서와 코드 주석에 "왜 그렇게 정했는지" 를 남기는 데 시간을 썼습니다. 몇 가지만 꼽자면:
- 매칭률은 평균이 아니라
min(S, G)입니다. 문서를 잘 찾아도(S) 답이 그 문서를 벗어났으면(G) 낮게 나와야 하니까요. 접지 비율의 분모는 "생성 시점 원본 문장 수"로 고정합니다 — 프루닝 후 개수를 쓰면 환각이 심할수록 등급이 올라가는 함수가 됩니다. - 임계값은 눈대중이 아니라 실측입니다. 개발 첫날에 캘리브레이션 게이트를 두고 실제 임베딩을 호출해 분포를 재서 정했습니다. 판정 기록은 저장소에 텍스트로 남아 있습니다.
--workers 1은 선택이 아닙니다. SSE 큐가 인메모리이고 스케줄러가 프로세스마다 발화하므로, 워커를 늘리면 에러 없이 조용히 깨집니다. 확장 시점의 정답은 코드 독스트링에 적어 두었습니다.- 할루시네이션은 4겹으로 막습니다. 인용 강제 → 발화 전 보류 → 담당자 검토와 질문자 크로스체크 → 크로스체크 실적으로 임계값 자동 보정. 뚫려도 최악이 "오답을 믿고 재작업"이 아니라 "참고 답변을 재확인"이 되도록 설계했습니다.
정해진 기간 안에 하나의 문제를 끝까지 풀어 보는 프로젝트였고, 답을 냈습니다. 운영을 이어갈 계획이 없는 서비스를 계속 열어 두면 의존성 경고와 만료된 키만 쌓입니다. 대신 왜 그렇게 만들었는지가 읽히는 상태로 얼려 두기로 했습니다.
포크해서 이어가는 것은 자유입니다.
다섯 명이 2주 동안 만들었습니다.
| 이름 | 역할 | |
|---|---|---|
| 👑 | 홍석영 · @Seokyoung-Hong | 팀장 · 설계 · 인프라 |
| ⚙️ | 장태희 · @TaeHee00 | 백엔드 |
| 🖥️ | 이우진 · @dldnwls07 | 프론트엔드 · 디자인 |
| 💡 | 송정훈 · @SongsBy | 최초 아이디어 · 프론트엔드 · 디자인 |
| 🔍 | 정혜원 · @jungjungjungdd-ai | 프론트엔드 · 기획 · 디자인 · QC |
설계
- 기획서 · 비즈니스 룰 · 데이터 모델 · API 계약서 등 설계 문서 9종
- 구현이 마일스톤 단위로 굴러가게 하는 프롬프트 11종
인프라
- 백엔드 · 프론트를 서브모듈로 묶는 배포 저장소 구조
deploy.sh·init-env.sh· compose · Cloudflare Tunnel 앞단
검색 품질 — 구현이 돌기 시작한 뒤 파고든 영역
- 청킹 2차 분할 — 섹션을 문장 3개씩 창으로
- 임베딩을
text-embedding-3-large로 교체 - 문서 언어를 판별해 검색 축을 언어별로 분리
API 서버 본체를 처음부터 끝까지
- M-1 캘리브레이션 게이트 ~ M9 시드, 마일스톤 열한 단계 완주
- 코드 18,400 줄 · 테스트 455개 · 엔드포인트 61개
- 임계값 5종을 실 임베딩 호출로 실측해 확정
"데모에서는 되는데 운영에서 깨지는 것" 셋
- 15건이 몰리면 접수까지 막히던 동시 파이프라인에 상한
- LLM 사용량·비용을 DB 에 적재 — 한도가 재시작을 견딤
- 예약 작업을 벽시계 트리거로 — 재배포 직후에도 돌게
배포 — 클라우드 배포와 리허설
디자인 — 화면 디자인은 프론트엔드 세 사람(이우진 · 송정훈 · 정혜원)이 함께 했습니다
- Figma 하이파이 시안 · 컬러 시스템
- Figma 변수를 Tailwind
@theme으로 1:1 이식
구조
- 업무 규칙을 React 밖으로 —
domain/application/infrastructure계층 분리 - 확인 카드의 액션 판단이 화면마다 복사되지 않게 하기 위해
기능
- 질문자 ↔ 담당자 양방향 대화 (대화/질문 탭 분리)
- 인박스 큐 SSE 재조회
- Notion · GitHub 연동 모달
조용한 실패 잡기
- 문서 조회 실패가 "문서를 선택하세요"로 보이던 것
- 사용량 조회 실패가 무한 로딩으로 오인되던 것
- 중복 전송과 늦은 응답이 겹치던 경합
최초 아이디어 — 불침번은 이 사람의 제안에서 시작했습니다
- 팀이 여러 아이디어를 내놓고 협의한 끝에 선택된 안
디자인 — 화면 디자인은 프론트엔드 세 사람(이우진 · 송정훈 · 정혜원)이 함께 했습니다
- 메인 와이어프레임 생성 — 화면 구조의 출발점
- Figma 하이파이 시안 · 컬러 시스템
Figma 를 실제 화면으로
- 대시보드를 첫 화면으로 교체
- 폴더 카드 호버 · 선택 연동
- 정보 패널을 API 사용량 기반으로 교체
화면 추가
- 공식 Q&A · 교훈 · 지표 세 페이지와 API 어댑터
- 인박스 허브 탭으로 통합
프론트엔드로 합류해, 기획 · 디자인 · QC 쪽으로 역할이 옮겨갔습니다.
기획
- 발표 자료 제작
- 소개 영상 제작
디자인
- 화면 디자인 협업
QC — 만드는 사람은 자기 화면에 익숙해져서 못 보는 것들이 있습니다
- 주 개발자들이 놓친 오류를 잡아냈습니다
- 코드를 짠 사람이 아니어서 볼 수 있던 자리들입니다
화면 디자인 — Figma · 프론트엔드 세 사람(이우진 · 송정훈 · 정혜원)이 만들었습니다. 메인 와이어프레임은 송정훈.