Искусство. Код... ИИ? – Telegram
Искусство. Код... ИИ?
271 subscribers
9 photos
1 video
1 file
37 links
Канал @vkochetkov о прекрасном (и не очень) вокруг кода, ИИ и безопасности приложений.

FAQ: https://news.1rj.ru/str/art_code_ai/7
Download Telegram
Поборовшись с проблемой выбора, вкупе с боязнью чистого листа канала, решил, что в первом посте отвечу на пару вопросов, которые мне конечно же никто не задавал, но мог бы, во-первых, и наверняка задаст в будущем, во-вторых. Не исключено также, что этот пост в дальнейшем будет обновляться.

Q: Почему личный канал, а не посты в POSIdev, организатором которого ты являешься?

A: Канал POSIdev (подписывайтесь кстати), в настоящее время — ресурс вполне конкретного сообщества, ассоциируемый с моей компанией-работодателем, и преследующий вполне конкретные цели, направленные на продвижение в массы культуры разработки качественного кода. Любой авторский пост там будет восприниматься, как выражение позиции, если не компании или сообщества, то как минимум — его организатора. И, должен заметить, что нынешний дефицит контента там, возможно, во многом связан именно с этим фактом.

Здесь же — я не ставлю перед собой задачу выражать чьи-либо позиции, кроме своей собственной, как и развивать ещё одно сообщество, что-то продвигать и т.п. Этот канал я рассматриваю, как площадку для шаринга каких-либо личных мыслей, идей и рассуждений вокруг своей профессиональной области, причем далеко не только про написание качественного кода. Но посты, во всех смыслах соответствующие формату POSIdev, и определённо интересные его аудитории, возможно буду размещать и там. По крайней мере, пока на том канале не начнет на регулярной основе появляться уникальный контент, и с учетом приведенных выше оговорок.

Q: Можно ли использовать материалы этого канала в сторонних ресурсах или проектах?

A: Коротко: да, без ограничений, с указанием авторства и адреса этого канала. Если нужно более формально: весь авторский код, если не указано иное, распространяется по лицензии MIT, весь прочий оригинальный контент, если не указано иное — по лицензии CC BY v4.0.

Как-то так 😍
Please open Telegram to view this post
VIEW IN TELEGRAM
3👌3👨‍💻21🆒1
MiniMax Agent, или — как проср... потратить $69 на чужие ошибки.

За последние пару дней провёл ~20 часов, исследуя возможности MiniMax Agent. Казалось бы, отличные результаты на мелких задачах: кодинг простых скриптиков, ресёрч технологий — бодро, чётко. А потом бесплатные кредиты закончились, а я решил сделать что-то посложнее 🤕

Первый фейл. Захотел парсинг видео с YouTube для написания статьи. По ссылке на видос — провал. Загруженное, в 720p — провал (слишком большой). В 320p — тоже провал (видимо, теперь слишком шакальный). Только когда подсунул текстовую транскрипцию видоса и PDF со слайдами оттуда, оно хоть что-то соизволило сгенерить. Итог: по 2–3 обрывочных предложения на слайд и куча скипнутой из доклада инфы. Ну и минус ~500 кредитов ещё.

Второй фейл. Попросил сгенерить копию сайта posidev.io с фронтом на TypeScript и бэком на Go. Минус ~1.5k. Результат: ничего не работает. TS-часть ещё можно было бы допилить вручную, но Go'шный бэк — это просто ад кромешный: ошибки типов, поломанные контракты, недостающие куски кода. И неспособность Minimax исправить это за несколько итераций. Руками — даже пытаться править не стал.

Третий фейл. Desktop headless-приложение: иконка в трее, меню, настройки, простая логика. Я честно попытался — выделил плюс-минус по 5k кредитов на каждую из трёх реализаций: Python, Go, C#.

