Локальные LLM для AI-агентов: полный гайд

Как запустить AI-агента полностью локально. LM Studio vs Ollama vs Jan. Какие модели работают, какое железо нужно, и зачем это вообще.

🖥️ Локально📊 Средний⏱ 20 мин

# 1. ЗАЧЕМ ЗАПУСКАТЬ LLM ЛОКАЛЬНО

Локальный запуск больших языковых моделей — это не хайп, а практическая необходимость для многих сценариев. Когда вы запускаете LLM локально, вы получаете полный контроль над данными, нулевую задержку сети и отсутствие ежемесячных счетов за API.

ПриватностьНикакие данные не покидают ваш компьютер. Код, документы, переписка остаются у вас.
ЦенаОдин раз купили GPU — пользуетесь бесплатно. Нет pay-per-token.
ДоступностьРаботает без интернета. В самолёте, в деревне, в дата-центре за firewall.
КастомизацияМеняете модель под себя: файнтюнинг, квантование, свои плагины.
НезависимостьAPI-провайдер не отключит вас. Модель не поменяют неожиданно.

# 2. LM STUDIO — САМЫЙ ПРОСТОЙ СТАРТ

LM Studio — десктопное приложение с графическим интерфейсом. Скачали, выбрали модель из каталога HuggingFace, нажали Start — и у вас локальный сервер с OpenAI-совместимым API. Не нужно писать ни строчки кода.

# Установка — https://lmstudio.ai
# 1. Скачать под свою ОС (Windows/Mac/Linux)
# 2. Запустить, найти модель через поиск
# 3. Нажать Download → Load Model → Start Server
# 4. API доступен на http://localhost:1234/v1

# Проверка через curl
curl http://localhost:1234/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "local-model",
    "messages": [{"role": "user", "content": "Привет! Кто ты?"}]
  }'

# Python-клиент работает через openai пакет
from openai import OpenAI
client = OpenAI(base_url="http://localhost:1234/v1", api_key="not-needed")
response = client.chat.completions.create(
    model="local-model",
    messages=[{"role": "user", "content": "Напиши функцию сортировки на Python"}]
)
print(response.choices[0].message.content)

Плюсы: максимально простой интерфейс, поиск моделей прямо из приложения, авто-настройка GPU, работает на Windows без WSL.

Минусы: только десктоп, нет headless-режима для серверов, ограниченный выбор форматов моделей (только GGUF).

# 3. OLLAMA — ЛУЧШЕЕ ДЛЯ СЕРВЕРОВ И АВТОМАТИЗАЦИИ

Ollama — CLI-first инструмент, который работает как демон в фоне. Идеален для серверов, CI/CD и встраивания в приложения. Одна команда — и модель запущена.

# Установка: curl -fsSL https://ollama.com/install.sh | sh

# Загрузка и запуск модели одной командой
ollama pull qwen3:14b        # Qwen 3 — 14B параметров
ollama pull deepseek-r1:8b    # DeepSeek — reasoning модель
ollama pull llama3.3:70b      # Llama 3.3 — универсальная

# Запуск в интерактивном режиме
ollama run qwen3:14b

# API автоматически на http://localhost:11434
# Совместим с OpenAI API — меняем только base_url

# Modelfile — кастомизация модели
cat << 'EOF' > MyAgent.Modelfile
FROM qwen3:14b
SYSTEM \"Ты — агент-аналитик для B2B-платформы. Отвечай на русском языке.\"
PARAMETER temperature 0.3
PARAMETER num_ctx 32768
EOF
ollama create my-agent -f MyAgent.Modelfile
ollama run my-agent

Плюсы: headless-режим, Docker-образ, API из коробки, огромный каталог моделей, Modelfile для кастомизации, поддержка GPU (CUDA, ROCm, Metal).

Минусы: только терминал (нет GUI), меньше контроля над параметрами GPU, чем в LM Studio.

# 4. КАК ВЫБРАТЬ МОДЕЛЬ ПОД СВОЙ GPU

Главное правило: модель должна помещаться в VRAM. Если не помещается — часть уходит в RAM и скорость падает в 10-100 раз. Вот таблица соответствия GPU и моделей:

