지나가던행인이 (61.♡.201.240)
2026년 5월 9일 PM 06:04

오전에 자게에서 남극백곰님 댓글에 엠모씨님이 "GPT를 오케스트레이터로 로컬 LLM 사용한다는 게 어떤 방식인지 힌트 부탁드립니다" 라고 물어보셨습니다. 댓글로 짧게 답을 드릴려고 했는데, 댓글로 풀기엔 한계가 있어서 글로 정리합니다. 그리고 따라서 돌려보실 수 있는 코드도 만들어서 같이 올렸습니다.
이 글의 목적은 두 가지입니다.
GPT(또는 Claude) 정액제 + 로컬 LLM 조합으로 토큰 절약하는 패턴을 코드 수준에서 보여드리는 것
본인 환경(Ollama / LM Studio / 다른 로컬 LLM)에 맞춰 변형하실 수 있게 가이드 드리는 것
왜 이렇게 쓰는가 — 토큰 절약의 구조
코딩 작업을 LLM에게 시킬 때 보통 세 가지가 일어납니다.
분해(Decompose) — 사용자의 모호한 요청을 구체적인 지시로 쪼개기
생성(Generate) — 실제 코드(또는 내용) 만들기
검증(Verify) — 결과가 요구사항에 맞는지 확인, 재시도 여부 판단
여기서 1번과 3번은 판단이 필요합니다. 짧은 입력, 짧은 출력인데 모델이 똑똑해야 합니다. 2번은 반대예요. 처리량이 필요합니다. 입력은 짧지만 출력이 길죠 — 토큰이 폭발하는 지점입니다.
세 가지를 다 같은 유료 모델에 시키면 2번이 비용을 다 잡아먹습니다. 그래서 이 패턴의 핵심은:
1번과 3번은 유료 모델에서 짧게, 2번은 로컬 LLM에서 길게.
판단은 비싼 모델, 노동은 싼 모델. 정액제 한도 안에서도 충분히 굴러갑니다.(이건 반대로 생각하시는 분들도 계신데 경험상 판단과 설계의 품질이 좋으면 적당한 모델들도 코딩은 아주 잘 합니다. 반박하시면 반박하시는 분 말씀이 맞습니다 ㅎㅎ)
3역할로 나누면 이렇게 됩니다
역할 | 모델 | 하는 일 | 비용 |
|---|---|---|---|
Architect | GPT/Claude (Codex CLI 등) | 요청을 Developer 지시로 분해 + 검증 기준 작성 | 짧은 입출력 (저비용) |
Developer | 로컬 27B (Ollama / LM Studio) | 실제 코드 생성 | 길어도 무료 (로컬) |
Reviewer | GPT/Claude (Architect와 같은 세션) | 결과를 검증 기준에 맞춰 판정 — pass/retry/fail | 짧은 입출력 (저비용) |
여기서 한 가지 트릭이 있어요. Architect와 Reviewer가 같은 세션을 공유합니다. Architect가 검증 기준을 작성한 다음, Reviewer가 같은 세션을 resume하면 그 기준을 다시 프롬프트에 넣을 필요가 없어요. CLI 세션 자체가 워킹 메모리 역할을 합니다. 이게 "외부화된 상태" 의 가장 단순한 형태고, 별도 DB나 벡터스토어 없이도 동작합니다.
동작 흐름
사용자 요청
↓
[Architect] Codex CLI - 분해 + 검증 기준 작성 → 세션 ID 받음
↓
[Developer] 로컬 27B - 지시받은 작업 수행
↓
[Reviewer] Codex CLI - 같은 세션 resume → 검증 → pass/retry/fail
↓
pass면 종료 / retry면 Developer에게 보강 지시 / fail이면 사용자에게
retry는 최대 2번. 그 이상 가면 "내가 직접 봐야 할 작업" 이라는 신호니까 사용자에게 넘깁니다.
따라하실 수 있는 코드
이 패턴을 그대로 구현한 미니 데모를 tunaflow/learn/gpt-local-tui/에 올려놨습니다. 파이썬 한 파일 + Textual TUI로, 정확히 위 워크플로우가 동작합니다.
핵심 코드는 이 정도입니다 (전체는 레포 참조):
async def run_workflow(user_input, cfg, state, emit): # 1. Architect: 분해 arch = await asyncio.to_thread( call_codex, ARCHITECT_PROMPT.format(user_input=user_input), cfg, session_id=state.session_id, # None이면 새 세션 ) state.session_id = arch.thread_id # 세션 ID 저장 → Reviewer가 재사용 plan = parse_json_blob(arch.text) instructions = plan["developer_instructions"]# 2. Developer: 생성 (로컬 LLM, 토큰 비용 0) dev_output = await asyncio.to_thread( call_ollama, DEVELOPER_PROMPT.format(developer_instructions=instructions), cfg, ) # 3. Reviewer: 검증 (Architect 세션 resume → 기준이 컨텍스트에 이미 있음) rev = await asyncio.to_thread( call_codex, REVIEWER_PROMPT.format(developer_output=dev_output), cfg, session_id=state.session_id, # 같은 세션! ) verdict = parse_json_blob(rev.text) # verdict에 따라 pass / retry / fail 처리
call_codex()는 codex exec --json subprocess 호출, call_ollama()는 ollama Python 클라이언트 한 줄 래퍼입니다. 둘 다 30줄 안 넘어요.
환경 설정 - 이게 더 중요할 수 있어요
코드 자체는 단순한데, 본인 환경에 맞게 모델과 백엔드를 고르는 게 진짜 작업입니다. 옵션별로 정리합니다.
1. 로컬 LLM 백엔드 선택
Ollama - 디폴트 추천. 설치·모델 다운로드가 한 줄로 끝나요.
# 설치 후
ollama pull qwen3.6:32b # 또는 gemma4:27b, command-r:35b 등
ollama serve # 백그라운드에서 자동 실행되기도 함
LM Studio — GUI 선호하시는 분, 모델 양자화 옵션 세밀하게 보고 싶으신 분. OpenAI 호환 API 지원.
LM Studio 실행 → 모델 다운로드 → "Local Server" 탭 → Start Server
기본 주소: http://localhost:1234
Ollama Cloud — 로컬 GPU가 없거나 약한 분께 추천. 27B 이상 큰 모델을 본인 머신 부담 없이 굴릴 수 있어요. 무료 티어가 "라이트 사용" 수준이긴 한데 이 데모처럼 가끔 굴리시는 정도는 충분합니다. Pro는 $20/월(또는 $200/년)에 무료 대비 50배 사용량 + 동시 3개 모델까지. 토큰 단위가 아닌 GPU 시간 단위 청구라 짧은 요청이나 캐시 공유 시 사용량이 훨씬 적게 잡혀요. ChatGPT Plus랑 합쳐도 월 $40 선이라 정액제 두 개로 GPT + 27B 조합이 가능합니다.
# Ollama Cloud 사용 시 (host만 바꾸면 됨)
[developer]
host = "https://ollama.com" # 또는 본인 cloud 엔드포인트환경변수로 OLLAMA_API_KEY 설정 필요
2. 모델 선택 — VRAM 기준 (2026년 5월 기준)
지금 시점에서 코딩 워크로드용으로 추천드릴 만한 두 가지는 Gemma 4 (Google, 4월 출시) 와 Qwen 3.6 (Alibaba, 4월 출시) 입니다. 둘 다 4월에 나왔는데 27B-31B 영역에서 의미 있는 도약이 있었어요.
VRAM | 추천 모델 | 비고 |
|---|---|---|
8GB | Gemma 4 E4B (effective 4B), Qwen 3.5 4B | 학습·실험용. 코드 품질 한계 |
16-18GB | Gemma 4 26B-A4B (MoE), Qwen 3.6-35B-A3B (MoE) | 활성 파라미터 작아 빠름. 균형 좋음 |
18-24GB | Qwen 3.6-27B (Dense), Gemma 4 31B (Q4) | 코딩 워크로드 메인. SWE-bench 77%대 |
32GB+ (Mac unified) | Gemma 4 31B (Q8), Qwen 3.6-27B (Q8) | M2/M3/M4 Max 이상 |
Qwen 3.6-27B가 가장 코딩 친화적입니다. SWE-bench Verified 77.2%, Terminal-Bench 2.0 59.3%로 Claude 4.5 Opus와 비슷한 수준이에요. Apache 2.0이라 라이선스도 자유롭고요. 4-bit 양자화하면 18GB로 돌아갑니다.
Gemma 4 31B는 추론 벤치마크가 더 강해요. GPQA Diamond 84.3%, MMLU Pro 85.2%. 코딩은 살짝 뒤지지만 추론·리뷰 작업이라면 더 적합합니다.
본인 ollama list 결과에서 가져온 모델명으로 config.toml에 적으시면 됩니다.
[developer]
model = "qwen3.6:27b" # 또는 gemma4:31b, gemma4:26b-a4b
host = "http://localhost:11434" # Ollama 기본
temperature = 0.3
num_ctx = 8192
7B/8B 모델은 학습용으로는 충분한데 Architect의 지시를 정확히 따라가는 능력이 떨어져서 retry 루프가 자주 돌게 됩니다. 일을 진짜로 시키시려면 27B 이상으로 가셔야 해요.
3. LM Studio로 바꾸는 법
본 데모는 Ollama 디폴트인데, LM Studio 쓰시는 분은 app.py의 call_ollama() 함수만 OpenAI 호환 클라이언트로 바꾸시면 됩니다.
이 변환 작업 자체가 사실 이 데모의 좋은 첫 사용 사례예요. Codex나 Claude한테 "이 함수를 LM Studio용으로 바꿔줘, base URL은 http://localhost:1234/v1" 이라고 시키시면 5분이면 됩니다. 본인이 만든 워크플로우의 첫 발주가 본인 워크플로우 자체를 수정하는 작업이 되는 거죠.
대략 이런 모양이 됩니다:
from openai import OpenAI
def call_local_llm(prompt, cfg):
client = OpenAI(
base_url="http://localhost:1234/v1",
api_key="lm-studio", # LM Studio는 아무 문자열이나 OK
)
resp = client.chat.completions.create(
model=cfg.developer_model,
messages=[{"role": "user", "content": prompt}],
temperature=cfg.developer_temperature,
)
return resp.choices[0].message.content
이런 식으로요. requirements.txt에 openai 추가하시고 ollama는 빼시면 됩니다.
4. Architect/Reviewer 모델 선택
본 데모는 Codex CLI 기준으로 작성됐어요. ChatGPT Plus/Codex 구독하시는 분이 추가 API 키 없이 바로 쓸 수 있어서요.
다른 옵션:
도구 | 설치 | 특징 |
|---|---|---|
Codex CLI |
| ChatGPT 구독 활용, JSONL 스트림 |
Claude Code | Anthropic CLI | Claude Pro/Max 구독 활용 |
Gemini CLI | Google CLI | 무료 할당량 큼 |
OpenAI API 직접 |
| API 비용 따로 |
전부 "비대화형 프롬프트 + 세션 resume" 기능이 있어서, call_codex() 부분만 해당 도구에 맞게 바꾸시면 됩니다. 이것도 LM Studio 변환과 마찬가지로 LLM한테 시키시면 빠릅니다.
한계도 분명히 있습니다
이 데모는 학습용이라 빠진 것들이 많아요.
스트리밍 없음 — subprocess로 한 번에 받습니다. 30초 걸리면 30초 동안 화면 안 변해요.
단일 Developer — 여러 모델 토론, 병렬 실행 같은 거 없음.
도구 호출 없음 — Developer가 자기 코드를 직접 실행해서 검증할 수 없어요.
재시도 2번 한정 — 그 이상은 사용자가 개입.
세션 외 영구 상태 없음 — 프로젝트 컨벤션, 과거 결정 같은 게 컨텍스트에 안 들어감.
이 한계가 본인 작업에서 자주 부딪히면 — 그게 풀세트 도구로 넘어갈 신호예요. LangGraph, CrewAI 같은 프레임워크나, 제가 만들고 있는 tunaFlow도 같은 패턴을 풀세트로 구현한 도구입니다. 다만 그건 별개 이야기고, 일단은 위 데모로 "이게 어떻게 작동하는지" 부터 보시면 됩니다.
시작하실 분께 — 한 줄 요약
ChatGPT Plus / Claude Pro / Gemini 중 하나 구독 + 해당 CLI 설치
Ollama 깔고 27B 이상 모델 받기 (또는 LM Studio)
git clone→pip install -r requirements.txt→cp config.example.toml config.toml→ 모델 이름 본인 환경에 맞게python app.py --check로 환경 검증python app.py실행
코드 보면서 "왜 이렇게 짰는지" 가 궁금하시면 docs/how-it-works.md에 더 자세히 풀어놨어요.
질문이나 막히는 부분 있으시면 댓글 주세요. GitHub 이슈로 올리셔도 됩니다. 즐거운 주말들 되세요 😁
댓글 (50)
-
아아수라장
05.09 · 125.♡.188.188
-
지지나가던행인이
→ 아수라장 작성자
05.09 · 118.♡.81.248
부족한 글 읽어주셔 감사합니다 😁
-
엠엠모씨
05.09 · 118.♡.12.144
와 진짜 친절하신 지식나눔 감사합니다. 선댓글 후정독 하겠습니다!
-
지지나가던행인이
→ 엠모씨 작성자
05.09 · 118.♡.81.248
답이 너무 늦어 죄송했습니다. 오전에 호다닥 정리할랬는데 평소 없던 일정이 갑자기 생겨서 좀 늦었습니다. 코드는 넘 빨리만들어서 개념정도만 구현했는데 필요하시면 더 보강해 보도록 하겠습니다
- 미
미자르
05.09 · 211.♡.153.86
맥북 M5 pro 48gb를 얼마전 구매했는데 로컬 환경 구현할 가이드를 찾아보고 있는 중이었습니다. 아주 좋은 지침서를 주셔서 감사합니다. 스크랩하겠습니다!
-
지지나가던행인이
→ 미자르 작성자
05.09 · 118.♡.81.248
너무 부럽네요 제 작고 소중한 맥북에어는 너무 뜨겁습니다 ㅎㅎ 대AI시대에 너무 부끄러운 자료인데 스크랩까지 해주셔서 감사합니다 😁 로컬환경 멋지게 구현하셔서 AI당에 자랑해주세요 👍
-
MMarino
05.09 · 119.♡.213.13
귀한 자료 감사드립니다.
-
지지나가던행인이
→ Marino 작성자
05.09 · 118.♡.81.248
귀한 댓글에도 감사드립니다. 즐거운 주말 보내셔요 😁
-
빅빅버그
05.09 · 141.♡.9.112
가장 큰 문제가 이걸 돌릴 PC가 없다는.것 같습니다. ㅜㅜ
-
지지나가던행인이
→ 빅버그 작성자
05.09 · 118.♡.81.248
ollama cloud가 있어요 글카살돈이면 최소 2-3년치가... (소곤소곤)
댓글을 작성하려면 이 필요합니다.
좋은 자료 감사합니다