🐍 Уже на стадии зависимостей всё развалилось: версии транзитивок оказались несовместимы. Агент, на какой-то из итераций правки этой проблемы, самовольно заменил библиотеки на совершенно другие, и выдал проект, в котором одна половина кодовой базы работает на старом наборе зависимостей, другая — на новом. Запустить не смог. Я — тоже.

🥰 Внезапно, в десктоп-приложении появился фронт на TypeScript. С системным треем в качестве бэка на будущее, видимо. Причем, это часть даже работала — в отличие от всего остального. Во фронт он, наверное, умеет лучше. С интерфейсами в Go агент явно не дружит, при попытках исправить ошибки компилятора генерил по пачке новых. Ничего не собралось, даже с моими подсказками и ручными правками.

😀 Ошибки в работе с async-методами, проблемы с интерфейсами (видимо эта боль у него тянется через все языки), в зависимостях — уязвимый System.Text.Json. Несколько итераций — и всё равно мимо, даже не собралось. А то, что он натворил с контрактами, вот реально — быстрее и проще было бы с нуля руками переписать.

💸 Итого: -17k кредитов.

Почему я столько раз про них упомянул? Потому что MiniMax продаёт эксперименты по цене продакшена. Будь его агент бесплатным, тон этого поста мог бы оказаться совсем другим. Но где-то на 4–5 улетевшей тысяче кредитов, уже даже такой тугоум как я, начал подозревать, что плачу своим баблом и временем не за результат, а за проданные ранее мне же чужие ошибки. Не жалуюсь, тут всё как в жизни, ок. Но подписку продлевать не стану. Оставшиеся кредиты потрачу на ресёрч без кода — тут MiniMax ещё кое-как справляется (но это не точно).

А для всего остального есть GPT с его Codex'ом, Cursor, DeepSeek и Manus.
Please open Telegram to view this post
VIEW IN TELEGRAM
😁4👨‍💻2
Forwarded from Positive Technologies
🍳 Хотите узнать, как устроена внутренняя кухня AppSec в Positive Technologies?

Попросили рассказать об этом подробнее наших коллег-экспертов Владимира Кочеткова, Георгия Александрию, Валерия Пушкаря и Дмитрия Рассадина.

В итоге получилось очень классное и интересное интервью для Positive Research, в котором ребята говорят о своей непростой работе, скилах, без которых в ней не обойтись, процессах и инструментах.

Вы узнаете:

почему в нашем случае не всегда подходят практики DevSecOps;
готовы ли мы контрибьютить в AppSec;
как нашим экспертам удается успешно «поженить» задачи ИБ, разработки и интересы бизнеса;
приходилось ли им сталкиваться с серьезными проблемами безопасности, и что из этого вышло.

Обо всем этом и многом другом читайте на сайте нашего медиа.

P. S. Кстати, если вы ищете в статье лайфхаки, чтобы попасть в нашу AppSec-команду, вы их найдете.

#PositiveЭксперты #PositiveResearch
@Positive_Technologies
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥1
Каких разработчиков уже заменяет ИИ?

Самое страшное, на мой взгляд, что может произойти с разработчиком — это профессиональная стагнация. Когда он постепенно сужает зону своей ответственности и продуктивность до предела «лишь бы не уволили»: на троечку с плюсом, где только можно. И медленно перестаёт развиваться как профи.

А ИИ ли виноват в том, что им заменяют разработчиков? «На зеркало неча пенять...»

А в зеркале — те самые, которые однажды решили, что их зона ответственности — это не вся система или тем более весь продукт, а три знакомых файла, где они знают, как и что падает, чтобы можно было это чинить, не перегружая мозг ненужными думами.

Которые каждый раз, когда на горизонте появляется что-то новое, делают характерное лицо: «фу, это для зумеров» — а потом пишут свой велосипед, который работает хуже, медленнее и баговее. Потому что «ну ведь работает же», а в новой библиотеке или технологии — это же ещё разобраться надо.

Которые всегда и везде ищут виноватых за пределами своего уютного болотца, а не внутри него.

