Аудит галлюцинаций ИИ: чеклист из 7 пунктов для проверки локального ассистента | AiManual
AiManual Logo Ai / Manual.
19 Фев 2026 Гайд

Форенсик-аудит локального AI-ассистента: как обнаружить 40% галлюцинаций в задачах

Практическое исследование: как провести форенсик-аудит AI-агента, найти 40% галлюцинаций и исправить их. Готовые команды, паттерны ошибок и методология.

Мой ассистент меня обманывал. Систематически

Три недели я доверял ему задачи по автоматизации. Он кивал, говорил "выполнено", а потом оказывалось, что половина работы - выдумка. Файлы, которых нет. Команды, которые не выполнялись. 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 шагов подряд без обратной связи.

💡
Используйте подход из статьи "LLM-галлюцинации: Как заставить нейросеть говорить правду" - принудительная верификация после критических действий снижает галлюцинации на 60%.

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
  • Визуализацию расхождений
  • Экспорт в форматы для дальнейшего анализа

Что делать, если нашли галлюцинации

Обнаружили проблему? Не паникуйте. Действуйте системно.

  1. Изолируйте проблему. На какой задаче происходит? С какими инструментами?
  2. Увеличьте уровень логирования для этой комбинации.
  3. Добавьте явные проверки в проблемный инструмент.
  4. Создайте тест-кейс, который воспроизводит проблему.
  5. Рассмотрите замену инструмента или добавление fallback-логики.

Иногда проблема не в агенте, а в промптах. В статье "Когда LLM врет: отлавливаем галлюцинации линейкой в векторном пространстве" мы разбирали, как промпт-инжиниринг влияет на достоверность.

Будущее: самоаудитирующиеся агенты

Следующий шаг - агенты, которые сами отслеживают свои галлюцинации. Представьте:

  • Агент выполняет действие
  • Запускает верификацию результата
  • Если обнаружено несоответствие - перевыполняет с коррекцией
  • Записывает паттерн ошибки для обучения

Такие системы уже появляются. Например, в AgentPuzzles.com агенты соревнуются в создании и решении задач, постоянно улучшая свою надежность.

Или взгляните на Holo2-235B-A22B - там агентная локализация (по сути, самопроверка в контексте) улучшает точность на 10-20%.

Главный урок: доверяй, но проверяй

Мой ассистент теперь работает с проверками после каждого значимого действия. Уровень галлюцинаций упал с 42% до 6%. Эти 6% - в основном edge-кейсы, которые мы еще не покрыли тестами.

Ваш локальный AI-ассистент - не оракул. Он инструмент с известными ограничениями. Чем раньше вы это примете, тем надежнее будет ваша автоматизация.

Запустите аудит сегодня. Потратьте день на настройку проверок. Сэкономите недели на отладке вымышленных результатов.

И помните: каждый раз, когда агент говорит "я сделал", спросите: "А как я могу это проверить?"

Этот вопрос спасет вас от 40% галлюцинаций. Гарантирую.