Добавлена блокировка реакций на действия бота + обновление системного промпта
- Добавлены паттерны блокировки в ai_agent.py для ddgs, rss, ssh, cron - Обновлён SYSTEM_PROMPT.md с разделом про блокировку реакций - Обновлён system_prompt.md с версией 0.8.0 - Добавлен приоритет File System tool перед SSH - Обновлена таблица версий Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
parent
09fb020745
commit
107685771c
|
|
@ -52,6 +52,7 @@ AI агент анализирует запрос пользователя и **
|
|||
|
||||
| Триггеры | Инструмент | Пример |
|
||||
|----------|------------|--------|
|
||||
| "прочитай", "покажи файл", "ls", "cat" | `file_system_tool` | "покажи файлы в директории" |
|
||||
| "найди", "погугли", "узнай" | `ddgs_search` | "найди информацию про asyncio" |
|
||||
| "новости", "rss", "лента" | `rss_reader` | "что нового в Linux?" |
|
||||
| "выполни команду", "ssh" | `ssh_executor` | "проверь нагрузку на сервере" |
|
||||
|
|
@ -76,10 +77,29 @@ AI агент анализирует запрос пользователя и **
|
|||
|
||||
При принятии решения AI следует приоритету:
|
||||
|
||||
1. **SSH** — явные системные задачи
|
||||
2. **Cron** — планирование и напоминания
|
||||
3. **Поиск (DDGS)** — свежие данные из интернета
|
||||
4. **RSS** — новости из подписанных лент
|
||||
1. **File System** — если операция с файлами/директориями
|
||||
2. **SSH** — если явная системная задача на сервере
|
||||
3. **Cron** — если планирование/напоминание
|
||||
4. **Поиск (DDGS)** — если нужны свежие данные из интернета
|
||||
5. **RSS** — если новости из подписанных лент
|
||||
|
||||
## ⚠️ Блокировка: Реакция на действия бота
|
||||
|
||||
**Важное правило:** Не активируй инструменты если пользователь говорит о **прошлых действиях бота**, а не просит сделать что-то новое.
|
||||
|
||||
**❌ НЕ активируй инструменты если пользователь:**
|
||||
- Комментирует прошлые действия: "ты опять ddgs запустил", "зачем ты rss включил"
|
||||
- Критикует срабатывание: "перестань", "хватит", "не надо"
|
||||
- Указывает на ошибку: "баг", "ошибка", "неправильно"
|
||||
- Говорит о прошлом: "я не просил", "я не говорил"
|
||||
- Реагирует на результат: "это не то", "я вижу что ты..."
|
||||
|
||||
**✅ Активируй инструменты только если:**
|
||||
- Пользователь явно просит сделать что-то **новое** ("найди...", "проверь...", "запусти...")
|
||||
- В запросе есть **триггерные слова** из раздела инструментов
|
||||
- Пользователь продолжает тему и нужен **новый запрос** к инструменту
|
||||
|
||||
**Правильное поведение при ошибке:** Извиниться кратко, объяснить что исправишь логику, но **не запускать инструмент повторно**.
|
||||
|
||||
## 🔄 Обновление промпта
|
||||
|
||||
|
|
@ -149,8 +169,9 @@ ai_agent.get_user_preference(user_id, 'preferred_tool')
|
|||
|
||||
| Версия | Изменения |
|
||||
|--------|-----------|
|
||||
| 0.8.0 | Исправление SSH (wait_and_read_ssh), команда /restart_bot |
|
||||
| 0.7.0 | Векторная память (ChromaDB RAG), ИИ-агент с памятью |
|
||||
| 0.8.0 | Исправление OAuth + память файлов + совместимость PTB 20.7+ |
|
||||
| 0.7.1 | AI Provider Manager (Qwen Code, GigaChat), блокировка на реакции бота |
|
||||
| 0.7.0 | Векторная память (ChromaDB RAG), ИИ-агент с памятью, File System Tool |
|
||||
| 0.6.0 | Автоматическая установка, SOCKS5 прокси |
|
||||
| 0.5.3 | Базовая реализация системного промпта |
|
||||
| 0.5.2 | AI агент с авто-выбором инструментов |
|
||||
|
|
|
|||
121
bot/ai_agent.py
121
bot/ai_agent.py
|
|
@ -97,6 +97,31 @@ class AIAgent:
|
|||
message_lower = message.lower()
|
||||
score = 0.0
|
||||
|
||||
# ❌ БЛОКИРОВКА: Если пользователь реагирует на действие бота — НЕ активируем
|
||||
# Это предотвращает циклические запуски когда пользователь критикует бота
|
||||
reaction_patterns = [
|
||||
r'ты\s+\w+\s+запусти', # "ты ddgs запустил"
|
||||
r'ты\s+опять', # "ты опять"
|
||||
r'ты\s+снова', # "ты снова"
|
||||
r'зачем\s+ты', # "зачем ты"
|
||||
r'почему\s+ты', # "почему ты"
|
||||
r'перестань', # "перестань"
|
||||
r'хватит', # "хватит"
|
||||
r'не\s+надо', # "не надо"
|
||||
r'не\s+нужно', # "не нужно"
|
||||
r'я\s+не\s+просил', # "я не просил"
|
||||
r'я\s+не\s+говорил', # "я не говорил"
|
||||
r'реакци', # "реакция", "реакцию"
|
||||
r'критик', # "критика", "критикуешь"
|
||||
r'баг', # "баг", "баги"
|
||||
r'ошибк', # "ошибка", "ошибся"
|
||||
r'проблем', # "проблема", "проблему"
|
||||
]
|
||||
for pattern in reaction_patterns:
|
||||
if re.search(pattern, message_lower):
|
||||
logger.debug(f"Блокировка search: пользователь реагирует на действие бота (паттерн: {pattern})")
|
||||
return False, 0.0
|
||||
|
||||
# Прямые триггеры — высокий приоритет
|
||||
# Используем паттерн с границами для избежания частичных совпадений
|
||||
for trigger in self.SEARCH_TRIGGERS:
|
||||
|
|
@ -132,6 +157,30 @@ class AIAgent:
|
|||
"""
|
||||
message_lower = message.lower()
|
||||
|
||||
# ❌ БЛОКИРОВКА: Если пользователь реагирует на действие бота — НЕ активируем
|
||||
reaction_patterns = [
|
||||
r'ты\s+\w+\s+запусти', # "ты rss запустил"
|
||||
r'ты\s+опять', # "ты опять"
|
||||
r'ты\s+снова', # "ты снова"
|
||||
r'зачем\s+ты', # "зачем ты"
|
||||
r'почему\s+ты', # "почему ты"
|
||||
r'перестань', # "перестань"
|
||||
r'хватит', # "хватит"
|
||||
r'не\s+надо', # "не надо"
|
||||
r'не\s+нужно', # "не нужно"
|
||||
r'я\s+не\s+просил', # "я не просил"
|
||||
r'я\s+не\s+говорил', # "я не говорил"
|
||||
r'реакци', # "реакция", "реакцию"
|
||||
r'критик', # "критика", "критикуешь"
|
||||
r'баг', # "баг", "баги"
|
||||
r'ошибк', # "ошибка", "ошибся"
|
||||
r'проблем', # "проблема", "проблему"
|
||||
]
|
||||
for pattern in reaction_patterns:
|
||||
if re.search(pattern, message_lower):
|
||||
logger.debug(f"Блокировка rss: пользователь реагирует на действие бота (паттерн: {pattern})")
|
||||
return False, 0.0
|
||||
|
||||
# Только прямые фразы-триггеры — высокий порог
|
||||
# Проверяем чтобы триггер был словом/фразой в контексте, а не частью слова
|
||||
for trigger in self.RSS_TRIGGERS:
|
||||
|
|
@ -155,6 +204,30 @@ class AIAgent:
|
|||
message_lower = message.lower()
|
||||
score = 0.0
|
||||
|
||||
# ❌ БЛОКИРОВКА: Если пользователь реагирует на действие бота — НЕ активируем
|
||||
reaction_patterns = [
|
||||
r'ты\s+\w+\s+запусти', # "ты ssh запустил"
|
||||
r'ты\s+опять', # "ты опять"
|
||||
r'ты\s+снова', # "ты снова"
|
||||
r'зачем\s+ты', # "зачем ты"
|
||||
r'почему\s+ты', # "почему ты"
|
||||
r'перестань', # "перестань"
|
||||
r'хватит', # "хватит"
|
||||
r'не\s+надо', # "не надо"
|
||||
r'не\s+нужно', # "не нужно"
|
||||
r'я\s+не\s+просил', # "я не просил"
|
||||
r'я\s+не\s+говорил', # "я не говорил"
|
||||
r'реакци', # "реакция", "реакцию"
|
||||
r'критик', # "критика", "критикуешь"
|
||||
r'баг', # "баг", "баги"
|
||||
r'ошибк', # "ошибка", "ошибся"
|
||||
r'проблем', # "проблема", "проблему"
|
||||
]
|
||||
for pattern in reaction_patterns:
|
||||
if re.search(pattern, message_lower):
|
||||
logger.debug(f"Блокировка ssh: пользователь реагирует на действие бота (паттерн: {pattern})")
|
||||
return False, 0.0
|
||||
|
||||
# Прямые триггеры
|
||||
# Используем паттерн с границами для избежания частичных совпадений
|
||||
for trigger in self.SSH_TRIGGERS:
|
||||
|
|
@ -186,6 +259,30 @@ class AIAgent:
|
|||
message_lower = message.lower()
|
||||
score = 0.0
|
||||
|
||||
# ❌ БЛОКИРОВКА: Если пользователь реагирует на действие бота — НЕ активируем
|
||||
reaction_patterns = [
|
||||
r'ты\s+\w+\s+запусти', # "ты cron запустил"
|
||||
r'ты\s+опять', # "ты опять"
|
||||
r'ты\s+снова', # "ты снова"
|
||||
r'зачем\s+ты', # "зачем ты"
|
||||
r'почему\s+ты', # "почему ты"
|
||||
r'перестань', # "перестань"
|
||||
r'хватит', # "хватит"
|
||||
r'не\s+надо', # "не надо"
|
||||
r'не\s+нужно', # "не нужно"
|
||||
r'я\s+не\s+просил', # "я не просил"
|
||||
r'я\s+не\s+говорил', # "я не говорил"
|
||||
r'реакци', # "реакция", "реакцию"
|
||||
r'критик', # "критика", "критикуешь"
|
||||
r'баг', # "баг", "баги"
|
||||
r'ошибк', # "ошибка", "ошибся"
|
||||
r'проблем', # "проблема", "проблему"
|
||||
]
|
||||
for pattern in reaction_patterns:
|
||||
if re.search(pattern, message_lower):
|
||||
logger.debug(f"Блокировка cron: пользователь реагирует на действие бота (паттерн: {pattern})")
|
||||
return False, 0.0
|
||||
|
||||
# Прямые триггеры
|
||||
# Используем паттерн с границами для избежания частичных совпадений
|
||||
for trigger in self.CRON_TRIGGERS:
|
||||
|
|
@ -211,6 +308,30 @@ class AIAgent:
|
|||
message_lower = message.lower()
|
||||
score = 0.0
|
||||
|
||||
# ❌ БЛОКИРОВКА: Если пользователь реагирует на действие бота — НЕ активируем
|
||||
reaction_patterns = [
|
||||
r'ты\s+\w+\s+запусти', # "ты file_system запустил"
|
||||
r'ты\s+опять', # "ты опять"
|
||||
r'ты\s+снова', # "ты снова"
|
||||
r'зачем\s+ты', # "зачем ты"
|
||||
r'почему\s+ты', # "почему ты"
|
||||
r'перестань', # "перестань"
|
||||
r'хватит', # "хватит"
|
||||
r'не\s+надо', # "не надо"
|
||||
r'не\s+нужно', # "не нужно"
|
||||
r'я\s+не\s+просил', # "я не просил"
|
||||
r'я\s+не\s+говорил', # "я не говорил"
|
||||
r'реакци', # "реакция", "реакцию"
|
||||
r'критик', # "критика", "критикуешь"
|
||||
r'баг', # "баг", "баги"
|
||||
r'ошибк', # "ошибка", "ошибся"
|
||||
r'проблем', # "проблема", "проблему"
|
||||
]
|
||||
for pattern in reaction_patterns:
|
||||
if re.search(pattern, message_lower):
|
||||
logger.debug(f"Блокировка file_system: пользователь реагирует на действие бота (паттерн: {pattern})")
|
||||
return False, 0.0
|
||||
|
||||
# Прямые триггеры
|
||||
# Используем паттерн с границами для избежания частичных совпадений
|
||||
for trigger in self.FILE_SYSTEM_TRIGGERS:
|
||||
|
|
|
|||
|
|
@ -177,6 +177,40 @@ file_system_tool(operation='copy', source='file.txt', destination='backup/file.t
|
|||
4. **Поиск (DDGS)** — если нужны свежие данные из интернета
|
||||
5. **RSS** — если новости из подписанных лент
|
||||
|
||||
### 5. **⚠️ БЛОКИРОВКА: Реакция на действия бота**
|
||||
|
||||
**ГЛАВНОЕ ПРАВИЛО:** Не активируй инструменты если пользователь говорит о **прошлых действиях бота**, а не просит сделать что-то новое.
|
||||
|
||||
**❌ НЕ активируй инструменты если пользователь:**
|
||||
|
||||
| Тип сообщения | Примеры | Реакция |
|
||||
|--------------|---------|---------|
|
||||
| **Комментирует прошлые действия** | "ты опять ddgs запустил", "зачем ты rss включил", "ну и снова ты cron включил" | ❌ Не запускать инструмент |
|
||||
| **Критикует срабатывание** | "перестань", "хватит", "не надо", "отстань" | ❌ Не запускать инструмент |
|
||||
| **Указывает на ошибку** | "баг", "ошибка", "неправильно", "глюк" | ❌ Не запускать инструмент |
|
||||
| **Говорит о прошлом** | "я не просил", "я не говорил", "я не это имел в виду" | ❌ Не запускать инструмент |
|
||||
| **Реагирует на результат** | "это не то", "зачем мне это", "я вижу что ты..." | ❌ Не запускать инструмент |
|
||||
|
||||
**✅ Активируй инструменты только если:**
|
||||
- Пользователь явно просит сделать что-то **новое** ("найди...", "проверь...", "запусти...")
|
||||
- В запросе есть **триггерные слова** из раздела инструментов
|
||||
- Пользователь продолжает тему и нужен **новый запрос** к инструменту
|
||||
|
||||
**Примеры правильной реакции:**
|
||||
|
||||
| Сообщение пользователя | Действие |
|
||||
|----------------------|----------|
|
||||
| "ты опять ddgs запустил" | ❌ Извиниться, не запускать |
|
||||
| "найди информацию про Python" | ✅ Запустить ddgs_search |
|
||||
| "перестань запускать cron" | ❌ Извиниться, не запускать |
|
||||
| "запланируй напоминание на завтра" | ✅ Запустить cron_manager |
|
||||
| "баг в твоей логике" | ❌ Извиниться, спросить что исправить |
|
||||
| "покажи последние новости" | ✅ Запустить rss_reader |
|
||||
| "я не просил искать новости" | ❌ Извиниться, не запускать rss_reader |
|
||||
| "что нового в Linux?" | ✅ Запустить rss_reader |
|
||||
|
||||
**Правильное поведение при ошибке:** Извиниться кратко, объяснить что исправишь логику, но **не запускать инструмент повторно**.
|
||||
|
||||
---
|
||||
|
||||
## 📋 ФОРМАТ ОТВЕТОВ
|
||||
|
|
@ -264,7 +298,7 @@ Filesystem Size Used Avail Use% Mounted on
|
|||
|
||||
## 🎯 ТЕКУЩАЯ ВЕРСИЯ
|
||||
|
||||
**Bot Version:** 0.7.1
|
||||
**Bot Version:** 0.8.0
|
||||
**AI Provider Manager:** Поддержка multiple AI providers (Qwen Code, GigaChat)
|
||||
**Memory:** ChromaDB RAG + Vector Memory
|
||||
**Tools:** ddgs_tool, rss_tool, ssh_tool, cron_tool, file_system_tool
|
||||
|
|
|
|||
Loading…
Reference in New Issue