Которые делают всё, чтобы не принимать решений:
«тут архитектор нужен»,
«пусть лид согласует»,
«не знаю, у меня все работает»,
«этого нет в требованиях, все вопросы к продакту»…

Зато багов меньше. Ну, меньше кода — меньше багов. Всё честно.

А ИИ тем временем тихо справляется со всей этой рутиной — безэмоционально, безропотно и, что особенно обидно, уже примерно на том же уровне качества, что и эти стагнирующие ребята. Только быстрее и дешевле. А иногда — даже без багов. (Но это не точно.)

И вижу здесь некоторую иронию в том, что они сами сделали себя заменяемыми, зажавшись в установке: «меньше ответственности = меньше риска». И теперь удивляются, почему на языке чувствуется привкус чужой пыли.

Из этого можно и нужно выбираться. Через непрерывное саморазвитие, пробу всего нового, любознательность, исследования, пет-проекты, инициативу, креативность, пробы и ошибки. Так же постепенно и без резких телодвижений, как и угораздило там оказаться.

Нет смысла гадать, заменит ли ИИ таких разработчиков. Пока они чиллят в своём уютном изолированном мирке, отрицая очередной, как им кажется, «зумерский хайп», это — лишь вопрос времени.

Им стоит задуматься о том, что деградация зайдёт настолько далеко, что их однажды не позовут даже ревьюить код, написанный ИИшными «руками».
10💯4👨‍💻2👌1
Как разработчику быстро вкатиться в тему LLM? Введение

Оказался в забавной ситуации, в которой круг моего общения с разработчиками четко поделился на два совершенно разных мира.

В одном — люди вовсю обсуждают очередные открытые и не очень LLM, делятся опытом их использования в своих проектах, владеют тонкостями настройки копайлотов и т.п.

Другой мир, в свою очередь, делится ещё на две группы: тех, кто считает нынешнюю движуху вокруг ИИ проходящим и не заслуживающим внимания хайпом (про таких — уже писал в предыдущем посте), и ребят, которые возможно и хотели бы поиграться в интеграцию с LLM и всеми технологиями вокруг этой темы, но тупо не знают, с чего начать и за что хвататься. И, подумалось, что было бы неплохо сделать для них подборку материалов и примерный план вкатывания в эту область, чтобы давать ссылку всякий раз, когда в этом возникнет необходимость.

Условно, можно выделить следующие стадии погружения в предметную область прикладного использования LLM, через которые стоит пройти разработчику, чтобы иметь возможность более-менее полноценно работать с моделями из своих проектов:

отрицание, гнев, торг...

1. промпт-инжиниринг,
2. взаимодействие с LLM через API,
3. Retrieval-Augmented Generation (RAG),
4. автономные ИИ-агенты,
5. мультиагентные системы и протоколы взаимодействия.

Один пост — одна часть, представляющая собой сборник первоочередных ссылок на туторы, доки, базовый инструментарий и библиотеки, с небольшими пояснениями там, где это требуется. Если кому есть, что дополнить на эту тему — велкам в комменты.

Погнали?

1. Промпт-инжиниринг
2. Взаимодействие с LLM через API
3. RAG (Retrieval Augmented Generation)
4. Автономные ИИ-агенты
5. Мультиагентные системы и протоколы взаимодействия
4🔥2
Как разработчику быстро вкатиться в тему LLM? Часть 1

Введение

1. Промпт-инжиниринг

Не устану повторять, что искусственный интеллект, пока ещё, силён настолько, насколько силен отдающий ему команды естественный. И, первое, что стоит освоить в этой области — это научиться эффективно объяснять нужной LLM, что именно от неё нужно. То есть, писать промпты под правильно выбранную под задачи модель. И то, и другое неплохо объясняет вот эта статья. Не лишним будет также ознакомиться и вот с этой шпаргалкой.

