Финтех с миллионом с лишним пользователей в шести странах решил подключить нейросеть к своей базе, чтобы аналитики могли задавать вопросы обычным языком. База непростая: 253 таблицы, 3550 колонок и ровно три комментария к схеме на всё это хозяйство. Смысл полей живёт не в базе, а в коде приложения.
Сравнивали три способа. Первый — дать модели инструменты, чтобы она сама исследовала схему. Второй — сначала показать ей каталог таблиц и попросить выбрать нужные, потом отдать их описание. Третий, на вид самый расточительный, — просто класть всю схему целиком, почти 59 тысяч токенов, в каждый запрос.
Результаты на наборе из 29 реальных вопросов аналитиков, по три попытки на каждый:
Это доля попаданий с первой попытки, медианная задержка и цена одного вопроса. С трёх попыток картина другая: 37,9%, 55,2% и 58,6% соответственно. В продакшен взяли третий, самый прямолинейный вариант — он не хуже по точности, вдвое быстрее и состоит из одной ступени, а не из двух.
Но главное в этой истории не таблица. Главное — кто ошибался.
Эталонные ответы, с которыми сравнивали работу модели, составлял не человек. Живого аналитика в проекте не было, и роль составителя взял на себя другой ИИ-агент. Он ошибся трижды, и все три раза одинаково: додумал смысл поля по его названию, не заглянув в код.
Самая крупная ошибка. На вопрос «сколько активных партнёров» составитель посчитал по колонке с названием, похожим на статус, и получил 432. Перекрёстная проверка вторым запросом ошибку пропустила — оба запроса честно считали одно и то же неверное множество. Поймал случай: по той же логике в одной из стран активных партнёров вышло ноль при нескольких тысячах пользователей. Полезли в код — оказалось, что колонка означает совсем другое, а роль партнёра лежит в отдельной таблице. Правильный ответ — 33 434. Ошибка в 77 раз, со статусом «подтверждено» после перекрёстной проверки.
Ещё одну ошибку эталона нашла сама проверяемая модель: она выдала фильтр, которого в эталоне не было, проверка по коду показала, что права модель, а эталон считал лишнее.
Вывод автора: «Перекрёстная проверка ловит ошибки в запросах, но не ошибки понимания предметной области».
Три вопроса из восьми провалившихся не взяла ни одна из трёх схем — по той же причине: смысл поля физически отсутствует в базе, он задан в коде приложения. И отдельный тест «признайся, что данных нет» все три способа провалили: на пустых колонках все уверенно выдали работающий запрос.
Про деньги: весь эксперимент, все три ветки, обошёлся в 245 рублей. Автор честно оговаривает границы: одна база, одна модель, 29 вопросов, по одному прогону на ветку, и разницу между вторым и третьим способом он сам называет шумом.