DEVELOPMENT JOURNAL

계약 전 자금 점검을 상담 자료로 잇고, 오프라인 대응 모델을 평가했습니다

2026.09.18localhost:daegu개발 기록

같은 날 오전의 최종 리뷰·역할 분담 이후 이어진 기록입니다.

무엇을 정했나

  • 주 동선을 “계약 전 창업자금 사전상담”으로 바꿨습니다. 지도에서 자리를 고르면 월세·투자비·자기자본으로 필요한 매출과 자금을 계산하고, 조건을 바꿔 비교한 뒤 그 계획을 iM뱅크 상담 자료로 가져가는 흐름입니다. 위험 진단은 보조 링크로 내렸습니다.
  • 코드 프리즈(9월 19일 18:00)를 무시하고 계속 개발하기로 했습니다. 블록체인 앵커링은 범위에서 뺐습니다.
  • 은행 후보는 iM뱅크를 최우선으로 두고, 근거가 확인된 상품만 후보에 올립니다. 원문에 취급 은행이 없는 상품은 “차선 후보”로 따로 보여 줍니다.
  • 배포는 프론트엔드 Vercel, 백엔드 Cloudflare Tunnel, DB는 로컬 Docker로 정했습니다. 초보자용 절차를 docs/deploy-vercel-cloudflare.md에 적었습니다.
  • 외부 API가 끊겨도 응대할 수 있도록 로컬 모델을 평가했습니다. 오프라인 대체는 임베딩 qwen3-embedding:4b(2560차원), 리포트 생성 gemma4:12b입니다. 기본 경로는 여전히 Gemini입니다.

왜 이렇게 했나

  • 계약 뒤에는 조건을 바꾸는 데 비용이 듭니다. 계약 전에 월세와 투자 규모를 바꿔 보는 경험에 집중하고, 결과물은 상담용 자금계획서로 잡았습니다.
  • 금융상품 목록을 보여 주는 것만으로 결정이 끝나지 않습니다. 은행 상담에서 무엇을 물어야 하는지, 아직 확인하지 못한 것이 무엇인지를 코드가 먼저 나열하고 AI는 질문 문장만 씁니다.
  • 온라인과 오프라인 모두에서 서비스가 서야 합니다. 키 한도·비용·네트워크 장애·오프라인 시연 환경에 대비하려면 로컬 모델이 같은 일을 얼마나 비슷하게 해내는지 재 봐야 했습니다. 어느 한쪽만 재지 않고 로컬과 외부 모델을 같은 코퍼스·같은 질문·같은 프롬프트로 전부 돌렸습니다.

누가 무엇을 맡았나

커밋은 작업 편의상 한 계정(SSH)으로 올렸지만, 작업은 역할 분담대로 각자 본인 영역을 했습니다.

영역 담당
DB 스키마 확장·ERD, API 계약, 배포 구조 확정, 제안요약서·시연 대본·참가신청서 장민석
지도 선택 연도 전달, 배포 가이드(백엔드), 오프라인·온라인 모델 평가와 어댑터 김충식
창업자금 사전상담 전환(T1~T7), 계산 가정·미입력 표시, 프론트엔드 동선 류준

이번 기록에서 확인한 것

사전상담 전환(T1~T7). 재무 엔진이 이미 계산하던 운영준비금·총 준비자금·자기자본 외 조달 필요액을 밖으로 꺼냈고, 최초안과 현재안을 서버가 다시 계산해 비교표로 씁니다. 상담 자료는 계획·비교·계산표·정책자금·확인 질문·상권 순서이며 완성된 것만 Markdown으로 내보냅니다. 상담 세션과 계획안은 서버에 기록하고, 자료를 내려받으면 어떤 선택안으로 만든 것인지와 sha256 해시를 남깁니다. 손대지 않은 0원은 “미입력”으로 구분해 확인 목록에 올립니다.

DB 스키마 19 → 29테이블. 금융상품·외부 데이터셋·지표·상담 4개 영역을 추가했고 기존 19테이블의 컬럼은 하나도 바꾸지 않았습니다. 마이그레이션 왕복과 alembic check를 통과했고, 29테이블 ERD 문서를 새로 썼습니다. 고립 테이블 2건(전국 금리 시계열, 정책 공고)은 엣지를 억지로 만들지 않고 검사 테스트로 감시합니다.

금융상품 원문 대조 12/12. 대구신용보증재단 사이트가 중간 인증서를 보내지 않아 접근이 막혔던 문제를 인증서 검증을 끄지 않고 해결했습니다. 최종 분포는 은행 자사 고시 2건, 제3자 공고에 은행명 명시 3건, 미확인 7건입니다. 지역 한정 상품은 사용자 자치구로 걸러 해당 지역에서만 후보로 올립니다.

원문을 확인한 것과 iM뱅크 취급 근거를 찾은 것은 구분합니다. 재단 4건은 취급은행을 “시중은행”·”출연 금융기관”으로만 적어 은행 연결 등급은 미확인입니다. 예비창업자 사전보증(dgsinbo-3)과 청년전용창업자금(youth-2)은 등록 전 신청 가능 조건을 확인했고, 2026 대구시 경영안정자금(youth-3·4)은 보증드림 사전 예약과 사업자등록증·1년분 과세표준증명원 등 서류를 확인했습니다. 서류가 확인되지 않은 후보에는 공식 안내 확인 필요를 표시합니다.

