Ollama を使用したローカル LLM: クラウドを使用しない AI
データをリモート サーバーに送信することが必ずしも必要である (または望ましい) わけではありません。 言語モデルから答えを得る。ザ ローカルの大規模言語モデル クラウド API に代わる具体的な代替手段であり、完全なプライバシーを提供します。 初期セットアップ後のコストが削減され、完全にオフラインで作業できる可能性があります。
このシリーズの 5 番目の記事では、 Web 開発者のための AI、探索してみます オラマ、ローカル LLM へのアクセスを民主化するツール。 インストール方法、選択するモデル、アプリケーションに統合する方法を見ていきます。 TypeScript/Node.js と、クラウドよりもローカル ソリューションを優先する方が良い場合。
何を学ぶか
- クラウド API の代わりにローカル LLM を使用する理由とタイミング
- すべてのオペレーティング システムに Ollama をインストールして構成します
- Llama 3、Mistral、CodeLlama などのテンプレートをダウンロードして管理
- プログラムによる統合に Ollama の REST API を使用する
- Ollama を TypeScript/Node.js プロジェクトに統合する
- Modelfiles を使用してモデルをカスタマイズする
- 本番環境の Docker で Ollama を実行する
- オンプレミス モデルとクラウド モデルのパフォーマンスを比較する
シリーズ概要
| # | アイテム | 集中 |
|---|---|---|
| 1 | RAG の概要 | 基本的な概念 |
| 2 | TypeScript と LangChain を使用した RAG | 実用化 |
| 3 | ベクトルデータベースの比較 | Chromadb、松ぼっくり、Weaviate |
| 4 | OpenAI と Anthropic API | API統合 |
| 5 | LLM Local with Ollama (あなたはここにいます) | クラウドを使わないAI |
| 6 | 微調整と RAG の比較 | いつ何を使うか |
| 7 | AIエージェント | エージェントベースのアーキテクチャ |
| 8 | CI/CD における AI | インテリジェントな自動化 |
1. ローカル LLM を使用する理由
言語モデルをローカルで実行すると、クラウド API にはない独特の利点が得られます。 彼らは一致しません。ただし、これには重要なトレードオフも伴います。 計算能力と結果の品質。
ローカル LLM の利点
| アドバンテージ | 説明 | 理想的な使用例 |
|---|---|---|
| 完全なプライバシー | コンピューターからデータが流出することはありません | 機密データ、独自コード、GDPR |
| コストゼロ | セットアップ後にトークンの請求書が発行されない | プロトタイピング、集中的なバッチ処理 |
| オフライン機能 | インターネット接続なしでも動作します | エアギャップ環境、外出先での開発 |
| 待ち時間の短縮 | ネットワーク遅延なし | リアルタイムの自己完結型アプリケーション |
| カスタマイズ | モデルとパラメータを完全に制御 | ドメインごとに特化したテンプレート |
| レート制限なし | 無制限のリクエスト | テスト、ベンチマーク、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 のようなシステムを使用します。 モデルは 1 回だけダウンロードされ、ローカルにキャッシュされます。
# 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 | 4ギガバイト | 限られたデバイス | サイズ的には良い |
| ジェマ2 9B | 9B | 5.4GB | 8GB | 雑談、推理 | 素晴らしい |
| クウェン 2.5 7B | 7B | 4.4GB | 8GB | 多言語、コード | とても良い |
| ディープシークコーダー V2 | 16B | 8.9GB | 16ギガバイト | 特殊なコード | コードに最適 |
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 Studio
LMスタジオ Ollama のグラフィカルな代替手段です。 ダウンロード、設定、対話のための完全なユーザー インターフェイス 地元モデルと一緒に。そして、特に次のような人に適しています 視覚的なアプローチ。
Ollama と LM Studio の比較
| 特性 | オラマ | LMスタジオ |
|---|---|---|
| インタフェース | CLI + REST API | デスクトップGUI + API |
| インストール | スクリプトまたはパッケージマネージャー | グラフィカルインストーラー |
| モデル | 独自のレジストリ | 直接ハグ顔 |
| カスタマイズ | モデルファイル | GUIパラメータ |
| ドッカー | ネイティブサポート | サポートされていません |
| CI/CD | 理想的(ヘッドレス) | 不適切 |
| リソース | 軽量 (~50MB) | 重い (~500MB) |
| API対応 | OpenAI対応 | OpenAI対応 |
| プラットフォーム | macOS、Linux、Windows | macOS、Linux、Windows |
// 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 のどちらを選択するかは二者択一ではありません。多くの場合、解決策は 両方の長所を活用するハイブリッド アプローチの方が優れています。 特定のコンテキストに基づいたアプローチ。
意思決定マトリックス
| シナリオ | 地元 | Cloud | アドバイス |
|---|---|---|---|
| ラピッドプロトタイピング | コストゼロ、迅速 | 優れた品質 | 地元 |
| 高トラフィックの生産 | ハードウェアのコストが高い | 自動スケーリング | Cloud |
| 機密データ/GDPR | プライバシーの保証 | コンプライアンスのリスク | 地元 |
| 複雑なタスク (分析、推論) | 限られた品質 | より強力なモデル | Cloud |
| オートコンプリートコード | 低遅延 | ネットワーク遅延 | 地元 |
| エンドカスタマーのチャットボット | 変動する品質 | 高い信頼性 | Cloud |
| 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 分の 1 に小型化され、品質の低下は最小限に抑えられています
- バッチ処理: GPU をより有効に活用するためにリクエストをグループ化する
- 生き続ける: 構成する
OLLAMA_KEEP_ALIVEモデルをメモリに保存するには - スレッド数: imposta
OLLAMA_NUM_THREADSCPU 使用率を最適化する
ローカル LLM のチェックリスト
- ハードウェア検証済み: 選択したモデルに十分な RAM
- Ollama がインストールされ、目的のモデルで実行されている
- REST API はポート 11434 でアクセス可能
- TypeScript と公式 OpenAI ライブラリまたは SDK の統合
- 特定のユースケースに合わせてカスタマイズされたモデルファイル
- 共有環境用に構成された Docker Compose
- 最適なモデルを選択するために実行されるベンチマーク
- ローカル開発とクラウド本番用のハイブリッド パターンを実装
結論
Ollama により、すべての開発者がローカル LLM を実行できるようになりました。 ほんの数個のコマンドを使用するだけで、機能する強力な言語モデルを作成できます。 完全にあなたのマシン上で、定期的なコストなしで完全なプライバシーを保ちます。 OpenAI API との互換性により、オンプレミスとクラウド間の移行が可能になります 透明な。
次の記事では、世界で最もよく寄せられる質問の 1 つについて取り上げます。 応用されたAIの: 微調整と RAG の比較。いつ分析しますか モデルをカスタマイズした方が良い場合と、コンテキストを充実させた方が良い場合 外部データと実用的な意思決定フレームワークを使用します。







