Dataset Generator v1.0.3-beta 로컬 LLM 지원 제공 — API 비용 없이 모델 파인튜닝

발행: (2026년 5월 4일 AM 02:06 GMT+9)
14 분 소요
원문: Dev.to

Source: Dev.to

번역할 텍스트를 제공해 주시면 한국어로 번역해 드리겠습니다.

개요

얼마 전에 LLL‑파인‑튜닝 데이터셋을 생성하는 데스크톱 앱을 배포했습니다.
잘 작동했습니다: 제 Qwen2.5‑Coder‑7B 파인‑튜닝 결과가 HumanEval에서 55.5 % → 72.3 % 로 상승했습니다.
전체 파이프라인은 OpenRouter에서 실행되었습니다 – 모델을 선택하고, Generate를 클릭하면 JSONL 파일을 받을 수 있었습니다.

v1.0.3‑beta에서는 이제 다중 제공자 LLM 지원이 포함됩니다 – Ollama, LM Studio, llama.cpp, 혹은 사용자 정의 OpenAI‑호환 엔드포인트와 기존 OpenRouter를 모두 사용할 수 있습니다.
조합해서 사용하세요: 로컬 Qwen3‑14B에서 생성하고, 저렴한 클라우드 모델로 평가하거나, 완전히 오프라인으로 운영할 수도 있습니다.

아래는 배포된 내용, 예상보다 어려웠던 점, 그리고 얻은 교훈을 간략히 정리한 것입니다.

새로운 기능

1️⃣ 원‑클릭 로컬 LLM 감지

  • 경로: Settings → Providers → "Auto‑detect local"
  • 앱이 다음 포트를 탐색합니다:
ProviderPort
Ollama11434
LM Studio1234
llama.cpp8080
  • 응답이 있는 모든 엔드포인트에 원‑클릭 “Add” 버튼이 표시됩니다.
  • 오프라인‑우선 사용자를 위한 온보딩 시간이 ≈ 30 s 로 단축되었습니다.

2️⃣ 혼합‑모드 파이프라인

  • 카테고리가 자체 제공자를 사용할 수 있습니다.
    • 예시: 로컬 Qwen2.5‑Coder‑14B에서 Gen을, 저렴한 클라우드 모델(예: GPT‑4‑mini)에서 Judge를 사용.
    • 혹은 카테고리별로 서로 다른 생성기를 사용 – 예를 들어 알고리즘 카테고리는 코드‑전문 로컬 모델을 활용.
  • 파이프라인이 자동으로 각 호출을 올바른 백엔드로 라우팅합니다.

3️⃣ 커스텀 엔드포인트

  • OpenAI‑호환 URL이면 모두 동작합니다(vLLM, TGI, 자체 호스팅 게이트웨이 등).
  • 베이스 URL과 선택적인 베어러 토큰을 붙여넣기만 하면 → 완료.

4️⃣ 로컬 작업 즉시 취소

  • 클라우드 API는 몇 초 안에 끝나므로 협력적인 취소가 간단합니다.
  • 로컬 14B 모델은 하나의 채팅 완성에 몇 분씩 머무를 수 있습니다.
  • v1.0.3‑betaasyncio.Task.cancel()을 진행 중인 HTTP 요청에 바로 연결해, 취소가 즉시(~1 s) 느껴지도록 하고(≈ 8 분 타임아웃 대기 없이) 구현했습니다.

5️⃣ 추론 모델 자동 처리

  • Qwen3, DeepSeek‑R1 등은 실제 출력 전에 전체 토큰 예산을 잡아먹는 블록을 내보냅니다.
  • 파이프라인이 “추론 기아”(empty content + finish=length + reasoning present) 를 감지하고 자동으로 4배 큰 예산으로 재시도합니다.
  • 수동으로 조정할 필요가 없습니다.

6️⃣ 공급자 간 토큰 회계

