01 / 리포트 해석
gemini-3.8-flash
운영 1차 · 일반 모드2.6% 해석 핵심 오류 3/116 · 적용분 마지막 측정(12단계)
사람 검수에서 틀린 내용 0/20, 질문에 답함 11/12. 응답 p50 4.0초·p93 5.6초. Opus와 오류율 구간이 겹치면서 비용은 약 1/10. 폴백은 claude-opus-5-5 → gemma4:12b.
리포트 해석 결과 보기 →2026-10-04 ~ 10-07 · 운영 기준 백엔드 v0.88.0 · RTX 5060 Ti 16GB 1장 · 외부 API 비교
서비스가 지금 쓰는 모델 세 개와 그 성적입니다. 리포트 해석·의도 관문·RAG 임베딩을 각각 고정된 평가셋과 블라인드 판정, 사람 검수로 확인해 골랐습니다. 위에는 운영 모델이 무엇을 달성했는지를, 아래에는 평가 방법과 경과, 시도했지만 채택하지 않은 후보와 한계를 차례로 적었습니다.
01 / 리포트 해석
2.6% 해석 핵심 오류 3/116 · 적용분 마지막 측정(12단계)
사람 검수에서 틀린 내용 0/20, 질문에 답함 11/12. 응답 p50 4.0초·p93 5.6초. Opus와 오류율 구간이 겹치면서 비용은 약 1/10. 폴백은 claude-opus-5-5 → gemma4:12b.
리포트 해석 결과 보기 →02 / 의도 관문
98.8% 지역·업종 동시 정답 · 지어내기 0/26
같은 날 2.5-flash(95.0%)가 놓친 랜드마크(광장시장·익선동·건대입구)를 행정동으로 맞게 옮겼습니다. 응답 p50 2.5초·p93 4.4초.
의도 관문 결과 보기 →03 / RAG 임베딩
0.940 MRR · Hit@5 0.991
색인·질의를 모델 하나로 처리하고, CPU에서도 질의 p95 149ms에 GPU와 같은 벡터(코사인 0.99998).
임베딩 결과 보기 →| 역할 | 운영 모델 | 실패 시 | 대표 성적 | 확인 방법 |
|---|---|---|---|---|
| 리포트 해석(맨 위 한 단락) | gemini-3.8-flash 일반 모드(사전 추론 끔) | claude-opus-5-5 → 로컬 gemma4:12b | 해석 핵심 오류 3/116(2.6%), 폴백 Opus 2/116, p93 5.6초 | 116건 opus 블라인드 판정 + 사람 검수 4·5차 |
| 의도 관문(규칙이 못 푼 자유문) | gemini-3.8-flash 일반 모드(사전 추론 끔) | 규칙 결과로 응답 | 동시 정답 98.8%, 지어내기 0/26, p93 4.4초 | 사람이 검수한 정답 80건 × 3회 |
| RAG 임베딩 | bge-m3@1024 (Ollama) | — | MRR 0.940(벤치) · 0.930(운영 HNSW) | 사람이 검수한 정답 233문항 |
해석 모델이 쓰는 것은 리포트 맨 위 한 단락입니다. 품질은 그 단락이 본문과 다른 숫자·추세·신호 뜻이나 본문에 없는 사실을 쓰는지(핵심 오류)로 잽니다. 평가셋 150건 중 자료 부족으로 LLM을 부르지 않는 34건을 뺀 116건을 매번 같은 조건으로 돌리고, opus 판정자가 블라인드로 판정했습니다(기준표 v2).
| 지표 | gemini-3.8-flash 일반 | 근거 |
|---|---|---|
| 해석 핵심 오류 | 3/116 (2.6%, 95% 구간 0.9%~7.3%) | 적용분 마지막 측정, 12단계(v0.86.0) |
| 선택 당시 → 개선 후 | 8/116 (6.9%) → 3/116 (2.6%) | 3단계 → 12단계(판정 묶음이 달라 ±3건 변동) |
| 사람 검수 4차 | 틀린 내용 0/20, 질문에 답함 11/12 | 블라인드, 3.8 일반·Opus 비교 |
| 사람 검수 5차 | 기록한 2건 모두 3.8이 더 나은 해석, 틀린 내용 0 | 운영 v0.78.0판 |
| 숫자 금지 규칙 | 가드가 지운 문장 0건(Opus 4건, 2.5-flash 26건) | 3단계 |
| 동 이름 표기 | 동 이름 한글 풀이(“답십리제두동” 등) 11 → 0건 | 7단계(v0.76.1) |
| 응답 시간 | p50 4.00초 · p93 5.61초 [5.04, 6.71] · 최대 12.4초 | 해석 단락 생성 시간, 13단계(v0.87.0) 116호출. p93은 바깥 표본 8개라 ‘참고’, p91 5.42초 [4.94, 6.09]까지 ‘신뢰’ |
| 비용 | 건당 약 $0.0022 (Opus $0.0217) | 사용량 × 공시 단가(10/6 확인) |
| 폴백 Opus | 2/116 (1.7%) | 12단계 |
13단계(v0.87.0)는 적용한 “판정 근거 약함”과 넣지 않은 조기 폐업 가드를 함께 시험해 3.8 5/116이 나왔습니다. 지금 운영판만 따로 잰 값은 아직 없습니다.
| 모델 | 핵심 오류 | 95% 구간 | p95 | 건당 비용 추정 |
|---|---|---|---|---|
| claude-opus-5-5 | 5/116 (4.3%) | 1.9%~9.7% | 8.6초 | $0.0217 |
| gemini-3.8-flash 일반 | 8/116 (6.9%) | 3.5%~13.0% | 5.5초 | $0.0022 |
| gemini-3.8-flash 추론 | 5/116 (4.3%) | 1.9%~9.7% | 12.0초 | $0.0022 + 미기록 추론 토큰 |
| gemini-2.5-flash | 19/115 (16.5%) | 10.8%~24.4% | 4.5초 | $0.0010 |
이 표는 3단계 모델 선택 비교입니다. 오류율 구간이 겹쳐 성능 동등성이 입증된 것은 아니지만, 비용이 약 1/10이고 더 빨라 3.8 일반을 선택했습니다(v0.75.0). 이후 사람 검수 4차(틀린 내용 두 모델 0/20)가 이 결정을 뒷받침했습니다. 비용은 당시 사용량·단가로 추정한 값이며 추론 모드는 하한입니다.
해석을 바꿀 때마다 같은 116건을 다시 쟀습니다. 기본 모델(3.8)의 오류가 늘면 넣지 않는 것이 원칙이고, 예외는 이용조건상 필수인 11단계와 제품 결정인 13단계입니다. 판정자 변동은 약 ±3건입니다.
| 단계 | 적용한 변경 | 3.8 핵심 오류 | 확인된 효과 |
|---|---|---|---|
| 4 | 해석 말투 규칙(v0.76.0) — 중고등학생 눈높이, 전문 용어 풀어 쓰기 | 8 → 4 | 쉬운 말로 써도 사실 오류가 늘지 않음. 사람 검수 의견 반영 |
| 7 | 동 이름은 본문 표기 그대로(v0.76.1) | 4 → 3 | 동 이름 한글 풀이(“답십리제두동” 등) 11 → 0 |
| 8 | 매출 중앙값 비교·시간대 매출 가드·판정 신호 구분(v0.78.0) | 3 → 4 (판정 오차 안) | 겨냥한 오류 3유형 0건, Opus 5 → 1 |
| 11 | 뉴스·상권 축소 신호를 해석 입력에서 제거(v0.83.0) | 4 → 9 | 데이터 이용조건상 필수 변경 |
| 12 | 조건 절에 지역 사건 연결(v0.86.0) | 9 → 3 (판정자 변동이 커 ‘늘지 않음’까지만) | 사건을 언급한 해석 8건(3.8 3·Opus 5) 중 오류 0 |
| 13 | 판정 근거 약함 표시(v0.87.0) | 함께 시험한 가드 포함 3 → 5 | 안정 신호 없는 7개 업종 비추천 방지(제품 결정) |
효과가 난 방식은 코드가 쓰는 사실 문장의 등급 낱말과 코드 가드, 사람 검수로 확인한 말투·표기 변경이었습니다. 윤문 규칙·뜻풀이·사실 문장을 더하거나 입력을 빼는 시도(5·6·9·10단계)는 오류를 늘려 넣지 않았습니다(7-2).
LLM 판정만으로는 질문에 답했는지와 사실 오류를 충분히 구분하기 어려웠습니다. 사람이 읽은 결과가 직접 답 구조·위험 등급 표기·해석 말투를 바꾸는 근거가 됐습니다.
| 날짜 | 대상 | 결과 | 반영 |
|---|---|---|---|
| 9/24 | RAG 평가셋 1차 | 사람이 10건을 X로 뒤집음 → confirmed 30 | 질문만으로 해당 공고가 우선 정답이어야 O라는 기준으로 통일 |
| 9/25 | RAG 평가셋 200건 | confirmed 180 / rejected 20 | 정답 검수 종료 |
| 10/4 | RAG 평가셋 260건 | confirmed 233 / rejected 27 | 질문 22건 교체, 임베딩 평가에 사용 |
| 10/5 | 의도 관문 평가셋 81건 | confirmed 80 / rejected 1 | 종로1.2.3.4가동 정답 정정, 관문 평가에 사용 |
| 차수 | 날짜 | 대상 | 결과 | 반영 |
|---|---|---|---|---|
| 1차 | 10/5 | 20건 × Gemini 2.5·12b | 38칸 중 질문 응답 입력 10칸 모두 못 답함, 판단 어려움 26칸 | 해석 한 단락을 본문과 대조하도록 검수 범위 축소 |
| 2차 | 10/5 | 같은 20건 × 2모델 | 질문 있는 16건 중 답함 4건, Claude 판정은 모두 답함 | 질문 유형별 직접 답·근거를 코드가 작성, 판정 기준표 개정 |
| 3차 | 10/6 | 질문 있는 16건 × 2모델 | 답함 13/16 (81%), 통과선 75% | 못 답함 3건의 백분위 오독을 위험 등급·풀어 쓴 순번으로 수정 |
| 4차 | 10/6 | 20건 × 3.8 일반·Opus, 블라인드 | 틀린 내용 두 모델 0/20, 질문 답함 둘 다 11/12. 더 나은 해석: 비슷함 14·3.8 2·Opus 1·미선택 3 | 3.8 일반 선택을 뒷받침, 친절한 말투 규칙 반영 |
| 5차 | 10/6 | 같은 20건 × 운영 v0.78.0의 두 모델 | 기록한 2건에서 틀린 내용 둘 다 0, 더 나은 해석 둘 다 3.8 | 직접 답·근거 상자만 펼치고 본문을 접은 검수 구성 유지 |
5차의 나머지 18건은 총평만 있어 20건 전체의 오류율로 계산하지 않습니다. 4차의 0/20도 작은 표본의 사람 검수 결과이며, 116건 LLM 판정의 오류가 사라졌다는 뜻은 아닙니다. 다음 검수는 분량을 줄여 끝까지 기록하도록 구성할 필요가 있습니다.
원자료는 구현 저장소의 docs/model-evaluation.md §11~12와 data/eval/results/claude-models-2026-10-06/에 있습니다. 날짜별 구현 기록은 개발 일지에서 확인할 수 있습니다.
규칙이 동을 찾지 못한 자유문(“홍대 근처 미용실”, “광장시장 국밥집”)에서 동·업종·예산을 JSON으로 뽑습니다. 동 이름이 들어간 문장은 규칙이 먼저 처리하므로, LLM의 몫은 주로 랜드마크·상권 이름을 행정동으로 옮기는 일입니다. 평가셋은 사람이 검수한 80건이고, 그중 26건은 동이나 업종을 비워 둬야 정답인 문장(누락·범위 밖)입니다.
| 지표 | gemini-3.8-flash 일반 모드 | 뜻 |
|---|---|---|
| 지역·업종 동시 정답 | 98.8% (79/80) | 동과 업종을 모두 맞힌 비율. 놓친 1건은 오답이 아니라 호출 실패 |
| 지역 / 업종 / 예산 | 98.8% / 98.8% / 98.8% | 칸별 정답률(호출 실패 1건 포함) |
| 지어내기 | 0/26 | 비워야 할 칸(서울 밖 지명·없는 업종·말하지 않은 값)에 값을 채운 경우 |
| 응답 시간 | p50 2.47초 · p93 4.42초 [3.73, 5.01] | 호출 한 번 기준, 240호출 |
| 호출 실패 | 1/240 | 약 9초 만에 끊김(10초 시간 제한 추정). 실패하면 규칙 결과로 응답 |
지어내기가 중요한 이유는 관문이 뽑은 동·업종으로 바로 판정 지도와 리포트를 열기 때문입니다. 모르면 비워 두고 되묻는 것이 안전합니다.
리포트 해석을 3.8로 바꾼 뒤, 관문도 같은 날·같은 조건(80건 × 3회, 같은 지시문·JSON 스키마·온도 0)으로 2.5-flash와 3.8 두 설정을 나란히 쟀습니다.
| 모델 | 동시 정답(1회차) | 놓친 문항 | 지어내기 | p50 | p93 |
|---|---|---|---|---|---|
| gemini-3.8-flash 일반(운영, v0.88.0~) | 98.8% | 호출 실패 1 | 0/26 | 2.47초 | 4.42초 |
| gemini-2.5-flash(10/7 이전 운영) | 95.0% | 익선동 한옥거리·광장시장·건대입구 맛의거리(랜드마크 → 행정동), “헬스장 차리면 망할까요?”(업종) | 0/26 | 1.70초 | 2.37초 |
| gemini-3.8-flash 사전 추론 기본 | 98.8% | 호출 실패 1 | 0/26 | 3.28초 | 5.34초 |
응답 시간 분포와 신뢰도 — 모델마다 240호출. 95% 구간은 같은 문항 3회를 한 묶음으로 4,000번 다시 뽑아(bootstrap) 구했고, “바깥 표본”은 그 값보다 느린 호출을 실제로 센 개수입니다(세 모델 모두 240호출이라 같음). 판정은 구간 폭까지 봅니다. 고정 지연 기준은 두지 않고 구간별 신뢰도로 읽습니다.
| 구간 | 바깥 표본 | 3.8 일반(운영) | 95% 구간 | 판정 | 2.5-flash | 95% 구간 | 판정 | 3.8 사전 추론 기본 | 95% 구간 | 판정 |
|---|---|---|---|---|---|---|---|---|---|---|
| p50 | 120개 | 2.47초 | 2.42~2.57 | 신뢰 | 1.70초 | 1.65~1.74 | 신뢰 | 3.28초 | 3.14~3.40 | 신뢰 |
| p60 | 96개 | 2.62초 | 2.52~2.77 | 신뢰 | 1.74초 | 1.70~1.80 | 신뢰 | 3.50초 | 3.37~3.65 | 신뢰 |
| p70 | 72개 | 2.88초 | 2.72~3.04 | 신뢰 | 1.80초 | 1.75~1.90 | 신뢰 | 3.77초 | 3.62~3.91 | 신뢰 |
| p80 | 48개 | 3.21초 | 3.00~3.38 | 신뢰 | 1.91초 | 1.82~2.12 | 신뢰 | 4.09초 | 3.86~4.42 | 신뢰 |
| p90 | 24개 | 3.90초 | 3.43~4.44 | 신뢰 | 2.21초 | 1.99~2.51 | 신뢰 | 4.93초 | 4.47~5.73 | 신뢰 |
| p91 | 22개 | 4.16초 | 3.48~4.72 | 신뢰 | 2.26초 | 2.04~2.59 | 신뢰 | 5.07초 | 4.54~5.82 | 신뢰 |
| p92 | 20개 | 4.22초 | 3.59~4.88 | 신뢰 | 2.30초 | 2.09~2.68 | 신뢰 | 5.17초 | 4.63~5.99 | 신뢰 |
| p93 | 17개 | 4.42초 | 3.73~5.01 | 신뢰 | 2.37초 | 2.12~2.78 | 신뢰 | 5.34초 | 4.73~6.23 | 신뢰 |
| p94 | 15개 | 4.65초 | 4.07~5.57 | 신뢰 | 2.45초 | 2.16~3.02 | 신뢰 | 5.76초 | 5.00~7.07 | 참고 |
| p95 | 12개 | 4.88초 | 4.19~6.34 | 참고 | 2.57초 | 2.21~3.24 | 신뢰 | 5.85초 | 5.12~7.24 | 참고 |
| p96 | 10개 | 5.01초 | 4.39~6.53 | 참고 | 2.66초 | 2.26~3.29 | 신뢰 | 6.09초 | 5.23~7.79 | 참고 |
| p97 | 8개 | 5.71초 | 4.54~6.60 | 참고 | 2.82초 | 2.31~3.40 | 참고 | 6.78초 | 5.73~8.83 | 참고 |
| p98 | 5개 | 6.42초 | 4.94~8.67 | 참고 | 3.25초 | 2.47~3.45 | 참고 | 7.44초 | 5.88~8.95 | 참고 |
| p99 | 3개 | 7.86초 | 5.53~8.93 | 불안정 | 3.42초 | 2.62~3.66 | 불안정 | 8.74초 | 6.18~9.22 | 불안정 |
| 최대 | — | 9.09초(실패) | 3.77초 | 9.26초(실패) | ||||||
| 3초 초과 | — | 62/240 | 7/240 | 153/240 | ||||||
| 5초 초과 | — | 11/240 | 0/240 | 24/240 | ||||||
| 8초 초과 | — | 3/240 | 0/240 | 5/240 |
품질 차이가 작아 자원과 운영 방식이 선택을 갈랐습니다. 로컬 3조합은 규칙상 동률이며, API 최고 MRR은 0.960이지만 기준선보다 유의하게 좋은 Gemini 조합은 없었습니다.
● 로컬 ◆ API 비교군 · MRR 축 0.90–1.00 확대 · 오른쪽은 질의 p95
벤치와 운영은 구분합니다. 위 MRR은 confirmed 233건·8,891청크·전수 검색 기준입니다. 운영 전환 후에는 8,905건을 재색인했고, HNSW 검색 MRR은 0.930입니다. CPU 동시 부하는 측정하지 않았습니다.
지금 RAG 색인은 지원사업 공고 2,265청크만 담습니다(뉴스는 이용조건에 따라 v0.83.0부터 색인하지 않음). 위 벤치는 뉴스를 포함한 당시 코퍼스 기준이라, 공고만으로 다시 재지는 않았습니다.
| 구분 | 모델 | 차원 | 구성 |
|---|---|---|---|
| 로컬 | bge-m3 | 1024 | Ollama F16, 색인·질의 같은 모델, instruction 없음 |
| 로컬 | qwen3-embedding-4b | 1536, 2560 | 당시 운영 그대로 — 색인 fp16 / 질의 Ollama Q4 + 질의 프롬프트 |
| API | gemini-embedding-001 | 1024, 1536, 2560 | task_type RETRIEVAL_DOCUMENT / RETRIEVAL_QUERY |
| API | gemini-embedding-2 | 1024, 1536, 2560 | task_type을 받지 않아 프롬프트 프리픽스로 대체 |
gemma4:12b와 동시 상주 시 밀려나지 않을 것, 질의 p95 ≤ 500ms.evaluate_rag 수치와 직접 비교하지 않는다.rag_chunk 전량 8891청크(sha256 757b1bbfee5b). 만료 공고를 포함했다.evaluate_rag는 상위 5). 주 지표.| 조합 | 그룹 | 차원 | top-1 | Hit@5 | MRR | nDCG@10 | MRR(hard) | p50 ms | p95 ms | 동시상주 |
|---|---|---|---|---|---|---|---|---|---|---|
| bge-m3@1024 | local | 1024 | 0.897 | 0.991 | 0.940 | 0.889 | 0.880 | 105 | 111 | O |
| qwen3@1536 | local | 1536 | 0.888 | 0.996 | 0.935 | 0.887 | 0.878 | 84 | 89 | O |
| qwen3@2560 | local | 2560 | 0.884 | 1.000 | 0.934 | 0.887 | 0.880 | 84 | 89 | O |
| gemini-001@1024 | api | 1024 | 0.918 | 0.996 | 0.953 | 0.902 | 0.899 | 374 | 426 | - |
| gemini-001@1536 | api | 1536 | 0.923 | 0.996 | 0.957 | 0.904 | 0.905 | 374 | 426 | - |
| gemini-001@2560 | api | 2560 | 0.931 | 0.996 | 0.960 | 0.905 | 0.914 | 374 | 426 | - |
| gemini-2@1024 | api | 1024 | 0.923 | 1.000 | 0.957 | 0.907 | 0.901 | 458 | 574 | - |
| gemini-2@1536 | api | 1536 | 0.927 | 1.000 | 0.959 | 0.909 | 0.910 | 458 | 574 | - |
| gemini-2@2560 | api | 2560 | 0.931 | 1.000 | 0.960 | 0.909 | 0.907 | 458 | 574 | - |
--rpm을 주지 않아 계산하지 않았다.results.json vram_used_mib): bge-m3 8998 MiB, qwen3 13369 MiB.evaluate_rag --provider ollama(MRR@5, HNSW, 만료 공고 제외)는 같은 233건에서 Hit@5 0.991 / MRR 0.930이었다. 벤치 qwen3@1536은 Hit@5 0.996 / MRR 0.935다. 검색 방식·코퍼스가 달라도 같은 범위다(Hit@5 +0.005, MRR +0.005).| 조합 | colloquial (n=20) | news_event (n=18) | sibling (n=16) |
|---|---|---|---|
| bge-m3@1024 | 0.883 | 0.796 | 0.969 |
| qwen3@1536 | 0.950 | 0.745 | 0.938 |
| qwen3@2560 | 0.950 | 0.750 | 0.938 |
| gemini-001@1024 | 0.975 | 0.798 | 0.919 |
| gemini-001@1536 | 0.975 | 0.798 | 0.938 |
| gemini-001@2560 | 0.975 | 0.826 | 0.938 |
| gemini-2@1024 | 0.950 | 0.815 | 0.938 |
| gemini-2@1536 | 0.950 | 0.843 | 0.938 |
| gemini-2@2560 | 0.975 | 0.815 | 0.927 |
Ollama options.num_gpu=0으로 CPU에만 올렸다(ollama ps PROCESSOR 100% CPU 확인). 측정 시 load 0.4.
| 항목 | bge-m3 CPU | bge-m3 GPU | qwen3-4b CPU |
|---|---|---|---|
| 질의 지연 p50 / p95 (233건, bge는 ×3) | 131 / 149ms | 105 / 111ms | 299 / 417ms |
| GPU 캐시 질의 벡터와 코사인 (최소 / 평균) | 0.99998 / 1.00000 | — | 0.98703 / 0.99670 |
상주 메모리 (ollama ps) | 1.2GB (RAM) | 664MB (VRAM) | 4.4GB (RAM) |
| 콜드 로드 | 1.2초 | — | 1.7초 |
| 문서 색인 속도 (32건 배치) | 3.3건/초 (512건 표본) | — | 0.4건/초 (128건 표본) |
| 전체 8,891건 재색인 추정 | 약 45분 | — | 약 5.7시간 |
| 배치 처리량 (질의 32 / 128건 묶음) | 28 / 29건/초 | 140 / 211건/초 | — |
count_tokens 실측). gemini-embedding-2의 프롬프트 프리픽스 토큰은 빠져 있다.| 모델 | 무료 등급 | 유료 표준(100만 토큰당, 텍스트) | 유료 배치 | 1회 전체 색인 비용(표준) |
|---|---|---|---|---|
| gemini-embedding-2 | 무료 | $0.20 | $0.10 | 약 $0.31 (배치 약 $0.15) |
| gemini-embedding-001 | 가격표에 없음 | 가격표에 없음 | 가격표에 없음 | 계산 불가 |
c7a3f1e8d204 — HNSW 인덱스 drop → embedding vector(1024) → 기존 벡터 NULL → 인덱스 재생성. 차원이 달라 전량 재색인이 필수다.rag_chunk_qwen1536_20261004.dump) 뒤 GPU 전량 재색인 8,905건(funding 2,265 + news 6,640), 101초. 전부 embedded_by=bge-m3.기준선보다 유의하게 좋을 때만 교체. MRR 차이 +0.005의 95% 구간은 [−0.018, +0.028].
자원 효율, 색인·질의 모델 통일, CPU 운영 가능성을 고려한 선택.
동률은 성능 동등성이 입증됐다는 뜻이 아닙니다. 유의한 차이를 관측하지 못했다는 선택 규칙입니다. API는 온라인 비교군으로 로컬 채택 판정에서 제외했습니다.
메모리 비교: bge-m3의 664MB는 VRAM, qwen3의 4.4GB는 RAM입니다. 같은 기준의 CPU 상주 메모리는 각각 1.2GB / 4.4GB이며, 664MB와 4.4GB를 GPU 메모리끼리 비교할 수 없습니다.
평가 순서는 research.remakeday.com/experiments/model-selection 과 같습니다. 게이트 먼저, 그다음 품질, 품질이 동률이면 자원(VRAM·지연)이 작은 쪽입니다. 보안 요구가 있으면 온프레미스로만 돌려야 할 수 있습니다.
로컬 후보 6개는 가드 후에도 엄격 게이트를 넘지 못했습니다. LLM이 해석 한 단락만 쓰는 코드 우선 구조로 바꾼 뒤에도 gemma4:12b의 핵심 오류는 35/116(30.2%, 7-2의 2단계 기준)였습니다. 숫자·추세·신호 뜻을 본문과 다르게 옮기는 오류라, 리포트 해석은 외부 API를 기본으로 쓰고 로컬은 폴백으로 둡니다.
RTX 5060 Ti 16GB 한 장에 임베딩과 리포트 모델이 함께 올라가야 합니다. gemma4:12b와 bge-m3의 동시 상주는 9,790 MiB이고, 관문 e4b까지 올리면 14,661 MiB입니다. 이번 평가 범위는 이 장비에서 함께 실행할 수 있는 후보로 한정했습니다. 더 큰 모델이나 미세조정·증류로 품질을 높이는 방법은 검증하지 않았습니다. 27~32B급은 4비트 양자화 파일만으로 16GB를 넘고(파일 크기 기준 추정), 학습은 추론보다 VRAM이 더 필요해 이 장비에서 시도할 수 없었습니다. 온프레미스가 꼭 필요해지면 GPU 증설이나 별도 추론 서버가 먼저입니다.
로컬 3·API 6조합을 같은 233문항으로 비교 → bge-m3@1024 채택(v0.65.0). 품질은 동률, 자원·운영 방식이 갈랐다
"로컬만으로 운영할 수 있나"를 물었다. 당시 구조(LLM이 6개 절을 모두 씀)에서 리포트·관문 로컬 후보 6개 모두 게이트 탈락. gemini-2.5-flash는 비교군
LLM이 틀리는 자리를 코드 가드로 막고 온도 0·seed를 고정(v0.67.0). 일관성은 올랐지만 로컬은 여전히 규칙 위반·지연으로 미달
결론: LLM에 맡기는 범위를 줄인다. 판정·수치·근거는 코드가, LLM은 해석 한 단락만(v0.68.0). 이때부터 재는 대상이 "해석 한 단락의 핵심 오류"로 바뀌어 앞 수치와 직접 비교하지 않는다
1~5차. 판정자와 사람의 차이를 확인하고, 직접 답·위험 등급·말투 규칙이 여기서 나왔다
Claude 3종 → Opus 1차(v0.73.0) → 같은 116건에 Gemini 3.8 추가 → 3.8 일반 1차(v0.75.0)
해석을 바꿀 때마다 116건을 다시 쟀다(4~13단계: 적용 5 · 일부 적용 1 · 미적용 4). 기본 모델 오류가 늘면 넣지 않는다
의도 관문을 같은 날 2.5-flash와 3.8 두 설정으로 나란히 쟀다. 3.8 일반 98.8% 대 2.5 95.0%(2.5가 랜드마크 변환을 놓침), 지어내기 둘 다 0/26 → 3.8 일반 모드로 교체(v0.88.0)
단계마다 무엇을 재는지가 달라졌습니다. 10/5 리포트 품질 점수(10점 만점, 6개 절 전체)와 10/6 이후 핵심 오류율(해석 한 단락)은 다른 검사입니다. 그래서 10/5 리포트 실험(품질·가드·온도 0)은 3.8로 다시 재지 않았습니다 — 그 구조가 운영에 없고, 3.8은 지금 구조에서 116건으로 쟀습니다.
운영 모델을 고르기까지 여러 후보와 개선안을 같은 방식으로 쟀습니다. 채택하지 않은 것도 결정의 근거라 그대로 남깁니다. 7-1은 로컬 LLM, 7-2는 해석 개선 전체 기록, 7-3은 다른 후보 모델입니다.
질문은 “로컬만으로 운영할 수 있나”였습니다. 당시 리포트는 LLM이 사실 묶음을 받아 6개 절(판정·이유·유사 사례·조건·대안·지원사업)을 모두 쓰는 구조였고, 로컬 후보 6개와 비교군 gemini-2.5-flash를 같은 고정 사실 12건 × 3회로 쟀습니다. 기준선 → 코드 가드 → 온도 0 순서로 고쳐 가며 다시 쟀지만 로컬은 끝내 기준을 넘지 못했고, 이 결과가 코드 우선 구조로 바꾸는 근거가 됐습니다. 이 구조는 지금 운영에 없으므로 아래 수치는 결정의 경위로 읽습니다.
리포트는 가드 전 로컬 6개 모두 탈락했습니다. 품질 점수는 gemini-2.5-flash 6.67 / gemma4:12b 6.00 / gemma4:e4b 5.42였지만, 점수만으로 채택할 수 없습니다. 가드 후 게이트별 결과는 아래 ‘코드 가드 적용 후’에 있습니다.
| 역할 | 당시 운영 구성 | 호출 형태 |
|---|---|---|
| 창업 경고 리포트 작성 | gemini-2.5-flash 주, 실패 시 gemma4:12b | 사실 묶음(facts)을 첫 메시지에 넣고 6개 절(판정·이유·유사 사례·조건·대안·지원사업)을 스트리밍. 도구는 자금 계산·RAG 재검색에만 |
| 의도 관문 폴백 | gemini-2.5-flash만 | 규칙이 못 푼 자유문에서 region_name(동 427개 중)·industry_id·budget_krw를 JSON 스키마로 1콜 추출 |
| 모델 | VRAM(MiB, size_vram) | 리포트 | 관문 | 라이선스 | 비고 |
|---|---|---|---|---|---|
| gemma4:12b | 8034 | O | O | Gemma 이용 약관(상업 가능) | 당시 로컬 폴백. 우대 없음 |
| gemma4:e4b | 3158 | O | O | Gemma 이용 약관(상업 가능) | 실제 점유는 보고값보다 크다(아래 동시 상주) |
| kanana1.5:8b-q4km | 8780 | O | O | Apache 2.0(모델 카드 확인) | 한국어 특화 |
| qwen3.5:9b | 6424 | O | O | Apache 2.0 | |
| qwen3.5:4b | 4074 | O | O | Apache 2.0 | |
| qwen3.5:2b-q4_K_M | 1990 | — | O | Apache 2.0 | 관문 전용 |
| exaone3.5:7.8b | 8697 | O(도구 없이) | — | EXAONE AI Model License 1.1 NC(비상업) | 참고 비교군. 채택 불가 |
| gemini-2.5-flash | - | O | O | API | 온라인 비교군. 판정 대상 아님 |
think: false), 입력 고정. 리포트는 num_ctx 32,768로 고정했다.ollama show --license가 아무것도 출력하지 않아 Hugging Face 모델 카드로만 확인했다.size_vram)을 따른다.missing)·범위 밖(out_of_scope)·복합이다. 규칙 엔진을 거치지 않고 추출기를 직접 부른다. 모든 모델에 같은 지시문(동 427개 포함)과 같은 JSON 스키마.data/eval/report_facts/<id>.json으로 저장하고 모든 모델에 같은 것을 넣었다. 데이터 갱신과 무관하게 모델만 비교한다.자동 지표(전 회차)와 블라인드 LLM 판정자(품질·규칙 위반)를 함께 쓴다.
리포트 지표:
관문 지표:
missing·out_of_scope 26건에서 null이어야 할 칸에 값을 만든 비율.게이트:
| 역할 | 게이트 |
|---|---|
| 리포트 | 완주 ≥ 0.95 · 판정 일치 = 1.00 · 지어내기 ≤ 0.05 · 응답 규칙 위반 0건 · 첫 글자 p95 ≤ 5초 · 완료 p95 ≤ 60초 |
| 관문 | 스키마 ≥ 0.98 · 지어내기 ≤ 0.05 · p95 ≤ 3초 |
| 자원 조합 | 리포트 모델 + 관문 모델 + bge-m3를 함께 올려 밀려나지 않을 것(ollama ps + nvidia-smi) |
판정자 기준표(data/eval/report_judge_rubric.md) 요약:
faithfulness(1~5): 사실 묶음에 있는 사실만 쓰는가. 숫자·공고명·URL 지어내기, 예시값을 현재 사실처럼 쓰기, 판정 등급 바꿔 말하기는 크게 감점.fluency(1~5): 한국어가 자연스럽고 섹션 계약(판정 1~2문장, 이유는 신호별 단락 등)을 지키는가.violations: 차별·혐오 표현, 재난기(2020~2022) 폐업률 일반화, 금융 규제(특정 금융사·상품 추천, 대출 권유), 신뢰 등급 표기 규칙 위반.| 모델 | VRAM(MiB) | 품질 | 완주 | 판정 모순 없음 | 판정 등급 생략 | 지어내기 | 규칙 | 첫 글자 p95(ms) | 완료 p95(ms) | 게이트 | 비고 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| gemma4:12b | 8034 | 6.00 | 0.92 | 1.00 | 7/36 | 0.39 | 12 | 8292 | 37056 | X | |
| gemma4:e4b | 3158 | 5.42 | 1.00 | 0.94 | 11/36 | 0.03 | 7 | 11858 | 21010 | X | |
| kanana1.5:8b-q4km | 8780 | 3.75 | 1.00 | 0.94 | 2/36 | 0.47 | 19 | 4277 | 31013 | X | |
| qwen3.5:9b | 6424 | 4.67 | 0.78 | 0.69 | 2/36 | 0.17 | 14 | 5417 | 17224 | X | |
| qwen3.5:4b | 4074 | 4.50 | 0.94 | 0.58 | 5/36 | 0.08 | 13 | 3671 | 10889 | X | |
| exaone3.5:7.8b | 8697 | 3.50 | 1.00 | 0.89 | 1/36 | 0.19 | 21 | 4541 | 31035 | X | 도구 없음(참고 비교군, 라이선스 NC) |
| gemini-2.5-flash | - | 6.67 | 1.00 | 1.00 | 18/36 | 0.03 | 11 | 1537 | 14244 | X | 온라인 비교군 |
게이트 탈락 사유:
| 모델 | 탈락 게이트 |
|---|---|
| gemma4:12b | completion, fabrication, rules, latency |
| gemma4:e4b | verdict_match, rules, latency |
| kanana1.5:8b-q4km | verdict_match, fabrication, rules |
| qwen3.5:9b | completion, verdict_match, fabrication, rules, latency |
| qwen3.5:4b | completion, verdict_match, fabrication, rules |
| exaone3.5:7.8b | verdict_match, fabrication, rules |
| gemini-2.5-flash | 온라인 비교군(판정 대상 아님). 규칙 게이트 미달 |
200124107, 000000000124844).| 모델 | VRAM(MiB) | 동시 정답 | 지역 | 업종 | 예산 | 스키마 | 지어내기 | 지어내기(null 칸 전체, 참고) | p95(ms) | 게이트 |
|---|---|---|---|---|---|---|---|---|---|---|
| gemma4:12b | 8034 | 0.887 | 0.887 | 0.988 | 0.950 | 1.000 | 0.077 | 0.039 | 1300 | X |
| gemma4:e4b | 3158 | 0.762 | 0.787 | 0.975 | 0.762 | 1.000 | 0.308 | 0.157 | 754 | X |
| kanana1.5:8b-q4km | 8780 | 0.487 | 0.550 | 0.900 | 0.350 | 1.000 | 0.654 | 0.569 | 606 | X |
| qwen3.5:9b | 6424 | 0.625 | 0.675 | 0.875 | 0.675 | 1.000 | 0.192 | 0.098 | 957 | X |
| qwen3.5:4b | 4074 | 0.650 | 0.738 | 0.887 | 0.762 | 1.000 | 0.308 | 0.157 | 704 | X |
| qwen3.5:2b-q4_K_M | 1990 | 0.013 | 0.075 | 0.163 | 0.613 | 1.000 | 0.577 | 0.294 | 434 | X |
| gemini-2.5-flash | - | 0.988 | 0.988 | 1.000 | 0.950 | 1.000 | 0.000 | 0.000 | 2637 | O |
엄격 게이트를 통과한 로컬 리포트 모델이 없어 참고용이다. 참고 1위(동률 시 VRAM 작은 쪽)는 gemma4:e4b, 동률 {gemma4:12b, gemma4:e4b}.
| 순위 | 모델 | 품질 | 1위 대비 차이 [95% 구간] | VRAM(MiB) | 게이트 탈락 |
|---|---|---|---|---|---|
| 1 | gemma4:12b | 6.00 | - | 8034 | completion, fabrication, rules, latency |
| 2 | gemma4:e4b | 5.42 | +0.58 [-0.17, +1.25] | 3158 | verdict_match, rules, latency |
| 3 | qwen3.5:9b | 4.67 | +1.33 [+0.58, +2.08] | 6424 | completion, verdict_match, fabrication, rules, latency |
| 4 | qwen3.5:4b | 4.50 | +1.50 [+0.50, +2.42] | 4074 | completion, verdict_match, fabrication, rules |
| 5 | kanana1.5:8b-q4km | 3.75 | +2.25 [+1.50, +3.00] | 8780 | verdict_match, fabrication, rules |
| 6 | exaone3.5:7.8b | 3.50 | +2.50 [+1.83, +3.17] | 8697 | verdict_match, fabrication, rules |
| 모델 | 신뢰 등급 표기 | 금융 | 재난기 | 차별 | 기타 |
|---|---|---|---|---|---|
| gemma4:12b | 10 | 0 | 0 | 0 | 2 |
| gemma4:e4b | 6 | 0 | 0 | 0 | 1 |
| kanana1.5:8b-q4km | 12 | 4 | 1 | 0 | 2 |
| qwen3.5:9b | 11 | 0 | 0 | 0 | 3 |
| qwen3.5:4b | 9 | 2 | 0 | 0 | 2 |
| exaone3.5:7.8b | 11 | 6 | 0 | 0 | 4 |
| gemini-2.5-flash | 8 | 3 | 0 | 0 | 0 |
백엔드가 리포트 모델·관문 모델·bge-m3를 함께 올리는 경우의 GPU 사용량(nvidia-smi)이다. /api/ps의 size_vram이 size와 같을 때(CPU 오프로드 없음)만 통과로 셌다.
| 조합 | 합계(MiB) | ok |
|---|---|---|
| gemma4:e4b(리포트) + gemma4:12b(관문) + bge-m3 | 14,661 | O |
| gemma4:12b 단독(리포트·관문 겸용) + bge-m3 | 9,790 | O |
/api/ps 기준 e4b는 3,158 MiB지만 두 조합의 nvidia-smi 차이는 4,871 MiB다. 실제 점유가 보고값보다 크다. 16GB 카드에서 첫 조합의 여유는 약 1.6GB다.로컬로 간다면 받아들여야 할 트레이드오프(notes 원문 요약):
| 구성 | 장점 | 대가 |
|---|---|---|
| gemma4:12b로 리포트·관문 모두 | 모델 하나라 단순. bge-m3까지 9,790 MiB | 리포트 지어내기 0.39(공고 번호·URL 훼손), 완주 0.92, 첫 글자 p95 8.3초(게이트 5초) |
| gemma4:e4b 리포트 + 12b 관문 | e4b 리포트는 지어내기 0.03, 완주 1.00 | 판정 모순 2/36, 등급 생략 11/36. 실제 GPU 약 4.9GB 추가, 여유 약 1.6GB |
insufficient, 빨간불, “판정을 내리지 않습니다”)을 놓쳐 Gemini가 0.22로 왜곡됐다. “다른 등급을 단정하지 않음”으로 다시 정의하고 동의어를 넓혔다. 생략 회차는 판정 등급 생략 열에 따로 적는다.missing·out_of_scope 26건으로 다시 세면 0.077이고 로컬 관문 승자는 없다. 두 값을 모두 표에 실었다.format은 Gemini 스키마의 nullable을 무시한다(문자열 “null”이 관측됨). Ollama용 스키마는 type 합집합([“string”,”null”])을 쓴다.가드 후에도 로컬 리포트 단독 운영 기준을 만족하는 모델은 없었습니다. 12b는 지어내기가 줄었지만 규칙 위반·첫 글자 지연이 남았고, e4b는 지어내기도 기준을 넘었습니다.
| 모델 | 완주 ≥ 0.95 | 모순 없음 = 1.00 | 지어내기 ≤ 0.05 | 규칙 위반 0건 | 첫 글자 p95 ≤ 5초 | 완료 p95 ≤ 60초 |
|---|---|---|---|---|---|---|
| gemma4:12b | ✓ 통과1.00 | ✓ 통과1.00 | ✓ 통과0.00 | ✕ 미달12건 | ✕ 미달9.606초 | ✓ 통과25.162초 |
| gemma4:e4b | ✓ 통과1.00 | ✓ 통과1.00 | ✕ 미달0.06 | ✕ 미달12건 | ✕ 미달12.694초 | ✓ 통과20.031초 |
| kanana1.5:8b-q4km | ✕ 미달0.61 | ✕ 미달0.47 | ✕ 미달0.64 | ✕ 미달27건 | ✕ 미달7.446초 | ✓ 통과28.639초 |
| qwen3.5:9b | ✕ 미달0.69 | ✕ 미달0.64 | ✕ 미달0.11 | ✕ 미달15건 | ✕ 미달6.761초 | ✓ 통과16.396초 |
| qwen3.5:4b | ✕ 미달0.61 | ✕ 미달0.53 | ✕ 미달0.14 | ✕ 미달19건 | ✓ 통과4.465초 | ✓ 통과12.503초 |
| exaone3.5:7.8b비상업 라이선스 · 채택 불가 | ✕ 미달0.78 | ✕ 미달0.78 | ✕ 미달0.11 | ✕ 미달19건 | ✕ 미달25.558초 | ✓ 통과44.109초 |
| gemini-2.5-flash온라인 비교군 · 판정 대상 제외 | ✕ 미달0.94 | ✓ 통과1.00 | ✕ 미달0.06 | ✕ 미달4건 | ✓ 통과2.114초 | ✓ 통과9.402초 |
gemini-2.5-flash는 온라인 비교군입니다. 위 표의 셀은 같은 기준과 비교한 값이며, 로컬 채택 판정 대상에는 포함하지 않습니다. 가드 후 gemini-2.5-flash도 완주·지어내기·규칙 위반 기준에 미달했습니다.
○ 가드 전 ● 가드 후 · 축 0–1
해석: 지어내기 0.39 → 0.00은 프롬프트에서 링크를 빼자 모델이 링크를 쓰지 않은 결과입니다(링크 제거 개입 0회). 규칙 위반은 12건 → 12건으로 남았습니다.
비교 조건: 가드 후 첫 글자 지연은 판정 절 버퍼링을 포함하므로 가드 전과 직접 비교하지 않습니다. 전후 품질은 판정 세션이 달라 ±0.5 안쪽 차이를 판정자 잡음과 구분할 수 없습니다.
당시(옛 구조) 남은 문제는 대안 등급 바꿔 쓰기, 뉴스가 없을 때 문장 지어내기, 꺼진 신호 오독, 예시 금리 옮기기, 추측에도 붙는 기본 신뢰 태그였습니다. 이 가운데 대안 등급·신뢰 태그는 v0.68.0부터 코드가 쓰고, 예시 금리는 v0.67.0에서 지웠으며, 뉴스는 v0.83.0부터 해석 입력에서 빠졌습니다.
화면이 이미 카드로 보여 주는 값(판정 등급·지원사업 원문 링크)을 LLM이 글로 옮기다 틀리는 실패가 많았다. 이것을 코드로 막고 같은 조건(고정 facts 12건, 7개 모델 × 3회, 같은 기준표, 같은 판정 모델)으로 다시 쟀다. 관문은 다시 돌리지 않았다(기준선 캐시 그대로).
[확인된 사실]을 붙인다(유사 사례 절 제외).| 모델 | 품질 전→후 | 완주 | 판정 모순 없음 | 지어내기 | 판정자 규칙 위반 | 첫 글자 p95(ms)* |
|---|---|---|---|---|---|---|
| gemini-2.5-flash | 6.67 → 6.75 | 1.00 → 0.94 | 1.00 → 1.00 | 0.03 → 0.06 | 11 → 4 | 1,537 → 2,114 |
| gemma4:12b | 6.00 → 5.83 | 0.92 → 1.00 | 1.00 → 1.00 | 0.39 → 0.00 | 12 → 12 | 8,292 → 9,606 |
| gemma4:e4b | 5.42 → 5.58 | 1.00 → 1.00 | 0.94 → 1.00 | 0.03 → 0.06 | 7 → 12 | 11,858 → 12,694 |
| qwen3.5:9b | 4.67 → 4.92 | 0.78 → 0.69 | 0.69 → 0.64 | 0.17 → 0.11 | 14 → 15 | 5,417 → 6,761 |
| qwen3.5:4b | 4.50 → 3.92 | 0.94 → 0.61 | 0.58 → 0.53 | 0.08 → 0.14 | 13 → 19 | 3,671 → 4,465 |
| kanana1.5:8b-q4km | 3.75 → 3.25 | 1.00 → 0.61 | 0.94 → 0.47 | 0.47 → 0.64 | 19 → 27 | 4,277 → 7,446 |
| exaone3.5:7.8b | 3.50 → 3.67 | 1.00 → 0.78 | 0.89 → 0.78 | 0.19 → 0.11 | 21 → 19 | 4,541 → 25,558 |
* 가드 후 첫 글자는 판정 절 전체를 모으는 시간을 포함한다. 기준선과 의미가 다르다.
가드 후 전체 표(나머지 열 포함):
| 모델 | VRAM(MiB) | 품질 | 완주 | 판정 모순 없음 | 판정 등급 생략 | 지어내기 | 규칙 | 첫 글자 p95(ms) | 완료 p95(ms) | 게이트 | 탈락 게이트 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| gemma4:12b | 8034 | 5.83 | 1.00 | 1.00 | 36/36 | 0.00 | 12 | 9606 | 25162 | X | rules, latency |
| gemma4:e4b | 3158 | 5.58 | 1.00 | 1.00 | 35/36 | 0.06 | 12 | 12694 | 20031 | X | fabrication, rules, latency |
| kanana1.5:8b-q4km | 8780 | 3.25 | 0.61 | 0.47 | 2/36 | 0.64 | 27 | 7446 | 28639 | X | completion, verdict_match, fabrication, rules, latency |
| qwen3.5:9b | 6424 | 4.92 | 0.69 | 0.64 | 6/36 | 0.11 | 15 | 6761 | 16396 | X | completion, verdict_match, fabrication, rules, latency |
| qwen3.5:4b | 4074 | 3.92 | 0.61 | 0.53 | 6/36 | 0.14 | 19 | 4465 | 12503 | X | completion, verdict_match, fabrication, rules |
| exaone3.5:7.8b | 8697 | 3.67 | 0.78 | 0.78 | 3/36 | 0.11 | 19 | 25558 | 44109 | X | completion, verdict_match, fabrication, rules, latency |
| gemini-2.5-flash | - | 6.75 | 0.94 | 1.00 | 27/36 | 0.06 | 4 | 2114 | 9402 | X | 온라인 비교군 |
| 모델 | 판정 교체 | 링크 제거 | 태그 추가 | 고지문 | 원문 판정 모순 없음 | 원문 지어내기 |
|---|---|---|---|---|---|---|
| gemma4:12b | 0 | 0 | 180 | 36 | 1.00 | 0.00 |
| gemma4:e4b | 0 | 0 | 180 | 36 | 1.00 | 0.06 |
| kanana1.5:8b-q4km | 14 | 5 | 180 | 36 | 0.50 | 0.64 |
| qwen3.5:9b | 10 | 1 | 178 | 34 | 0.64 | 0.11 |
| qwen3.5:4b | 13 | 0 | 179 | 35 | 0.53 | 0.14 |
| exaone3.5:7.8b | 7 | 40 | 175 | 35 | 0.78 | 0.11 |
| gemini-2.5-flash | 0 | 0 | 174 | 36 | 1.00 | 0.06 |
판정자 위반 유형(가드 후):
| 모델 | 신뢰 등급 표기 | 금융 | 재난기 | 차별 | 기타 |
|---|---|---|---|---|---|
| gemma4:12b | 7 | 0 | 1 | 0 | 4 |
| gemma4:e4b | 6 | 0 | 0 | 0 | 6 |
| kanana1.5:8b-q4km | 9 | 0 | 0 | 0 | 18 |
| qwen3.5:9b | 1 | 0 | 0 | 0 | 14 |
| qwen3.5:4b | 1 | 0 | 4 | 0 | 14 |
| exaone3.5:7.8b | 7 | 1 | 0 | 0 | 11 |
| gemini-2.5-flash | 2 | 1 | 0 | 0 | 1 |
참고 순위(가드 후): 1위 gemma4:12b 5.83, 2위 gemma4:e4b 5.58, 차이 +0.25 [-0.17, +0.67]로 동률 → VRAM 우선으로 e4b. 3위 이하는 qwen3.5:9b 4.92(+0.92 [+0.25, +1.67]), qwen3.5:4b 3.92(+1.92 [+1.17, +2.75]), exaone3.5:7.8b 3.67(+2.17 [+1.25, +2.92]), kanana1.5:8b-q4km 3.25(+2.58 [+2.17, +3.00]).
Gemini 비용(가드 후): 리포트 1건 평균 입력 14,189 / 출력 1,308 토큰, 약 $0.0075.
로컬 모델은 여전히 엄격 게이트를 통과하지 못한다. 12b·e4b의 남은 탈락 사유는 규칙 위반과 첫 글자 지연이다. 남은 위반은 가드가 다루지 않은 새 유형이다.
loan_rate “예 0.0405”)이 원인. 온도 0 단계에서 예시값을 지웠다.[확인된 사실]은 문단에 뉴스·추측이 섞여도 붙는다. e4b가 판정·이유 문단에 “최근 뉴스에서는 … 긍정적인 신호”를 섞으면 확인된 사실처럼 보인다(비교 판정에서 4건 지적). 그래서 판정자의 신뢰 등급 표기 위반은 크게 줄지 않았다(e4b 6 → 6, 12b 10 → 7).일관성은 높아졌고, 유의한 품질 차이는 관측되지 않았습니다. 고정 사실 12건을 모델별로 3회 반복해 비교했습니다.
○ 벤치 기본 설정 ● 온도 0 · 축 0–1
○ 벤치 기본 설정 ● 온도 0 · 축 0–1
비교 조건: 이전 값은 로컬 온도 0.3 / Gemini 기본값입니다. 운영 로컬 기본 온도 대비 개선 폭은 측정하지 않았고, 같은 변경에 loan_rate 예시값 제거도 포함돼 온도만의 효과로 볼 수 없습니다.
결론 일치 1.00은 반복 회차의 (완주·판정 모순 없음·지어내기 여부)가 같다는 뜻입니다. 정답률이나 본문 전체의 동일성을 뜻하지 않으며, 온도 0도 글자까지 같은 응답을 보장하지 않습니다.
REPORT_TEMPERATURE=0.0, REPORT_SEED=42(apps/agent/domain/services/report_sampling.py) 단일 원천으로 바꿨다. 같은 커밋에서 도구 명세의 loan_rate 예시값(0.0405)을 지웠다.같은 모델·같은 시나리오의 3회 반복끼리 비교한다. 1.00이면 완전히 같다.
| 모델 | 결론 일치 | 숫자 일치(Jaccard) | 문장 유사도 | 대안 등급 일치 |
|---|---|---|---|---|
| gemini-2.5-flash | 0.75 → 1.00 | 0.42 → 0.71 | 0.39 → 0.74 | 0.75 → 0.94 |
| gemma4:12b | 1.00 → 1.00 | 0.62 → 0.84 | 0.58 → 0.86 | 0.44 → 0.78 |
| gemma4:e4b | 0.83 → 1.00 | 0.34 → 0.79 | 0.40 → 0.82 | 0.22 → 0.72 |
| 모델 | 완주 | 판정 모순 없음 | 지어내기 | 첫 글자 p50/p95(ms) |
|---|---|---|---|---|
| gemini-2.5-flash | 0.94 → 1.00 | 1.00 → 1.00 | 0.056 → 0.00 | 1,679/2,114 → 1,664/8,679* |
| gemma4:12b | 1.00 → 1.00 | 1.00 → 1.00 | 0.00 → 0.00 | –/9,606 → –/9,489 |
| gemma4:e4b | 1.00 → 1.00 | 1.00 → 1.00 | 0.056 → 0.00 | –/12,694 → –/7,099 |
* Gemini p95 상승은 2회차 4건의 API 지연(5.9~9.6초)이다. 중앙값은 같아 온도와 무관한 네트워크 변동으로 본다.
기본 온도 회차와 온도 0 회차를 한 판정 묶음에 섞어 블라인드로 판정했다(시나리오당 6개 리포트, 같은 판정 세션). 판정 세션이 달라서 생기는 잡음을 없애려는 것이다.
| 모델 | 충실도 기본→0 | 차이 [95% 구간] | 자연스러움 기본→0 | 차이 [95% 구간] |
|---|---|---|---|---|
| gemini-2.5-flash | 3.50 → 3.25 | −0.25 [−0.83, +0.42] | 3.17 → 3.17 | +0.00 [−0.42, +0.42] |
| gemma4:12b | 2.25 → 2.33 | +0.08 [−0.33, +0.50] | 3.42 → 3.50 | +0.08 [−0.25, +0.42] |
| gemma4:e4b | 2.00 → 1.75 | −0.25 [−0.58, +0.08] | 2.83 → 2.83 | +0.00 [−0.33, +0.33] |
loan_rate 예시값 제거가 함께 들어가 있어 온도만의 효과로 볼 수는 없다. 영향은 s11·s12 금리 문장에 한정된다.같은 80건에서 로컬 후보는 모두 비워야 할 칸을 채웠습니다(missing·out_of_scope 26건 기준).
축 0–100% · 점선은 허용 상한 5% · 숫자는 지어내기 비율
12b가 지어낸 2건은 모두 서울 밖 지명을 서울 동으로 바꾼 경우였습니다.
아래 수치는 각 단계의 해석 핵심 오류 건수입니다. 운영 두 모델을 같은 116건에서 다시 돌리고 opus 판정자가 블라인드로 판정했으며, 판정자 변동은 약 ±3건입니다. 기본 모델(3.8)의 오류가 늘면 미적용이 원칙입니다. 미적용 단계 다음은 직전 적용 단계를 기준선으로 다시 쟀습니다(9·10·11단계의 기준선은 8단계).
| 단계 | 변경 | 3.8 일반 | Opus | 결정 |
|---|---|---|---|---|
| 4 | 해석 말투 규칙 | 8 → 4 | 5 → 4 | 적용 |
| 5 | 한국어 윤문 규칙 | 4 → 10 (축소판 12) | 4 → 2 (축소판 4) | 미적용 |
| 6 | 시간대 매출 자료 없음을 사실 문장으로 명시 | 4 → 7 | 4 → 5 | 미적용 |
| 7 | 동 이름은 본문 표기 그대로 | 4 → 3 | 4 → 5 | 적용 |
| 8 | 매출 중앙값 비교·시간대 가드·판정 신호 구분 | 3 → 4 | 5 → 1 | 적용 |
| 9 | 상권변화지표 뜻풀이·시간대 낱말 가드 | 4 → 5 | 1 → 5 | 미적용 |
| 10 | 시간대 자료가 없으면 사람 흐름을 해석 입력에서 제거 | 4 → 6 | 1 → 6 | 미적용 |
| 11 | 뉴스·상권 축소 신호 제거 | 4 → 9 | 1 → 4 | 이용조건에 따라 적용 |
| 12 | 조건 절에 지역 사건 연결 | 9 → 3 | 4 → 2 | 적용 |
| 13 | 판정 근거 약함 표시 + 조기 폐업 오독 가드 | 3 → 5 | 2 → 4 | 근거 약함만 적용, 가드 미적용 |
13단계는 두 변경을 함께 시험한 결과입니다. 5/116·4/116을 가드를 제외한 최종 운영판의 오류율로 읽으면 안 됩니다. 적용분만으로 잰 마지막 값은 12단계(v0.86.0)의 3.8 3/116·Opus 2/116이며, 현재 운영판(v0.87.0, 판정 근거 약함만 적용)을 단독으로 잰 값은 없습니다. 7개 업종의 판정 근거 약함 표시는 제품 결정으로 적용했지만, 조기 폐업 가드는 올바른 근거 문장까지 지워 적용하지 않았습니다.
윤문 규칙·뜻풀이·사실 문장 추가(5·6·9단계)와 입력 빼기(10단계)에서는 3.8이 그 글을 재료로 추론을 덧붙여 오류가 늘었습니다. 지역 사건 줄(12단계)은 오류를 늘리지 않았습니다. 효과가 난 것은 코드가 쓰는 사실 문장의 등급 낱말과 코드 가드, 사람 검수로 확인한 말투·표기 변경이었습니다. 시간대 추정·신호 사이 인과·조기 폐업 오독은 남은 한계입니다.
코드 우선 구조(v0.68.0~)에서 LLM은 리포트 맨 위 해석 한 단락만 쓴다. 외부 API 후보를 같은 150건 평가셋으로 비교했다. 코드는 v0.71.2(폐업률·점포 수 해마다), 판정은 opus 블라인드(기준표 data/eval/report_answer_rubric.md v2), 자료 부족 34건은 LLM을 부르지 않아 제외했다.
| 모델 | 요청 설정 | 핵심 오류 | 건당 비용(추정) | p50 / p95 |
|---|---|---|---|---|
| claude-haiku-4-5 | 온도 0 | 10/20 | $0.0045 | 3.4 / 4.4초 |
| claude-sonnet-5-5 | 생각 끔(between_tools) | 4/20 | $0.0103 | 4.4 / 5.4초 |
| claude-opus-5-5 | effort low(생각을 끌 수 없다) | 2/20 | $0.0222 | 5.7 / 9.1초 |
| gemini-2.5-flash | 생각 끔·온도 0 | 2/19 | $0.0010 | 4.0 / 4.3초 |
| 모델 | 핵심 오류 | 95% 구간 | p50 / p95 | 건당 비용(추정) |
|---|---|---|---|---|
| claude-opus-5-5 | 2/116 (1.7%) | 0.5%~6.1% | 5.7 / 8.6초 | $0.0217 |
| gemini-2.5-flash | 19/115 (16.5%) | 10.8%~24.4% | 4.0 / 4.5초 | $0.0010 |
| gemma4:12b(로컬) | 35/116 (30.2%) | 22.6%~39.1% | 3.7 / 4.6초 | — |
| 모델 | 핵심 오류 | 95% 구간 | p50 / p95 | 건당 비용(추정) |
|---|---|---|---|---|
| claude-opus-5-5 | 5/116 (4.3%) | 1.9%~9.7% | 5.7 / 8.6초 | $0.0217 |
| gemini-3.8-flash 일반(사전 추론 끔) | 8/116 (6.9%) | 3.5%~13.0% | 4.1 / 5.5초 | $0.0022 |
| gemini-3.8-flash 추론(사전 추론 켬) | 5/116 (4.3%) | 1.9%~9.7% | 8.4 / 12.0초 | $0.0022 + 추론 토큰(미기록) |
| gemini-2.5-flash | 19/115 (16.5%) | 10.8%~24.4% | 4.0 / 4.5초 | $0.0010 |
사람 검수 4차에서 “답변이 사용자에게 친절하지 않다”는 의견이 나와 [말투] 규칙(중고등학생 눈높이, 전문 용어 풀어 쓰기, 짧은 문장, 유치한 표현 금지)을 넣고 같은 116건을 다시 쟀다(태그 persona150, 묶음당 두 해석).
| 모델 | 핵심 오류 전 → 후 | 평균 길이 | 문장 평균 길이 | p95 |
|---|---|---|---|---|
| gemini-3.8-flash 일반 | 8 (6.9%) → 4 (3.4%) | 301 → 255자 | 60 → 51자 | 5.5 → 5.9초 |
| claude-opus-5-5 | 5 (4.3%) → 4 (3.4%) | 382 → 315자 | 57 → 45자 | 8.6 → 7.4초 |
[말투] 위에 [문장 다듬기] 규칙(번역투·AI 관용구·같은 완곡 표현 반복·문두 접속사·형식명사 끝맺음)을 더해 같은 116건을 쟀다(태그 polish150, 브랜치 feat/answer-polish v0.77.0, 미머지).
| 모델 | 핵심 오류 말투만 → +윤문 | 짝 비교(말투만에만 / +윤문에만) | 문두 접속사 |
|---|---|---|---|
| gemini-3.8-flash 일반(기본) | 4 (3.4%) → 10 (8.6%) | 4 / 10 | 72 → 41 |
| claude-opus-5-5 | 4 (3.4%) → 2 (1.7%) | 4 / 2 | 20 → 4 |
polish2-150): 3.8 12/116 (10.3%)(짝 비교 말투만에만 3 · 줄인 윤문에만 11), 오퍼스 4/116(4 · 4). 줄여도 3.8 오류가 줄지 않았다 — 새 오류는 대부분 “시간대 매출 자료 부족인데 유동인구로 매출·장사 시간을 추정”과 “본문에 없는 평가(평균 매출이 높지 않다)”였다. 규칙 내용보다 지시문이 길어지는 것 자체가 3.8의 근거 지키기를 흐리게 하는 것으로 보인다.feat/answer-polish는 기록으로 남기고 머지하지 않는다.남은 오류 중 가장 많은 “시간대 매출 자료가 없는데 유동인구로 매출·장사 시간을 추정”을 지시문이 아니라 코드가 쓰는 사실 문장으로 막아 봤다(태그 hours150, 브랜치 feat/hour-gap-missing, 미머지). 시간대 자료 부족 줄 끝에 “이 업종이 어느 시간대에 매출을 내는지는 알 수 없습니다”, 사람 흐름 줄에 “(동 전체 유동인구, 업종 매출과 다름)”.
| 모델 | 핵심 오류 말투만(운영) → +시간대 명시 | 그중 시간대 관련 | 짝 비교(전에만 / 후에만) |
|---|---|---|---|
| gemini-3.8-flash 일반 | 4 → 7 | 3 → 2 | 4 / 7 |
| claude-opus-5-5 | 4 → 5 | 2 → 4 | 3 / 4 |
6단계에서 찾은 “숫자 금지 때문에 동 이름을 한글로 풀어 씀”을 고쳤다 — 숫자 금지 규칙에 “동 이름은 본문에 적힌 그대로 쓴다(예: 역삼1동)” 예외 한 줄(태그 dong150).
| 모델 | 동 이름 한글 풀이 | 숫자 가드가 지운 문장 | 핵심 오류 말투만 → +예외 | 짝 비교(전에만 / 후에만) |
|---|---|---|---|---|
| gemini-3.8-flash 일반 | 11 → 0 | 0 → 0 | 4 → 3 | 3 / 2 |
| claude-opus-5-5 | 4 → 0 | 6 → 4 | 4 → 5 | 4 / 5 |
7단계 뒤 남은 오류를 유형별로 지시문이 아니라 코드(사실 문장·가드)로 막았다(태그 fix150). 평가셋 facts 116건에는 매출 근거의 서울 중앙값만 다시 채웠다(freeze --augment, 다른 값 변화 없음).
| 유형 | 고친 방식 |
|---|---|
| 본문에 없는 매출 평가(“평균 매출이 낮은 편”) | 매출 줄에 서울 같은 업종 동 중앙값과 견준 등급을 코드가 붙임 |
| 시간대 매출 자료가 없는데 사람 흐름으로 매출 시간 추정 | 자료가 없으면 시간대 낱말+매출·장사 문장을 지우는 가드(모른다고 밝힌 문장은 남김) |
| “경고 없음”을 자료 공백 탓으로 설명 | 판정 줄을 켜짐 / 계산했지만 기준 안 넘음(이름) / 자료 부족(이름)으로 나눔 |
| 모델 | 핵심 오류 7단계 → 8단계 | 짝 비교(전에만 / 후에만) | 가드가 지운 문장 |
|---|---|---|---|
| gemini-3.8-flash 일반 | 3 → 4 | 3 / 4 | 5 |
| claude-opus-5-5 | 5 → 1 | 5 / 1 | 4 |
8단계 뒤 남은 오류 중 “상권확장을 침체로 읽음”(e082)과 “밤을 저녁·주말로 바꿔 옮김”(e038)을 코드로 막아 봤다(태그 fix2-150, 브랜치 feat/answer-fixes-2, 미머지). 상권변화지표 이름 뒤에 쉬운 뜻(예: “정체(영업 중·폐업 점포 모두 서울보다 오래 영업 — 오래된 가게 위주로 변화가 적은 쪽)”)을 붙이고, 해석에 본문에 없는 시간대 낱말(저녁·점심·퇴근 등)이 나오면 그 문장을 지웠다.
| 모델 | 핵심 오류 8단계 → 9단계 | 짝 비교(전에만 / 후에만) |
|---|---|---|
| gemini-3.8-flash 일반 | 4 → 5 | 4 / 5 |
| claude-opus-5-5 | 1 → 5 | 1 / 5 |
9단계 뒤 가장 많이 남은 오류는 시간대 매출 자료가 없는데 본문의 “사람 흐름: 가장 많은 때 저녁”을 “저녁 손님이 많다”로 옮기는 것이었다. 원인을 없애려고, 시간대 매출 자료가 없을 때 모델에 주는 입력에서만 사람 흐름 구절을 뺐다(화면 본문은 그대로, 태그 flow150, 브랜치 feat/hour-flow-input, 미머지).
| 모델 | 핵심 오류 8단계 → 10단계 | 그중 시간대 관련 | 짝 비교(전에만 / 후에만) |
|---|---|---|---|
| gemini-3.8-flash 일반 | 4 → 6 | 1 → 4 | 2 / 4 |
| claude-opus-5-5 | 1 → 6 | 1 → 4 | 0 / 5 |
네이버 검색 API 특약(AI 입력 금지)에 따라 리포트 본문에서 뉴스 줄과 유사 사례의 뉴스 건수 문장을 빼고, 해석 지시문의 뉴스 규칙 한 줄도 뺐다. 같은 때 판정 신호 “상권 축소”가 빠져 왜 안 되나 절의 참고 신호 줄도 없어졌다(태그 news150, 브랜치 feat/news-compliance).
| 모델 | 핵심 오류 8단계(fix150) → 11단계 | 짝 비교(전에만 / 후에만) |
|---|---|---|
| gemini-3.8-flash 일반 | 4 → 9 | 4 / 9 |
| claude-opus-5-5 | 1 → 4 | 1 / 4 |
조건 절에 “[확인된 사실] ○○동 지역 사건(최근 3년, 서울 열린데이터광장): 2025-08 … (출처: OA-xxxxx)” 줄을 넣었다(정비사업 이주·착공, 대규모점포 개설·폐업, 1,000세대 이상 입주 — 최대 5건, 날짜는 달까지). 평가 facts 150건에 한 번 채웠고 사건이 있는 시나리오는 40건(LLM 판정 대상 116건 중 34건). 태그 events150, 기준선은 11단계 news150.
| 모델 | 핵심 오류 11단계 → 12단계 | 사건 줄 있는 34건 안 |
|---|---|---|
| gemini-3.8-flash 일반 | 9 → 3 | 5 → 3 |
| claude-opus-5-5 | 4 → 2 | 1 → 2 |
두 가지를 함께 시험했다(태그 weak150b, 기준선 12단계 events150). ① 안정 신호 없는 7개 업종에 비추천을 내지 않고 판정 줄에 “판정 근거 약함” 문장(평가 facts 74건에 반영, 그중 비추천 12건 → 조건부). ② 해석에서 “조기 폐업”을 새로 연 점포의 생존으로 풀이한 문장을 지우는 가드 — 첫판(weak150)은 생존 절벽·조기 폐업을 한 문장에 바르게 푼 문장까지 25개를 지워 “조기 폐업” 앞뒤 구만 보도록 고친 뒤 다시 돌렸다(3.8 5문장·오퍼스 4문장 삭제).
| 모델 | 핵심 오류 12단계 → 13단계 |
|---|---|
| gemini-3.8-flash 일반 | 3 → 5 |
| claude-opus-5-5 | 2 → 4 |
exp/early-closure-guard). 조기 폐업 오독은 판정자마다 핵심 오류로 보는 기준이 흔들린다(11·12단계).data/eval/results/claude-models-2026-10-06/(3단계는 g38-150/).| 후보 | 역할 | 결과 | 채택하지 않은 이유 |
|---|---|---|---|
| claude-opus-5-5 | 리포트 해석 1차(v0.73.0 → v0.75.0) | 2/116 · 5/116(판정 묶음에 따라) | 3.8과 오류율 구간이 겹치고 비용 약 10배 → 폴백으로 유지 |
| gemini-3.8-flash 추론 모드 | 리포트 해석 | 5/116 | p95 12.0초로 가장 느림 |
| claude-sonnet-5-5 · claude-haiku-4-5 | 리포트 해석(표본 20건) | 4/20 · 10/20 | Opus(2/20)보다 오류 많음 |
| gemini-2.5-flash | 리포트 해석 | 19/115 (16.5%) | 3.8보다 오류 많음 |
| gemini-2.5-flash | 의도 관문(10/7까지 운영) | 98.8%(10/5) · 95.0%(10/7) | 같은 날 3.8 일반보다 랜드마크 변환을 놓침 → v0.88.0에 교체. 더 빠름(p93 2.4초) |
| gemini-3.8-flash 사전 추론 기본 | 의도 관문 | 98.8%, 지어내기 0/26 | 일반 모드와 정확도 같고 더 느림(p93 5.3초) |
| gemini-embedding-001·2 (6조합) | RAG 임베딩 | 최고 MRR 0.960 | 기준선보다 유의하게 좋지 않고 외부 의존·비용 발생 |
| qwen3-embedding-4b | RAG 임베딩(당시 운영) | MRR 0.935 | bge-m3와 동률, CPU 재색인 약 5.7시간 |
| 질문 | 결과 | 비고 |
|---|---|---|
| 로컬 모델만으로 운영할 수 있나 | 평가함 — 불가 | 리포트·관문 로컬 6개 모두 게이트 탈락(10/5), 코드 우선 구조에서도 gemma4:12b 해석 핵심 오류 35/116 |
| 외부 API 중 무엇을 1차로 | 평가함 — 3.8 일반 | Opus와 구간 겹침, 비용 약 1/10. 동등성 입증은 아님 |
| 해석 개선이 실제로 효과가 있나 | 단계마다 평가함 | 116건 재평가 4~13단계, 판정자 변동 ±3건 |
| 의도 관문 모델 | 평가함 — 3.8 일반 모드로 교체 | 같은 날 비교에서 3.8 98.8% 대 2.5 95.0%. 다만 80건 한 묶음이라 차이 구간이 0을 포함함 |
| 지금 운영판(v0.87.0) 단독 오류율 | 재지 않음 | 13단계는 적용·미적용 변경을 함께 잼. 적용분 마지막 값은 12단계 |
| 10/5 리포트 품질·가드·온도 0을 3.8로 | 해당 없음 | 옛 구조(LLM이 6개 절 작성)는 폐기. 3.8은 현행 구조로 평가 |
| 더 큰 로컬 모델·미세조정·증류 | 할 수 없었음 | 16GB 한 장에 임베딩과 함께 올라가는 12b급이 상한. 27~32B급은 4비트로도 16GB 초과(추정), 학습은 VRAM이 더 필요 |
| 도구 호출 능력 | 측정 안 됨 | 10/5 252회 실행 전부 도구 호출 0건. 지금 구조는 도구를 쓰지 않음 |
| CPU 동시 부하 | 측정 안 함 | 임베딩 CPU 단독 지연만 잼 |
| 판정자 편향 | 사람 검수로 방향만 확인 | 판정자가 Claude(opus)라 Opus 해석을 후하게 볼 수 있음 |
주요 한계: 해석 평가는 150건 중 LLM을 호출한 116건, 10/5 리포트 평가는 12시나리오입니다. 판정자도 LLM(Claude opus)이라 같은 계열인 Opus 해석을 후하게 볼 수 있고, 판정 묶음에 따라 오류 건수가 ±3건 흔들리며, 모델마다 1회 실행입니다. 지금 운영판(v0.87.0)만 따로 잰 오류율은 없습니다. CPU 동시 부하와 도구 호출 능력은 검증되지 않았습니다.
임베딩:
LLM:
loan_rate 예시값 제거가 섞여 있어 온도 효과만 분리할 수 없다.size_vram(3,158 MiB)보다 실제 점유(nvidia-smi 차이 4,871 MiB)가 크다.운영 임베딩 qwen3@1536 → bge-m3@1024 전환, 8,905건 재색인 101초
컨테이너가 127.0.0.1:11434로 자기 자신을 가리키던 문제 — OLLAMA_BASE_URL=http://host.docker.internal:11434로 호스트 Ollama 접속
운영 로컬 폴백·운영 점검 프로브에 num_ctx 32,768 — 입력 2,051 → 19,228토큰
리포트 코드 가드 4종, 온도 0·seed 42 단일 원천, loan_rate 예시값 제거
컨테이너에 backend/.env 키 주입(env_file, required: false) — 8200 컨테이너가 Gemini 키 없이 로컬 12b 단독으로 쓰던 리포트 129초 → 8초
판정·수치·직접 답·근거는 코드가 쓰고, LLM은 해석 한 단락만 작성. 질문 유형별 직접 답과 위험 등급 표기 반영
리포트 해석 1차를 claude-opus-5-5로 변경. 이후 같은 평가셋에 Gemini 3.8 Flash를 추가 비교
1차 gemini-3.8-flash 일반 → 폴백 claude-opus-5-5 → gemma4:12b. 해석 가드 재시도는 Opus, 실패 시 로컬
해석 말투·동 이름 표기, 매출 중앙값 비교·시간대 매출 가드·판정 신호 구분 반영
이용조건에 따라 뉴스·상권 축소 신호를 해석 입력에서 제거하고, 지역 사건을 조건 절에 연결
안정적인 경고 신호가 없는 7개 업종은 판정 근거 약함을 표시하고 최대 조건부. 함께 시험한 조기 폐업 오독 가드는 미적용
의도 관문 LLM을 gemini-2.5-flash → gemini-3.8-flash 일반 모드(사전 추론 끔)로 교체
| 내용 | 경로 |
|---|---|
| 임베딩 평가 결과 | data/eval/results/embedding-benchmark-2026-10-04/ (report.md, results.json, corpus.jsonl.sha256) |
| LLM 평가 결과(가드 전) | data/eval/results/llm-benchmark-2026-10-05/ (report.md, notes.md, results.json) |
| 가드 후 재평가·온도 0 | data/eval/results/llm-benchmark-2026-10-05-guards/ (report.md, notes.md, results.json, temp0/) |
| 판정자 기준표 | data/eval/report_judge_rubric.md |
| 리포트 고정 facts | data/eval/report_facts/<id>.json |
| 평가셋 | data/eval/rag_evalset.jsonl, data/eval/intent_evalset.jsonl, data/eval/report_scenarios.jsonl |
| 임베딩 평가 설계 | docs/superpowers/specs/2026-10-04-embedding-benchmark-design.md |
| LLM 평가 설계 | docs/superpowers/specs/2026-10-04-llm-benchmark-design.md |
| 코드 가드·샘플링 | backend/apps/agent/domain/services/report_guards.py, backend/apps/agent/domain/services/report_sampling.py |
| 개정 이력 | backend/docs/backend_ver_log.md |
| 외부 API 해석 비교·반복 개선 | data/eval/results/claude-models-2026-10-06/ (3단계 g38-150/) |
| 해석 판정 기준표 | data/eval/report_answer_rubric.md (v2) |
| 사람 검수 4·5차 | data/eval/results/claude-models-2026-10-06/human_review_4.json, human_review_5.json |
| 의도 관문 3.8 재측정 | data/eval/results/intent-gemini38-2026-10-07/ (report.md, results.json) |
| 정본 문서 | 구현 저장소 docs/model-evaluation.md (§1~§13) |