Мой ассистент меня обманывал. Систематически
Три недели я доверял ему задачи по автоматизации. Он кивал, говорил "выполнено", а потом оказывалось, что половина работы - выдумка. Файлы, которых нет. Команды, которые не выполнялись. API-ключи от несуществующих сервисов.
Это не баг. Это системная галлюцинация, и ваш агент делает то же самое прямо сейчас.
Я провел полный форенсик-аудит своего локального ассистента на базе Qwen2.5-32B-Instruct. Результат шокировал: 42% задач содержали галлюцинации разной степени тяжести. От мелких неточностей до полного вымысла.
Галлюцинация в контексте агентов - это не просто "немного неправды". Это когда агент сообщает о выполнении действия, которое не выполнял. Или создает артефакты, которых не существует. Или вызывает инструменты с неверными параметрами.
Почему агенты врут чаще, чем обычные LLM
Одиночная LLM может галлюцинировать факты. Агент же галлюцинирует цепочки действий. Каждый шаг в плане - потенциальная точка отказа.
Вспомните статью "Отладка глубоких агентов" - там мы разбирали, как сложность агентных систем создает каскадные ошибки. Галлюцинации - частный случай этой проблемы.
Мой ассистент использовал CrewAI с инструментами для работы с файлами, выполнения команд и вызова API. Казалось бы, стандартный стек. Но вот что происходило на самом деле:
- Агент писал: "Создал файл config.yaml с настройками"
- Файл действительно появлялся
- Но содержимое было случайным набором YAML-подобного синтаксиса
- Ключи API в файле не работали
- Пути к директориям указывали на несуществующие места
Агент не врал сознательно. Он просто "додумывал" недостающие части, чтобы завершить задачу. Как человек, который, не зная ответа, начинает импровизировать.
10 паттернов галлюцинаций, которые я нашел
После анализа 127 задач я выделил повторяющиеся шаблоны. Запомните их - они как отпечатки пальцев у лжеца.
| Паттерн | Частота | Пример |
|---|---|---|
| Синтетическое выполнение | 23% | "Выполнил команду docker-compose up", но контейнеры не запущены |
| Фантомные файлы | 18% | Файл существует, но содержимое не соответствует описанию |
| Некорректные пути | 15% | Пути типа /home/user/project/src/main.py, когда структура иная |
| Вымышленные API-ответы | 12% | "API вернул успех", но лог показывает ошибку 404 |
| Перепутанные контексты | 10% | Использует команды из другой ОС или устаревшего ПО |
Обратите внимание на "синтетическое выполнение" - самый частый паттерн. Агент сообщает об успехе, но не проверяет результат. Это как если бы вы сказали "я починил кран", не проверив, течет ли он.
В статье "Ваш агент врёт как сивый мерин" мы касались похожих проблем, но там речь шла о продакшн-системах. Локальные ассистенты врут иначе - более "творчески".
Чеклист аудита: 7 шагов к правде
Хватит теории. Вот что нужно сделать прямо сейчас с вашим ассистентом.
1 Включите детальное логирование каждого инструмента
Большинство фреймворков по умолчанию логируют только высокоуровневые действия. Это бесполезно. Нужны сырые данные:
# Для CrewAI
from crewai.agents import Agent
from crewai.tools import tool
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
@tool
def execute_command(cmd: str) -> str:
"""Execute shell command and return output"""
logger.debug(f"EXECUTING: {cmd}")
# ... выполнение команды
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
logger.debug(f"RESULT: {result.returncode}, OUTPUT: {result.stdout[:200]}")
return result.stdout
Без DEBUG-уровня вы никогда не увидите, что команда на самом деле вернула ошибку, а агент проигнорировал ее.
2 Добавьте верификацию после каждого действия
Агент сказал "создал файл"? Проверьте:
@tool
def create_file_with_verification(path: str, content: str) -> dict:
"""Create file and verify it was created correctly"""
# Создание файла
with open(path, 'w') as f:
f.write(content)
# Верификация
verification = {
'file_exists': os.path.exists(path),
'file_size': os.path.getsize(path) if os.path.exists(path) else 0,
'content_matches': False
}
if verification['file_exists']:
with open(path, 'r') as f:
actual_content = f.read()
verification['content_matches'] = (actual_content == content)
return verification
Этот подход убивает паттерн "фантомные файлы" на корню.
3 Внедрите контрольные точки (checkpoints)
Разбейте сложные задачи на этапы с обязательной проверкой между ними. Не давайте агенту выполнять 10 шагов подряд без обратной связи.
4 Создайте датасет тестовых задач
Возьмите 20-30 реальных задач из вашего workflow. Запустите их через агента. Вручную проверьте каждую.
Мой датасет включал:
- Настройку Docker-окружения
- Генерацию конфигурационных файлов
- Работу с Git (создание веток, коммиты)
- Вызов REST API
- Парсинг логов
После первого прогона 42% задач содержали ошибки. После внедрения проверок - только 8%.
5 Анализируйте расхождения между планом и исполнением
Сохраняйте не только результат, но и план, который составил агент. Потом сравните:
def audit_task_execution(task_description, agent_plan, actual_actions, final_result):
"""Compare what was planned vs what actually happened"""
discrepancies = []
for planned_action, actual_action in zip(agent_plan, actual_actions):
if planned_action['tool'] != actual_action['tool']:
discrepancies.append(f"Tool mismatch: {planned_action['tool']} vs {actual_action['tool']}")
if planned_action.get('expected_output') and \
planned_action['expected_output'] not in str(actual_action.get('result')):
discrepancies.append(f"Output mismatch for {planned_action['tool']}")
return {
'task': task_description,
'discrepancies': discrepancies,
'discrepancy_count': len(discrepancies),
'success': len(discrepancies) == 0
}
6 Используйте специализированные модели для проверки
Qwen2.5-32B-Instruct - отличная модель для выполнения задач. Но для проверки результатов иногда лучше использовать более маленькую, но точную модель.
Например, для проверки корректности YAML/JSON файлов я добавил вызов специализированного валидатора:
@tool
def validate_yaml_file(path: str) -> dict:
"""Validate YAML file syntax and structure"""
import yaml
from yaml import YAMLError
try:
with open(path, 'r') as f:
content = yaml.safe_load(f)
return {
'valid': True,
'has_content': bool(content),
'keys': list(content.keys()) if content else []
}
except YAMLError as e:
return {
'valid': False,
'error': str(e),
'line': getattr(e, 'problem_mark', None)
}
7 Регулярно обновляйте контекст агента
Агенты забывают. Или точнее - их контекст устаревает. Файловая система изменилась? Установлены новые пакеты? Агент этого не знает.
Добавьте периодическую синхронизацию:
@tool
def sync_environment_context() -> dict:
"""Update agent's knowledge about current environment"""
context = {
'current_directory': os.getcwd(),
'python_version': sys.version,
'installed_packages': [],
'docker_containers': [],
'git_status': None
}
# Получаем актуальные данные
try:
import pkg_resources
context['installed_packages'] = [pkg.key for pkg in pkg_resources.working_set]
except:
pass
# Проверяем Docker
result = subprocess.run(['docker', 'ps', '--format', '{{.Names}}'],
capture_output=True, text=True)
if result.returncode == 0:
context['docker_containers'] = [name.strip() for name in result.stdout.split('\n') if name]
return context
Где искать самые коварные галлюцинации
Некоторые области особенно уязвимы. Проверьте их в первую очередь.
Работа с файловыми системами
Агенты постоянно путают абсолютные и относительные пути. Или предполагают существование директорий. Или не учитывают права доступа.
Мой ассистент "создавал" файлы в /etc/, хотя работал под обычным пользователем. И сообщал об успехе, хотя на самом деле получал Permission denied.
Вызов внешних API
Здесь галлюцинации принимают особо изощренные формы:
- Агент "помнит" старые endpoint'ы, которые уже не работают
- Генерирует примерные ответы вместо реальных
- Игнорирует коды ошибок HTTP
- Путает форматы данных (XML вместо JSON)
Решение: всегда сохраняйте сырые HTTP-ответы в лог. Всегда проверяйте status code.
Работа с базами данных
Самое опасное. Агент может "уверенно" сообщать о миграции данных, которая на самом деле не произошла. Или о бэкапе, который не создан.
Никогда не доверяйте агенту критичные операции с БД без ручной проверки. Одна галлюцинация здесь может стоить данных.
Инструменты для автоматизации аудита
Ручная проверка утомительна. Вот что я автоматизировал:
#!/bin/bash
# audit_agent.sh - автоматический аудит AI-ассистента
# 1. Запускаем набор тестовых задач
python run_audit_tasks.py --dataset tasks.json --output audit_results.json
# 2. Анализируем расхождения
python analyze_discrepancies.py audit_results.json --generate-report
# 3. Проверяем созданные артефакты
python verify_artifacts.py --check-files --check-commands --check-api-calls
# 4. Генерируем сводный отчет
python generate_report.py --html --markdown --stdout
Полный скрипт аудита доступен в моем репозитории. Он включает:
- 50+ тестовых задач разных категорий
- Верификаторы для файлов, команд, API
- Визуализацию расхождений
- Экспорт в форматы для дальнейшего анализа
Что делать, если нашли галлюцинации
Обнаружили проблему? Не паникуйте. Действуйте системно.
- Изолируйте проблему. На какой задаче происходит? С какими инструментами?
- Увеличьте уровень логирования для этой комбинации.
- Добавьте явные проверки в проблемный инструмент.
- Создайте тест-кейс, который воспроизводит проблему.
- Рассмотрите замену инструмента или добавление fallback-логики.
Иногда проблема не в агенте, а в промптах. В статье "Когда LLM врет: отлавливаем галлюцинации линейкой в векторном пространстве" мы разбирали, как промпт-инжиниринг влияет на достоверность.
Будущее: самоаудитирующиеся агенты
Следующий шаг - агенты, которые сами отслеживают свои галлюцинации. Представьте:
- Агент выполняет действие
- Запускает верификацию результата
- Если обнаружено несоответствие - перевыполняет с коррекцией
- Записывает паттерн ошибки для обучения
Такие системы уже появляются. Например, в AgentPuzzles.com агенты соревнуются в создании и решении задач, постоянно улучшая свою надежность.
Или взгляните на Holo2-235B-A22B - там агентная локализация (по сути, самопроверка в контексте) улучшает точность на 10-20%.
Главный урок: доверяй, но проверяй
Мой ассистент теперь работает с проверками после каждого значимого действия. Уровень галлюцинаций упал с 42% до 6%. Эти 6% - в основном edge-кейсы, которые мы еще не покрыли тестами.
Ваш локальный AI-ассистент - не оракул. Он инструмент с известными ограничениями. Чем раньше вы это примете, тем надежнее будет ваша автоматизация.
Запустите аудит сегодня. Потратьте день на настройку проверок. Сэкономите недели на отладке вымышленных результатов.
И помните: каждый раз, когда агент говорит "я сделал", спросите: "А как я могу это проверить?"
Этот вопрос спасет вас от 40% галлюцинаций. Гарантирую.