ProviderIssue (문제)Fix (해결)
OpenRouter사용량 페이로드에서 reasoning_tokens를 깔끔히 구분함.
Ollamacompletion_tokens생각 + 내용이 모두 포함됨(예: 800 + 80 = 880).“ 블록(Format A) 또는 message.reasoning(Format B)을 감지해 추론 부분을 제거하고, tiktoken으로 다시 계산한 뒤 usage.completion_tokens에 수정된 값을 기록합니다.
LM Studiomessage.reasoning_content를 사용함.동일한 제거 로직 적용; LM Studio는 completion_tokens_detailsreasoning_tokens도 제공하므로 “빼기 경로”가 이를 포착합니다.

결과: Quality Report와 예시별 토큰 수가 이제 일치합니다.

7️⃣ 기능‑기반 공급자 추상화

  • 초기 버전에서는 if provider.kind == "ollama" 같은 검사가 코드 전역에 흩어져 있었습니다.
  • 이를 ProviderCapabilities 플래그로 리팩터링했습니다:
supports_provider_routing
supports_reasoning
requires_api_key
has_pricing
supports_embeddings
  • 새로운 백엔드를 추가할 때는 클래스 하나 + 레지스트리 항목 하나만 필요하고, job_runner.py전혀 수정되지 않습니다.

8️⃣ 기본 공급자 재배정 UX

  • 이전 동작: 기본 공급자(예: OpenRouter)를 비활성화하면 시스템이 조용히 고아 상태가 되고, 다음 작업이 “Provider ‘openrouter‑default’ is disabled” (422) 오류와 함께 실패했습니다.
  • 새로운 동작: 백엔드가 자동으로 다음 활성화된 공급자를 기본으로 승격하고, 프론트엔드에서는 4초 토스트를 표시합니다 – “Default switched to Ollama (local)”.

작은 버그를 발견하면 금방 고칠 수 있는 수준입니다.

User Personas Unlocked

페르소나문제점v1.0.3‑beta가 돕는 방법
프라이버시‑중시기업/NDA‑제한 코드가 노트북을 떠날 수 없음.모든 처리를 로컬 하드웨어에서 오프라인으로 유지할 수 있음.
비용‑중시클라우드 GPT‑4에서 5 000개의 다중‑턴 예시를 생성하는 데 비용이 막대함.저렴한 로컬 생성기(예: Qwen3‑14B) + 클라우드 판정 → ≈ 1/10 비용.
클라우드‑계정 없음규제, 신용카드 부재, 혹은 지원되지 않는 국가.전체 파이프라인이 외부 API 호출 없이 실행됨.

Lessons Learned

1️⃣ 14B local models are the practical floor

  • 7B/9B 변형은 기술적으로는 유효한 출력을 만들지만 주제에서 벗어나고, 패턴을 반복하며, 카테고리를 오해합니다.
  • 클라우드에서 절약한 시간은 **5×**에 해당하는 거부된 예제 처리에 사용됩니다.
  • 14B가 최소이며, VRAM이 충분하면 32B가 편안하게 느껴집니다.

2️⃣ The judge model matters more than the generator

  • 작은 로컬 판정기(≈ 8B)는 품질과 관계없이 점수(95‑100)를 무조건 부여하는 경향이 있습니다.
  • 더 큰 판정기(≥ 14B)는 카테고리를 파악하지 못해 좋은 예제를 놓칠 수 있습니다.
  • 판정기에 클라우드 비용을 투자하거나 하드웨어가 허용한다면 32B+ 로컬 판정기를 사용하세요.

3️⃣ Mixed mode is the killer feature

  • “완전 오프라인”이 주요 장점이 될 것으로 기대했지만, 대부분의 사용자는 다음을 원합니다:
cheap local model → generate volume (≈ 7 000 examples)
strong cloud model → judge (quality control)
  • v1.0.3‑beta는 이를 한 줄 설정으로 만들며 – 하나의 제공자에서 생성기를, 다른 제공자에서 판정기를 선택해 배포합니다.

4️⃣ Per‑provider concurrency limits add complexity for little gain

  • 프로토타입: “Ollama: 1, OpenRouter: 10”으로 설정해 전역 세마포어가 로컬 GPU를 압도하지 않게 합니다.
  • 실제로는 단일 사용자, 단일 GPU 환경이 압도적이며 (≈ 99 % 사용자).
  • 이 기능은 v1.0.3‑beta에서 제거되었으며 향후 엔터프라이즈 사용을 위해 보류되었습니다.