GPUVRAMРекомендуемые модели
RTX 306012GBQwen3-8B, Llama 3.1-8B, DeepSeek-R1-8B (Q4_K_M)
RTX 407012GBQwen3-14B (Q4), Llama 3.3-8B (Q8), Mistral-Nemo-12B
RTX 409024GBQwen3-30B (Q4), Llama 3.3-70B (IQ3), DeepSeek-V3 (IQ2)
Mac M2 Max32GBQwen3-30B (Q4), Llama 3.3-70B (Q4_K_M), Mixtral-8x7B
RTX 6000 Ada48GBQwen3-70B (Q4), Llama 3.3-70B (Q8), DeepSeek-V3-671B (IQ1)

Форматы квантования: GGUF/Q4_K_M — золотая середина (4 бита, почти без потери качества). IQ3 — агрессивное сжатие (экономия 30% VRAM, небольшое падение точности). Q8 — почти lossless (для задач, где критична точность).

# 5. СБОРКА ЛОКАЛЬНОГО AI-АГЕНТА

Соединяем Ollama с агентным фреймворком. Вот минимальный AI-агент с доступом к файловой системе и веб-поиску, работающий полностью локально:

# local_agent.py — полностью локальный AI-агент
import os, subprocess, json
from openai import OpenAI

# Подключаемся к локальной Ollama
client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")

# Определяем инструменты агента
TOOLS = {
    "read_file": lambda path: open(path).read()[:5000],
    "list_dir": lambda path: "\n".join(os.listdir(path)),
    "run_command": lambda cmd: subprocess.getoutput(cmd)[:3000],
}

# Системный промпт — учим агента пользоваться инструментами
SYSTEM = """Ты AI-агент с доступом к инструментам. Используй JSON-формат:
Для действия: {"action": "tool_name", "args": {"param": "value"}, "reason": "почему"}
Для ответа: {"action": "respond", "text": "твой ответ пользователю"}
Доступные инструменты: read_file(path), list_dir(path), run_command(cmd)
Отвечай на русском. Думай по шагам."""

def agent_loop(user_input, max_steps=5):
    messages = [
        {"role": "system", "content": SYSTEM},
        {"role": "user", "content": user_input}
    ]
    
    for step in range(max_steps):
        response = client.chat.completions.create(
            model="qwen3:14b",
            messages=messages,
            temperature=0.2
        )
        text = response.choices[0].message.content
        
        try:
            action = json.loads(text.split("```json")[1].split("```")[0])
        except:
            try:
                action = json.loads(text)
            except:
                print(f"Agent sagt: {text[:500]}")
                return text
        
        if action["action"] == "respond":
            return action["text"]
        
        # Выполняем инструмент
        tool = TOOLS.get(action["action"])
        if tool:
            result = tool(**action.get("args", {}))
            messages.append({"role": "assistant", "content": text})
            messages.append({"role": "user", "content": f"Результат {action['action']}: {result}"})
        else:
            messages.append({"role": "user", "content": f"Инструмент '{action['action']}' не найден"})
    
    return "Агент не смог решить задачу за отведённые шаги"

# Тест агента
answer = agent_loop("Какие файлы в текущей директории? Найди config.json и покажи его содержимое.")
print(answer)

# 6. СРАВНЕНИЕ ИНСТРУМЕНТОВ

КритерийLM StudioOllamaJan
ИнтерфейсGUICLI + APIGUI (Electron)
HeadlessНетДаНет
API-совместимостьOpenAIOpenAIOpenAI
Форматы моделейGGUFGGUF + SafetensorsGGUF + Safetensors
GPU-ускорениеCUDA, ROCm, MetalCUDA, ROCm, MetalCUDA, Vulkan
ОСWin/Mac/LinuxMac/Linux (Win WSL)Win/Mac/Linux
Open SourceНет (проприетарно)Да (MIT)Да (AGPL)

# 7. ВЕРДИКТ: КОГДА ЧТО ВЫБИРАТЬ

LM Studio — если вы только начинаете, хотите GUI и работаете на десктопе. Идеально для экспериментов и одиночной разработки.

Ollama — если вам нужен сервер, Docker, CI/CD или встраивание в приложение. Стандарт для production-использования.

Jan — если хотите open-source GUI с кастомизацией. Альтернатива LM Studio для тех, кому важна открытость кода.

Совет: начните с Ollama + Open WebUI. Получаете и серверное API, и веб-интерфейс в стиле ChatGPT. Связка покрывает 90% сценариев.