Контекст смарт контракта для AI
Сегодня просто решил поделиться с вами своими наблюдениями, которые я получил создавая небольшой проект на стыке AI/Web3.
В рамках задачи мне нужно было каким-то образом сжать смарт контракт для отправки его в модель LLM для анализа. Само сжатие потребовалось, чтобы уместить один или несколько смарт контрактов в рамки контекстного окна модели. Для тех, кто не в курсе, далее чуть поясню суть проблемы.
Несмотря на то, что современные модели могут иметь контекстные окна (тот объем информации, который они могут обработать за раз) от 200 000 до 1 000 000 токенов, активное внимание хорошо работает только примерено до 100 000 токенов. Другими словами, до этого объема они могут эффективно следовать инструкциям и "не забывать" условия и суть задачи.
Запросы пользователя в чатах не такие уж и большие, зачастую всего 50-250 токенов, поэтому общение в чате может быть достаточно долгим, если не просить модель отвечать развернуто.
Однако проблемы начинают возникать тогда, когда требуется в одном запросе отправить:
пользовательское сообщение + системный промт + контракт + документацию
Детально написанный системный промт может занимать 5к-15к токенов, длинный контракт около 8к-10к, документация и того больше. В итоге один запрос для хорошего анализа смарт контракта может занимать около 30к-40к токенов. И вроде бы ок, если не думать, что для более глубокого анализа связей между функциями нужно добавить еще 2-3 контракта, которые наследуются в первом. И тут уже контекст растет значительно!
Поэтому мне и нужно было как-то сжимать контракты и документацию, чтобы уменьшать количество используемых токенов, хотя бы на 30%-40%, а лучше и больше.
К сожалению, удаление комментариев из файла контракта, уменьшение пробелов и переносов строк, могут бать максимум 5%-8% сокращения. И этого мало.
Общение с ИИ также не сильно помогает: в большинстве своем они дают самые очевидные советы.
Однажды мне пришла мысль, что можно заменить самые часто повторяющиеся слова в контрактах (function, public, view, balanceOf) на какие-либо символы - типа тех же смайлов, так как по уверениям ChatGPT, смайлы занимают всего один токен.
P.S. Тут к слову сказать, что зачастую 1 токен равен около 3,5-4 символам текста, но для разных ИИ это могут быть разные значения.
И вроде как логично, 1 смайл - 1 токен. Но все оказалось сложнее.
Сначала нужно было узнать те самые популярные слова в контактах. Благо в сети можно найти отличные подборки контрактов, которые использовали в различных датасетах. Я получил около 130 000 реальных контрактов.
Затем с помощью простого скрипта на Python, я собрал самые повторяющиеся слова, которых вышло около 150 000 всего. Слов которые повторялись более 500 раз на эту подборку было около 10 000. Их я и решил использовать.
Далее я написал небольшой скрипт, который используя популярные библиотеки для подсчета токенов (antropic, openai, huggingface и базовый - 1 токен/4 символа), прогнал все 10 000 слов.
Далее, собрал все PUA / emoji / редкие символы (UU+E000–U+F8FF) и также прогнал их через скрипт подсчета токенов.
И тут было мое разочарование. Оказалось, что большинство популярных слов в смарт контрактах и так составляют всего 2-3 токена, как и смайлы!
OnlyOwner, balanceOf и другие популярные переменные занимают столько же места в контексте, что и :)!
В данном эксперименте я не учет способ обучения модели на данных! Когда, грубо говоря, GPT обучается на смарт контрактах и видит миллионы из них, то самые часто употребляющиеся слова "сливаются" в меньшее количество токенов, и не зависит от количества символов в слове! Другими словами, модель сама себя оптимизирует по контексту, и таким образом программный код занимает минимально возможное количество токенов. (На самом деле процесс немного сложнее, но суть примерно та же).
И от этой идеи пришлось отказаться...
Но есть пара других: кардинально другой подход, который на первых тестах показал сокращение количества токенов на 45%! Экспериментирую с ним дальше!
Post #1476
780
- 👍 8
- 🤔 1