5. 자료를 밖으로 보내지 않기
로컬로 옮길 때 치르는 값
이 차시를 마치면
로컬 전환에서 무엇을 얻고 무엇을 내주는지 계산합니다.
로컬 전환은 공짜가 아닙니다. 무엇을 얻고 무엇을 내주는지 정확히 적습니다.
1. 추론 토큰 — 가장 먼저 만나는 함정
이 모델 계열은 답을 내기 전에 보이지 않는 추론 토큰을 씁니다. max_tokens 가 부족하면 추론만 하다 잘려서 본문이 빈 채로 돌아옵니다.
계측 결과입니다.
모델: google/gemma-4-e4b
질문: 한 문장으로만 답하세요: LangGraph의 State는 무엇입니까?
max_tokens finish_reason completion reasoning 본문
----------------------------------------------------------------------
80 length 79 77 0자
300 length 299 297 0자
800 stop 479 438 81자
→ LangGraph의 State는 그래프를 통과하는 모든 노드들이 공유하고
업데이트하며, 실행 흐름을 결정하는 단일화된 메모리 또는 컨텍스트입니다
2026-08-15 계측. 재현: python3 webapp/verify/local/probe_reasoning_tokens.py
읽는 법
| 신호 | 뜻 |
|---|---|
finish_reason 이 length | 토큰이 모자라 잘렸습니다 |
reasoning_tokens 가 completion_tokens 의 대부분 | 추론에 다 썼습니다. max_tokens=800 에서도 479 중 438 이 추론이고 본문에는 41 토큰만 남았습니다 |
| 본문이 0자인데 오류가 없음 | 가장 위험한 조합입니다. 그냥 "빈 응답" 으로 보입니다 |
응답 객체의 reasoning_content 필드에 잘린 추론이 들어 있어 확인할 수 있습니다.
왜 이것이 위험한가
오류가 나지 않습니다. HTTP 200 이고 응답 형식도 정상입니다. 내용만 비어 있습니다.
코드가 reply.content 를 그대로 다음 단계로 넘기면 빈 문자열이 흘러 들어갑니다. 어디서 잘못됐는지 찾기 어렵습니다.
대응
max_tokens를 넉넉히 잡습니다. 이 교재의 연결 코드는 1200 을 씁니다finish_reason을 확인합니다.length면 잘린 것입니다- 본문이 비면 오류로 처리합니다. 조용히 넘기지 않습니다
2. 모델 크기와 품질
작은 모델이라고 다 못 하는 것은 아닙니다. 작업의 성격이 먼저입니다.
| 작업 | 4B 모델로 되는가 | 근거 |
|---|---|---|
| 회의록에서 실행항목 추출 (Structured Output) | 됩니다 | 4차시에서 3건을 정확히 추출 분석 |
| 문서 요약 | 됩니다 | 5차시 관찰 과정에서 확인 |
| 복잡한 Tool calling | 확인 필요 | 이 교재에서 시험하지 않았습니다 |
| 긴 코드 작성, 다단계 추론 | 확인 필요 | 시험하지 않았습니다 |
확인하지 않은 것을 된다고 쓰지 않습니다. 쓰려는 작업으로 직접 시험해 보는 것이 유일한 방법입니다.
3. 하드웨어
3차시에서 본 대로 디스크보다 메모리가 먼저 걸립니다.
| 모델 | 디스크 | 메모리가 모자라면 |
|---|---|---|
| 4B | 6.86 GB | 대체로 올라갑니다 |
| 31B | 18.85 GB | 못 올리거나, 올라가도 매우 느립니다 |
느린 것이 문제가 되는 지점이 있습니다. Agent 는 모델을 여러 번 부릅니다. 한 번에 10초 걸리는 모델로 5단계 그래프를 돌리면 한 번 실행에 1분이 듭니다.
4. 공급망 — 모델 가중치의 출처
패키지만 공급망 대상이 아닙니다. 모델 가중치도 남이 만든 파일입니다.
외부 근거 OWASP Top 10 for LLM Applications 2025 는 이를 두 항목으로 나눕니다. LLM03: Supply Chain Vulnerabilities 와 LLM04: Data and Model Poisoning. 확인일 2026-08-15.
| 확인할 것 | 왜 |
|---|---|
| 누가 배포했는가 | 공식 배포자인지, 재업로드본인지 |
| 파일 무결성 | 내려받은 파일이 배포자가 올린 것과 같은지 |
| 어디서 받았는가 | 같은 이름의 모델이 여러 곳에 있습니다 |
이 교재는 이미 기기에 있던 모델을 씁니다. 새로 내려받지 않으므로 이 절차를 실습하지 않습니다. 확인 필요 실제로 내려받을 때는 위 세 가지를 확인해야 합니다.
5. 업데이트는 자동이 아닙니다
외부 API 를 쓰면 제공자가 모델을 개선할 때 가만히 있어도 좋아집니다. 로컬은 그렇지 않습니다.
- 새 모델이 나와도 사람이 받아서 바꿔야 합니다
- 바꾸면 다시 시험해야 합니다. 프롬프트와 schema 가 그대로 통할지 모릅니다
- 안 바꾸면 그 자리에 머뭅니다
3번 트랙의 "버전 고정의 두 얼굴" 과 같은 구조입니다. 고정은 재현 가능성을 주고 갱신 지연을 줍니다.
6. 비용은 사라지지 않고 형태만 바뀝니다
| 외부 API | 로컬 | |
|---|---|---|
| 돈 | 사용량에 비례한 요금 | 하드웨어 구입비, 전력 |
| 시간 | 거의 없음 | 설치, 모델 관리, 갱신, 장애 대응 |
| 예측 가능성 | 쓴 만큼. 갑자기 늘 수 있음 | 고정비. 많이 써도 늘지 않음 |
사용량이 많으면 로컬이 싸고, 적으면 외부 API 가 쌉니다. 운영 시간까지 넣어 계산해야 실제 비교가 됩니다. 분석
정리 — 무엇을 얻고 무엇을 내주는가
| 얻는 것 | 내주는 것 |
|---|---|
| 자료가 기기를 벗어나지 않음 · 인터넷 없이 동작 · 사용량이 늘어도 요금이 안 늘어남 · 요청 내용을 직접 관찰 가능 | 모델 품질과 속도 · 하드웨어 · 설치와 갱신에 드는 시간 · 최신 모델을 즉시 못 씀 · 공급망 확인 책임 |
이 표를 보고 자기 상황에서 답이 갈립니다. 어느 쪽이 옳다고 말할 수 없습니다.
2차시의 세 축(자료 민감도 · 품질 요구 · 운영 여력)으로 돌아가 다시 보십시오. 자료 민감도가 높으면 나머지 둘을 감수할 이유가 생깁니다. 그것이 이 트랙의 결론입니다.