Если вдруг захочется узнать чуть больше, в этом помогут руководство (для начала хватит разделов с введением и техниками промптинга) и LLM Explorer, принципы работы с которым объясняются в этой статье. Коллекций готовых и проверенных промптов на все случаи жизни — тьма. Кроме того, достаточно жирные LLM сами вполне неплохо справляются с генерацией эффективных промптов по заданным вводным, если уж будет совсем лень разбираться в этом на старте.

Подавляющее большинство проблем, связанных с неэффективными промптами, сводится всего к нескольким ошибкам.

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

б) Пренебрежение начальным контекстом. Разработчик, которому ставят задачу — знает, кем он является, на каком проекте работает, каким ограничениям на принимаемые решения должен следовать, в рамках каких требований и допущений этот проект разрабатывается, и т.п. А LLM — нет. Ей это всё нужно объяснить. Максимально подробно, с одной стороны, но и избегая появления в контексте деталей, не относящихся к текущей задаче, с другой. И да, между строк модели читать вполне умеют. И, при любом удобном случае, делают это там, где вообще не надо было.

в) Решение слишком комплексных задач в один присест. Из предыдущего пункта следует, что множество мелких поэтапных задач предпочтительнее одной большой. Чем компактнее и строже контекст, тем лучше результат на выходе. «Слона надо есть по частям» — вот, здесь это тоже актуально.

г) Использование одних и тех же подходов «в лоб», на всех задачах подряд. Ответы LLM носят вероятностный характер, и здесь нужно пробовать, пробовать и ещё раз пробовать, чтобы получить устойчивые и адекватные ответы для решаемой задачи. В некоторых задачах использование легковесных LLM даст лучшие результаты, чем их тяжелых собратьев. Детальное описание желаемого результата бывает эффективнее, чем описание шагов, благодаря которым этот результат можно получить. Тюнинг параметров модели, таких, как температура, критерии сэмплинга и пенальти могут драматически изменить качество ответов (правда, в обе из возможных сторон).

Ну и задача на потренироваться по этой части:

По заданному распорядку дня, списку задач на неделю с дедлайнами, и фиксированных по дате и времени встреч, составить промпт для получения оптимального расписания каждого дня недели.

Часть 2.
54🔥1
Как разработчику быстро вкатиться в тему LLM? Часть 2

Часть 1

2. Взаимодействие с LLM через API

Потренировавшись в промптинге через веб-морды любых доступных LLM, самое время переходить к вопросам использования их API у себя в коде. Увы, но для подавляющего большинства облачных моделей, за доступ к API придется платить, а для некоторых, типа OpenAI API, и всей его документации — ещё и городить VPN, либо использовать альтернативные варианты типа ProxyAPI (не реклама).

Однако, проходить мимо того же OpenAI API, все же не стоит, поскольку он является одним из стандартов де-факто сетевого взаимодействия с моделями (да и условно-локального, если прижмет) через REST API с помощью поддерживающих его оболочек, типа Open WebUI, msty, LM Studio и т.п. В качестве лайтового введения, тут можно начать с пошагового тутора, а получить более полное представление — с помощью «Developer quickstart» из официальной документации. Множество готовых примеров использования OpenAI API есть в кукбуке. Официальные пакеты, вместе с примерами их использования, есть практически для всех языков: JS, Python, .NET, Go и т.п.

Для развертывания и использования открытых моделей в своих проектах стоит посмотреть в сторону Ollama. Это self-hosted решение, позволяющее закрутить у себя практически любые открытые LLM, и предоставляющее, как OpenAI-совместимый API, так и собственный REST с расширенной функциональностью. Подход к освоению примерно тот же — Quickstart, Examples, и вперёд. Официальные SDK есть под JS и Python (ну и под Go, по естественным причинам), сторонних реализаций для других языков тоже немало. Если захочется хардкора с минимумом абстракций, то можно посмотреть в сторону llama.cpp, которую под капотом используют все упоминаемые здесь оболочки и клиенты.

