Forwarded from Dimension AI | Dmitry Sirakov
ROADMAP: ГЛУБОКОЕ ОБУЧЕНИЕ (3/3) 😳
НУ ТЕПЕЕРЬ ТОООЧНО, я возвращаюсь на постоянную основу и буду радовать вас своей шизой. Сначала начал со старого - обновил роадмап по мат.стату, можете поглядеть, если только начинаете свой путь.
Давайте закончим с начатым (с роадмапи) и перейдем к интересному, что меня в последнее время очень сильно драйвит / о чем я в последнее время активно задумываюсь.
Что с глубоким обучением и как его ботать?🤔
На самом деле, если вы дошли до этой части и раньше все заботали - вы герой. Время определяться с ориентацией.
Как и везде, для основы нужна база. Крепкий фундамент, на который потом по очереди будут наслаиваться различные области: от CV до NLP.
БАЗА:
1. Женя Соколов, ну а как же без него. Очень хороший, "мягкий" цикл лекций, идёт как по маслу и даёт все понимание происходящего. Однозначно рекомендовано к первому просмотру и к знакомству с глубоким обучением.
ССЫЛКА НА ЦИКЛ ЛЕКЦИЙ
2. Практика. Я бы рекомендовал закреплять лекции Жени лекциями ШАДа. Одно дело слушать, другое дело повторять за семинаристом и делать домашки, мастхев для новичков.
Ориентации:
Наверное, для себя я определяю несколько вариантов профессионального развития - NLP, CV, RecSys (ну и классика, но она уже разбиралась). По последнему - ничего сказать не могу, а вот по первым двум - с радостью.
NLP:
Курс Лены Войты с ШАД, суперский курс. Как основа, как "база" для NLP - точно пойдет, ведь раскрываются как и методы "ручек", так и доходчиво объясняют механизм внимания и современные архитектуры. Ежу (основному, как по мне, семинаристу, я бы выразил отдельный респект).
На самом деле, здесь бы я еще посоветовал обязательно подписаться на эти каналы, чтобы следить за трендами (что очень важно). Сиолошная, Denis Sexy IT и эй ай ньюз. Да, список хайповый, но дальше, поверьте мне, вы сами найдете для себя узкопрофильных авторов, которые будут радовать себя своим контентом.
Дальше уже - собеситься, работать, читать папиры и наслаждаться жизнью
CV:
Я не спец. по CV, но как сказал один мой товарищ, которому я очень сильно доверяю - "курсы по CV не имеет смысла делать, потому что есть ЭТО".
Ну и разумеется, пишите в комментах ресурсы по рекомендательным системам, чтоыб помочь себе и окружающим😎
Шэры, реакции для вдохновения нужны, конечно же!
Первая часть по классике ML
Вторая часть по математике для собесов
НУ ТЕПЕЕРЬ ТОООЧНО, я возвращаюсь на постоянную основу и буду радовать вас своей шизой. Сначала начал со старого - обновил роадмап по мат.стату, можете поглядеть, если только начинаете свой путь.
Давайте закончим с начатым (с роадмапи) и перейдем к интересному, что меня в последнее время очень сильно драйвит / о чем я в последнее время активно задумываюсь.
Что с глубоким обучением и как его ботать?
На самом деле, если вы дошли до этой части и раньше все заботали - вы герой. Время определяться с ориентацией.
Как и везде, для основы нужна база. Крепкий фундамент, на который потом по очереди будут наслаиваться различные области: от CV до NLP.
БАЗА:
1. Женя Соколов, ну а как же без него. Очень хороший, "мягкий" цикл лекций, идёт как по маслу и даёт все понимание происходящего. Однозначно рекомендовано к первому просмотру и к знакомству с глубоким обучением.
ССЫЛКА НА ЦИКЛ ЛЕКЦИЙ
2. Практика. Я бы рекомендовал закреплять лекции Жени лекциями ШАДа. Одно дело слушать, другое дело повторять за семинаристом и делать домашки, мастхев для новичков.
Ориентации:
Наверное, для себя я определяю несколько вариантов профессионального развития - NLP, CV, RecSys (ну и классика, но она уже разбиралась). По последнему - ничего сказать не могу, а вот по первым двум - с радостью.
NLP:
Курс Лены Войты с ШАД, суперский курс. Как основа, как "база" для NLP - точно пойдет, ведь раскрываются как и методы "ручек", так и доходчиво объясняют механизм внимания и современные архитектуры. Ежу (основному, как по мне, семинаристу, я бы выразил отдельный респект).
На самом деле, здесь бы я еще посоветовал обязательно подписаться на эти каналы, чтобы следить за трендами (что очень важно). Сиолошная, Denis Sexy IT и эй ай ньюз. Да, список хайповый, но дальше, поверьте мне, вы сами найдете для себя узкопрофильных авторов, которые будут радовать себя своим контентом.
Дальше уже - собеситься, работать, читать папиры и наслаждаться жизнью
CV:
Я не спец. по CV, но как сказал один мой товарищ, которому я очень сильно доверяю - "курсы по CV не имеет смысла делать, потому что есть ЭТО".
Ну и разумеется, пишите в комментах ресурсы по рекомендательным системам, чтоыб помочь себе и окружающим
Шэры, реакции для вдохновения нужны, конечно же!
Первая часть по классике ML
Вторая часть по математике для собесов
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Dimension AI | Dmitry Sirakov
GIGACHAT MAX vs GPT4o (Гигачат победил?) 😎
Кажется, про RAG написали уже все, кому не лень. Но я хочу показать один из корнер-кейсов, которых уже в сети не так уж и много.
Начнём с архитектуры. Есть стандартная схема — Hybrid Search, где совмещается лексический поиск (BM25Retriever, знакомый каждому по простому Ctrl+F) и семантический поиск (тот самый умный, на embedding-моделях). Из каждой системы берутся топ-25 документов, а затем на сцену выходит reranker-модель (cross-encoder), которая внимательно смотрит и на запрос пользователя, и на документы, выбирая только топ-5 самых полезных и релевантных.
Чтобы улучшить качество поиска, используется query expansion — по сути, это «переписывание запроса». Пользователь часто ошибается, пишет транслитом, путается в формулировках. Но стоит лишь попросить LLM аккуратно переформулировать запрос для поиска — и дело сделано. Но всегда ли?
Итак, две системы. Они совершенно идентичны: те же embedder, тот же reranker, те же промпты. Единственная разница — в LLM (одна модель - отечественная: GigaChat MAX, а вторая - GPT4o), и вот тут начинается самое интересное.
САМ КЕЙС:😵💫
Системы проходят проверку на простом запросе: «Что такое разбрасыватель?» (имеется в виду сельскохозяйственная техника).
GPT4o внезапно ведёт себя крайне нестабильно (при температуре всего 0.2!): то в ответе появляются непонятные цифры, то сухие строчки из Википедии без конкретики. Что показатель явных галлюцинаций модели, чего бы очень хотелось избежать!
А вот GigaChat MAX поражает своей стабильностью и четкостью, всегда выдавая конкретный, развернутый, полезный ответ.
Но почему же так происходит?😳
В поисках ответа я взял под лупу каждый компонент системы. Документы о тракторах разных компаний, вроде всё понятно. Но вдруг — странность! При использовании GPT4o запрос пользователя каждый раз расширяется дополнительно названием компании («Что такое разбрасыватель Kverneland?»), хотя GigaChat MAX оставляет запрос нетронутым. [название компании обеим ллм известны заранее. И поиск делается по каждой компании в отдельной коллекции Milvus и в отдельном индексе OpenSearch]
Казалось бы, GPT4o делает лучше, точнее уточняет запрос, качество поиска должно быть ого-го, но...
Разгадка загадки скрывалась в одном простом факте: слово «Kverneland» встречается крайне редко. Как известно из статей, attention-механизм особенно чувствителен к редким словам (аналогично и BM25). Документов с упоминанием компании много, и внимание системы невольно переключается именно на упоминание компании, а не на главный предмет вопроса — «разбрасыватель». Итог — мусор в выдаче и нестабильность ответов.
А вот GigaChat MAX, не добавляя лишних деталей, сохраняет стабильность выдачи и всегда отвечает четко, конкретно и по делу.
Такой вот неожиданный поворот — иногда чем проще, тем лучше!
Технические детали:
- Embedder: bge-m3 (chunk_size=1200, overlap=300).
- Reranker: bge-reranker-v2-m3.
Это сочетание дало лучшие результаты именно в моём домене (естественно, они взяты не на обум и проводились сотни экспериментов (и сотни тысяч рублей), чтобы это вычислить на моих документах). Были перепробованы все опенсорс эмбеддеры, реранкеры (в том числе на основе декодеров), обученные на русский и английский язык
Документы в основном на русском и английском языке.
RAG - сам по себе прост, но очень много нюансов нужно решить в своём домене. Я уж не говорю про парсинг документов / таблиц / графиков, использование SO + CoT и т.д.
Напишите в комментах, работали ли с RAG, какие у вас были забавные случаи?
Картинки к посту будут в комментах 👇
Кажется, про RAG написали уже все, кому не лень. Но я хочу показать один из корнер-кейсов, которых уже в сети не так уж и много.
Начнём с архитектуры. Есть стандартная схема — Hybrid Search, где совмещается лексический поиск (BM25Retriever, знакомый каждому по простому Ctrl+F) и семантический поиск (тот самый умный, на embedding-моделях). Из каждой системы берутся топ-25 документов, а затем на сцену выходит reranker-модель (cross-encoder), которая внимательно смотрит и на запрос пользователя, и на документы, выбирая только топ-5 самых полезных и релевантных.
Чтобы улучшить качество поиска, используется query expansion — по сути, это «переписывание запроса». Пользователь часто ошибается, пишет транслитом, путается в формулировках. Но стоит лишь попросить LLM аккуратно переформулировать запрос для поиска — и дело сделано. Но всегда ли?
Итак, две системы. Они совершенно идентичны: те же embedder, тот же reranker, те же промпты. Единственная разница — в LLM (одна модель - отечественная: GigaChat MAX, а вторая - GPT4o), и вот тут начинается самое интересное.
САМ КЕЙС:
Системы проходят проверку на простом запросе: «Что такое разбрасыватель?» (имеется в виду сельскохозяйственная техника).
GPT4o внезапно ведёт себя крайне нестабильно (при температуре всего 0.2!): то в ответе появляются непонятные цифры, то сухие строчки из Википедии без конкретики. Что показатель явных галлюцинаций модели, чего бы очень хотелось избежать!
А вот GigaChat MAX поражает своей стабильностью и четкостью, всегда выдавая конкретный, развернутый, полезный ответ.
Но почему же так происходит?
В поисках ответа я взял под лупу каждый компонент системы. Документы о тракторах разных компаний, вроде всё понятно. Но вдруг — странность! При использовании GPT4o запрос пользователя каждый раз расширяется дополнительно названием компании («Что такое разбрасыватель Kverneland?»), хотя GigaChat MAX оставляет запрос нетронутым. [название компании обеим ллм известны заранее. И поиск делается по каждой компании в отдельной коллекции Milvus и в отдельном индексе OpenSearch]
Казалось бы, GPT4o делает лучше, точнее уточняет запрос, качество поиска должно быть ого-го, но...
Разгадка загадки скрывалась в одном простом факте: слово «Kverneland» встречается крайне редко. Как известно из статей, attention-механизм особенно чувствителен к редким словам (аналогично и BM25). Документов с упоминанием компании много, и внимание системы невольно переключается именно на упоминание компании, а не на главный предмет вопроса — «разбрасыватель». Итог — мусор в выдаче и нестабильность ответов.
А вот GigaChat MAX, не добавляя лишних деталей, сохраняет стабильность выдачи и всегда отвечает четко, конкретно и по делу.
Такой вот неожиданный поворот — иногда чем проще, тем лучше!
Технические детали:
- Embedder: bge-m3 (chunk_size=1200, overlap=300).
- Reranker: bge-reranker-v2-m3.
Документы в основном на русском и английском языке.
RAG - сам по себе прост, но очень много нюансов нужно решить в своём домене. Я уж не говорю про парсинг документов / таблиц / графиков, использование SO + CoT и т.д.
Напишите в комментах, работали ли с RAG, какие у вас были забавные случаи?
Картинки к посту будут в комментах 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from So so
ruBert-tiny — это "рабочая лошадка" для RAG на русском, где важны скорость и экономия.
ruBert-base подключают, когда качество > стоимость, но в большинстве RAG-кейсов tiny достаточно.
P.S. Для английского аналог — all-MiniLM-L6-v2 (часто используется вместо large-моделей в продакшне).
ruBert-base подключают, когда качество > стоимость, но в большинстве RAG-кейсов tiny достаточно.
P.S. Для английского аналог — all-MiniLM-L6-v2 (часто используется вместо large-моделей в продакшне).
Forwarded from Onigiri
Я нагенерировал много картинок через новую мультимодальную генерацию GPT, посмотрел, как генерируют другие, какие промты используют, что-то адаптировал, что-то придумал сам. Вот, делюсь интересным:
1. Генерируем превью для ютуб-видео:
2. Инфографика:
Примерно тот же промт. Интересно, что GPT выдумало Mandelbreich, но он так хорошо вписывается, как будто и правда такой фрактал есть.
3. Превращаем фотку в постер к фильму:
4. Генерируем карточки для игры:
Покажу на примере Magic The Gathering: сначала я написал GPT
А затем полученный ответ добавил после промта:
5. Генерируем фотку с надписью:
Сами промты можно писать как на английском, так и на русском, но на русском GPT иногда делает опечатки в тексте на картинке, поэтому немного лучше сначала писать на английском, а потом можно просто попросить перевести картинку на русский, если нужно. Либо еще можно написать весь конкретный текст на русском в кавычках, кажется, что так получается лучше
1. Генерируем превью для ютуб-видео:
A fun colorful youtube thumbnail for a video about making an onigiri in 3D. Something fun and attention grabbing, that would work well as a viral organic video.2. Инфографика:
Примерно тот же промт. Интересно, что GPT выдумало Mandelbreich, но он так хорошо вписывается, как будто и правда такой фрактал есть.
A fun colorful infographic showcasing different fractals. Something fun and attention grabbing, that would work well as a social media viral organic post.3. Превращаем фотку в постер к фильму:
A movie poster of a new Hollywood Movie called Big Floppa, a heroic cat (from image) saving the world from disaster.4. Генерируем карточки для игры:
Покажу на примере Magic The Gathering: сначала я написал GPT
Придумай карту для Magic the Gathering про кота Big Floppa. Он должен быть легендарным, и у него способность будет создавать токены креветок, которыми можно лечить существ. Напиши его описание на английском.А затем полученный ответ добавил после промта:
Make an image of a trading card in the style of Magic the Gathering. The card title should be "Big Floppa". Here is a suggestion for its inner contents:5. Генерируем фотку с надписью:
A dark, low quality phone camera photo of a fat cat staring at the camera in a backyard on a stone patio at night, with a snapchat caption reading "Нейросеть бы такое не нарисовала"Сами промты можно писать как на английском, так и на русском, но на русском GPT иногда делает опечатки в тексте на картинке, поэтому немного лучше сначала писать на английском, а потом можно просто попросить перевести картинку на русский, если нужно. Либо еще можно написать весь конкретный текст на русском в кавычках, кажется, что так получается лучше
Forwarded from Machine learning Interview
OpenAI запустила "Академию OpenAI", которая претендует на роль главного учебника по ИИ. Платформа поможет освоить нейросети, понять их возможности и научиться эффективно использовать ChatGPT и Sora в повседневной жизни и работе.
▪ Обширная база обучающих материалов доступна на отдельном сайте.
▪ Живые трансляции и офлайн-мероприятия помогут глубже разобраться в технологиях.
▪ Бесплатный доступ — OpenAI стремится расширить аудиторию, а не ограничивать её ценником.
📌Начать обучение
📌 Блог
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Machine learning Interview
🔥 Пошаговый гайд создания системы автоматического распознавания речи с помощью PyTorch и Hugging Face
С эти гайдом вы сможете:
- Загружать и обрабатывать речь данные
- Настраивать предварительно обученную модель Wav2Vec2
- Оценивать производительность модели с помощью коэффициента ошибок слов (WER)
- Развертывать модель для перевода речи в текст в режиме реального времени
🔗 Читать
С эти гайдом вы сможете:
- Загружать и обрабатывать речь данные
- Настраивать предварительно обученную модель Wav2Vec2
- Оценивать производительность модели с помощью коэффициента ошибок слов (WER)
- Развертывать модель для перевода речи в текст в режиме реального времени
🔗 Читать
Forwarded from Борис_ь с ml
У верблюда два горба, потому что жизнь - борьба...
#иб_для_ml
Таквозможно сказал Николас Карлини, так как сегодня вышла статья с его соавторством "🐫 Defeating Prompt Injections by Design". Остальной авторский коллектив этой статьи тоже серьезный - исследователи из Google и ETH Zurich.
Система защиты CaMeL
В этой работе представлена система защиты ИИ-агентов от промпт-атак CaMeL (расшифровывается как CApabilities for MachinE Learning). Основывается она на двухгорбах LLM (Priveleged и Quarantined) и специальном интерпретаторе языка Python. По сути, эта методика вытаскивает логику действий агента в явную плоскость, заставляя программу "написать свой код", к которой благодаря кастомному интерпретатору применятся все ограничения безопасности.
Область применения и ограничения
CaMeL, в первую очередь, нацелен на предотвращение несанкционированных действий ИИИ-агентов, которые могут привести к утечкам данных, или использованию данных из ненадежных источников. Однако он совершенно не предназначен для защиты от атак, не влияющих на порядок действий агента или поток данных (например, от фишинга, или изменения содержания сгенерированного текста). Поэтому как компонент системы безопасности ИИ-агентов это решение может быть полезно, но не выполнит ее роль полностью.
Алгоритм работы CaMeL
1. Поступление запроса пользователя: Пользователь формулирует запрос на естественном языке, например, "Отправь Бобу документ, который он просил на прошлой встрече".
2. Генерация кода: Privileged LLM (P-LLM), которой доверяют, берет запрос пользователя и генерирует псевдо-код на Python, который выражает намерения пользователя. Важно, что P-LLM видит только запрос пользователя, но не данные из ненадежных источников (например, содержимое файлов).
3. Интерпретация кода: Созданный код обрабатывается CaMeL Interpreter, который:
— Строит граф потока данных (data flow graph), отслеживая зависимости между переменными.
— Проверяет политики безопасности на основе capabilities (некоторых метаданных, присвоенных различным объектам информации), определяя, какие действия разрешены.
— Выполняет код, вызывая инструменты (например, для отправки email) или блокирует выполнение, если нарушается политика безопасности.
— Использует Quarantined LLM (Q-LLM) для обработки ненадежных данных, таких как извлечение информации из текста.
4. Применение политик безопасности: перед выполнением каждого инструмента агента, CaMeL Interpreter применяет политики безопасности, основанные на capabilities данных. Если политика нарушена, выполнение блокируется, и пользователю может быть запрошено подтверждение.
Что такое capabilities и security policies?
Capabilities — это метаданные (теги), присваиваемые каждому отдельному объекту данных для описания контроля и взаимосвязей потока данных. Capabilities определяют, кому разрешено читать данную часть данных или ее происхождение. Перевести на русский можно как "метки доступа". В статье не указывается их полное содержание, но раскрываются два главных элемента:
— разрешенные читатели (public, или перечень конкретных пользователи),
— происхождение данных (user, camel, inner tool source). С user понятно, camel - порожденные кодом данные, inner tool source - поступившие из инструмента данные, например отправителя полученного email сообщения.
Security policies - код функций на python, в которых реализуются политики безопасности. Например, если данные происходят из недоверенного источника, ответ прерывается. Или если у пользователя нет разрешения на запрошенную информацию, ответ прерывается.
В общем, конечно же интересно увидеть, что будет дальше, так что продолжим следить за работами этих ученых)
#иб_для_ml
Так
Система защиты CaMeL
В этой работе представлена система защиты ИИ-агентов от промпт-атак CaMeL (расшифровывается как CApabilities for MachinE Learning). Основывается она на двух
Область применения и ограничения
CaMeL, в первую очередь, нацелен на предотвращение несанкционированных действий ИИИ-агентов, которые могут привести к утечкам данных, или использованию данных из ненадежных источников. Однако он совершенно не предназначен для защиты от атак, не влияющих на порядок действий агента или поток данных (например, от фишинга, или изменения содержания сгенерированного текста). Поэтому как компонент системы безопасности ИИ-агентов это решение может быть полезно, но не выполнит ее роль полностью.
Алгоритм работы CaMeL
1. Поступление запроса пользователя: Пользователь формулирует запрос на естественном языке, например, "Отправь Бобу документ, который он просил на прошлой встрече".
2. Генерация кода: Privileged LLM (P-LLM), которой доверяют, берет запрос пользователя и генерирует псевдо-код на Python, который выражает намерения пользователя. Важно, что P-LLM видит только запрос пользователя, но не данные из ненадежных источников (например, содержимое файлов).
3. Интерпретация кода: Созданный код обрабатывается CaMeL Interpreter, который:
— Строит граф потока данных (data flow graph), отслеживая зависимости между переменными.
— Проверяет политики безопасности на основе capabilities (некоторых метаданных, присвоенных различным объектам информации), определяя, какие действия разрешены.
— Выполняет код, вызывая инструменты (например, для отправки email) или блокирует выполнение, если нарушается политика безопасности.
— Использует Quarantined LLM (Q-LLM) для обработки ненадежных данных, таких как извлечение информации из текста.
4. Применение политик безопасности: перед выполнением каждого инструмента агента, CaMeL Interpreter применяет политики безопасности, основанные на capabilities данных. Если политика нарушена, выполнение блокируется, и пользователю может быть запрошено подтверждение.
Что такое capabilities и security policies?
Capabilities — это метаданные (теги), присваиваемые каждому отдельному объекту данных для описания контроля и взаимосвязей потока данных. Capabilities определяют, кому разрешено читать данную часть данных или ее происхождение. Перевести на русский можно как "метки доступа". В статье не указывается их полное содержание, но раскрываются два главных элемента:
— разрешенные читатели (public, или перечень конкретных пользователи),
— происхождение данных (user, camel, inner tool source). С user понятно, camel - порожденные кодом данные, inner tool source - поступившие из инструмента данные, например отправителя полученного email сообщения.
Security policies - код функций на python, в которых реализуются политики безопасности. Например, если данные происходят из недоверенного источника, ответ прерывается. Или если у пользователя нет разрешения на запрошенную информацию, ответ прерывается.
В общем, конечно же интересно увидеть, что будет дальше, так что продолжим следить за работами этих ученых)
Forwarded from Находки в опенсорсе
PEP765: больше никакой грязи в finally
Ссылка на PEP: https://peps.python.org/pep-0765
Одна из самых сломанных частей питона была пофикшена в 3.14
В чем проблема?
Ранее такой код вел себя крайне странно:
Так как из функции может быть только один
Или такой код:
Тут вообще жесть. У нас подавляется исключение без
Аналогично можно делать не только с
Такой код позволял создавать ошибки на ровном месте.
Как исправили?
Теперь такой код генерирует
Скоро – будет
Но, WPS, например, запрещал такое делать уже очень давно.
Как работает?
Сам патч очень маленький и простой:
1. Добавляет список текущего контекста
Храним внутри структуры вида:
2. При обходе дерева, добавляет нужные данные в текущий контекст: находимся ли мы в
3. Если находим
4. Внутри
Готово!
Обсуждение: вы знали про такую проблему? Стреляли так себе в ногу?
P.S. Пока писал пост, нашел багу в питоне и важную опечатку :)
| Поддержать | YouTube | GitHub | Чат |
Ссылка на PEP: https://peps.python.org/pep-0765
Одна из самых сломанных частей питона была пофикшена в 3.14
В чем проблема?
Ранее такой код вел себя крайне странно:
>>> def some():
... try:
... return 1
... finally:
... return 2
>>> some()
2
Так как из функции может быть только один
return, а код в finally всегда выполняется – то получаем, что получаем.Или такой код:
>>> def other():
... try:
... 1 / 0
... finally:
... return 2
>>> other()
2
Тут вообще жесть. У нас подавляется исключение без
except 🫠Аналогично можно делать не только с
return, но и с break / continue в циклах:
>>> def cycle():
... for i in range(2):
... try:
... i / 0
... finally:
... print(i)
... continue
... return 2
>>> cycle()
# prints: 0
# prints: 1
# returns: 2
Такой код позволял создавать ошибки на ровном месте.
Как исправили?
Теперь такой код генерирует
SyntaxWarning в 3.14:
>>> def some():
... try:
... return 1
... finally:
... return 2
<python-input-14>:5: SyntaxWarning: 'return' in a 'finally' block
Скоро – будет
SyntaxError, в будущих версиях.Но, WPS, например, запрещал такое делать уже очень давно.
Как работает?
Сам патч очень маленький и простой:
1. Добавляет список текущего контекста
_Py_c_array_t cf_finally; в ast_opt.cХраним внутри структуры вида:
typedef struct {
bool in_finally; // мы в `finally`?
bool in_funcdef; // мы в `def` или `async def`?
bool in_loop; // мы в `for`, `async for` или `while`?
} ControlFlowInFinallyContext;
2. При обходе дерева, добавляет нужные данные в текущий контекст: находимся ли мы в
finally, функции, цикле3. Если находим
return, break или continue, то выполняем проверку синтаксиса; вот код для return:
static int
before_return(_PyASTOptimizeState *state, stmt_ty node_)
{
if (state->cf_finally_used > 0) {
ControlFlowInFinallyContext *ctx = get_cf_finally_top(state);
// если нашли `return` в `finally`, но не во вложенной функции,
// то показываем warning пользователю:
if (ctx->in_finally && ! ctx->in_funcdef) {
if (!control_flow_in_finally_warning("return", node_, state)) {
return 0;
}
}
}
return 1;
}
4. Внутри
control_flow_in_finally_warning используем специальное АПИ для SyntaxWarning:
static int
control_flow_in_finally_warning(const char *kw, stmt_ty n, _PyASTOptimizeState *state)
{
PyObject *msg = PyUnicode_FromFormat("'%s' in a 'finally' block", kw);
if (msg == NULL) {
return 0;
}
int ret = _PyErr_EmitSyntaxWarning(msg, state->filename, n->lineno,
n->col_offset + 1, n->end_lineno,
n->end_col_offset + 1);
Py_DECREF(msg);
return ret < 0 ? 0 : 1;
}
Готово!
Обсуждение: вы знали про такую проблему? Стреляли так себе в ногу?
P.S. Пока писал пост, нашел багу в питоне и важную опечатку :)
| Поддержать | YouTube | GitHub | Чат |
Forwarded from Valuable AI / Валентин Малых
новая работа про токенизацию - SuperBPE - наводит на меня мысли о том, что история развивается по спирали; своим студентам я на первой лекции рассказываю про словосочетания (Multi-Word Expression), которые можно выделять из текста статистически; а потом использовать, например, для лучшего представления в TF-IDF (придуман в 1970-е)
прошло 50 лет, наши представления о токенизации сильно изменились, особенно в 2015 году, с адаптацией алгоритма сжатия ZIP к токенизации (это, собственно, и есть BPE), и теперь мы вышли на новый круг, чтобы снова учитывать словосочетания в токенизации...
прошло 50 лет, наши представления о токенизации сильно изменились, особенно в 2015 году, с адаптацией алгоритма сжатия ZIP к токенизации (это, собственно, и есть BPE), и теперь мы вышли на новый круг, чтобы снова учитывать словосочетания в токенизации...