Локальный AI-агент для кода: Qwen 4B, GGUF и 100% валидность tool-calling | AiManual
AiManual Logo Ai / Manual.
24 Фев 2026 Инструмент

Как настроить 4B-агент для навигации по коду: GGUF, Qwen и 100% валидность tool-calling

Пошаговая настройка 4B-агента для навигации по коду. GGUF модель, 100% валидность tool-calling, экономия токенов. Сравнение с Claude и GPT.

Токены горят, нервы тоже: зачем вам этот агент

Каждый раз, когда вы просите Claude или GPT-4.5 "найти все вызовы функции X", ваш кошелек тихо плачет. Контекст в 200К токенов – это не мощь, это финансовое самоубийство. Особенно если нужно просто пробежаться по кодовой базе.

Локальные модели? Да, но та же Qwen 3 Coder Next сломала tool-calling, а 40B-монстры вроде IQuestCoder требуют видеокарту стоимостью с ипотеку.

💡
Новость: на 24.02.2026 появилась дообученная версия Qwen 2.5 Coder 4B в GGUF формате, которая дает 100% валидность вызовов инструментов для навигации по файлам. Не 97%, как у FunctionGemma 270M, а все сто. И работает на любой карте с 8GB памяти.

Что внутри: Qwen, GGUF и магия 100% валидности

Это не очередная квантованная модель с Hugging Face. Авторы взяли Qwen 2.5 Coder 4B – последнюю доступную на февраль 2026 года 4B-версию кодера от Alibaba – и дообучили ее на специфическом датасете вызовов инструментов.

Что получилось:

  • GGUF формат: запускается в llama.cpp, LM Studio, Ollama – где угодно.
  • Только два инструмента: grep_search и find_files. Ничего лишнего.
  • 100% валидный JSON: модель всегда возвращает корректный вызов, без забытых скобок или кавычек.
  • Понимание контекста: если вы в диалоге упомянули "ищи в папке src", следующий вызов find_files будет с параметром directory="src".

Важно: 100% валидность – только для этих двух инструментов. Модель не умеет в API-вызовы или сложные цепочки. Ее задача – заменить ваш первый запрос к GPT "найди все файлы, где...".

1 Качаем и устанавливаем

Модель выложена на Hugging Face в трех квантованиях: Q4_K_M (2.5GB), Q5_K_M (3GB), Q6_K (3.5GB). Для точности берите Q6_K, для скорости – Q4_K_M.

# Скачиваем через huggingface-cli (установите, если нет)
huggingface-cli download author/qwen-2.5-coder-4b-toolcall-GGUF qwen-2.5-coder-4b-toolcall-q6_k.gguf --local-dir ./models

# Или качаем вручную с страницы модели
# Запускаем через llama.cpp с указанием семплара\./main -m ./models/qwen-2.5-coder-4b-toolcall-q6_k.gguf \
  -c 4096 \
  --temp 0.1 \
  --top-k 40 \
  --top-p 0.9 \
  -n -1 \
  -p "Пользователь: найди все .py файлы в текущей директории\nАссистент:"

2 Пишем простой враппер для инструментов

Модель возвращает JSON вида {"tool": "find_files", "params": {"pattern": "*.py", "directory": "."}}. Ваша задача – исполнить это и вернуть результат в диалог.

import subprocess
import json
import re

def execute_tool_call(tool_call_json: str):
    """Парсим JSON и выполняем grep или find"""
    try:
        data = json.loads(tool_call_json)
        tool = data.get("tool")
        params = data.get("params", {})
        
        if tool == "find_files":
            pattern = params.get("pattern", "*")
            directory = params.get("directory", ".")
            cmd = f"find {directory} -name '{pattern}' -type f 2>/dev/null | head -20"
            
        elif tool == "grep_search":
            pattern = params.get("pattern", "")
            directory = params.get("directory", ".")
            case_sensitive = params.get("case_sensitive", False)
            flag = "-i" if not case_sensitive else ""
            cmd = f"grep -r {flag} '{pattern}' {directory} 2>/dev/null | head -30"
            
        result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
        return result.stdout if result.stdout else "Ничего не найдено."
        
    except json.JSONDecodeError:
        return "Ошибка: невалидный JSON от модели"

Это базовая реализация. В реальном агенте добавьте ограничения на директории (чтобы модель не полезла в /sys) и кэширование.