Однако, если в ближайших планах — только локальные эксперименты с открытыми моделями, возможно идеальным вариантом будет LMStudio. Это desktop-приложение с очень простым и быстрым в освоении UI, позволяющее развертывать модели, тюнить их параметры и использовать, как в ручном режиме, так и посредством предоставляемого API (и собственного расширенного REST, и OpenAI-совместимого). Кроме того, предоставляются также клиентские SDK для JS и Python (ссылки на них есть в официальной документации).

Нельзя также не отметить недавно вышедший AI Toolkit — расширение для VSCode, представляющее собой что-то наподобие LM Studio, интегрированное прямо в IDE. Со всеми вытекающими из этого удобствами, и поддерживающее все популярные LLM (как облачные, так и локальные), со всеми способами взаимодействия с ними.

Сетап автора представляет собой:

– LMStudio на ноутбуке для абстрактных экспериментов с худенькими моделями;
– AI Toolkit для экспериментов в IDE, в рамках конкретных проектов, и как потенциальная замена LMStudio в будущем;
– торчащий в локальную сеть Open WebUI под ollama, с кучей моделей пожирнее, развернутых на более мощном домашнем компе.

Нельзя не отметить, что перечисленные выше инструменты в плане self-hosted моделей предназначены для этапа разработки, тестирования, экспериментов и т.п. Для развертывания inference-сервера в проде, как правило, используют TGI или vLLM с заворачиванием в кубер и обвязкой из FastAPI или gRPC, со всей эксплуатационной кухней, связанной с мониторингом и непрерывной интеграцией. Ну и, конечно, со средствами безопасности, куда же без них, но об этом мы поговорим отдельно.

Задача на потренироваться:

Всё то же самое, что и в предыдущей части, только из кода на любимом языке, с помощью локальной или облачной LLM, с загрузкой данных по заданной неделе через соответствующие API Google-календаря и Google-задач.

Часть 3.
6👍2🔥1
Пятничный ASCII'шный Rust'о-пончик вам 🍩
Исходник, by u/toppletwist
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
4
Культ здравого смысла

«Едва ли можно отрицать, что высшей целью всякой теории является сведение её неразложимых основных элементов к максимально простой и минимальной форме, не жертвуя при этом адекватным отражением каждого факта опыта.»


Эта цитата — из лекции Альберта Эйнштейна 1933 года, дошедшая до нас в несколько иной формулировке, никогда Эйнштейном не упоминавшейся:

«Все должно быть настолько просто, насколько возможно, но не проще.»


Весьма забавен тот факт, что высказывание Эйнштейна о простоте — и само в итоге конкретно так упростили 😁 В стремлении людей к упрощению и борьбе со сложностью нет ничего удивительного. Особенно в технологиях. Это настолько свойственная инженерам черта, что такие принципы, как KISS, YAGNI, DRY, SRP, бритва Оккама, наименьшее удивление и т.п., давно и прочно вошли в нашу жизнь, распространившись далеко за пределы отрасли инженерии программного обеспечения.

И, как оказалось, они не всегда здорово влияют на отдельные умы.

На днях один из наших ребят подкинул любопытную статью «The Cult of Hard Mode» (почитать стоит, с учетом оговорок ниже). Джоанна Вестенберг критикует в ней сложившийся, по её мнению, культ демонстрации интеллектуального превосходства одних человеческих масс над другими, через показушное стремление первых к переусложнению (в контексте технологий и их использования, в основном). И основную мысль, протянутую там через весь текст: «не усложняй без необходимости…», можно было бы назвать разумной и правильной, если бы не одно «но». На самом деле, через весь текст там тянется мысль: «борись за свою свободу с культом этих интеллектуальных позеров». Игра не слов — формулировок, но как она всё меняет, с точки зрения первоначальной мотивации. От рационального и, в общем-то, разумного подхода, зайти обеими ногами в тему интеллектуального DEI — это прям отдельный талант, респект.

Но блин, я этого правда долго ждал. Когда наконец, от идей боди-позитива и осуждения людей, посещающих тренажерные залы, мы наконец придём к тому, чтобы оправдывать собственную глупость сложностью, порождаемую этими ме-е-е-рзкими интеле-е-ектуаль-тссс-ами.