What’s Next?

  • Enterprise‑grade concurrency controls (수요가 발생하면 다시 도입).
  • Better token‑budget introspection (추론 토큰을 숨기는 제공자를 위해).
  • More provider capability flags (예: 스트리밍, 함수 호출)와 같이 생태계가 확장됨에 따라.

베타를 자유롭게 사용해보고, 버그를 보고하고, 개선 사항을 제안해 주세요! 🚀

멀티‑GPU vLLM – 실제로 누가 필요로 할까?

모델 선택기에서 제공자 배지
두 제공자가 동일한 모델 이름(예: llama‑3.1‑8bOllamaOpenRouter 모두에서 제공)일 경우, 선택기에는 두 개의 동일해 보이는 항목이 표시됩니다. 나는 이를 구분하기 위해 작은 배지 UI를 스케치했지만, 일반적인 설정에서는 이름 충돌이 없다는 것을 깨달았습니다(어디에 어떤 모델을 두었는지 알고 있잖아요). 향후 다듬기 작업으로 미뤘습니다.

동일한 기반, 새로운 레이어

레이어기술 스택새로운 추가 사항
FrontendNext.js 16 (static export) + Tailwind + base‑uiProvidersSection for CRUD, auto‑detect, per‑row connection test
BackendFastAPI + SQLite (WAL) + Pydanticapp/services/llm/ – provider abstraction (LLMProvider ABC + ProviderCapabilities)
app/routers/providers.py

스키마 마이그레이션

  • providers 테이블v6에 추가되었으며, 기존 단일 OpenRouter 키를 백필(back‑fill)했습니다.
  • 기존 설정은 첫 실행 시 자동으로 조용히 마이그레이션됩니다.

테스트

  • 460개 통과 (이전 릴리스의 329개에서 증가)
  • 네 개 백엔드, 레지스트리 해석, 자동 감지, 혼합 모드 작업에 대한 전체 커버리지.

라이선스 및 배포

  • AGPL‑3.0 (이전과 동일)
  • 원바이너리 배포 (Linux AppImage, Windows .exe).

오픈소스 저장소

  • 앱 저장소 (v1.0.3‑beta):
  • 원본 릴리스 포스트 (HumanEval + 16pp 벤치마크 포함): previous dev.to post
  • 데이터셋 (2,248 예시):
  • 파인튜닝 모델:

다음 단계

  1. System‑tray version

    • 로컬 하드웨어에서 5,000개 이상의 예시를 생성하는 장시간 작업(수시간)은 영구적으로 열려 있는 창보다 조용한 UX가 필요합니다.
    • 트레이 아이콘, “다음 작업 준비 완료” 알림, 클릭하면 대시보드가 다시 표시됩니다.
  2. Embedding provider picker

    • 중복 제거는 백엔드에서 다중 제공자를 지원하지만, UI에서는 현재 OpenRouter 임베딩 모델만 노출됩니다.
    • 로컬 사용자가 Ollama를 통해 nomic‑embed‑text로도 중복 제거를 실행할 수 있도록 작은 드롭다운을 추가합니다.
  3. LiveCodeBench와 BigCodeBench를 목표로 하는 두 개의 새로운 카테고리

    • 이전 게시물에서 해당 벤치마크가 거의 변동이 없었던 이유(LCB는 포맷 불일치, BCB는 너무 일반적인 라이브러리 카테고리)를 설명했습니다.
    • 두 가지 수정이 진행 중입니다:
      • LCB를 위한 에지 케이스를 포함한 알고리즘 드릴.
      • BCB를 위한 라이브러리‑API‑정밀 분류 체계.
  4. 커뮤니티 피드백

    • 로컬에서 데이터셋을 생성할 때 어떤 모델 크기를 사용하고 있으며, 수용률은 어느 정도인가요?
    • 특히 ** Disclosure: 이 게시물은 AI 도움을 받아 초안 작성했습니다 — 앱을 만든 방식과 동일합니다.
0 조회
Back to Blog

관련 글

더 보기 »