3 Настраиваем контекст и промпт

Самый важный этап. Модель должна понимать, что она – sub-agent для поиска, а не полноценный помощник. Используйте системный промпт:

Ты – агент для навигации по кодовой базе. Твоя задача – отвечать на запросы разработчика, используя инструменты find_files и grep_search.
Инструменты:
1. find_files - поиск файлов по маске. Параметры: pattern (маска, например *.py), directory (директория для поиска).
2. grep_search - поиск текста в файлах. Параметры: pattern (regex или текст), directory, case_sensitive (true/false).
Всегда возвращай вызов инструмента в формате JSON. Не объясняй, не комментируй. Только JSON.

Этот промпт – причина 100% валидности. Модель не отвлекается на болтовню, как многие агенты из CAR-bench.

Claude vs. Локальная крошка: кто кого?

Критерий Qwen 4B Toolcall Claude 3.7 Sonnet GPT-4.5 Turbo
Стоимость запроса (поиск по 100 файлам) 0 ₽ (локально) ~15 ₽ ~12 ₽
Валидность tool-calling 100% (для двух инструментов) ~95% (иногда теряет параметры) ~98%
Контекстное окно 4K (но достаточно) 200K (избыточно) 128K
Понимание сложных запросов Среднее (только файлы/текст) Отличное Отличное

Вывод: для рутинного "найди-покажи" 4B-агент выигрывает по стоимости и надежности. Для сложного анализа кода с рассуждениями – все еще нужен Claude или GPT. Но зачем платить 15 рублей за то, что делает бесплатная модель?

Как заставить агента искать код: реальные сценарии

Диалог выглядит так:

Пользователь: Ищи все вызовы функции send_email в папке app/services
Ассистент: {"tool": "grep_search", "params": {"pattern": "send_email", "directory": "app/services", "case_sensitive": false}}

(Система выполняет grep, возвращает результат)

Пользователь: А теперь найди все тестовые файлы для этих сервисов
Ассистент: {"tool": "find_files", "params": {"pattern": "*test*.py", "directory": "app/services"}}

Никаких лишних слов. Только инструменты и результаты. Экономия токенов – в 5-7 раз по сравнению с тем, если бы вы впихнули весь этот диалог в промпт GPT с просьбой "сначала найди, потом проанализируй".

💡
Комбинируйте этого агента с другими техниками из статьи "Как не сжечь токены". Например, сначала 4B-агент соберет файлы, затем вы отправите только их содержимое в GPT для анализа – вместо загрузки всей кодовой базы.

Кому стоит попробовать, а кому лучше не надо

Берите этого агента, если:

  • Устали платить за каждый запрос "найди файл" к облачным API.
  • Работаете с крупными кодобазами (50к+ файлов), где ручной поиск – ад.
  • Хотите построить кастомного агента для GitHub Copilot с локальными компонентами.
  • Имеете RTX 3060/4060 или любую карту с 8GB VRAM – этого хватит.

Не тратьте время, если:

  • Нужен анализ кода с пониманием семантики ("почему эта функция падает?").
  • Ждете агента с длинной памятью и сложными навыками.
  • Ищете замену CodeQL или статическому анализу.
  • У вас нет доступа к Linux/macOS (Windows с WSL работает, но нативно – только grep/find).

Что дальше? Подключаем супервизора

Один 4B-агент – это только начало. Настройте двух агентов: один ищет файлы (наш Qwen), второй – анализирует найденное (например, IQuestCoder-40B или даже GPT-4.5, но с урезанным контекстом).

Первый агент становится фильтром: он отсекает 95% мусора, оставляя для дорогой модели только релевантные файлы. Так вы сокращаете токены в 10-20 раз для сложных задач.

Предупреждение: даже с 100% валидностью tool-calling, модель может ошибаться в параметрах. Например, искать в / вместо ./. Добавьте в ваш враппер проверку директорий и лимит на количество возвращаемых строк.

На февраль 2026 года этот подход – самый дешевый способ автоматизировать рутинную навигацию по коду. Пока крупные вендоры увеличивают контекст до 1M токенов, вы можете делать то же самое за 0 рублей. Просто надо правильно поделить задачу между маленькой и большой моделью.

И да, если боитесь галлюцинаций – проведите форенсик-аудит на своем коде. Но для поиска файлов по маске галлюцинировать сложно: либо файл есть, либо нет.

Подписаться на канал