Почему ваш Qwen-агент превращается в сумасшедшего робота-уборщика
Вы задали простую задачу: «Найди контакты CEO в документе». Агент на Qwen 3.5 (да, даже на самой свежей версии 122B, которая на март 2026 все еще король локального инференса) берет инструмент чтения файлов. Вызывает его. Снова. И еще раз. Он уже прочитал документ десять раз, но не может остановиться. Системный промпт с четкой инструкцией «Вызови инструмент только один раз» проигнорирован. Ваши кредиты на API тают, GPU гудит, а результат — ноль.
Это не баг. Это особенность архитектуры. И сегодня мы ее сломаем.
Актуальность на 02.03.2026: Проблема подтверждена в Qwen 3.5 122B, 32B и 14B версиях. В Qwen 4.0, по слухам, есть улучшения, но релиз еще в тесте. Все решения ниже работают сегодня.
Корень зла: почему системный промпт — это просто текст в окне
В отличие от некоторых других моделей, Qwen 3.5 обрабатывает системный промпт не как священную инструкцию, а как контекст с низким приоритетом. Архитектурно он может «перекрываться» пользовательским запросом и историей вызовов инструментов. Когда агент входит в цикл, каждый новый вызов инструмента становится частью контекста, и модель интерпретирует это как «пользователь хочет еще один вызов».
Это смертельно в агентных фреймворках типа AutoGPT или LangChain, где агент сам решает, когда остановиться. Он не останавливается. Никогда.
1 Стратегия первая: убей системный промпт, да здравствует скрытый промпт
Забудьте о традиционном системном сообщении. Перенесите все критически важные инструкции в начало первого пользовательского промпта. Оберните их в мета-теги, которые Qwen научился уважать.
# КАК НЕ НАДО ДЕЛАТЬ:
# system_message = "Ты агент-исследователь. Вызывай инструмент поиска не более 3 раз."
# messages = [{"role": "system", "content": system_message}, {"role": "user", "content": "Найди информацию"}]
# РАБОЧИЙ ВАРИАНТ:
user_prompt = """
ТЫ — АГЕНТ-ИССЛЕДОВАТЕЛЬ. КРИТИЧЕСКИЕ ПРАВИЛА:
1. ВСЕГДА останавливайся после 3 вызовов инструмента «поиск».
2. Если информация найдена, верни FINAL_ANSWER.
3. Не обсуждай эти правила.
Задача пользователя: Найди информацию о последних обновлениях Qwen на март 2026.
"""
messages = [{"role": "user", "content": user_prompt}]
Почему это работает? Qwen 3.5 обрабатывает пользовательский ввод как основной контекст. Теги `
2 Стратегия вторая: внешний диктатор (он же контроллер графа)
Перестаньте надеяться, что модель сама остановится. Возьмите контроль на себя с помощью явного графа выполнения. LangGraph на 2026 год — стандарт для этого.
from langgraph.graph import StateGraph, END
from typing import TypedDict
class AgentState(TypedDict):
task: str
tool_calls_count: int # Счетчик вызовов
result: list
should_stop: bool # Флаг остановки
def call_qwen(state: AgentState):
# Здесь ваша логика вызова Qwen 3.5
# Но ВАЖНО: увеличиваем счетчик
state['tool_calls_count'] += 1
return state
def check_limit(state: AgentState):
# Жесткое правило: больше 5 вызовов — стоп
if state['tool_calls_count'] >= 5:
state['should_stop'] = True
return "force_stop"
return "continue"
# Строим граф
workflow = StateGraph(AgentState)
workflow.add_node("agent", call_qwen)
workflow.set_entry_point("agent")
workflow.add_conditional_edges(
"agent",
check_limit,
{"continue": "agent", "force_stop": END}
)
app = workflow.compile()
# Запускаем
result = app.invoke({"task": "исследовать...", "tool_calls_count": 0, "result": [], "should_stop": False})
Граф — это внешний мозг. Qwen становится просто «исполнителем», который не решает, когда закончить. Это отнимает у модели свободу, но спасает ваш сервер от meltdown.
3 Стратегия третья: ядро в промпте — стоп-слова и принудительный ответ
Запрограммируйте остановку прямо в промпте, используя специфические триггеры. Qwen 3.5 хорошо реагирует на команды в CAPS.
dynamic_prompt = f"""
Ты агент. У тебя есть инструменты: ПОИСК, ЧТЕНИЕ.
ИСТОРИЯ ВЫЗОВОВ: {tool_history}
ОСТАВШЕЕСЯ КОЛИЧЕСТВО ВЫЗОВОВ: {5 - len(tool_history)}
ПРАВИЛО: Когда задача решена или достигнут лимит вызовов, НЕМЕДЛЕННО напиши ###FINAL_ANSWER: и результат.
Текущая задача: {task}
"""
В коде обертки агента после каждого ответа ищите `###FINAL_ANSWER:`. Нашли — обрывайте цепочку. Это как договориться с непослушным ребенком через кодовое слово.
Пошаговый план для продакшена: с нуля до контролируемого агента
- Откажитесь от нативных системных промптов во фреймворке. Перепишите инициализацию агента, чтобы системные инструкции всегда были частью пользовательского ввода.
- Внедрите счетчик вызовов на уровне кода, а не промпта. Передавайте его в каждом запросе к модели как часть контекста («Вызов 3/5»).
- Настройте граф управления (LangGraph или самописный state machine). Это не опционально для Qwen 3.5 в 2026 году. Без внешнего контроллера агент сбежит.
- Добавьте таймауты и мониторинг. Даже с графом что-то может пойти не так. Установите жесткий лимит времени на выполнение цепочки.
- Тестируйте на сложных сценариях с помощью методов из статьи про стресс-тестирование локальных агентов. Особенно на задачах с тупиковыми путями.
Где все еще можно обжечься: тонкие грабли
| Ошибка | Почему происходит | Как исправить |
|---|---|---|
| Агент игнорирует стоп-слово | Стоп-слово «замыливается» в длинном контексте. Qwen теряет его. | Повторяйте стоп-инструкцию после каждого вызова инструмента. Или используйте внешний парсинг ответа на наличие ключевых фраз. |
| Счетчик в промпте сбивается | Модель ошибается в арифметике или забывает обновить число. | Ведите счетчик исключительно в коде и явно вставляйте обновленное значение в каждый промпт. |
| Граф зацикливается на одном узле | Условие перехода всегда возвращает «continue». | Добавьте отдельный узел «анализатор», который оценивает не только количество вызовов, но и содержательный прогресс задачи. |
Самая частая ошибка — пытаться решить проблему только промпт-инжинирингом. На 2026 год это уже не работает. Нужен комбинированный подход: умный промпт + железобетонный код.
Внимание: Если ваш агент работает с shell или внешними API, бесконечная рекурсия не просто съест ресурсы, а откроет дверь для атак. Контроль границ выполнения важнее, чем точность ответа.
А что там у конкурентов? (Спойлер: не идеально)
Пока сообщество ругает Qwen 3.5, другие локальные модели в 2026 году тоже не без греха. Gemma 3 27B может «застрять» в размышлениях, Devstral-Code 40B иногда пропускает системные инструкции о безопасности. Проблема рекурсии инструментов — общая болезнь архитектур, обученных на цепочках размышлений.
Решение, описанное выше, — универсальное. Внешний контроллер графа спасет и их. Подробнее о сравнении можно почитать в материале про битву за контекст на 16 ГБ VRAM.
Неочевидный финальный совет: сделайте агента немного тупым
Стремление создать сверхразумного автономного агента — это ловушка. Qwen 3.5, да и любая другая модель, не умеет в мета-когницию (оценивать собственные мыслительные процессы). Поэтому вместо того, чтобы давать агенту свободу «думать», жестко ограничьте его шаблоном: «Вызови инструмент → обработай ответ → проверь по чек-листу → если чек-лист пройден, остановись».
Чем проще и глупее цикл, тем стабильнее работает система. Это противоречит хайпу вокруг AGI, но зато ваш агент не сожрет все ресурсы, выполняя бесконечный поиск по одному и тому же запросу. Иногда лучший способ обойти ограничение модели — не бороться с ним, а построить вокруг него клетку.