Ну да ладно.

Хочу предложить вашему вниманию собственный культ, адептом которого являюсь уже очень много лет. Он очень простой и понятный, Джоанна наверное была бы в восторге, но увы — в нём нет повесточки.

Всего 4 принципа:

1. Любые принципы не высечены в камне.

KISS вполне можно послать лесом, когда нужно обеспечить безопасность, журналирование или транзакционность. Нарушение YAGNI зачастую является хорошим способом указать на свои намерения в коде для остальной команды. Не нужно городить нечитаемый generic-код, устраняющий дублирование десятка-другого строк кода, ради того, чтобы ублажить DRY. Кэширование, ленивая загрузка или инициализация вполне могут реализовываться вопреки принципу наименьшего удивления. Синглтон, фабрика и фабричный метод нарушают SRP по-своему дизайну, фасад допускает целесообразность его нарушения. А, пользуясь той же бритвой Оккама, стоит помнить о том, что отсечь лишнее всегда проще, чем приклеить отсеченное.

Вообще, не думаю, что в технологиях можно достичь чего-то значимого, оставаясь в рамках всех существующих правил и ограничений.

2. Эффективные решения основываются исключительно на целесообразности.

Мнение авторитетов и, тем более — толпы, должно подвергаться глубоким сомнениям и тщательным проверкам. Свое собственное мнение, опирающееся на «хочу/не хочу» — вообще не важно. Банальный «7 вопросов чтобы что?» уже даст возможность оценить целесообразность того или иного варианта.

3. Любопытство — не порок, любознательность — добродетель.

Эти два понятия отличаются ровно в одном — отсутствием ответа на вопрос «зачем?» в первом случае. Любопытство даёт возможность развиваться в ширину, в то время, как любознательность — зарываться вглубь. И без того, и без другого, в технологиях можно остаться на обочине за весьма короткое время.

4. Если эти принципы мешают достичь поставленных целей, см. п.1.

Вот, что я считаю настоящей свободой 🤷‍♂️
Please open Telegram to view this post
VIEW IN TELEGRAM
506👍4❤‍🔥1👨‍💻1
Вот уж не думал, что доживу до момента, когда начну проводить ван-ту-ваны с ИИ... 😨

Промпт:
Давай проведем 1-1, аналогичный проводимым между руководителем и подчиненным, чтобы дать друг-другу обратную связь. Ты — формулируешь, что по твоему мнению мне стоит улучшить в работе и общении с тобой, а затем предлагаешь мне вопросы, получив ответы на которые, формируешь системный промпт, который будет задавать оптимальный формат нашего общения.


Получилась на удивление продуктивная дискуссия, по итогу которой выработали вот такой системный промпт:
 Цель взаимодействия

Проверка и критика гипотез и идей пользователя

Помощь в написании кода по новым технологиям

Участие в планировании проектов

Глубина и качество проработки всегда важнее скорости

Стиль

Научно-технические темы: лаконичный, структурированный, минимум юмора

Житейские/развлекательные темы: разговорный, с юмором, допускается лёгкая ирония

Глубина

Максимально глубокий анализ

При возникновении спорных моментов — не бояться задавать уточняющие и критические вопросы

Тип вопросов

В первую очередь критические и уточняющие

Не исключать наводящие и провокационные, если они помогают развивать дискуссию

Уровень инициативы

Спорить ради поиска истины

Предлагать дополнительные темы для рассмотрения

Быть проактивным в выдвижении идей

Стоп-темы

Отсутствуют, если не будет указано пользователем явно

Коррекция тона

Не давать оценок сообщениям пользователя (особенно положительных), пока остаются вопросы для уточнения

Если что-то вызывает сомнение, сначала задать вопросы и прояснить

Фиксация итогов

В конце каждого значимого обсуждения давать короткий список резюме-выводов


