Ollama가 포함된 로컬 LLM: 클라우드 없는 AI
데이터를 원격 서버로 보내는 것이 항상 필요하거나 바람직한 것은 아닙니다. 언어 모델로부터 답을 얻으세요. 그만큼 로컬 대형 언어 모델 완전한 개인정보 보호를 제공하는 클라우드 API에 대한 구체적인 대안을 제시합니다. 초기 설정 후 비용이 절감되고 완전히 오프라인으로 작업할 수 있습니다.
이 시리즈의 다섯 번째 기사에서는 웹 개발자를 위한 AI, 우리는 탐구할 것입니다 올라마, 로컬 LLM에 대한 액세스를 민주화한 도구입니다. 설치 방법, 선택할 모델, 애플리케이션에 통합하는 방법을 살펴보겠습니다. TypeScript/Node.js 및 클라우드보다 로컬 솔루션을 선호하는 것이 더 나은 경우.
무엇을 배울 것인가
- 클라우드 API 대신 로컬 LLM을 사용해야 하는 이유와 시기
- 모든 운영 체제에 Ollama 설치 및 구성
- Llama 3, Mistral, CodeLlama와 같은 템플릿을 다운로드하고 관리하세요.
- 프로그래밍 방식 통합을 위해 Ollama의 REST API 사용
- TypeScript/Node.js 프로젝트에 Ollama 통합
- Modelfiles로 모델 사용자 정의
- 프로덕션 환경을 위해 Docker에서 Ollama 실행
- 온프레미스 모델과 클라우드 모델 간의 성능 비교
시리즈 개요
| # | Articolo | 집중하다 |
|---|---|---|
| 1 | RAG 소개 | 기본 개념 |
| 2 | TypeScript 및 LangChain을 사용한 RAG | 실제 구현 |
| 3 | 벡터 데이터베이스 비교 | Chromadb, 솔방울, Weaviate |
| 4 | OpenAI 및 Anthropic API | API 통합 |
| 5 | Ollama와 함께하는 LLM 로컬(현재 위치) | 클라우드 없는 AI |
| 6 | 미세 조정과 RAG | 언제 무엇을 사용할 것인가 |
| 7 | AI 에이전트 | 에이전트 기반 아키텍처 |
| 8 | CI/CD의 AI | 지능형 자동화 |
1. 지역 LLM을 사용하는 이유
언어 모델을 로컬에서 실행하면 클라우드 API가 제공하는 고유한 이점을 얻을 수 있습니다. 그들은 일치할 수 없습니다. 그러나 이는 또한 측면에서 중요한 절충안을 포함합니다. 계산 능력과 결과의 품질이 중요합니다.
지역 LLM의 장점
| 이점 | 설명 | 이상적인 사용 사례 |
|---|---|---|
| 완전한 개인 정보 보호 | 어떤 데이터도 컴퓨터를 떠나지 않습니다. | 민감한 데이터, 독점 코드, GDPR |
| 비용 제로 | 설정 후 토큰에 대한 송장 없음 | 프로토타이핑, 집중 배치 처리 |
| 오프라인 기능 | 인터넷 연결 없이 작동 | Air-Gaped 환경, 이동 중에도 개발 가능 |
| 대기 시간 감소 | 네트워크 대기 시간 없음 | 실시간 자체 완성 애플리케이션 |
| 맞춤화 | 모델 및 매개변수에 대한 완전한 제어 | 도메인별 전문 템플릿 |
| 속도 제한 없음 | 무제한 요청 | 테스트, 벤치마킹, CI/CD |
하드웨어 요구 사항
로컬 모델에는 상당한 리소스가 필요합니다. 7B 매개변수 모델의 경우 최소 8GB RAM이 필요하며, 6GB 이상의 VRAM을 갖춘 GPU가 바람직합니다. 13B+ 모델의 경우 16GB 이상의 RAM 또는 12GB 이상의 VRAM을 갖춘 GPU가 필요합니다. GPU가 없으면 CPU 추론이 가능하지만 상당히 느립니다.
2. Ollama 설치 및 설정
Ollama는 다운로드, 설정 및 프로세스를 대폭 단순화합니다. 지역 언어 모델 실행. 단일 명령으로 다운로드할 수 있습니다. 지원되는 모델을 실행하세요.
# macOS - tramite Homebrew
brew install ollama
# macOS/Linux - tramite script ufficiale
curl -fsSL https://ollama.com/install.sh | sh
# Linux (Ubuntu/Debian) - tramite APT
curl -fsSL https://ollama.com/install.sh | sh
sudo systemctl enable ollama
sudo systemctl start ollama
# Windows - scarica l'installer da ollama.com
# oppure tramite winget:
winget install Ollama.Ollama
# Verifica installazione
ollama --version
템플릿 다운로드 및 관리
Ollama는 템플릿 관리를 위해 Docker와 유사한 시스템을 사용합니다. 모델은 한 번만 다운로드되고 로컬로 캐시됩니다.
# Scaricare un modello
ollama pull llama3.1
ollama pull mistral
ollama pull codellama
ollama pull phi3
# Eseguire un modello (scarica automaticamente se non presente)
ollama run llama3.1
# Elencare i modelli installati
ollama list
# Output esempio:
# NAME ID SIZE MODIFIED
# llama3.1:latest 365c0bd3c0 4.7 GB 2 days ago
# mistral:latest f974a74358 4.1 GB 5 days ago
# codellama:latest 8fdf89f89a 3.8 GB 1 week ago
# Rimuovere un modello
ollama rm codellama
# Mostrare i dettagli di un modello
ollama show llama3.1
# Copiare un modello con un nome personalizzato
ollama cp llama3.1 mio-assistente
3. 사용 가능한 모델 비교
모델 선택은 응답 품질 간의 균형에 따라 달라집니다. 추론 속도 및 사용 가능한 하드웨어 리소스. 비교는 다음과 같습니다. Ollama에서 가장 인기 있는 모델 중 하나입니다.
주요 모델 비교
| 모델 | 매개변수 | 크기 | 최소 RAM | 사용 사례 | 품질 |
|---|---|---|---|---|---|
| 라마 3.1 8B | 8B | 4.7GB | 8GB | 일반 채팅, 지원 | 훌륭한 |
| 라마 3.1 70B | 70B | 40GB | 48GB | 복잡한 작업, 분석 | 훌륭한 |
| 미스트랄 7B | 7B | 4.1GB | 8GB | 범용, 빠름 | 매우 좋은 |
| 코드라마 7B | 7B | 3.8GB | 8GB | 코드 생성 | 코드에 좋습니다 |
| 파이-3 미니 | 3.8B | 2.3GB | 4GB | 제한된 장치 | 사이즈대비 좋아요 |
| 젬마 2 9B | 9B | 5.4GB | 8GB | 채팅, 추론 | 훌륭한 |
| 퀀 2.5 7B | 7B | 4.4GB | 8GB | 다국어, 코드 | 매우 좋은 |
| DeepSeek 코더 V2 | 16B | 8.9GB | 16GB | 특수코드 | 코드에 탁월 |
4. Ollama의 REST API
Ollama는 포트에 로컬 REST API를 노출합니다. 11434 허용하는
모든 프로그래밍 언어의 모델과 상호 작용합니다.
API는 OpenAI 형식과 호환되므로 마이그레이션이 간단합니다.
# Chat completion (non-streaming)
curl http://localhost:11434/api/chat -d '{
"model": "llama3.1",
"messages": [
{"role": "user", "content": "Cos'\''e il pattern Strategy?"}
],
"stream": false
}'
# Chat completion (streaming)
curl http://localhost:11434/api/chat -d '{
"model": "llama3.1",
"messages": [
{"role": "user", "content": "Scrivi una funzione di sort."}
],
"stream": true
}'
# Generazione di embeddings
curl http://localhost:11434/api/embeddings -d '{
"model": "llama3.1",
"prompt": "Testo da convertire in embedding"
}'
# Elenco modelli disponibili
curl http://localhost:11434/api/tags
# Informazioni su un modello
curl http://localhost:11434/api/show -d '{
"name": "llama3.1"
}'
OpenAI 호환 형식
Ollama는 OpenAI 형식 호환 엔드포인트도 지원합니다. 기존 클라이언트 라이브러리를 간단하게 재사용할 수 있습니다. URL 기반을 변경합니다.
# Compatibilità OpenAI - stesso formato di richiesta
curl http://localhost:11434/v1/chat/completions -d '{
"model": "llama3.1",
"messages": [
{"role": "system", "content": "Sei un assistente utile."},
{"role": "user", "content": "Ciao, come stai?"}
]
}'
# Questo permette di usare l'SDK OpenAI con Ollama:
# basta impostare baseURL a http://localhost:11434/v1
5. TypeScript 및 Node.js와의 통합
Ollama를 TypeScript 프로젝트에 통합하려면 다음을 사용할 수 있습니다.
공식 도서관 ollama 또는 OpenAI SDK를 재사용하세요
엔드포인트 호환성 덕분입니다.
# Libreria ufficiale Ollama
npm install ollama
# Alternativa: usare l'SDK OpenAI con Ollama
npm install openai
공식 라이브러리와 함께 사용
// src/lib/ollama-client.ts
import { Ollama } from 'ollama';
const ollama = new Ollama({
host: 'http://localhost:11434',
});
// Chat non-streaming
export async function chatWithOllama(
prompt: string,
model: string = 'llama3.1'
): Promise<string> {
const response = await ollama.chat({
model,
messages: [{ role: 'user', content: prompt }],
});
return response.message.content;
}
// Chat con streaming
export async function* streamOllama(
prompt: string,
model: string = 'llama3.1',
systemPrompt?: string
): AsyncGenerator<string> {
const messages: Array<{ role: string; content: string }> = [];
if (systemPrompt) {
messages.push({ role: 'system', content: systemPrompt });
}
messages.push({ role: 'user', content: prompt });
const stream = await ollama.chat({
model,
messages,
stream: true,
});
for await (const chunk of stream) {
yield chunk.message.content;
}
}
// Generazione embeddings
export async function getEmbeddings(
text: string,
model: string = 'llama3.1'
): Promise<number[]> {
const response = await ollama.embeddings({
model,
prompt: text,
});
return response.embedding;
}
// Verifica modelli disponibili
export async function listModels(): Promise<string[]> {
const response = await ollama.list();
return response.models.map(m => m.name);
}
OpenAI SDK와 함께 사용
// src/lib/ollama-openai-compat.ts
import OpenAI from 'openai';
// Crea un client OpenAI puntando a Ollama
const ollamaClient = new OpenAI({
baseURL: 'http://localhost:11434/v1',
apiKey: 'ollama', // Ollama non richiede una vera API key
});
export async function chatWithOllamaOpenAI(
messages: Array<{ role: string; content: string }>,
model: string = 'llama3.1'
): Promise<string> {
const response = await ollamaClient.chat.completions.create({
model,
messages: messages as any,
temperature: 0.7,
});
return response.choices[0].message.content ?? '';
}
// Streaming con SDK OpenAI
export async function* streamOllamaOpenAI(
messages: Array<{ role: string; content: string }>,
model: string = 'llama3.1'
): AsyncGenerator<string> {
const stream = await ollamaClient.chat.completions.create({
model,
messages: messages as any,
stream: true,
});
for await (const chunk of stream) {
const content = chunk.choices[0]?.delta?.content;
if (content) {
yield content;
}
}
}
OpenAI 호환성의 장점
Ollama와 함께 OpenAI SDK를 사용하면 로컬 모델 간에 전환할 수 있습니다.
간단히 변경하여 클라우드로 baseURL 그리고
apiKey. 이 접근 방식은 로컬 개발에 이상적입니다.
프로덕션 환경에서 클라우드 API를 사용하여 배포합니다.
6. Modelfile을 사용한 사용자 정의
I 모델파일 이는 다음을 수행할 수 있는 구성 파일입니다. 모델의 동작을 사용자 정의합니다. 그들은 비슷하게 작동합니다 ai Dockerfiles: 기본 템플릿을 정의하고 다음과 같이 변경 사항을 적용합니다. 시스템 프롬프트, 온도 매개변수 및 응답 템플릿.
# Modelfile per un assistente di code review
FROM llama3.1
# System prompt personalizzato
SYSTEM """
Sei un esperto code reviewer specializzato in TypeScript e Angular.
Analizza il codice fornito e suggerisci miglioramenti su:
- Sicurezza e vulnerabilità
- Performance e ottimizzazione
- Leggibilita e manutenibilità
- Aderenza alle best practice Angular
- Gestione degli errori
Rispondi sempre in italiano con esempi di codice corretto.
"""
# Parametri del modello
PARAMETER temperature 0.3
PARAMETER top_p 0.9
PARAMETER top_k 40
PARAMETER num_predict 2048
PARAMETER stop "<|eot_id|>"
# Template per il formato di risposta
TEMPLATE """
{{ if .System }}<|start_header_id|>system<|end_header_id|>
{{ .System }}<|eot_id|>{{ end }}{{ if .Prompt }}<|start_header_id|>user<|end_header_id|>
{{ .Prompt }}<|eot_id|>{{ end }}<|start_header_id|>assistant<|end_header_id|>
{{ .Response }}<|eot_id|>
"""
# Creare il modello dal Modelfile
ollama create code-reviewer -f ./Modelfile
# Verificare che sia stato creato
ollama list
# Eseguire il modello personalizzato
ollama run code-reviewer
# Usare via API
curl http://localhost:11434/api/chat -d '{
"model": "code-reviewer",
"messages": [{
"role": "user",
"content": "Rivedi questo codice:\nconst data = await fetch(url).then(r => r.json());"
}],
"stream": false
}'
7. Docker에서 Ollama 실행
공유 개발 환경, CI/CD 또는 서버 배포의 경우 Docker는 Ollama를 실행하는 표준화된 방법을 제공합니다. 이 재현성과 호스트 환경으로부터의 격리를 보장합니다.
# docker-compose.yml
version: '3.8'
services:
ollama:
image: ollama/ollama:latest
container_name: ollama
ports:
- "11434:11434"
volumes:
- ollama_data:/root/.ollama
# Per GPU NVIDIA (decommentare se disponibile)
# deploy:
# resources:
# reservations:
# devices:
# - driver: nvidia
# count: 1
# capabilities: [gpu]
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:11434/api/tags"]
interval: 30s
timeout: 10s
retries: 3
# Servizio per scaricare i modelli all'avvio
ollama-setup:
image: ollama/ollama:latest
depends_on:
ollama:
condition: service_healthy
entrypoint: ["/bin/sh", "-c"]
command:
- |
ollama pull llama3.1
ollama pull codellama
echo "Modelli scaricati con successo"
environment:
- OLLAMA_HOST=ollama:11434
volumes:
ollama_data:
# Avviare i servizi
docker compose up -d
# Verificare lo stato
docker compose ps
# Verificare i modelli disponibili
curl http://localhost:11434/api/tags
# Testare una richiesta
curl http://localhost:11434/api/chat -d '{
"model": "llama3.1",
"messages": [{"role": "user", "content": "Ciao!!"}],
"stream": false
}'
# Visualizzare i log
docker compose logs -f ollama
8. 대안: LM 스튜디오
LM 스튜디오 다음을 제공하는 Ollama의 그래픽 대안입니다. 다운로드, 구성 및 상호 작용할 수 있는 완전한 사용자 인터페이스 현지 모델과 함께. 그리고 특히 선호하는 사람들에게 적합합니다. 시각적 접근 방식.
Ollama와 LM Studio 비교
| 특성 | 올라마 | LM 스튜디오 |
|---|---|---|
| 인터페이스 | CLI + REST API | 데스크탑 GUI + API |
| 설치 | 스크립트 또는 패키지 관리자 | 그래픽 설치 프로그램 |
| 모델 | 독점 레지스트리 | 직접 포옹얼굴 |
| 맞춤화 | 모델파일 | GUI 매개변수 |
| 도커 | 기본 지원 | 지원되지 않음 |
| CI/CD | 이상적(헤드 없음) | 적합하지 않음 |
| 자원 | 경량(~50MB) | 무거움(~500MB) |
| API 호환 | OpenAI 호환 | OpenAI 호환 |
| 플랫폼 | 맥OS, 리눅스, 윈도우 | 맥OS, 리눅스, 윈도우 |
// LM Studio espone la stessa API OpenAI-compatibile
// sulla porta 1234 di default
import OpenAI from 'openai';
const lmStudio = new OpenAI({
baseURL: 'http://localhost:1234/v1',
apiKey: 'lm-studio', // non richiede una vera chiave
});
const response = await lmStudio.chat.completions.create({
model: 'llama-3.1-8b-instruct', // nome del modello caricato
messages: [
{ role: 'user', content: 'Spiega il concetto di closure.' }
],
temperature: 0.7,
});
console.log(response.choices[0].message.content);
9. 로컬과 클라우드를 사용해야 하는 경우
온프레미스 모델과 클라우드 API 사이의 선택은 바이너리가 아닙니다. 종종 해결책 더 나은 방법은 두 가지의 장점을 모두 활용하는 하이브리드 접근 방식입니다. 특정 상황에 따라 접근합니다.
결정 매트릭스
| 대본 | 현지의 | 구름 | 조언 |
|---|---|---|---|
| 신속한 프로토타이핑 | 비용이 전혀 들지 않고 빠릅니다. | 우수한 품질 | 현지의 |
| 높은 트래픽 생산 | 높은 하드웨어 비용 | 자동 확장 | 구름 |
| 민감한 데이터/GDPR | 개인 정보 보호 보장 | 규정 준수 위험 | 현지의 |
| 복잡한 작업(분석, 추론) | 제한된 품질 | 더욱 강력한 모델 | 구름 |
| 자동완성 코드 | 낮은 대기 시간 | 네트워크 대기 시간 | 현지의 |
| 최종 고객 챗봇 | 다양한 품질 | 높은 신뢰성 | 구름 |
| CI/CD 및 테스트 | 테스트 당 비용 없음 | 실행당 비용 | 현지의 |
하이브리드 패턴: 로컬 개발, 클라우드 프로덕션
// src/lib/ai-provider-factory.ts
import OpenAI from 'openai';
interface AIConfig {
provider: 'ollama' | 'openai' | 'anthropic';
model: string;
baseURL?: string;
apiKey?: string;
}
function getConfig(): AIConfig {
const env = process.env.NODE_ENV ?? 'development';
if (env === 'development') {
return {
provider: 'ollama',
model: 'llama3.1',
baseURL: 'http://localhost:11434/v1',
apiKey: 'ollama',
};
}
// Produzione: usa API cloud
return {
provider: 'openai',
model: 'gpt-4o',
apiKey: process.env.OPENAI_API_KEY,
};
}
export function createAIClient(): OpenAI {
const config = getConfig();
return new OpenAI({
baseURL: config.baseURL,
apiKey: config.apiKey ?? '',
});
}
// Utilizzo - stesso codice in sviluppo e produzione
const client = createAIClient();
const response = await client.chat.completions.create({
model: getConfig().model,
messages: [{ role: 'user', content: 'Ciao!' }],
});
10. 벤치마킹 및 최적화
귀하의 사용 사례에 가장 적합한 로컬 모델을 선택하려면 다음이 유용합니다. 특정 벤치마크를 실행해 보세요. 다음은 귀하의 기계에서 다양한 모델의 성능.
// src/scripts/benchmark.ts
import { Ollama } from 'ollama';
const ollama = new Ollama();
interface BenchmarkResult {
model: string;
prompt: string;
tokensGenerated: number;
timeMs: number;
tokensPerSecond: number;
}
async function benchmarkModel(
model: string,
prompt: string
): Promise<BenchmarkResult> {
const start = Date.now();
let tokensGenerated = 0;
const stream = await ollama.chat({
model,
messages: [{ role: 'user', content: prompt }],
stream: true,
});
for await (const chunk of stream) {
tokensGenerated++;
}
const timeMs = Date.now() - start;
return {
model,
prompt: prompt.substring(0, 50) + '...',
tokensGenerated,
timeMs,
tokensPerSecond: (tokensGenerated / timeMs) * 1000,
};
}
async function runBenchmarks() {
const models = ['llama3.1', 'mistral', 'phi3'];
const prompts = [
'Scrivi una funzione TypeScript per ordinare un array.',
'Spiega il pattern Observer con un esempio pratico.',
'Genera un componente Angular per un form di login.',
];
console.log('Avvio benchmark...\n');
for (const model of models) {
console.log(`--- ${model} ---`);
for (const prompt of prompts) {
const result = await benchmarkModel(model, prompt);
console.log(
` Prompt: ${result.prompt}`
);
console.log(
` Token: ${result.tokensGenerated} | ` +
`Tempo: ${result.timeMs}ms | ` +
`Velocita: ${result.tokensPerSecond.toFixed(1)} t/s\n`
);
}
}
}
runBenchmarks();
성능 최적화
- GPU: CUDA와 함께 NVIDIA GPU를 사용하여 추론 속도를 10~50배 향상
- 양자화: Q4 모델은 품질 손실을 최소화하면서 4배 더 작습니다.
- 일괄 처리: GPU를 더 잘 활용하기 위한 그룹 요청
- 살아있어라: 구성
OLLAMA_KEEP_ALIVE모델을 메모리에 유지하려면 - 스레드 수: imposta
OLLAMA_NUM_THREADSCPU 사용량을 최적화하기 위해
지역 LLM을 위한 체크리스트
- 하드웨어 검증: 선택한 모델에 충분한 RAM
- Ollama가 원하는 모델로 설치되어 실행 중입니다.
- 포트 11434에서 액세스 가능한 REST API
- 공식 OpenAI 라이브러리 또는 SDK와 TypeScript 통합
- 특정 사용 사례에 맞게 사용자 정의된 모델 파일
- 공유 환경을 위해 구성된 Docker Compose
- 최적의 모델을 선택하기 위해 수행된 벤치마크
- 로컬 개발 및 클라우드 생산을 위한 하이브리드 패턴 구현
결론
Ollama는 모든 개발자가 액세스할 수 있는 로컬 LLM을 실행하도록 만들었습니다. 몇 가지 명령만으로 작동하는 강력한 언어 모델을 가질 수 있습니다. 반복되는 비용 없이 완전한 개인 정보 보호를 통해 전적으로 귀하의 컴퓨터에 있습니다. OpenAI API와의 호환성으로 온프레미스와 클라우드 간의 전환이 가능합니다. 투명하다.
다음 기사에서는 전 세계에서 가장 자주 묻는 질문 중 하나를 다루겠습니다. 응용 AI의 수: 미세 조정과 RAG. 언제 분석해보겠습니다. 모델을 사용자 정의하는 것이 더 좋고 컨텍스트를 풍부하게 하는 것이 더 나은 경우 외부 데이터와 실용적인 의사결정 프레임워크를 활용합니다.







