무엇인가
Ollama는 LLM을 로컬에서 실행하는 오픈소스 도구입니다. 모델 내려받기, 양자화된 가중치 관리, GPU 가속을 알아서 처리하고, 로컬에 HTTP 서버(기본 localhost:11434)를 띄워 OpenAI 호환 API와 자체 API를 엽니다. 클라우드 계정도 API 키도 필요 없고, 데이터가 기기 밖으로 나가지 않으며, 호출당 과금이 없습니다. MIT 라이선스, Go로 작성됐고, 2026년 10월 24일 기준 GitHub 별은 18만 4천 개를 넘었습니다.
추론은 원래 llama.cpp 위에서 돌았고, 0.40부터 애플 실리콘에서 MLX 러너를 기본으로 켰습니다. 같은 ollama pull로 받아도 어떤 모델은 llama.cpp에서, 어떤 모델은 MLX에서 돕니다. 하는 일도 채팅에서 넓어졌습니다. 임베딩(/api/embed)에 이어 2026년 9월 29일에는 선택지와 확률만 돌려주는 판정 모델용 엔드포인트 /v1/systemone이 추가됐습니다.
어떻게 동작하나
dimensions로 앞쪽 차원 절단ollama show <모델>을 치면 그 모델의 뼈대·양자화·창 크기와 함께 Capabilities(completion, embedding, decision 등)가 나옵니다. 모델마다 기본 num_ctx와 시스템 프롬프트가 정해져 있고, 이 값이 실제 사용 한도를 정하므로 먼저 확인할 것은 이 화면입니다. 웹 UI가 필요하면 Open WebUI 같은 프런트엔드를 붙입니다.
빠른 시작
curl -fsSL https://ollama.com/install.sh | sh # macOS·Linux (macOS는 brew install ollama도 가능)
ollama run gemma3:4b # 첫 실행 때 모델을 자동으로 받는다
임베딩은 HTTP로 바로 부릅니다. 코어닷투데이 실측에서 쓴 방식 그대로이고, 모델 카드가 정한 접두어를 붙이는 것이 핵심입니다.
import json, urllib.request
def embed(model, texts, dimensions=None):
body = {"model": model, "input": texts, "keep_alive": "15m", "truncate": True}
if dimensions:
body["dimensions"] = dimensions # 앞쪽 차원 절단 + 재정규화
req = urllib.request.Request("http://localhost:11434/api/embed",
data=json.dumps(body).encode(), headers={"Content-Type": "application/json"})
return json.load(urllib.request.urlopen(req))["embeddings"]
vecs = embed("embeddinggemma", ["task: search result | query: 청년 일자리 사업 신청 기한"])
코어닷투데이 실측
2026년 10월 Ollama 0.40.3, 맥 한 대(M1 Ultra 128GB)에서 임베딩 모델 아홉 개와 판정 모델 세 개를 한국어 문서 660건·질문 85개로 쟀습니다.
| 모델 (러너) | 검색 nDCG@10 | 문서 처리량 | 질의 1건 |
|---|---|---|---|
| Qwen3-Embedding 8B (llama.cpp) | 0.879 | 3.9건/초 | 115ms |
| EmbeddingGemma 300M (llama.cpp) | 0.852 | 54.2건/초 | 22ms |
| BGE-M3 (llama.cpp) | 0.830 | 45.1건/초 | 24ms |
| EmbeddingGemma 2 (MLX, nvfp4) | 0.765 | 32.0건/초 | 37ms |
dimensions옵션은 로컬 절단과 같았습니다. 저장해 둔 전체 벡터를 앞에서 잘라 재정규화한 값과 서버가 자른 값이 소수점 넷째 자리까지 일치했습니다. 이미 색인한 벡터는 다시 임베딩하지 않고 잘라 써도 됩니다.- 판정 모델은 출력 토큰이 0이었습니다. 호출 지연 중앙값은 tev1 0.8B 37~57ms, tev1 4B 120~240ms, Nimble 9B 244~422ms. 같은 맥의 Qwen3.8 27B 채팅 모델에 글자 한두 개만 답하게 하면 317~391ms였지만 확률이 없고 p95가 최대 4초까지 튀었습니다.
- 창 한도를 넘으면 자르지 않고 거부합니다. tev1은
num_ctx 2048이라 2,238토큰 입력에 400 오류(input is never truncated)를 냈습니다. - MLX 러너에서 멈춘 경우가 있었습니다. 0.40.3에서 Qwen3.8 27B 채팅 모델에 1,000토큰 넘는 기사 본문을 주자 커널 스레드 한도 오류로 멈췄습니다(짧은 입력에서는 정상).
언제 쓰고, 언제 피하나
| 상황 | Ollama가 맞는다 | 다른 방법을 먼저 본다 |
|---|---|---|
| 데이터 | 밖으로 보낼 수 없다 — 고객 문의 원문, 계약서, 망분리 환경 | 반출이 허용되고 정확도가 최우선 — 클라우드 프런티어 모델 |
| 규모 | 개발자 노트북, 사내 배치, 동시 요청이 적은 내부 도구 | 동시 접속이 많은 서비스 — vLLM·SGLang |
| 일의 모양 | 임베딩 검색, 라우팅·분류·규정 판정, 짧은 요약 | 긴 추론, 어려운 코딩 |
한계와 주의
- 같은 이름이어도 양자화본이다. Ollama가 배포하는 가중치는 Q4_K_M·F16·BF16·nvfp4 등 태그마다 다르고, 공개 벤치마크(전체 정밀도)와 점수가 다를 수 있습니다. 자기 문서로 다시 잽니다.
- 러너가 모델마다 다르다. llama.cpp와 MLX 경로의 속도·안정성이 다르고, MLX 임베딩·판정 경로는 0.40에서 처음 열린 것입니다.
- 접두어와 기본 파라미터를 확인한다. EmbeddingGemma는 접두어를 빼면 0.852가 0.770으로 떨어졌습니다. 템플릿은 글자 하나까지 모델 카드대로 씁니다.
- 판정 엔드포인트는 새것이다.
/v1/systemone은 TypeSafe Jev API 모양을 따르며, 2026-10-11 실측 당시에는 Ollama CLI와 공식 Python·JS 라이브러리가 이 엔드포인트를 몰라curl·urllib나 TypeSafe SDK(TYPESAFE_BASE_URL=http://localhost:11434)로 불렀습니다. 지금 라이브러리 페이지에는ollama.systemone()예시가 올라 있으니 쓰는 버전에서 확인합니다. - 지연·처리량은 한 대의 맥에서 직렬로 잰 값입니다. NVIDIA GPU, 병렬 호출, 캐시 재사용에 따라 크게 달라집니다.