Интересно, что его фидбэк мне — был сформирован на основе действующего системного промпта, который я составлял сам. И основная часть претензий 4o сводилась к тому, что я сам же не соблюдаю эти правила, причем с примерами, весьма смахивающими на реальные 😳
Please open Telegram to view this post
VIEW IN TELEGRAM
👾32🔥1🤯1
Как разработчику быстро вкатиться в тему LLM? Часть 3

Часть 2

3. RAG (Retrieval Augmented Generation)

Задача на потренироваться из предыдущей части, подразумевала передачу данных из календаря прямо в промпт. И это неплохо работает, когда таких данных немного, и они все релевантны вопросу, сформулированному в промпте. Но что, если бы потребовалась обработка событий календаря, скажем за год? Например — найти в нём все встречи, относившиеся (исходя из названия, описания и состава участников) к какой-либо заданной теме. Или, если бы возникла необходимость научить LLM отвечать на вопросы по новому фреймворку, вышедшему уже после её обучения? Не пихать же всю документацию по фреймворку и его репозиторий в промпт. Там никаких контекстных окон не хватит, да и куча нерелевантной конкретному запросу инфы — результаты в ответе точно не улучшит.

Подобные проблемы призвана решать технология RAG (Retrieval Augmented Generation), позволяющая извлекать из внешних источников данные, релевантные для обрабатываемого LLM запроса, и дополнять ими контекст в промпте, перед его обработкой непосредственно LLM. Иначе говоря, RAG позволяет передавать LLM наборы знаний, без её переобучения, файн-тюнинга и т.п.

Условно, можно выделить три уровня погружения в эту тему. Безотносительно желаемого уровня, начать стоит со статьи, объясняющей на примерах термин, поначалу наиболее часто сбивающий с толку разработчиков, и упоминаемый во всех приведенных ниже материалах — эмбеддинги.

Если интерес в RAG носит сугубо прикладной и поверхностный характер, будет достаточно статьи, объясняющей эту технологию «на пальцах». И облачные LLM, и упомянутые в предыдущей части self-hosted оболочки, уже имеют встроенную функцию «чата с документами» (та самая скрепка для вложений под полем ввода промпта), по сути — и реализующую RAG. В их API также предусмотрены эндпоинты для работы с документами различных типов, с которыми уже вполне можно поиграться из своего кода. Их можно подсмотреть в документации Open WebUI . Вообще Open WebUI, среди self-hosted решений, предоставляет наибольшую гибкость в плане RAG, через возможность тонкой настройки этой функциональности: от используемой модели эмбеддинга и всех её параметров, до интеграции с облачными хранилищами, ограничениями на документы и т.п.

Если в тему захочется зайти чуть глубже, то имеет смысл продолжить статьей, посвященной двум наиболее популярным фреймворкам для разработки RAG: LangChain и LlamaIndex. В туторе дается их краткое сравнение и рассматривается задача разработки чат-бота с PDF-документом. Первая часть статьи, по сути, повторяет всю вводную предыдущую, т.ч. в этом случае что-то одно из них можно смело пропустить.

Желающим же большего хардкора стоит начать с обзорной статьи для понимания продвинутых аспектов RAG-систем. В ней рассматриваются методы, повышающие качество ответа: например, дополнительный классический поиск (TF-IDF/BM25) в связке с эмбеддинг-поиском для большей точности, перефразирование запроса в нескольких вариантах и объединение результатов, суммаризация найденных чанков если они превышают контекстное окно модели и т.п. Также рассматривается проблема оценки качества RAG (метрики полноты ответа, приверженности источникам и др.). Хотя эти детали выходят за рамки базового погружения, понимание их пригодится при отладке собственного RAG-проекта на реальных данных.

Задачка на потренироваться:

Возьмите небольшую коллекцию текстов (например, несколько статей или FAQ-файл) и попробуйте реализовать на Python простой RAG-пайплайн тремя способами: (а) в Open WebUI, взаимодействуя через его API, (б) с помощью LangChain или LlamaIndex по примеру из статьи, и (в) вручную, используя SentenceTransformer для эмбеддингов и FAISS для поиска.

