5.9 KiB
5.9 KiB
🔄 Исправление проблемы с инструментами ИИ
Проблема
ИИ (Qwen Code / Opencode / GigaChat) не хотел использовать инструменты бота, потому что:
- Не считал их своими — пытался работать только через свои встроенные инструменты
- Говорил что инструменты недоступны — хотя AI-агент их вызывал
- Пытался вызвать инструменты напрямую — хотя технически не мог это сделать
Причина
Архитектурная проблема:
- AI-агент бота (
bot/ai_agent.py) — принимает решение об использовании инструментов и вызывает их - ИИ (Qwen/другие) — генерирует текст, но не имел доступа к результатам инструментов
ИИ видел в системном промпте описание инструментов, но не получал результаты их выполнения — поэтому думал что они недоступны.
Решение
1. Обновлён системный промпт (system_prompt.md)
Добавлены явные указания:
## 🧠 АРХИТЕКТУРА: КТО ВЫЗЫВАЕТ ИНСТРУМЕНТЫ?
**ВАЖНОЕ РАЗДЕЛЕНИЕ ОТВЕТСТВЕННОСТИ:**
1. **AI-агент бота** (внешняя система) — **принимает решение** об использовании инструментов и **вызывает их**
2. **ТЫ (Qwen/ИИ)** — **получаешь результаты инструментов в контексте** и **анализируешь их**
**ТЫ НЕ ВЫЗЫВАЕШЬ ИНСТРУМЕНТЫ НАПРЯМУЮ!**
2. Обновлена логика bot.py
До:
if tool_result.success:
# СРАЗУ формируем ответ из результатов
tool_result_formatted = await format_tool_result(...)
await send_long_message_html(update, tool_result_formatted)
return # Qwen НЕ получает результаты!
После:
# Сохраняем результат для передачи в Qwen
tool_result_for_context = {
'tool_name': agent_decision.tool_name,
'result': tool_result,
'args': agent_decision.tool_args
}
# Формируем блок с результатами инструментов
if tool_result_for_context:
tool_result_block = f"=== РЕЗУЛЬТАТЫ ИНСТРУМЕНТА ===\n{result.data}"
# Добавляем в полный промпт для Qwen
full_task = f"{system_prompt}\n\n{tool_result_block}\n\n=== ЗАПРОС ===\n{text}"
3. Поддержка всех провайдеров
Обновлены все AI-провайдеры:
- ✅ Qwen Code — получает результаты в
full_task - ✅ GigaChat — получает результаты в
context_messages - ✅ Opencode — получает результаты в
context_messages
Что изменилось
| Было | Стало |
|---|---|
| ИИ не видел результаты инструментов | ИИ получает результаты в контексте |
| ИИ пытался вызвать инструменты сам | ИИ знает что не может вызывать инструменты |
| Прямой ответ из инструментов | ИИ анализирует результаты и формирует ответ |
| Путаница с доступностью | Явное разделение ответственности |
Тестирование
Проверьте работу с разными инструментами:
# Поиск в интернете
"Найди информацию про Python asyncio"
# RSS новости
"Почитай новости Linux"
# SSH команды
"Проверь нагрузку на сервере"
# Cron задачи
"Напомни каждый день делать бэкап"
# Файловая система
"Покажи содержимое /home/mirivlad/git"
Ожидаемое поведение:
- AI-агент распознаёт запрос и решает использовать инструмент
- Инструмент выполняется
- Результаты передаются в ИИ
- ИИ анализирует результаты и формирует понятный ответ
- ИИ не пытается вызвать инструмент повторно
Файлы изменены
system_prompt.md— добавлено явное разделение ответственностиbot.py— передача результатов инструментов в ИИhandle_ai_task()— сохранение результатов вtool_result_for_context- Формирование
tool_result_blockдля разных провайдеров - GigaChat и Opencode — поддержка результатов инструментов
Следующие шаги
Если проблема сохранится:
- Проверить логи — посмотреть что видит ИИ в контексте
- Добавить больше примеров в системный промпт
- Настроить temperature — возможно ИИ слишком "креативный"
- Добавить few-shot примеры — показать как правильно отвечать
Дата исправления: 2026-03-09
Версия бота: 0.9.0