후속 과제. 자치구 5자리 district_code로 달성군 dgsinbo-5·북구 youth-1을 해당 지역 후보에 올렸고, 은행 후보와 차선 후보를 포함한 지역 매칭 결과는 중구 10건·달성군 11건·북구 11건입니다. 기존 /matching은 지역 한정 상품 제외 계약을 유지했습니다. 상담 가정·확인 질문은 replace_notes로 서버 노트를 교체하고, 초안의 session_id로 세션을 갱신해 선택안을 바꿔도 새 세션이 쌓이지 않게 했습니다. 문서 다운로드는 선택 계획안과 해시를 기록하며, 서버 기록 실패가 자료 생성·다운로드를 막지 않습니다.

미입력 금액은 PlanSnapshot.unconfirmed에 남기고, 연도는 분석 요청에서 지표·위험도까지 전달합니다. matching이 product의 DB 어댑터를 직접 가져오던 경로는 입력 포트 주입으로 바꾸고 BC 경계 검사로 고정했습니다. mock handoff의 목적 구분과 review의 서울 잔재도 수정해 대구 실측·검산값을 사용합니다.

제출 준비. 배포를 막던 CORS 고정값을 환경변수로 뺐고, 배포 런북·제안요약서·시연 대본(모든 수치를 엔진으로 재검산)·참가신청서 개정안을 썼습니다.

모델 평가 — 임베딩(코퍼스 3,448건, 질문 80건). 로컬 3종과 Gemini 6종을 전부 돌렸습니다. Top-1 정확도는 qwen@2560 0.762, Gemini 0.700~0.738, bge-m3 0.650이었습니다. 정확도가 비슷해도 로컬과 Gemini가 고르는 문서는 절반가량 다릅니다(상위 5개 겹침 0.45). Gemini의 차원 지정 결과가 3072차원 벡터의 앞부분을 자른 것과 정확히 같다는 점도 확인했습니다.

모델 평가 — 리포트 LLM(후보당 28건). 운영과 같은 시스템 지시·프롬프트·근거를 주고 결정론 게이트(제목 금지, 분량 상한, 프롬프트에 없는 숫자, 인용 제목이 실제 문서인지, 위험 등급을 바꿨을 때 첫 문장의 방향)로 쟀습니다.

후보 게이트 전부 통과 숫자 환각 첫 조각 지연 총 시간
gemini-3.8-flash(운영) 1.000 0 1.68초 2.12초
gemma4:12b 1.000 0 0.46초 2.95초
kanana1.5:8b 0.857 0 0.17초 1.67초
exaone3.5:7.8b 0.536 0 0.11초 1.50초

exaone은 상업 이용이 어려운 라이선스라 운영 후보가 아니고, 한국어 모델의 평가 기준점으로 넣었습니다. GPU를 비운 뒤 임베딩과 LLM을 함께 올리면 gemma4 기준 11.6 GiB로 16 GB 안에 동주합니다. 평가 하네스가 운영 코드를 그대로 돌리다가 지도 선택 연도가 캐시 프록시에서 끊기는 결함을 찾아 고쳤습니다.

테스트(9/19 문서 대조 정정). 원본 작업 로그에서 확인되는 마지막 전체 실행은 후속 과제 6건 완료 시점의 백엔드 472개 통과·1개 건너뜀, 프론트엔드 203개 통과(40파일), 타입 검사·빌드와 실백엔드 깔때기·AI 분석 E2E 통과입니다. 이전에 적었던 491개는 모델 평가 어댑터 추가 후 전체 실행 로그를 확인해야 하는 수치이므로 확정 결과에서 제외했습니다.

남은 문제

  • 배포는 아직 실행 전입니다. 도메인이 가비아 네임서버라 Cloudflare로 옮기는 전파 시간이 필요합니다.
  • 참가서약서·개인정보 동의서는 주최 양식이 필요하고, 시연 영상과 온라인 접수는 시작 전입니다.
  • 대구 빅데이터활용센터 데이터는 여전히 미확보이며 해당 테이블은 비어 있습니다.
  • 재단 4건의 실제 취급은행과 youth-1의 2026년 재공고를 확인해야 합니다. 뉴스 수집의 전 키워드 실패 종료 코드, 일부 테스트의 미추적 원본 파일 의존, API 키 재발급도 이월 항목입니다.
  • 모델 평가셋 80건은 자동 생성한 미검수 상태입니다. 오프라인 전환은 검색 색인 컬럼을 2560차원으로 바꾸고 전량 재색인한 뒤에 가능합니다. 자동 폴백은 설계하지 않았습니다.

다음에 할 일

  1. 도메인 네임서버 이전을 시작하고 Vercel·Cloudflare Tunnel로 배포합니다.
  2. 시연 영상을 녹화하고 9월 20일에 접수합니다.
  3. 마감 뒤 평가셋을 검수하고 오프라인 전환(색인 재구성)을 결정합니다.

전체 근거는 모델 평가 문서와 개발 기록에 있습니다.


맨 위로

053 · DAEGU · 2026