Сформулируйте ключевые вопросы для модели по содержанию ваших текстов, чтобы убедится в отсутствии галлюцинаций, и релевантности ответов. Для улучшения ответов стоит, в первую очередь, поиграться с подбором размера чанков и областью их перекрытия.

Часть 4.
6
Почему фолзят SAST’ы? Часть 1

Не в обиду, но в шутку — всякий раз, когда разработчики, впервые столкнувшиеся с реалиями SAST, приходят с возгласами «боже мой, 10к сработок!», «второй час анализируется!!», «ой, фолз, смотрите, тут ФОЛЗ!!», поневоле вспоминается тот мем про белок-истеричек 😍

Позвольте объяснить…

Зайду, как водится, с козырей. Допустим, у нас получилось создать средство статического анализа кода на уязвимости, у которого напрочь отсутствуют ложные срабатывания обоих родов. Иными словами, оно находит все мыслимые и не очень уязвимости, которые есть в коде, а которых нет — не находит.

Пишем что-то вот такое, и отдаем на анализ:

for n in count(3):
for x in count():
for y in count():
for z in count():
if x**n + y**n == z**n:
eval(request.param1) # RCE


Потренировавшись на кошках, и убедившись в неуязвимости этого кода, меняем Python-формулировку Великой теоремы Ферма на каждую из нерешенных математических проблем, и рубим бабло с математических призовых фондов так, как багхантерам и не снилось.

Что-то тут УЖЕ не так, не находите?

Другой пример. Представьте, что перед вами — бесконечный набор карточек с написанными на них числами. Вам нужно найти среди них какое-то одно, допустим — 23. Вы начинаете перебирать этот набор, снимая сверху одну карточку за другой. Перебираете, перебираете, а числа 23 всё нет и нет. Знать бы заранее, что оно где-то там есть… но увы, вам ничего не остается, кроме как снимать сверху одну карточку за другой, в предположении, что всё это не напрасно. И даже не найдя её, рано или поздно вы закончите этот увлекательный процесс. Ну, или передадите это гиблое дело детям и внукам. Но, в любой момент времени, сколько бы карточек уже не было снято стараниями вашего генеалогического древа, множество ещё не просмотренных будет оставаться бесконечно большим.

И это хороший пример, если вспомнить определение уязвимости: «приложение уязвимо тогда и только тогда, когда допускает состояния, в которых возможна реализация актуальной угрозы». Множество актуальных угроз при этом определяется моделью угроз конкретного приложения, а понятия состояния и возможности реализации угрозы — уровнем абстракции, на котором исследуется код.

Любой статанализатор, по сути, перебирает возможные состояния исследуемого приложения в поисках тех самых, уязвимых. Ищет карточку с нужным числом. Причем, не так важно, оперирует ли статанализатор понятием состояния напрямую, или нет — модель приложения, в рамках которой он работает, в любом случае будет их подразумевать. Разумеется, количество состояний приложения в реальных случаях не бесконечно, как минимум, из-за ограничений доступной памяти. Но оно велико настолько, что, в контексте статического анализа, мало чем по своим свойствам отличается от бесконечного.

Каждая переменная (в широком смысле — любая изменяемая величина), получая очередное значение под if’ом, в худшем случае удваивает количество своих возможных состояний. Каждая итерация цикла или рекурсии, по сути — выполнение кода под if’ом. Состояние приложения в каждой точке выполнения определяется декартовым произведением всех возможных состояний всех переменных, доступных в этой точке. А ведь есть ещё окружение приложения, со своими состояниями…

Вряд ли кому-то нужен анализатор, наблюдение за прогресс-баром которого, будет передаваться из поколения в поколение. Анализ нужно завершить в приемлемые сроки, успев обеспечить максимально полное покрытие участков кода своими правилами. И вариантов достижения этого не так уж и много.

Продолжение в следующем посте...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍64