아키텍처
헥사고날 백엔드, 데이터, 모델 평가
구성
[프론트엔드 Next.js] ── Vercel 배포
| REST
[백엔드 FastAPI] ── 로컬 GPU 머신 + Cloudflare Tunnel
apps/ (컨텍스트) × core/ (헥사고날: adapter/inbound · adapter/outbound)
|
PostgreSQL + pgvector · Neo4j · Redis (로컬 Docker)
(근거: 허브 지식베이스, 팀 저장소 docs/deploy-vercel-cloudflare.md)
기술 구성
| 갈래 | 내용 |
|---|---|
| 백엔드 | FastAPI · SQLAlchemy 2.0 · psycopg 3 · alembic · pydantic-settings · dependency-injector |
| 구조 | 헥사고날 — apps/(컨텍스트) × core/, adapter/inbound · adapter/outbound |
| 공간 연산 | pyproj · shapely (행정동 경계, 좌표 변환) |
| 저장소 | PostgreSQL + pgvector · Neo4j · Redis |
| 프론트 | Next.js |
| 배포 | 프론트 Vercel, 백엔드는 로컬 GPU 머신 + Cloudflare Tunnel, DB 는 로컬 Docker |
백엔드 apps/ 에는 finance(재무 엔진), matching(상품 매칭), product, consultation(상담자료), analysis, intent, rag, indicator, metric, funding, news, rent, shock, store, tobacco, childcare, convenience, dataset, master 컨텍스트가 있습니다. 데이터베이스는 29개 테이블입니다. (근거: 팀 저장소 backend/apps, docs/erd.md)
계산과 AI 의 분담
재무 계산과 비교표는 결정론 코드(finance 컨텍스트의 엔진)가 만들고, LLM 은 계산된 값을 읽어 설명과 상담 질문만 씁니다. 지표가 전부 없는 업종은 AI 를 부르지 않고 「집계되지 않았을 뿐 나쁘다는 뜻이 아니다」라는 문구를 코드가 씁니다. 판정을 생성 모델에 맡기지 않는 쪽입니다. (근거: 허브 지식베이스, docs/proposal-summary.md)
데이터
전부 공공데이터입니다. (근거: 허브 지식베이스)
| 데이터 | 규모 · 비고 |
|---|---|
| RAG 코퍼스 | 3,448건 — 지원공고 1,693 · 뉴스 1,755 |
| 행정동 | 대구 8개 구·군(군위군 제외) 144개 행정동, 경계 142곳 |
| 업종 지표 | 11업종 (인허가 7업종 + 지오코딩으로 추가한 학원·부동산·편의점·어린이집) |
| 주민등록 인구 | 4만 8천 행 |
| 임대료 | 786행 |
| 충격 이벤트 | 29건 |
| 지하철 승차 | 2,632행 |
| 확보하지 못한 것 | 카드 소비·생활인구(DIP 빅데이터활용센터) |
모델 평가
온라인(운영)과 오프라인(장애·한도 초과·네트워크 없는 심사 환경) 두 경로를 모두 평가했습니다. 운영은 Gemini 임베딩·생성이고, 오프라인 후보는 Ollama 의 qwen3-embedding:4b · bge-m3 입니다. 로컬 3종과 외부 6종을 같은 코퍼스 · 같은 질문 · 같은 지표로 돌렸습니다.
| 후보 | 차원 | Top-1 | Recall@5 | MRR | 질문 p50 |
|---|---|---|---|---|---|
| gemini@3072 | 3072 | 0.700 | 0.875 | 0.779 | 394 ms |
| qwen@2560 (로컬) | 2560 | 0.762 | 0.900 | 0.813 | 96 ms |
| gemini@1024 | 1024 | 0.738 | 0.887 | 0.800 | 393 ms |
| bge-m3@1024 (로컬) | 1024 | 0.650 | 0.825 | 0.727 | 118 ms |
로컬 qwen3-embedding:4b@2560 이 Gemini 모든 후보보다 정확했고 질문 임베딩은 4배 빨랐습니다. 다만 이 평가는 팀원 김충식의 담당이고 류준이 잰 값이 아닙니다. 측정 조건은 코퍼스 3,448건, 질문 80건, RTX 5060 Ti 16GB 이며, 질문 80건은 전부 gemma4:12b 가 청크에서 만든 미검수 후보라 사람이 검수한 본지표가 아닙니다. 데이터베이스 컬럼이 1536차원 고정이라 평가는 데이터베이스 밖에서 돌렸습니다. (근거: 허브 지식베이스, 팀 저장소 docs/model-evaluation.md)