Коротко
Автор проекта millfolio рассказал, как организовать пакетную обработку финансовых записей с помощью on-device модели. Ключевая идея — вычислять суждения модели один раз и хранить результат, а не вызывать ИИ при каждом запросе пользователя.
Проект millfolio использует двухуровневую архитектуру: фронтальная модель генерирует небольшую программу поверх схемы, а локальная модель читает реальные файлы пользователя прямо на устройстве. Главная проблема — локальная модель не масштабируется вместе с объёмом данных. Тысячи транзакций за пару лет невозможно прогонять через ИИ при каждом вопросе: даже доля секунды на запись превращается в минуты инференса, а следующий запрос повторяет всё заново.
Суждение модели — это то, что вычисляется один раз и сохраняется, а не запускается в момент запроса. Все теги проставляются на этапе индексации и хранятся вместе с записями.
Теги описываются в обычном текстовом файле categories.txt — по одному правилу на строку, файл является единственным источником истины. Типы упорядочены по стоимости:
@tag. Правило срабатывает, если на строке уже есть указанный тег. Циклы безопасны: теги только добавляются, поэтому вычисление сходится.В момент запроса все три типа выглядят одинаково: сгенерированная программа фильтрует по .tags, и ответ по тысячам записей сводится к сравнению строк, а не к вызову модели.
Фронтальной модели сообщаются имена тегов и заметки об области действия, но не ключевые слова. Реальные строки merchants остаются на устройстве.
AI-теги нужно вычислить хотя бы один раз — это бэкфилл по всем существующим записям плюс новые поступления. Работой управляет on-device оркестратор: дисковая очередь, переживающая перезапуски, обрабатывающая одну задачу за раз. Индексация и бэкфилл AI-тегов не конкурируют друг с другом, а оба уступают интерактивному запросу.
Внутри задачи классификация батчится и дедуплицируется:
1: yes, 2: no, … — один вызов классифицирует целый срез;Небольшой журнал фиксирует, насколько каждое правило уже материализовано, с привязкой к монотонному поколению вставки. Готовый тег никогда не пересчитывает старые записи — новые подхватываются инкрементально. Между срезами бэкфиллер «дремлет», и длина паузы выступает настройкой приоритета.
Источник: Hacker News - Newest: ""AI" "LLM""