Tutorial DeepSeek-R1 Lokal: Build Reasoning Agent dengan Tool Calling di Node.js
Poin Kunci Artikel Ini:
- Unduh dan instal aplikasi Ollama pada sistem operasi sesuai standar lingkungan pengembang.
- Tantangan Parsing CoT Reasoning dan Tool Calling LLM LokalDeepSeek-R1 gunakan Reinforcement Learning untuk hasilkan teks penalaran.
- Proses Chain-of-Thought (CoT) tingkatkan akurasi logika masalah kompleks.
Tantangan Parsing CoT Reasoning dan Tool Calling LLM Lokal
DeepSeek-R1 gunakan Reinforcement Learning untuk hasilkan teks penalaran. Teks masuk dalam tag <think>. Proses Chain-of-Thought (CoT) tingkatkan akurasi logika masalah kompleks. Masalah timbul saat integrasi tool calling pada lingkungan lokal.
Model gabungkan teks CoT dan payload JSON tool call dalam satu data stream. Parser JSON standar gagal. Teks <think>...</think> sebabkan SyntaxError: Unexpected token saat eksekusi JSON.parse().
Model terkuantisasi lokal ukuran kecil (8B atau 14B) kerap alami masalah tambahan:
- Schema Drift: Model lupa struktur parameter JSON yang diminta jika teks CoT terlalu panjang.
- Malformed Output: Model keluarkan JSON tidak lengkap atau salah kurawal akibat batasan token.
- Context Window Overflow: Teks penalaran CoT mengonsumsi kuota token
num_ctx. VRAM penuh sebabkan Out of Memory (OOM) atau pemangkasan sistem prompt.
Solusi: Buat kustom parser. Pisahkan blok <think> dari payload instruksi eksekusi. Gunakan siklus rekursif untuk eksekusi fungsi dan umpan balik data ke model.
Setup Ollama DeepSeek-R1, Schema Tools, dan Logic Loop Node.js
Berikut adalah langkah-langkah terstruktur untuk menyiapkan lingkungan kerja, mengunduh model, dan mengonfigurasi proyek Node.js:
- Unduh dan instal aplikasi Ollama pada sistem operasi sesuai standar lingkungan pengembang.
- Jalankan perintah berikut pada terminal untuk mengunduh serta menjalankan model DeepSeek-R1 versi 8B (direkomendasikan VRAM minimal 8GB):
ollama run deepseek-r1:8b - Buat direktori proyek Node.js baru dan lakukan inisialisasi modul:
mkdir deepseek-agent && cd deepseek-agent npm init -y - Ubah tipe modul proyek ke ES Module dengan menambahkan
"type": "module"pada berkaspackage.json. - Pasang SDK resmi Ollama dan library validasi skema Zod:
npm install ollama zod
Buat berkas agent.js. Kode berikut atur schema tool, tangani integrasi Ollama, dan jalankan perulangan logika agen:
import { Ollama } from 'ollama';
import { z } from 'zod';
import os from 'os';
const ollama = new Ollama();
const GetSystemStatsSchema = z.object({});
const tools = [
{
type: 'function',
function: {
name: 'get_system_stats',
description: 'Ambil data statistik memori bebas dan penggunaan CPU server lokal',
parameters: {
type: 'object',
properties: {},
required: []
}
}
}
];
function getSystemStats() {
const freeMem = (os.freemem() / 1024 / 1024 / 1024).toFixed(2);
const totalMem = (os.totalmem() / 1024 / 1024 / 1024).toFixed(2);
const loadAvg = os.loadavg();
return JSON.stringify({
freeMemory: `${freeMem} GB`,
totalMemory: `${totalMem} GB`,
cpuLoad1Min: loadAvg[0].toFixed(2)
});
}
async function executeTool(name, args) {
if (name === 'get_system_stats') {
GetSystemStatsSchema.parse(args);
return getSystemStats();
}
throw new Error(`Tool ${name} tidak ditemukan`);
}
async function runAgentLoop(userPrompt) {
const messages = [{ role: 'user', content: userPrompt }];
let continueLoop = true;
let maxIterations = 5;
while (continueLoop && maxIterations > 0) {
maxIterations--;
const response = await ollama.chat({
model: 'deepseek-r1:8b',
messages: messages,
tools: tools
});
messages.push(response.message);
if (response.message.tool_calls && response.message.tool_calls.length > 0) {
for (const call of response.message.tool_calls) {
try {
const toolResult = await executeTool(call.function.name, call.function.arguments);
console.log(`[Tool Executed: ${call.function.name}] Result:`, toolResult);
messages.push({
role: 'tool',
content: toolResult
});
} catch (error) {
messages.push({
role: 'tool',
content: JSON.stringify({ error: error.message })
});
}
}
} else {
console.log('\n--- Output Akhir Agen ---');
console.log(response.message.content);
continueLoop = false;
}
}
}
runAgentLoop('Cek kondisi performa resource memori dan CPU server saat ini.');Ekstraksi Thought Process, Error Handling, dan Rate Limit
Parsing Regex Teks Reasoning
DeepSeek-R1 hasilkan blok <think> sebelum output final. Regex pisahkan teks penalaran dan konten jawaban:
function parseDeepSeekStream(rawContent) {
const thinkMatch = rawContent.match(/<think>([\s\S]*?)<\/think>/);
const reasoning = thinkMatch ? thinkMatch[1].trim() : '';
const cleanResponse = rawContent.replace(/<think>[\s\S]*?<\/think>/, '').trim();
return { reasoning, cleanResponse };
}Strategi Handling Error dan Penanganan Limit
- JSON Parse Error: Tangkap exception saat ekstraksi. Masukkan kembali pesan kesalahan sintaks ke array
messagesdengan roleuser. Minta model perbaiki format output JSON. - Zod Schema Validation Fail: Jika argumen masukan dari LLM tidak cocok skema, kembalikan pesan skema ke konteks pesan agen. Minta model koreksi tipe data argumen.
- VRAM Out of Memory (OOM): Batasi parameter
num_ctxpada Ollama (misal: 4096 token). Kurangi beban alokasi memori grafis dengan menurunkan ukuran konteks.
PERINGATAN KEAMANAN: Eksekusi perkakas secara otomatis di lingkungan lokal memberikan hak akses langsung ke sistem operasi underlying. Selalu lakukan validasi dan sanitasi ketat pada setiap parameter masukan sebelum mengeksekusi fungsi perintah sistem. Eksekusi kode arbitrer tanpa isolasi dapat mengakibatkan kerusakan berkas sistem atau kebocoran data sensitif. Gunakan lingkungan terisolasi seperti Docker container untuk mengeksekusi alat perkakas agen.
Kesimpulan dan Best Practice Scaling Agent Lokal
Infrastruktur AI lokal tangani masalah privasi data. Data pemrosesan internal server tidak dikirim ke API vendor publik. Kombinasi DeepSeek-R1, Ollama, dan Node.js efektif hasilkan agen mandiri yang handal.
Checklist Rekomendasi Arsitektur
- Pilih Bobot Kuantisasi Tepat: Gunakan kuantisasi format
Q4_K_Muntuk efisiensi RAM/VRAM standar. Gunakan formatQ8_0jika tingkat akurasi logika instruksi membutuhkan presisi tinggi. - Isolasi Eksekutor Alat: Jalankan script eksekusi tool di dalam Docker container terisolasi (sandbox environment). Batasi hak akses berkas hanya ke direktori tertentu.
- Prompt Caching dan VRAM Retention: Atur parameter
keep_alivepada API Ollama. Jaga model tetap dimuat pada GPU VRAM untuk hindari overhead latency pemuatan model saat panggil API berulang.


