Не то чтобы какая-то отдельная магия, специальных статей не подскажу.
На стыке в основном классические алгоритмы ml и зрения. Смысл был скорее в том, чтобы аккуратно их переписать на gpu, а так же "подружить" с OpenXLA (https://openxla.org/xla). OpenXLA - замечательный фреймворк, который помогает собирать довольно хорошие по производительности gpu ядра на основе не сильно сложного для разработчика кода.
Основная сложность - работа с опечатками и ошибками, которые приходят из OCR части.
Дальше говорю по состоянию мира открытых или публично доступных LLM на примерно конец прошлого декабря:
Поведение LLM модели очень сильно зависит от используемых токенизаторов, а токенизаторы при обучении в основном видят только чистый текст. Случайная небольшая ошибка от OCR, например "ворона"->"ворсна" вносит значительное изменение в результат работы токенизатора и смысл входа в значительной мере теряется.
Замечательный пример похожего поведения, основанного на особенностях работы токенизаторов:
Me: Сколько букв "а" в слове "аааааааааа"?
Some LLM (32B): В слове "аааааааааа" 9 букв "а".
На самом деле 10, ошибка из-за того, что после токенизации появляются токены "аа, ааа" количество которых сложно связано с ожидаемым ответом.
Если же "помочь" токенизатору модели, то все сразу станет просто:
Me: Сколько букв "а" в слове "а а а а а а а а а а"?
Some LLM (32B): В этой строке 10 букв "а".
False positive слова, пришедшие не совсем из контекста, а так же случайно перепутанный порядок, например, абзацев в общем тексте, обычно большими моделями обрабатываются нормально.
Не то чтобы какая-то отдельная магия, специальных статей не подскажу.
На стыке в основном классические алгоритмы ml и зрения. Смысл был скорее в том, чтобы аккуратно их переписать на gpu, а так же "подружить" с OpenXLA (https://openxla.org/xla). OpenXLA - замечательный фреймворк, который помогает собирать довольно хорошие по производительности gpu ядра на основе не сильно сложного для разработчика кода.
Основная сложность - работа с опечатками и ошибками, которые приходят из OCR части.
Дальше говорю по состоянию мира открытых или публично доступных LLM на примерно конец прошлого декабря:
Поведение LLM модели очень сильно зависит от используемых токенизаторов, а токенизаторы при обучении в основном видят только чистый текст. Случайная небольшая ошибка от OCR, например "ворона"->"ворсна" вносит значительное изменение в результат работы токенизатора и смысл входа в значительной мере теряется.
Замечательный пример похожего поведения, основанного на особенностях работы токенизаторов:
Me:
Сколько букв "а" в слове "аааааааааа"?
Some LLM (32B):
В слове "аааааааааа" 9 букв "а".
На самом деле 10, ошибка из-за того, что после токенизации появляются токены "аа, ааа" количество которых сложно связано с ожидаемым ответом.
Если же "помочь" токенизатору модели, то все сразу станет просто:
Me:
Сколько букв "а" в слове "а а а а а а а а а а"?
Some LLM (32B):
В этой строке 10 букв "а".
False positive слова, пришедшие не совсем из контекста, а так же случайно перепутанный порядок, например, абзацев в общем тексте, обычно большими моделями обрабатываются нормально.