Почему ваш бенчмарк врет на 300%
Вы запускаете Terminal Bench 2.0, смотрите на цифры и думаете: "Мой агент гений!". А потом он падает на продакшене при первой же попытке прочитать базу данных. Знакомо? Это задача db-wal-recovery. Она не просто тестирует скорость - она ломает всю логику бенчмаркинга.
Если вы используете TB2 для оценки AI-агентов и не знаете про db-wal-recovery, ваши результаты - случайные числа. Серьезно.
Что скрывает Terminal Bench 2.0
Terminal Bench 2.0 - это набор задач для тестирования AI-агентов. Одна из них - db-wal-recovery. Суть: восстановить базу данных SQLite из WAL-лога, который зашифрован XOR. Звучит просто? На практике это ад из edge-кейсов.
Технический ад: SQLite WAL + XOR шифрование
SQLite 3.45.1 (актуально на март 2026) использует WAL для повышения производительности. Но в TB2 этот лог дополнительно шифруется XOR с ключом, который разбросан по памяти агента. Задача агента - найти ключ, расшифровать WAL и применить его к базе.
Почему это сложно:
- XOR шифрование - это не AES. Оно обратимо, но ключ может быть любой длины.
- WAL-файл имеет специфичную структуру: заголовок, фреймы, checksum.
- Ключ шифрования хранится в памяти агента, но может быть фрагментирован или замаскирован.
Стандартные бенчмарки тестируют скорость инференса или точность ответов. Они не учитывают, что агенту нужно манипулировать бинарными данными, искать ключи в памяти и восстанавливать базу. Вот почему агент с высоким score в TB2 может провалить реальную задачу.
Это похоже на ситуацию с багами llama.cpp, где неочевидные детали реализации ломают весь пайплайн.
Пошаговое решение: как не сломать мозг
Вот как правильно решить db-wal-recovery. Забудьте про стандартные подходы - здесь нужна хирургическая точность.
1 Анализ памяти агента
Первое - найти ключ XOR. Он спрятан в памяти агента. Используйте инструменты для дампа памяти. Если агент написан на Python, используйте sys.getsizeof и интроспекцию. Но осторожно: ключ может быть разбит на части. Как и в случае с RCE-уязвимостями, неправильный доступ к памяти ведет к катастрофе.
import sys
import inspect
def find_key_in_memory(agent):
# Ищем объекты, которые могут быть ключами
for name, obj in inspect.getmembers(agent):
if isinstance(obj, bytes) and len(obj) in [16, 32, 64]:
# Проверяем, похож ли на ключ
if is_xor_key(obj):
return obj
return None
2 Расшифровка WAL-файла
Получив ключ, применяем XOR к WAL-файлу. Важно: шифрование применяется ко всему файлу, включая заголовок. Используйте побитовую операцию.
def xor_decrypt(data, key):
# XOR расшифровка с повторением ключа
key_length = len(key)
return bytes([data[i] ^ key[i % key_length] for i in range(len(data))])
with open('database.wal', 'rb') as f:
encrypted_wal = f.read()
key = find_key_in_memory(agent)
decrypted_wal = xor_decrypt(encrypted_wal, key)
3 Восстановление базы данных
Теперь применяем WAL к основной базе SQLite. Используйте API SQLite. Не пытайтесь вручную парсить WAL - это чревато ошибками.
import sqlite3
import os
# Создаем временную копию базы
os.system('cp database.db database_recovered.db')
# Подключаемся и применяем WAL
conn = sqlite3.connect('database_recovered.db')
conn.execute('PRAGMA journal_mode = WAL') # Убедимся, что WAL включен
conn.close()
# Теперь заменяем WAL-файл
with open('database_recovered.db-wal', 'wb') as f:
f.write(decrypted_wal)
# SQLite автоматически применит WAL при следующем подключении
conn = sqlite3.connect('database_recovered.db')
cursor = conn.cursor()
cursor.execute('SELECT * FROM sqlite_master')
conn.close()
Не используйте os.system в продакшене! Это для примера. В реальности используйте shutil.copy и обрабатывайте ошибки. Иначе рискуете получить кирпич, как в истории с ASRockRack.
Нюансы, которые вас убьют
Теперь о подводных камнях. Их много.
- Ключ не в памяти агента. Иногда ключ хранится во внешнем хранилище, и агент должен его запросить. Это проверка на способность работать с сетью. Если вы работаете в кластере, как в RDMA-кластере для LLM, учтите сетевые задержки.
- WAL поврежден. TB2 может добавить битые байты. Нужна проверка checksum и восстановление. Это похоже на проблемы с квантованием в MoE-моделях - малейшее искажение ломает логику.
- Конкурентный доступ. База может быть заблокирована другим процессом. Агент должен уметь ждать или обходить блокировки. Как в случае с ошибками 429 в Bedrock.
Эти нюансы не учитываются в стандартных бенчмарках. Поэтому агент, который отлично работает в контролируемой среде, падает в реальности.
FAQ: частые вопросы
| Вопрос | Ответ |
|---|---|
| Почему XOR, а не современное шифрование? | Потому что задача не про криптографию, а про работу с бинарными данными и памятью. XOR достаточно для усложнения. |
| Можно ли использовать готовые библиотеки для восстановления? | Да, но TB2 ограничивает их использование. Агент должен показать, что понимает процесс. Иначе вы получите те же проблемы, что и с багом повторной обработки в Qwen - поверхностное решение не работает. |
| Как это связано с реальными AI-агентами? | Агенты часто работают с данными: базы, файлы, сеть. Умение восстанавливать данные - критичный навык. Особенно в кластерах, как бюджетный кластер на AMD Strix Halo. |
Что дальше? Будущее бенчмаркинга
Terminal Bench 2.0 - шаг в правильном направлении. Но он не идеален. Задачи вроде db-wal-recovery показывают, что бенчмарки должны быть комплексными. Не только скорость, но и надежность, работа с edge-кейсами.
Мой прогноз: к 2027 году появятся бенчмарки, которые полностью эмулируют продакшн-среду. С сетевыми задержками, битыми данными и случайными сбоями. И тогда db-wal-recovery покажется детской игрой. Агентам придется работать в условиях, близких к мульти-нод кластерам, где ошибка в одном узле ломает всю систему.
А пока - проверьте своих агентов на этой задаче. Если они ее проваливают, значит, ваши бенчмарки врут. И не говорите, что я не предупреждал.