ChatGPT, Claude 같은 클라우드 LLM은 강력하지만 데이터가 외부 서버로 전송됩니다. 회사 코드나 개인 정보를 다룰 때는 꺼림칙할 수밖에 없습니다. 내 Mac에서 직접 LLM을 돌릴 수 있다면? 데이터 유출 걱정 없이, 인터넷 없이도, 무료로 AI를 활용할 수 있습니다.
이 글에서는 로컬 LLM 실행 도구인 Ollama와 LG AI Research가 개발한 한국어 특화 모델 EXAONE 3.5:7.8B를 Mac에 설치하고 활용하는 방법을 단계별로 안내합니다. Apple Silicon Mac이라면 GPU 가속까지 자동으로 활용되어, 생각보다 쾌적한 경험을 할 수 있습니다.
Ollama란?
Ollama ↗는 로컬 환경에서 LLM(Large Language Model)을 간편하게 실행할 수 있는 오픈소스 도구입니다. Docker가 컨테이너를 관리하듯, Ollama는 AI 모델을 관리합니다. 모델 다운로드부터 실행, API 서버까지 한 번에 해결됩니다.
왜 Ollama인가?
| 특징 | 설명 |
|---|---|
| 간편한 설치 | brew install ollama 한 줄이면 끝 |
| 모델 허브 | ollama pull 명령으로 수백 개 모델 즉시 다운로드 |
| GPU 자동 활용 | Apple Silicon의 Metal API를 자동으로 사용 |
| OpenAI 호환 API | 기존 OpenAI SDK 코드에서 URL만 바꾸면 연동 |
| 오프라인 실행 | 모델 다운로드 후 인터넷 불필요 |
macOS, Windows, Linux를 모두 지원하며, MIT 라이선스로 자유롭게 사용할 수 있습니다.
EXAONE 3.5란?
EXAONE 3.5 ↗는 LG AI Research가 2024년 12월에 공개한 LLM 시리즈입니다. 가장 큰 특징은 한국어에 특화되어 있다는 점입니다. 어휘(Vocabulary)가 한국어 50% + 영어 50%로 구성되어, 한국어 텍스트를 적은 토큰으로 효율적으로 처리합니다.
모델 라인업
EXAONE 3.5는 세 가지 크기로 제공됩니다.
| 구분 | 2.4B | 7.8B | 32B |
|---|---|---|---|
| 레이어 수 | 30 | 32 | 64 |
| Attention Heads | 32 | 32 | 40 |
| 최대 컨텍스트 | 32,768 | 32,768 | 32,768 |
| 용도 | 가벼운 작업 | 범용 (권장) | 고품질 |
이 글에서는 7.8B 모델을 기준으로 설명합니다. 품질과 성능의 균형이 가장 좋고, 8GB RAM Mac에서도 실행 가능합니다.
왜 EXAONE 3.5인가?
동급(7~9B 파라미터) 모델과 비교하면 EXAONE 3.5:7.8B의 강점이 명확합니다.
실전 사용 벤치마크:
| 벤치마크 | EXAONE 3.5 7.8B | Llama 3.1 8B | Qwen 2.5 7B | Gemma 2 9B |
|---|---|---|---|---|
| MT-Bench | 8.29 | 7.59 | 6.48 | 7.64 |
| Arena-Hard | 68.7 | 27.7 | 48.9 | 43.6 |
| IFEval | 78.9% | 74.5% | 72.5% | 54.7% |
| HumanEval | 84.2% | 67.7% | 82.3% | 68.3% |
한국어 벤치마크 — 여기서 차이가 압도적입니다.
| 벤치마크 | EXAONE 3.5 7.8B | Qwen 2.5 7B | Llama 3.1 8B | Gemma 2 9B |
|---|---|---|---|---|
| KoMT-Bench | 7.96 | 5.19 | 4.85 | 7.10 |
| LogicKor | 9.08 | 6.38 | 5.99 | 8.05 |
한국어 성능에서 2위(Gemma 2 9B)와도 큰 격차를 보입니다. 특히 Qwen 2.5는 32B 미만 모델에서 한국어 질문에 한국어로 답변하지 못하는 경우가 빈번합니다. 한국어 용도라면 EXAONE 3.5가 최선의 선택입니다.
아키텍처 특징
EXAONE 3.5는 현대적인 Transformer 아키텍처를 채택했습니다.
- Decoder-only Transformer 기반
- SwiGLU 활성화 함수
- RMSNorm 사전 정규화
- RoPE 위치 인코딩 (theta=1,000,000)
- GQA (Grouped Query Attention)로 추론 효율 극대화
- 9T(9조) 토큰으로 학습, SFT + DPO 기반 선호도 최적화
라이선스 주의사항
EXAONE 3.5는 비상업적 용도로만 무료 사용이 가능합니다. 연구, 학술, 실험, 대회 참여 등에 자유롭게 사용할 수 있지만, 상업적으로 활용하려면 LG AI Research에 별도 문의가 필요합니다 (contact_us@lgresearch.ai).
설치 방법
시스템 요구사항
먼저 내 Mac이 조건을 충족하는지 확인합니다.
| 항목 | 최소 | 권장 |
|---|---|---|
| macOS | 11 Big Sur 이상 | 최신 버전 |
| RAM | 8GB | 16GB 이상 |
| 디스크 여유 공간 | 20GB | 30GB 이상 |
| 프로세서 | Intel / Apple Silicon | Apple Silicon (M1+) |
Apple Silicon Mac에서는 Metal API를 자동으로 활용하여 GPU 가속을 받습니다. Intel Mac은 CPU만 사용하므로 성능이 상당히 느립니다.
방법 1: Homebrew로 설치 (권장)
Homebrew가 설치되어 있다면 가장 간단한 방법입니다.
CLI 전용 설치:
brew install ollama
GUI 앱 포함 설치 (메뉴바 아이콘, 자동 시작):
brew install --cask ollama
CLI 전용으로 설치하면 ollama serve로 직접 서버를 시작해야 합니다. Cask로 설치하면 앱을 실행할 때 서버가 자동으로 시작됩니다.
방법 2: 공식 사이트에서 다운로드
- ollama.com/download/mac ↗에서 DMG 파일을 다운로드합니다
- DMG를 열고 Ollama 앱을 Applications 폴더로 드래그 앤 드롭합니다
- Applications에서 Ollama를 실행합니다
설치 확인
설치가 완료되면 버전을 확인합니다.
ollama --version
정상적으로 설치되었다면 ollama version x.x.x 같은 출력이 나타납니다.
EXAONE 3.5 모델 다운로드 및 실행
모델 다운로드
Ollama가 실행 중인 상태에서 모델을 다운로드합니다.
# EXAONE 3.5:7.8B 다운로드 (기본 양자화: q4_K_M, 4.8GB)
ollama pull exaone3.5:7.8b
Cask로 설치한 경우 앱을 먼저 실행해야 합니다. CLI로 설치한 경우 별도 터미널에서
ollama serve를 먼저 실행하세요.
다운로드에는 인터넷 속도에 따라 몇 분이 소요됩니다. 약 4.8GB를 다운로드합니다.
대화 시작
다운로드가 완료되면 바로 대화할 수 있습니다.
ollama run exaone3.5:7.8b
프롬프트가 나타나면 한국어로 질문해 보세요.
>>> 안녕하세요! 자기소개 부탁합니다.
안녕하세요! 저는 LG AI Research에서 개발한 EXAONE이라는 AI 어시스턴트입니다.
다양한 주제에 대해 한국어와 영어로 도움을 드릴 수 있습니다.
궁금한 점이 있으시면 무엇이든 물어보세요!
>>> /bye
대화를 종료하려면 /bye를 입력합니다.
양자화 변형 선택
모델을 다운로드할 때 양자화(quantization) 수준을 선택할 수 있습니다. 양자화란 모델의 가중치를 더 적은 비트로 표현하여 크기를 줄이는 기법입니다. 비트가 낮을수록 파일 크기가 작고 빠르지만, 품질이 약간 떨어집니다.
| 태그 | 크기 | 특징 | 권장 RAM |
|---|---|---|---|
exaone3.5:7.8b (q4_K_M) | 4.8GB | 기본값. 품질과 크기의 균형 | 8GB+ |
exaone3.5:7.8b-instruct-q8_0 | 8.3GB | 더 높은 품질 | 16GB+ |
exaone3.5:7.8b-instruct-fp16 | 16GB | 원본에 가까운 최고 품질 | 32GB+ |
Mac 사양에 맞는 양자화를 선택하세요.
# 고품질 버전 (16GB RAM 이상)
ollama pull exaone3.5:7.8b-instruct-q8_0
# 최고 품질 버전 (32GB RAM 이상)
ollama pull exaone3.5:7.8b-instruct-fp16
RAM이 8GB라면 기본 q4_K_M을 사용하세요. 체감 품질 차이는 생각보다 크지 않습니다.
다른 크기의 EXAONE 3.5
작업 특성에 따라 다른 크기의 모델을 사용할 수도 있습니다.
# 가벼운 모델 (1.6GB) — 빠른 응답, 간단한 작업에 적합
ollama pull exaone3.5:2.4b
# 대형 모델 (19GB) — 최고 품질, 32GB+ RAM 필요
ollama pull exaone3.5:32b
기본 명령어 정리
Ollama의 핵심 명령어를 정리합니다.
# 서버 관리
ollama serve # 서버 시작 (앱 실행 시 자동)
# 모델 관리
ollama pull <model> # 모델 다운로드
ollama list # 설치된 모델 목록 확인
ollama show <model> # 모델 상세 정보 확인
ollama rm <model> # 모델 삭제
# 모델 실행
ollama run <model> # 대화형 실행
ollama run <model> "질문" # 단일 질문 후 종료
설치된 모델을 확인해 봅시다.
ollama list
NAME ID SIZE MODIFIED
exaone3.5:7.8b abc123def 4.8GB 2 minutes ago
모델의 상세 정보도 확인할 수 있습니다.
ollama show exaone3.5:7.8b
실전 활용 예제
터미널에서 직접 대화하는 것도 좋지만, API를 활용하면 자신만의 앱에 LLM을 통합할 수 있습니다. Ollama는 기본적으로 http://localhost:11434에서 REST API를 제공합니다.
REST API (curl)
단일 응답 생성
/api/generate 엔드포인트로 단일 프롬프트에 대한 응답을 받을 수 있습니다.
curl http://localhost:11434/api/generate -d '{
"model": "exaone3.5:7.8b",
"prompt": "React의 useState와 useReducer의 차이를 설명해주세요.",
"stream": false
}'
"stream": false를 설정하면 전체 응답을 한 번에 받습니다. 생략하면 토큰 단위로 스트리밍됩니다.
대화형 채팅
/api/chat 엔드포인트는 대화 기록을 유지하며 채팅할 수 있습니다.
curl http://localhost:11434/api/chat -d '{
"model": "exaone3.5:7.8b",
"messages": [
{
"role": "system",
"content": "당신은 시니어 프론트엔드 개발자입니다. 한국어로 답변합니다."
},
{
"role": "user",
"content": "TypeScript의 제네릭을 쉽게 설명해줘"
}
],
"stream": false
}'
system 메시지로 모델의 역할을 지정하면 더 전문적인 답변을 받을 수 있습니다.
OpenAI 호환 API
Ollama는 OpenAI 형식의 API도 제공합니다. 기존에 OpenAI API를 사용하던 코드에서 URL만 변경하면 됩니다.
curl http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "exaone3.5:7.8b",
"messages": [
{
"role": "system",
"content": "한국어로 답변하는 도움이 되는 어시스턴트입니다."
},
{
"role": "user",
"content": "안녕하세요!"
}
]
}'
주요 API 엔드포인트 정리
| 엔드포인트 | 메서드 | 설명 |
|---|---|---|
/api/generate | POST | 단일 프롬프트 → 텍스트 생성 |
/api/chat | POST | 대화형 메시지 → 채팅 |
/v1/chat/completions | POST | OpenAI 호환 채팅 API |
/api/tags | GET | 로컬 설치된 모델 목록 |
/api/show | POST | 모델 상세 정보 |
/api/pull | POST | 모델 다운로드 |
Python 연동
Python에서 Ollama를 사용하려면 공식 라이브러리를 설치합니다.
pip install ollama
기본 채팅
from ollama import chat, ChatResponse
response: ChatResponse = chat(
model='exaone3.5:7.8b',
messages=[
{
'role': 'system',
'content': '당신은 한국어로 답변하는 AI 어시스턴트입니다.'
},
{
'role': 'user',
'content': 'Python에서 비동기 프로그래밍이란?'
}
]
)
print(response.message.content)
스트리밍 응답
긴 응답을 실시간으로 출력하고 싶다면 스트리밍을 사용합니다.
from ollama import chat
stream = chat(
model='exaone3.5:7.8b',
messages=[
{'role': 'user', 'content': '한국의 사계절을 설명해줘'}
],
stream=True,
)
for chunk in stream:
print(chunk.message.content, end='', flush=True)
비동기 클라이언트
FastAPI 같은 비동기 프레임워크와 함께 사용할 때 유용합니다.
import asyncio
from ollama import AsyncClient
async def main():
response = await AsyncClient().chat(
model='exaone3.5:7.8b',
messages=[
{'role': 'user', 'content': '안녕하세요!'}
]
)
print(response.message.content)
asyncio.run(main())
에러 핸들링
모델이 아직 다운로드되지 않은 경우를 대비한 에러 처리 예제입니다.
import ollama
try:
response = ollama.chat(
model='exaone3.5:7.8b',
messages=[{'role': 'user', 'content': '테스트'}]
)
print(response.message.content)
except ollama.ResponseError as e:
print('Error:', e.error)
if e.status_code == 404:
print('모델을 다운로드합니다...')
ollama.pull('exaone3.5:7.8b')
JavaScript/Node.js 연동
Node.js에서 Ollama를 사용하려면 공식 라이브러리를 설치합니다.
npm install ollama
기본 채팅
import ollama from "ollama";
const response = await ollama.chat({
model: "exaone3.5:7.8b",
messages: [
{
role: "system",
content: "한국어로 답변하는 AI 어시스턴트입니다.",
},
{
role: "user",
content: "Express.js와 Fastify의 차이점은?",
},
],
});
console.log(response.message.content);
스트리밍 응답
import ollama from "ollama";
const response = await ollama.chat({
model: "exaone3.5:7.8b",
messages: [{ role: "user", content: "자바스크립트 클로저를 설명해줘" }],
stream: true,
});
for await (const part of response) {
process.stdout.write(part.message.content);
}
커스텀 호스트 설정
원격 서버의 Ollama에 연결할 때는 호스트를 지정합니다.
import { Ollama } from "ollama";
const client = new Ollama({ host: "http://192.168.1.100:11434" });
const response = await client.chat({
model: "exaone3.5:7.8b",
messages: [{ role: "user", content: "안녕!" }],
});
console.log(response.message.content);
OpenAI SDK와 연동
이미 OpenAI SDK를 사용하고 있다면, base_url만 변경하면 됩니다.
Python (openai 패키지):
from openai import OpenAI
# Ollama의 OpenAI 호환 엔드포인트
client = OpenAI(
base_url='http://localhost:11434/v1',
api_key='ollama' # 아무 값이나 가능
)
response = client.chat.completions.create(
model='exaone3.5:7.8b',
messages=[
{'role': 'system', 'content': '한국어로 답변하는 어시스턴트입니다.'},
{'role': 'user', 'content': 'TypeScript와 JavaScript의 차이는?'}
]
)
print(response.choices[0].message.content)
Node.js (openai 패키지):
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "http://localhost:11434/v1",
apiKey: "ollama", // 아무 값이나 가능
});
const response = await client.chat.completions.create({
model: "exaone3.5:7.8b",
messages: [{ role: "user", content: "안녕하세요!" }],
});
console.log(response.choices[0].message.content);
기존 코드를 거의 수정하지 않고 로컬 LLM으로 전환할 수 있다는 점이 Ollama의 큰 장점입니다.
Modelfile로 나만의 모델 만들기
Modelfile을 사용하면 시스템 프롬프트와 파라미터를 미리 설정한 커스텀 모델을 만들 수 있습니다. 매번 시스템 프롬프트를 입력할 필요가 없어집니다.
Modelfile 작성
프로젝트 디렉토리에 Modelfile이라는 이름으로 파일을 생성합니다.
FROM exaone3.5:7.8b
# 시스템 프롬프트 설정
SYSTEM "당신은 시니어 풀스택 개발자 어시스턴트입니다. 한국어로 답변하며, 코드 예제를 포함하여 명확하게 설명합니다. 코드에는 반드시 주석을 달아주세요."
# 파라미터 조정
PARAMETER temperature 0.7
PARAMETER top_p 0.9
PARAMETER num_predict 2048
커스텀 모델 생성 및 실행
# 커스텀 모델 생성
ollama create my-dev-assistant -f Modelfile
# 실행
ollama run my-dev-assistant
이렇게 만든 커스텀 모델은 ollama list에서 확인할 수 있고, 일반 모델처럼 API에서도 사용 가능합니다.
활용 예시
용도별로 여러 커스텀 모델을 만들어 두면 편리합니다.
# 코드 리뷰 전문가
FROM exaone3.5:7.8b
SYSTEM "당신은 코드 리뷰 전문가입니다. 보안 취약점, 성능 이슈, 코드 스멜을 찾아 개선 방안을 제시합니다."
PARAMETER temperature 0.3
# 기술 문서 작성자
FROM exaone3.5:7.8b
SYSTEM "당신은 기술 문서 작성 전문가입니다. 명확하고 구조화된 한국어 기술 문서를 작성합니다."
PARAMETER temperature 0.5
# 창의적 브레인스토밍 파트너
FROM exaone3.5:7.8b
SYSTEM "당신은 창의적인 아이디어를 제안하는 브레인스토밍 파트너입니다. 다양한 관점에서 아이디어를 제시합니다."
PARAMETER temperature 0.9
팁과 주의사항
Mac 하드웨어별 권장 설정
| Mac 모델 | RAM | 권장 모델/양자화 | 예상 VRAM 사용 |
|---|---|---|---|
| M1/M2 Air | 8GB | exaone3.5:7.8b (q4_K_M) | ~4.8GB |
| M2/M3 Pro | 16-24GB | exaone3.5:7.8b-instruct-q8_0 | ~8.3GB |
| M3/M4 Max/Ultra | 32GB+ | exaone3.5:7.8b-instruct-fp16 | ~16GB |
Intel Mac을 사용 중이라면 CPU만 사용되어 응답이 상당히 느립니다. 이 경우 2.4B 모델(
exaone3.5:2.4b)을 권장합니다.
메모리 최적화
Ollama는 모델을 메모리에 올려서 실행합니다. 메모리가 부족하면 응답 속도가 크게 느려집니다.
메모리 확보 방법:
- 브라우저 탭 정리: Chrome, Safari 각 탭이 100-300MB를 소모합니다
- 무거운 앱 종료: Slack, Docker Desktop 등 메모리를 많이 쓰는 앱을 닫습니다
- Activity Monitor 확인: 메모리 압력(Memory Pressure)이 녹색인지 확인합니다
Apple Silicon Mac은 Unified Memory Architecture(UMA)를 사용하여 CPU와 GPU가 동일한 메모리를 공유합니다. 별도의 VRAM이 없으므로 메모리 압력이 높아지면 macOS가 모델 데이터를 디스크(스왑)로 내보내는데, 이때 응답 속도가 느려지는 것은 정상입니다.
트러블슈팅
| 증상 | 원인 | 해결 |
|---|---|---|
| ”model requires more system memory” | RAM 부족 | 더 작은 양자화(q4_K_M) 또는 2.4B 모델 사용 |
| 응답 속도가 매우 느림 | GPU 메모리 부족으로 CPU 폴백 | 브라우저/앱 종료로 메모리 확보 |
| ”connection refused” | Ollama 서버 미실행 | ollama serve 실행 또는 Ollama 앱 실행 |
| 모델 다운로드 중 실패 | 네트워크 또는 디스크 문제 | 인터넷 연결 확인, 디스크 여유 공간 확인 |
GPU 가속 확인
Apple Silicon에서 Metal API가 정상적으로 사용되고 있는지 확인할 수 있습니다.
# Ollama 로그에서 Metal 관련 메시지 확인
cat ~/.ollama/logs/server.log | grep "metal"
디버그 모드
문제 해결이 어려울 때는 디버그 모드로 Ollama를 실행합니다.
# 디버그 모드로 서버 시작
OLLAMA_DEBUG=1 ollama serve
# 또는 로그 파일 직접 확인
cat ~/.ollama/logs/server.log
모델 저장 위치
Ollama가 다운로드한 모델은 기본적으로 ~/.ollama/models/ 디렉토리에 저장됩니다. 디스크 공간이 부족할 때 이 경로를 확인하세요.
# 모델 저장 위치 확인
ls -la ~/.ollama/models/
# 특정 모델 삭제로 공간 확보
ollama rm exaone3.5:7.8b-instruct-fp16
마무리
이 글에서 다룬 내용을 정리합니다.
- Ollama 설치 —
brew install --cask ollama한 줄로 설치 - EXAONE 3.5 다운로드 —
ollama pull exaone3.5:7.8b로 한국어 특화 모델 다운로드 - 대화형 실행 —
ollama run exaone3.5:7.8b로 즉시 대화 시작 - API 연동 — REST API, Python, Node.js에서 활용
- 커스텀 모델 — Modelfile로 용도별 맞춤 모델 생성
로컬 LLM은 클라우드 서비스를 대체하는 것이 아니라 보완하는 도구입니다. 민감한 데이터 처리, 오프라인 환경, 빠른 프로토타이핑에서 특히 빛을 발합니다. EXAONE 3.5는 한국어 작업에서 동급 모델 중 최고 성능을 보여주므로, 한국어 중심 작업에 적극 활용해 보시길 권합니다.
더 나아가고 싶다면 Ollama 공식 문서 ↗와 EXAONE 3.5 GitHub 리포지토리 ↗를 참고하세요.
참고 자료
Ollama
- Ollama 공식 사이트 ↗
- Ollama GitHub 리포지토리 ↗
- Ollama API 문서 ↗
- Ollama OpenAI 호환 API ↗
- Ollama Python 라이브러리 ↗
- Ollama JavaScript 라이브러리 ↗
- Modelfile 레퍼런스 ↗