Интересное что-то
517 subscribers
2.72K photos
253 videos
138 files
4.51K links
Материалы и мысли, понадерганные отовсюду
Блог: https://t.me/asisakov_channel
Чат: https://t.me/youknowds_chat
Download Telegram
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, какие у вас были забавные случаи?

Картинки к посту будут в комментах 👇
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-моделей в продакшне).
Forwarded from Onigiri
Я нагенерировал много картинок через новую мультимодальную генерацию 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 иногда делает опечатки в тексте на картинке, поэтому немного лучше сначала писать на английском, а потом можно просто попросить перевести картинку на русский, если нужно. Либо еще можно написать весь конкретный текст на русском в кавычках, кажется, что так получается лучше
🖥 OpenAI открывает бесплатное обучение по работе с нейросетями

OpenAI запустила "Академию OpenAI", которая претендует на роль главного учебника по ИИ. Платформа поможет освоить нейросети, понять их возможности и научиться эффективно использовать ChatGPT и Sora в повседневной жизни и работе.

Обширная база обучающих материалов доступна на отдельном сайте.
Живые трансляции и офлайн-мероприятия помогут глубже разобраться в технологиях.
Бесплатный доступ — OpenAI стремится расширить аудиторию, а не ограничивать её ценником.

📌Начать обучение
📌 Блог
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Пошаговый гайд создания системы автоматического распознавания речи с помощью PyTorch и Hugging Face

С эти гайдом вы сможете:
- Загружать и обрабатывать речь данные
- Настраивать предварительно обученную модель 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, в которых реализуются политики безопасности. Например, если данные происходят из недоверенного источника, ответ прерывается. Или если у пользователя нет разрешения на запрошенную информацию, ответ прерывается.


В общем, конечно же интересно увидеть, что будет дальше, так что продолжим следить за работами этих ученых)
PEP765: больше никакой грязи в finally

Ссылка на 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 | Чат |
новая работа про токенизацию - SuperBPE - наводит на меня мысли о том, что история развивается по спирали; своим студентам я на первой лекции рассказываю про словосочетания (Multi-Word Expression), которые можно выделять из текста статистически; а потом использовать, например, для лучшего представления в TF-IDF (придуман в 1970-е)

прошло 50 лет, наши представления о токенизации сильно изменились, особенно в 2015 году, с адаптацией алгоритма сжатия ZIP к токенизации (это, собственно, и есть BPE), и теперь мы вышли на новый круг, чтобы снова учитывать словосочетания в токенизации...
Forwarded from DLStories
С 2022 по 2023 годы я вела в МГУ курс по основам AI. У курса был формат, где на каждом занятии был один jupyter notebook с теорией и практикой, и мы по нему шли. Курс я уже не веду, но ноутбуки у меня остались, и мне нравится, как я их сделала. И у меня была мысль перевести их на английский, немного дополнить, причесать и выложить на GitHub как открытый курс "DL Intro". И я даже потихоньку начала это делать, вот репозиторий, там уже есть первые два урока (Intro to NN, PyTorch, Backprop).

Но вот недавно я думала о том, какой рисерч делать дальше после недавней статьи (статья кстати вот, чуть позже о ней тоже напишу), и мне стало интересно исследовать многообразия, которые составляют векторы-выходы разных слоев диффузионной модели. Я начала читать статьи и думать над тем, как вообще такое делают, и в итоге залезла куда-то в дифференциальную геометрию. И тут ко мне пришла очень гениальная мысль: а что если спросить у GPT объяснить мне то, что я не понимаю? Или спросить что-то типа "вот я хочу вот это понять про многообразие, могу ли я это сделать и как?"
Тут если вам кажется, что эта мысль ничерта не гениальна и все делают так каждый день, то я до этого момента GPT не использовала вообще. Ну, 3-4 раза за все время, может, и по каким-то совсем отвлеченным поводам. Чувстсвую себя бабкой, честное слово))

Так вот, на мои эти вопросы GPT выдала очень классные саммари и предложения, и для некоторых вещей даже код написала (и даже почти совсем правильный). И если веруться к разговору про курс: теперь я думаю о том, что, возможно, с помощью GPT можно довольно быстро собрать неплохой такой курс по чему угодно. Так-то объяснения по диффгеому GPT выдавала понятные и достаточно развернутые, а если чего-то не хватает, то можно попросить пояснить. И теперь думаю о том, насколько усилия по составлению курсов людьми из головы становятся оправданы)

Думаю, что этот курс я все-таки доделаю и выложу (снова, вот ссылка, буду рада звездочкам 🙃), все же ноутбуки у меня в основном готовы, нужно их только причесать. Но в то же время пойду понимать, на что способна GPT, у меня теперь есть подписка на GPT и Claude, буду их мучить. Все-таки преподавание — это значительная часть моей работы, которую я люблю и хочу развивать, и хочется понимать, как делать эту работу лучше и быстрее. И не делать того, что можно не делать. Правда, в создании курсов я перфекционист, мне редко нравятся чужие объяснения, и я очень долго продумываю свои. Но посмотрим, может, GPT справится и удивит меня еще больше) Пока думаю, что, как минимум, в качестве помощника в составлении общей структуры курса и поиска дополнительных материалов GPT точно должна быть полезна.
Please open Telegram to view this post
VIEW IN TELEGRAM