Skip to content

기본 프로바이더를 로컬 Ollama 로 전환하고, 받을 수 있는 기본 모델로 교체 - #3

Merged
needsbuilder merged 3 commits into
mainfrom
fix/local-first-provider
Jul 29, 2026
Merged

기본 프로바이더를 로컬 Ollama 로 전환하고, 받을 수 있는 기본 모델로 교체#3
needsbuilder merged 3 commits into
mainfrom
fix/local-first-provider

Conversation

@needsbuilder

Copy link
Copy Markdown
Owner

Closes #1
Closes #2

무엇을

또박의 기본 실행 경로를 인터넷도 상용 API 도 없이 실제로 동작하는 상태
만든다. 지금까지는 두 군데가 어긋나 있어서, 아무 설정 없이 실행하면 반드시 무언가
잘못됐다.

이전 이후
기본 프로바이더 anthropic (원격 API) ollama (로컬)
기본 로컬 모델 kanana-1.5-8b (pull 불가) qwen2.5:7b (공식 라이브러리)
구성 실패 시 조용히 스텁으로 폴백 폴백하되 stderr 경고 + UI 배너

커밋 3개

  1. fix(providers) — 기본 모델 kanana-1.5-8bqwen2.5:7b
  2. feat(providers) — 기본 프로바이더를 로컬로 전환 + 폴백 가시화
  3. docs(providers) — README·docs/providers.md·CLAUDE.md 정합화

검증

실측 — 환경변수(TTOBAK_PROVIDER)와 ANTHROPIC_API_KEY 를 모두 지운 상태에서
parse()simplify() 완주:

[프로바이더] OllamaProvider   [모델] qwen2.5:7b
[소요] 4.3초   [K-ER] 79.2   [Fidelity] pass   [재교정] 0회

청년월세 안내문(합성)을 입력했을 때 금액(20만원)·기간(12개월)·신청기간(2026-08-03
~09-30)·기관명(강서구청)·연락처(02-2600-1234)가 모두 보존됐다. 같은 입력을 반복
실행하면 human_review 판정도 나오는데, 이는 Fidelity 게이트가 보수적으로 회부하는
정상 동작이다.

게이트 — 411 passed · ruff clean · ttobak audit PASS

새 테스트 8개

  • 기본 프로바이더가 ollama 인가 / make_provider(None) 이 실제로 그 경로를 타는가
  • ollama 구성 실패 시 스텁 폴백은 유지되는가 (CI 안전성)
  • 폴백·오타 이름이 stderr 로 알리는가, 의도적 fake 선택은 조용한가
  • 스텁일 때 UI 배너가 뜨는가, 실제 프로바이더일 때는 안 뜨는가
  • 기본 모델 태그가 ollama pull 가능한 형식인가 (외부 저장소 경로가 아닌지 — 기본 로컬 모델 태그 kanana-1.5-8b 를 Ollama 에서 받을 수 없음 #1 회귀 방지)

호환성

깨지는 변경 없음. --provider anthropic$TTOBAK_PROVIDER 는 그대로 동작하며,
원격을 쓰던 사람은 환경변수 하나로 이전 동작을 유지할 수 있다.

`kanana-1.5-8b` 는 Ollama 공식 라이브러리에 없다
(ollama.com/library/kanana → HTTP 404, 2026-07-29 확인).
따라서 아무 설정 없이 `ttobak web` 을 실행하면 기본 경로가 곧바로
'model not found' 로 깨졌다 — 처음 써 보는 사람이 가장 먼저 밟는 길이다.

qwen2.5:7b 로 교체한다:
- Ollama 공식 라이브러리에 있어 `ollama pull qwen2.5:7b` 로 바로 받힌다
- Apache-2.0 (Qwen2.5 는 3B·72B 만 NC — 7B/14B 는 Apache-2.0)
- 결과보고서 붙임2 가 신고하고 시연영상이 실제로 사용한 바로 그 모델
- README 도 이미 기본 모델을 qwen2.5:7b 로 안내하고 있었다 (코드만 어긋나 있었음)

Kanana-1.5 는 문서화된 대안으로 유지하되, 공식 라이브러리에 없어
Hugging Face GGUF 태그가 필요하다는 점을 명시했다.

회귀 방지: 기본 모델 태그가 `ollama pull` 가능한 형식인지
(외부 저장소 경로가 아닌지) 검사하는 테스트를 추가.
지금까지 `make_provider()` 의 기본값은 원격 `anthropic` 이었고, docstring 도
Anthropic 을 "demo default", Ollama 를 "local fallback" 으로 라벨링했다.
실제 설계는 정반대다 — 또박은 로컬 오픈웨이트 모델만으로 완결 동작하고
원격 API 는 교체 가능한 선택지다. 코드가 그 사실과 어긋나 있었다.

1) 기본값 전환: $TTOBAK_PROVIDER → "ollama" (DEFAULT_PROVIDER 상수 신설).
   `ollama` 분기를 make_provider() 에 추가하고, anthropic 은 이름을 명시해야
   닿는 경로로 남긴다. 라벨도 뒤집었다(기본 ↔ 선택적 대안).

2) 조용한 폴백 제거: 구성 실패 시 FakeProvider 로 떨어지는 동작은 CI·데모
   안전성 때문에 유지하되, 이제 stderr 경고와 웹 UI 배너로 반드시 알린다.
   미리 정해진 고정 문장을 실제 변환 결과로 오인하는 것이 조용한 폴백의
   진짜 위험이었다 — 특히 키·데몬 없이 실행하는 제3자에게 그렇다.
   검증자는 터미널이 아니라 브라우저를 보므로 stderr 만으로는 부족하다.
   오타난 프로바이더 이름도 이제 조용히 스텁으로 떨어지지 않는다.

배경: 대회 운영규정 제9조 ②-1-다는 "외부 API 호출을 통해서만 작동하는 상용
API 전용 모델을 서비스 형태로 단순 연결하는 출품작" 을 제한한다. 또박은
로컬 독립 구동이 가능해 해당하지 않지만, 그 사실이 문서 문구가 아니라
코드의 기본 동작으로 드러나야 한다.

실측: 환경변수·API 키 없는 상태로 parse → simplify 완주 확인
(OllamaProvider / qwen2.5:7b, 4.3초, K-ER 79.2, Fidelity PASS,
금액·기간·날짜·기관명·연락처 전부 보존).
- README 빠른 시작을 로컬 모델 기준으로 재구성 (ollama pull → ttobak web).
  `--provider fake` 는 "모델 받기 전 화면만 보기" 용도로 격하하고, 그 화면이
  실제 변환이 아님을 명시.
- docs/providers.md: 표 순서를 ollama(기본) → anthropic(선택) → fake 로 바꾸고,
  kanana 가 공식 라이브러리에 없다는 사실과 GGUF 태그 필요성을 기록.
  폴백이 조용하지 않다는 계약도 문서화.
- CLAUDE.md: 프로바이더 절 갱신 + 기본값을 원격으로 되돌리지 말 것,
  기본 모델 태그는 Ollama 공식 라이브러리에 실재해야 한다는 제약 추가.
@needsbuilder
needsbuilder merged commit a628595 into main Jul 29, 2026
7 checks passed
@needsbuilder
needsbuilder deleted the fix/local-first-provider branch July 29, 2026 07:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant