[개발자] 데이터 유출 걱정 없이 쓸 수 있는 로컬 LLM 입문, Ollama

AI튜터랩
회사 코드도, 고객 데이터도 외부로 보내지 않고 AI를 쓸 수 있을까?
[이미지 삽입: 왼쪽에는 소스코드와 문서가 외부 클라우드로 전송되는 모습, 오른쪽에는 개발자의 노트북 안에서 AI 모델이 실행되는 모습을 대비한 메인 이미지]
“사내 문서를 AI에게 분석시키고 싶은데, 외부 API에 올려도 괜찮을까?”
“코딩 어시스턴트를 붙이고 싶지만 호출 비용이 계속 늘어나면 어떡하지?”
“인터넷이 없는 개발 환경에서도 LLM을 사용할 수 없을까?”
생성형 AI를 실제 서비스에 적용하려는 개발자라면 한 번쯤 고민해 본 문제입니다.
ChatGPT나 Claude 같은 클라우드 기반 AI는 강력하지만, 요청 데이터가 외부 서버로 전달된다는 점과 API 사용량에 따라 비용이 발생한다는 점을 고려해야 합니다.
이때 선택할 수 있는 방법이 바로 로컬 LLM입니다.
로컬 LLM은 대규모 언어 모델을 클라우드 API가 아니라 내 PC, 사내 서버 또는 자체 인프라에서 직접 실행하는 방식입니다. 그리고 복잡한 로컬 모델 실행 과정을 비교적 간단하게 만들어 주는 대표적인 도구가 Ollama입니다.
로컬 LLM을 직접 실행하기 어려운 이유
LLM 모델 파일을 내려받는 것만으로는 바로 AI 서비스를 만들 수 없습니다.
모델 형식과 양자화 방식을 확인해야 하고, GPU와 CPU 환경에 맞는 추론 엔진을 설치해야 합니다. 모델마다 프롬프트 형식이 다르고, 애플리케이션에서 호출할 API 서버도 별도로 구성해야 합니다.
❌ 기존 로컬 LLM 실행 방식의 어려움
모델별 실행 환경과 의존성을 직접 관리해야 합니다.
GPU 메모리에 맞는 모델 크기와 양자화 버전을 골라야 합니다.
모델마다 다른 프롬프트 템플릿을 처리해야 합니다.
서비스에서 사용하려면 별도의 추론 API 서버가 필요합니다.
모델 변경이나 업데이트 과정이 복잡합니다.
단순히 AI 모델 하나를 테스트하려고 했을 뿐인데, 정작 모델을 사용하는 시간보다 환경을 설정하는 시간이 더 길어질 수 있습니다.
우리가 해결해야 할 문제는 모델을 실행하는 것 자체가 아니라, 로컬 모델을 개발 환경에서 반복 가능하고 관리 가능한 형태로 운영하는 것입니다.
💡 Ollama는 로컬 LLM을 위한 실행 관리자입니다
Ollama는 다양한 언어 모델을 로컬 환경에 내려받아 실행하고, CLI와 REST API를 통해 애플리케이션에서 사용할 수 있도록 도와주는 도구입니다.
macOS, Windows, Linux를 지원하며, 설치 후 ollama run 모델명과 같은 명령어로 모델을 실행할 수 있습니다.
쉽게 비유하면 Ollama는 로컬 LLM을 위한 Docker와 패키지 관리자, 추론 API 서버를 결합한 도구에 가깝습니다.
개발자는 모델의 세부 실행 명령을 매번 직접 구성하는 대신 다음과 같은 작업에 집중할 수 있습니다.
어떤 모델을 사용할지 선택하기
프롬프트와 시스템 메시지 설계하기
백엔드 서비스와 연결하기
RAG나 AI 에이전트 구조로 확장하기
응답 속도와 메모리 사용량 최적화하기
Ollama 설치 후에는 기본적으로 로컬의 다음 주소에서 API를 사용할 수 있습니다.
http://localhost:11434/api로컬 주소를 통한 API 요청에는 별도의 인증이 필요하지 않습니다.
⚠️ 주의 : 인증이 없다는 것은 개발 환경에서는 편리하지만, Ollama 포트를 외부 네트워크에 그대로 공개하면 위험할 수 있다는 뜻이기도 합니다. 외부에서 접근하게 만들 경우 반드시 방화벽, 리버스 프록시, 인증 계층을 별도로 구성해야 합니다.
Ollama 를 이용하여 로컬 LLM 사용해보기
STEP 1. Ollama 설치하기
macOS
공식 설치 파일을 내려받은 뒤 Ollama 애플리케이션을 Applications 폴더로 이동합니다. Ollama 앱을 실행하면 CLI 명령어를 사용할 수 있도록 설정할 수 있습니다.
설치 여부는 터미널에서 확인합니다.
ollama --versionWindows
Windows에서는 공식 OllamaSetup.exe 설치 프로그램을 사용하는 것이 가장 간단합니다. 공식 문서에 따르면 사용자 계정에 설치할 수 있으며, 일반적인 설치 과정에서는 관리자 권한이 필요하지 않습니다.
설치 후 PowerShell에서 확인합니다.
ollama --versionLinux
Linux에서는 다음 명령어로 설치할 수 있습니다.
curl -fsSL https://ollama.com/install.sh | sh서비스 로그를 확인해야 할 때는 다음 명령어를 사용할 수 있습니다.
journalctl -e -u ollamaSTEP 2. 첫 번째 로컬 모델 실행하기
설치가 끝났다면 터미널에서 모델을 실행합니다.
ollama run gemma3해당 모델이 로컬에 없다면 Ollama가 먼저 모델 파일을 내려받고, 다운로드가 완료되면 대화형 터미널을 실행합니다. 공식 CLI 문서에서도 ollama run gemma3 형태로 모델을 실행하도록 안내합니다.
실행 후 질문을 입력해 봅니다.
>>> Python의 generator와 iterator 차이를 예제와 함께 설명해 줘.
대화를 종료할 때는 다음 명령을 입력합니다.
/bye모델을 실행하지 않고 미리 다운로드만 하고 싶다면 pull을 사용합니다.
ollama pull gemma3현재 내려받은 모델 목록은 다음과 같이 확인합니다.
ollama list실행 중인 모델을 확인하려면 다음 명령어를 사용합니다.
ollama ps또는 API로도 확인할 수 있습니다.
curl http://localhost:11434/api/ps어떤 크기의 모델을 선택해야 할까?
로컬 LLM에서는 무조건 큰 모델을 고르는 것이 정답이 아닙니다. 모델이 클수록 일반적으로 더 많은 메모리와 연산 자원이 필요하고, 첫 응답과 전체 생성 시간이 길어질 수 있습니다.
처음에는 다음 기준으로 시작하는 것이 좋습니다.
가벼운 개발 테스트
간단한 문장 생성
프롬프트 실험
API 연동 확인
로컬 챗봇 프로토타입
이 경우에는 비교적 작은 파라미터 규모의 모델이나 양자화된 모델부터 테스트합니다.
코딩 및 문서 분석
코드 설명과 리팩터링
긴 기술 문서 요약
저장소 단위 코드 분석
RAG 기반 사내 검색
이 경우에는 모델의 코딩 능력뿐 아니라 컨텍스트 길이를 함께 확인해야 합니다. 컨텍스트 길이는 모델이 한 번의 요청에서 참고할 수 있는 입력 범위입니다.
Ollama는 VRAM 규모에 따라 기본 컨텍스트 길이를 다르게 적용합니다. 공식 문서 기준으로 VRAM이 24GiB 미만이면 4K, 24~48GiB는 32K, 48GiB 이상은 256K가 기본값이며, 코딩 도구나 에이전트처럼 긴 입력을 사용하는 작업은 더 큰 컨텍스트 설정이 필요할 수 있습니다.
💡 모델 선택의 핵심
모델 이름보다 먼저 확인해야 할 것은 내 장비에서 실제로 사용할 수 있는 속도와 메모리 사용량입니다.
성능이 높은 모델이라도 응답 하나에 수십 초가 걸리면 실시간 서비스에는 적합하지 않을 수 있습니다.
STEP 3. REST API로 로컬 LLM 호출하기
터미널에서 모델이 정상적으로 실행된다면 이제 애플리케이션과 연결할 차례입니다. Ollama는 모델 실행과 관리를 위한 REST API를 제공합니다.
cURL로 채팅 요청 보내기
curl http://localhost:11434/api/chat \
-d '{
"model": "gemma3",
"messages": [
{
"role": "system",
"content": "너는 친절한 시니어 백엔드 개발자다."
},
{
"role": "user",
"content": "REST API와 RPC의 차이를 설명해 줘."
}
],
"stream": false
}'주요 필드는 다음과 같습니다.
model: 사용할 모델 이름messages: 대화 기록role:system,user,assistant등의 메시지 역할stream: 응답을 스트리밍 형태로 받을지 여부
stream을 false로 설정하면 완성된 응답을 한 번에 받습니다.
true로 설정하면 토큰이 생성되는 순서대로 여러 JSON 응답이 전달됩니다. 챗봇 UI처럼 글자가 실시간으로 출력되는 기능을 만들 때 유용합니다.
STEP 4. Python 프로젝트에 연결하기
Ollama는 공식 Python 라이브러리를 제공합니다.
먼저 패키지를 설치합니다.
pip install ollama공식 Python 라이브러리는 Ollama가 실행 중이고 사용할 모델이 로컬에 준비되어 있다는 것을 전제로 합니다.
다음과 같이 채팅 요청을 보낼 수 있습니다.
from ollama import chat
from ollama import ChatResponse
def ask_local_llm(question: str) -> str:
response: ChatResponse = chat(
model="gemma3",
messages=[
{
"role": "system",
"content": (
"너는 10년 차 Python 개발자다. "
"답변에는 실행 가능한 예제를 포함한다."
),
},
{
"role": "user",
"content": question,
},
],
)
return response.message.content
if __name__ == "__main__":
answer = ask_local_llm(
"FastAPI에서 의존성 주입을 사용하는 예제를 보여 줘.")
print(answer)
이 구조를 사용하면 기존 백엔드 코드에서 외부 AI API 대신 로컬 Ollama를 호출할 수 있습니다.
HTTP 클라이언트로 직접 호출하는 방법
SDK에 의존하지 않고 직접 API를 호출할 수도 있습니다.
from typing import Any
import requests
OLLAMA_CHAT_URL = "http://localhost:11434/api/chat"
def ask_ollama(question: str) -> str:
payload: dict[str, Any] = {
"model": "gemma3",
"messages": [
{
"role": "system",
"content": "너는 정확하고 간결하게 답하는 개발 도우미다.",
},
{
"role": "user",
"content": question,
},
],
"stream": False,
}
try:
response = requests.post(
OLLAMA_CHAT_URL,
json=payload,
timeout=120,
)
response.raise_for_status()
except requests.RequestException as exc:
raise RuntimeError(f"Ollama 호출에 실패했습니다: {exc}") from exc
data = response.json()
return data["message"]["content"]
if __name__ == "__main__":
print(ask_ollama("Docker 이미지와 컨테이너의 차이를 설명해 줘."))직접 HTTP 요청을 사용하면 타임아웃, 재시도, 로깅, 인증 프록시 등을 서비스 요구사항에 맞게 세밀하게 제어할 수 있습니다.
STEP 5. Node.js 프로젝트에 연결하기
JavaScript와 TypeScript 프로젝트에서는 공식 ollama 패키지를 사용할 수 있습니다.
npm install ollama공식 JavaScript 라이브러리는 로컬 Ollama 인스턴스를 애플리케이션에서 호출할 수 있도록 지원합니다.
import ollama from "ollama";
async function askLocalLLM(question: string): Promise<string> {
const response = await ollama.chat({
model: "gemma3",
messages: [
{
role: "system",
content: "너는 TypeScript 전문 개발자다.",
},
{
role: "user",
content: question,
},
],
});
return response.message.content;
}
async function main(): Promise<void> {
try {
const answer = await askLocalLLM(
"Express와 Fastify의 구조적 차이를 설명해 줘.",
);
console.log(answer);
} catch (error) {
console.error("Ollama 호출 실패:", error);
process.exitCode = 1;
}
}
void main();
STEP 6. OpenAI SDK를 그대로 재사용하기
기존 프로젝트가 OpenAI SDK를 사용하고 있다면 전체 코드를 새로 작성할 필요가 없습니다. Ollama는 OpenAI API의 일부 형식과 호환되는 엔드포인트를 제공합니다.
기본 주소를 다음과 같이 변경할 수 있습니다.
http://localhost:11434/v1Python 예시는 다음과 같습니다.
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:11434/v1", api_key="ollama")
response = client.chat.completions.create(
model="gemma3",
messages=[
{
"role": "system",
"content": "너는 백엔드 아키텍처 리뷰어다.",
},
{
"role": "user",
"content": "이벤트 기반 아키텍처의 장단점을 설명해 줘.",
},
],
)
print(response.choices[0].message.content)로컬 Ollama API 자체에는 인증 키가 필요하지 않지만, 일부 OpenAI SDK에서는 형식상 api_key 값을 요구할 수 있어 임의의 문자열을 입력하는 방식이 사용됩니다.
이 방식을 활용하면 환경 변수에 따라 클라우드 모델과 로컬 모델을 전환하는 구조도 만들 수 있습니다.
import os
from openai import OpenAI
use_local_llm = os.getenv("USE_LOCAL_LLM", "true").lower() == "true"
if use_local_llm:
client = OpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama",
)
model_name = "gemma3"
else:
client = OpenAI(
api_key=os.environ["OPENAI_API_KEY"],
)
model_name = os.getenv("OPENAI_MODEL", "YOUR_CLOUD_MODEL")
✅ 개발 환경에서는 로컬 모델 사용
✅ 품질 검증이나 운영 환경에서는 클라우드 모델 사용
✅ 동일한 인터페이스를 유지하면서 모델 제공자 교체
이런 구조를 만들면 특정 LLM 제공자에 대한 의존도를 줄일 수 있습니다.
STEP 7. Modelfile로 우리 팀 전용 모델 만들기
매번 API 요청마다 긴 시스템 프롬프트와 파라미터를 반복해서 전달하면 관리가 어려워집니다. Ollama에서는 Modelfile을 사용해 기본 모델, 시스템 프롬프트, 생성 파라미터 등을 정의한 커스텀 모델을 만들 수 있습니다.
공식 문서는 Modelfile을 Ollama 커스텀 모델을 생성하고 공유하기 위한 설계도라고 설명합니다.
프로젝트 폴더에 Modelfile을 생성합니다.
FROM gemma3
SYSTEM """
너는 우리 팀의 시니어 코드 리뷰어다.
다음 기준으로 코드를 검토한다.
1. 잠재적인 버그
2. 보안 취약점
3. 성능 문제
4. 가독성과 유지보수성
5. 테스트가 필요한 예외 상황
문제를 지적할 때는 반드시 수정 예제를 함께 제공한다.
"""
PARAMETER temperature 0.2
PARAMETER num_ctx 8192
커스텀 모델을 생성합니다.
ollama create team-code-reviewer -f ./Modelfile생성한 모델을 실행합니다.
ollama run team-code-reviewer이제 애플리케이션에서도 동일한 모델 이름을 사용할 수 있습니다.
response = chat(
model="team-code-reviewer",
messages=[
{
"role": "user",
"content": "다음 FastAPI 코드를 리뷰해 줘: ...",
}
],
)이 방식의 장점은 단순합니다.
☑ 팀의 리뷰 기준을 모델 설정에 고정할 수 있습니다.
☑ 개발자마다 다른 시스템 프롬프트를 사용하는 문제를 줄일 수 있습니다.
☑ 프롬프트와 모델 설정을 Git으로 버전 관리할 수 있습니다.
☑ 개발·스테이징 환경에서 동일한 모델 구성을 재현할 수 있습니다.
로컬 LLM으로 무엇을 만들 수 있을까?
Ollama를 설치했다고 해서 반드시 범용 챗봇부터 만들 필요는 없습니다. 로컬 LLM은 범위가 명확하고 반복되는 내부 업무에서 특히 효과적입니다.
1. 로컬 코딩 어시스턴트
코드 설명
리팩터링 제안
테스트 코드 초안 생성
SQL 작성
로그 분석
정규표현식 생성
외부 전송이 어려운 사내 저장소의 코드도 로컬 환경에서 분석할 수 있습니다.
2. 사내 문서 검색 RAG
RAG는 검색 증강 생성의 약자입니다. 모델이 모든 사내 지식을 학습하도록 만드는 대신, 질문과 관련된 문서를 먼저 검색하고 검색 결과를 프롬프트에 포함하는 방식입니다.
사용자 질문
↓
관련 문서 검색
↓
검색 결과와 질문을 Ollama에 전달
↓
문서 근거 기반 답변 생성
사내 규정, 기술 문서, 장애 대응 기록, API 명세 등을 검색하는 내부 AI 도우미로 확장할 수 있습니다.
3. 개인정보가 포함된 텍스트 처리
고객 상담 내용 분류
내부 회의록 요약
계약서 핵심 항목 추출
보안 로그 설명
개발 이슈 자동 분류
다만 “로컬에서 실행한다”는 사실만으로 모든 보안 문제가 해결되지는 않습니다.
로그 저장 위치, 사용자 접근 권한, 모델 파일 공급망, 프롬프트 인젝션, 생성 결과의 정확성까지 함께 관리해야 합니다.
로컬 LLM이 항상 정답은 아닙니다
Ollama를 사용하면 데이터 통제와 개발 자유도가 높아지지만, 모든 상황에서 클라우드 AI보다 유리한 것은 아닙니다.
로컬 LLM이 잘 맞는 경우
✅ 외부 반출이 어려운 코드나 문서를 다룰 때
✅ 인터넷이 제한된 환경에서 AI가 필요할 때
✅ 반복적인 대량 요청으로 API 비용이 부담될 때
✅ 특정 모델과 프롬프트 구성을 직접 통제해야 할 때
✅ 개인 프로젝트나 사내 PoC를 빠르게 만들 때
클라우드 LLM이 더 적합할 수 있는 경우
❌ 고성능 GPU를 직접 운영하기 어려울 때
❌ 최고 수준의 추론 품질이 최우선일 때
❌ 갑작스러운 트래픽 증가를 처리해야 할 때
❌ 모델 배포와 모니터링 인력이 부족할 때
❌ 모바일이나 저사양 장비에서 직접 모델을 실행해야 할 때
💡 실무에서는 하이브리드 구조가 현실적입니다
보안이 중요한 데이터와 반복 작업은 로컬 모델로 처리하고, 복잡한 추론이나 높은 품질이 필요한 요청만 클라우드 모델로 전달할 수 있습니다.
운영 전에 반드시 확인해야 할 5가지
1. 로컬이라고 해서 처음부터 완전한 오프라인은 아닙니다
모델을 최초로 사용할 때는 모델 파일을 내려받아야 합니다.
모델 다운로드가 완료된 후에는 해당 모델의 추론을 로컬에서 실행할 수 있지만, 외부 검색이나 클라우드 모델 기능을 함께 사용한다면 네트워크 연결이 필요할 수 있습니다.
2. 모델 파일은 상당한 저장 공간을 차지합니다
모델 크기에 따라 수 GB에서 수십 GB 이상의 저장 공간이 필요할 수 있습니다. macOS 공식 문서 역시 LLM 저장을 위해 수십에서 수백 GB의 추가 공간이 필요할 수 있다고 안내합니다.
3. 응답 품질은 모델과 장비에 따라 크게 달라집니다
같은 프롬프트라도 모델의 크기, 양자화 방식, 시스템 프롬프트, 컨텍스트 길이에 따라 결과가 달라집니다.
최소한 다음 항목을 기록하며 비교해야 합니다.
첫 토큰이 출력되기까지 걸린 시간
초당 생성 토큰 수
전체 요청 처리 시간
메모리와 VRAM 사용량
작업별 정답률
잘못된 정보를 생성하는 빈도
Ollama API 응답에는 모델 로딩 시간, 프롬프트 평가량, 생성 토큰 수 등 사용량과 성능 측정에 활용할 수 있는 정보가 포함됩니다.
4. API 포트를 외부에 그대로 공개하지 마세요
로컬 API는 기본적으로 인증 없이 사용할 수 있습니다.
따라서 사내 서버나 원격 서버에서 Ollama를 운영한다면 다음 구성이 필요합니다.
사용자 또는 애플리케이션
↓
인증 서버 또는 API Gateway
↓
요청 제한과 감사 로그
↓
Ollama
↓
로컬 모델
5. 모델 라이선스를 확인하세요
모델을 내려받아 실행할 수 있다는 사실과 상업적으로 자유롭게 사용할 수 있다는 것은 같은 의미가 아닙니다.
모델마다 재배포, 상업적 이용, 파생 모델 제작 조건이 다를 수 있습니다.
서비스에 적용하기 전에는 반드시 해당 모델의 라이선스와 사용 조건을 확인해야 합니다.
☑ Ollama를 적용하면 개발 과정이 이렇게 달라집니다
빠른 프로토타이핑
복잡한 추론 서버를 먼저 구축하지 않고도 CLI와 API로 로컬 모델을 테스트할 수 있습니다.
데이터 통제 강화
민감한 코드와 문서를 외부 AI API에 직접 전달하지 않는 구조를 설계할 수 있습니다.
비용 예측 가능성 향상
요청마다 비용을 지불하는 대신, 보유한 로컬 장비나 서버 자원을 중심으로 운영할 수 있습니다.
모델 교체 용이성
애플리케이션 구조를 유지하면서 용도에 맞는 모델을 비교하고 교체할 수 있습니다.
RAG와 에이전트로 확장
단순 챗봇을 넘어 사내 검색, 코드 리뷰, 문서 분석, 도구 호출 시스템으로 발전시킬 수 있습니다.
지금 바로 만들어 볼 최소 프로젝트
처음부터 거대한 사내 AI 플랫폼을 만들려고 하지 마세요.
다음 세 단계만 구현해도 충분합니다.
1단계: Ollama에서 모델 실행
ollama run gemma32단계: API 연결
curl http://localhost:11434/api/chat \
-d '{
"model": "gemma3",
"messages": [
{
"role": "user",
"content": "이 에러 로그의 원인을 분석해 줘."
}
],
"stream": false
}'3단계: 실제 개발 업무 하나에 적용
다음 중 하나를 선택합니다.
Git diff 코드 리뷰 도구
에러 로그 분석기
README 초안 생성기
SQL 설명 도구
사내 API 문서 질의응답
테스트 케이스 생성기
핵심은 “로컬 LLM으로 무엇이든 만들겠다”가 아닙니다.
반복적으로 발생하고, 입력과 출력이 명확하며, 사람이 결과를 검토할 수 있는 작은 업무 하나를 선택하는 것이 중요합니다.
👉 오늘 Ollama를 설치하고, 여러분이 어제 처리했던 개발 업무 하나를 로컬 LLM에 연결해 보세요.
작은 CLI 도구 하나에서 시작한 로컬 LLM이 이후에는 사내 문서 RAG, 코드베이스 분석기, 개발 에이전트의 기반이 될 수 있습니다.
댓글 (0)