📱

Get Our Mobile App

Take your business learning on the go!

Download on the App StoreGet it on Google Play

Spec-driven разработка с ИИ-агентами в Cursor: 4 практических проекта

Клуб разработчиков СПб26:15

Transcription

Всем привет. Меня зовут Вадим Краузе. Я ведущий разработчик в управлении цифровизации в университете.

Вот недавно я прошёл небольшой интенсив по обучению, короче говоря, по работе в курсор. И хочу вам рассказать и показать, что у меня получилось и что я понял, в принципе, про разработку с агентами. Здесь в заголовке доклада у меня такой термин "вайп-кодинг". И в принципе, вайп-кодинг - это просто, когда разработчик пишет задание на естественном языке, а агент пишет код в соответствие задания. Собственно, это всё.

Ну и сразу хочу сказать, что уровень доклада у меня вводный. Я полноценно не использую пока что агенты в разработке в промышленные, но стремлюсь к этому. Значит, план моего доклада: сперва небольшой обзор возможностей курсора. Потом я покажу четыре учебных проекта, которые сделал. А, ну и расскажу, что, собственно, я узнал о разработке с агентом, что понял и что планирую делать дальше.

Значит, что такое вообще курсор? Это на базе VSOD, сразу заточенная для работы с агентами. То есть в отличие от, скажем, какой-нибудь ADE идея, да, в которой можно поставить плагин, а для как бы тоже работы с большой языковой моделью, но это не будет такая нативная интеграция, да? То есть здесь это весь под это заточен.

Значит, у агента VS-код есть инструменты для взаимодействия с внешним миром, собственно говоря. А какие у него инструменты есть? Он может по кодовой базе проекта выполнять семантический поиск. То есть может искать во всех во всех исходных кодах проекта, может смотреть содержимое папки, файла, может редактировать файлы, удалять файлы. Что важно, он может выполнять команды в терминале и читать вывод из терминала. То есть он может запускать, иначе говоря, всё, всё, что захочет, грубо говоря. И что ещё важно, он может подключаться к MCP-серверам, а, которые предоставят ему доступ к информации, к инструментам. Это зависит от MCP-сервера. В принципе, это очень, можно сказать, неограниченные возможности к расширению, но про MCP я немножко дальше расскажу. Вот.

А что ещё есть в курсоре? А, значит, есть в нём правила. Это такие промпты, да, для каких-то конкретных моментов. Например, они могут действовать всегда или могут действовать в каком-то контексте. Тоже я покажу, какие, ну, что такое правило в курсоре. И в курсоре есть память. Условно говоря, вы общаетесь с агентом, он что-то для вас делает, и потом он говорит: "Вы знаете, я понял такую вещь и предлагаю вам сохранить это как память". Э вот, то есть это будет, ну, перманентное перманентное сохранение между вашими сессиями разработки. он будет знать, что вот вы предпочитаете делать так вот. Ну, и, э, курсор, э, позволяет, ээ, автодополнение в режиме автодополнения работать в режиме онлайн-редактирования, но я его использовал в диалоге в агентском режиме. И, собственно, покажу, как агентский режим выглядит в курсоре.

Значит, что по использованию курсора у нас в России? А, он работает без VPN уже хорошо. Имеет смысл использовать продвинутые модели GPT5, Clot 400et, но это платно. Вот. И оплата с российских карт невозможна, но мы все понимаем, что есть варианты. Также там есть бесплатный план, и, в принципе, любой из нас может туда зайти и бесплатно попробовать разработку с платными моделями, в том числе. Но там, конечно, всё очень лимитированно будет. Зайти можно через Google аккаунт, через GitLab, через почту на Gmail. Вот, вот такие рекомендованные способы. Но, в принципе, всё это просто сделать. И также можно ввести API ключ для доступа к модели в курсор. И тогда курсору платить не нужно будет вовсе. Да, тогда можно будет платить, э, за API OpenAI или там Гугла, или, может быть, даже найти где-нибудь какой-нибудь промо API, да, который будет для вас бесплатно работать, да. Стоимость Pro плана там 20 долларов в месяц. Вот. Но он тоже лимитирован, то есть там есть ещё какие-то планы, но я уже сильно не разбирался.

И значит, вот такой первый мой проект учебный был сделан. А все проекты, которые я покажу, написаны на Питоне. А этот проект он консультирует в Телеграме по услугам некой IT-компании вымышленной. Значит, информация об IT-компании для него написана в, ну, как бы в промпте, да. Также в промте написано, кто как бы кто он такой и что он должен делать. Это там зафиксировано. Здесь я написал, что он разработан с нуля по SPC driven development. С нуля, значит, как бы, ну, понятно, ничего не было, да? А что значит пок driven development? Когда я его делал, я не знал этого термина, но фактически получается, что действовал по этой методологии. Что это значит? Что перед разработкой кода, перед написанием кода разрабатывается документация. А конкретно начиная с идеи продукта, да, мы говорим: "Я хочу код, будет консультант, который будет делать то-то". Потом разрабатывается аа техническое видение. Также через правила подключается соглашение, что, мол, допустим, ты работаешь итерациями, ты прежде чем комитить, спрашиваешь и так далее, и как бы в конце концов разрабатывается task-лист с конкретными задачами, да, по итерациям. Вот.

И, значит, этот первый вот консультант использует большую языковую модель через Open Router, точнее с Open Router. Open Router - это мм такая платформа агрегатор, через которую можно мм пользоваться языковыми моделями самыми разными, от разных провайдеров, от того же Open AI, Antropic, Google и кого угодно. Вот. М там есть как платные, так и бесплатные модели. И OpenAI API - это API, которая OpenAI разработал для своей модели изначально. Ну, в принципе, сейчас это такой промышленный стандарт, отраслевой стандарт, ну, в общем, стандартный доступ до способ доступа к моделям. Вот.

Значит, давайте смотреть первый проект. Так, вот, э, значит, это интерфейс курсора, это настройки. Здесь, э, хотел показать именно про правила и память. То есть вот здесь написано, что учиться, мм, ну, сохранять, генерировать, сохранять память. Можно посмотреть сохранённую память. И вот здесь два подключённых правила. Правила - это фактически файлики, которые лежат, это правила проекта, которые лежат в cursor Rules. Какие здесь сейчас подключены правила? Значит, первое - это конвенции, правила разработки кода, да, следует по принципу KISS, Keep it simple, структура кода и так далее. То есть это понятно, правила управляют тем, как агент будет генерировать код. Это важно. И workflow - это, собственно, порядок работы. То есть мы работаем итерациями. Сначала планируем, потом делаем, потом проверяем, пишем какой-то тест и там, допустим, говорим, спрашиваем: "Вот я сделал это, можно ли комитить?" Что здесь ещё в проекте? А, значит, здесь вот техническая документация, как я говорил, начиная с идеи, аа, и заканчивая тасклистом. Вот здесь список итераций, восемь итераций, то есть за восемь итераций был сделан этот год. Также вот лежат промты и вот лежат исходники на питоне, поделённые по модулям. Ну, и вот в лежат всякие настройки для доступа API. Так.

Прежде чем запустить, я, наверное, покажу, в принципе, как работает агентский режим разработки. У меня есть этот же проект, в котором как бы пустой, да? То есть, мм, в котором ничего не разработано. Вот он такой. Итерации все пустые. Вот здесь у меня, собственно, этот взаимодействие в агентском режиме. Что это такое? Это, ну, по сути, чатик, да, здесь выбрано, что это агентский режим, автовыбор модели. То есть можно выбрать конкретную модель, но в автовыборе получается дешевле, на самом деле, с точки зрения использования ресурсов. Вот я ему говорю: "Значит, что здесь ещё видно? Здесь подключены два правила, которые там я показывал, да, конвенция Workflow. И я ему говорю: "Значит, выполняй итерацию один из и ссылаясь на файл Task Taskist. Поехали. Значит, что будет? Он планирует свою работу, он делает себе to do list, а, работать по своему туду. Вот он пишет все инструменты, которые он использует. Он прочитал, читает какие-то файлы, выполняет список, ну, листинг как бы файлов в папке и пошёл. Вот он создаёт файлы, папки, базовый системный промт. Можно посмотреть, что он там написал. Вот он написал промт, который будет передаваться модели. То есть модель будет знать, что она ассистент компании с такими-то услугами, что модель должна делать и примеры ответов.

[музыка]

Так, он уже сделал исходники. Bot, lm lmpй, э, функция для работы с LLM, собственно говоря, добавляет команды, проверяет. То есть он делает, он имеет статический анализ. То есть делает makeфайл. Так, тут он меня спрашивает. Вот при выполнении команд я не разрешал ему автоматически выполнять и запуская ранды. Так, ну, в общем-то, он написал уже как бы результат, сделал результат. Так, no model memory. Вот самое интересное, да, как бы он встретил ошибку и он начинает её править. Он тестирует импорты. Посмотрим, что у него получится. опять рор. Ну, в общем, как бы не обязательно эту итерацию добивать, да? А смысл как бы, ну, смысл в том, что, ну, чуть попозже скажу, да, но самое важное, да, что он действует итеративно, он встречает ошибки, он обходит эти ошибки, он меняет свои подходы, то есть он действует как живой разработчик. Вот.

О'кей, давайте посмотрим результат. Ближе не надо. Посмотрим результат, собственно говоря, первого проекта. Я запускаю бота. Ага, вроде бы запустился. Так, ээ, привет. Что можете сделать? Не очень быстро, потому что используется бесплатная модель. Угу. Во, собственно, он ответил. А здесь я добавил немножко юморк. Ээ, в принципе, каждый ответ он делает в одном из трёх забавных режимов: драматический, режим злодея и кошачий режим. То есть вот, да, здесь я ему спрошу: "А можете сделать мобильное приложение?" Приложение. Вот. То есть он, получается, он объединяет системный промпт, точнее, не системный промпт, а основную информацию с промтом по какому-то забавному режиму. Всё это становится контекстом модели и как бы порождает такой вот интересный. То есть он выдаёт Ага. Вот кошачий режим. И он говорит, что мяу, я могу разработать мобильное приложение. Вот так.

Значит, давайте дальше пойдём. Мм, а следующий проект - это развитие предыдущего проекта для путешествий. Он уже понимает, может распознавать изображения, голосовые сообщения и работать с БД. Вот все модели подняты на моей машине, соответственно, они уже, ну, как сказать, у меня видеокарта начального уровня, видеокарта начального уровня RTX 360, но кое-какие модели туда влезают, соответственно. И, э, значит, модели у меня используется Dipsic R1, дистилированная модель общего назначения и Vision модель Quen 2.5 VL. Модели подняты в LM Studio. Так, смотрим проект. Вот такой проект получается. Поскольку это развитие мм предыдущего проекта, то здесь а этот проект, в принципе, сделан вот в пять итераций развития, да? То есть на одной итерации добавлена обработка фото, на другой обработка аудио, а база данных и локальные модели. Э, вот, значит, предыдущий проект я остановлю, точнее, этот запущу. Посмотрим, что он может. Так, это у меня теперь помощник для путешествий. Он должен суметь следующее. Я ему говорю: "М, что это такое?" Так, пошёл думать. Напоминаю, модели выполняются на моей машине, соответственно, думи тоже какое-то время. Во, он понял, что здесь на картинке чипсы тортиля с соусами глаукомоля. Замечательно. А он ещё должен понимать голос. Сейчас проверим. А как это готовится? Там распознавание голоса добавлено через Да. То есть распознавание голоса произошло. Модель прочитала, что распознала и ответила мне: "Это чипсы с соусами готовится сторонко нарезанный жареной морков или картофеля".

Третий проект - это агент-помощник компании Вкусный точка. Вот так я сделал. А он сделан на базе готовой тетрадки. То есть у меня была готовая тетрадка с агентом а Jupitter Notук. Кто не знает, это такой такая, можно сказать, среда, да, в которой часто делаются разработки для, э, разрабатываются нейронки или проекты машинного обучения, а теперь вот можно и LLM проекты делать. Вот. А, и проект написано на Landграph - это такая, ну, фреймворк бесплатный, где которой можно делать сложных агентов, агентные системы. И система там представляется в виде графа, да, то есть с узлами, с рёбрами, там, с циклами, всё такое вот. То есть здесь, в принципе, такой простейший граф, когда а модель может обращаться к инструментам. Собственно, почему это именно агент, а не бот, да? Потому что у него есть инструменты, при помощи которых он взаимодействует. Она взаимодействует с внешним миром, условно говоря. Вот она взаимодействует с инструментами, когда закончила взаимодействовать, формирует результат. Значит, там было три инструмента в этой тетрадке. Значит, RAG, то есть retrieval, augmented generation, то есть мы можем какую-то дополнительную инфу дать модели в контекст. В частности, например, э, часто бывает, что это какие-то корпоративная документация, да, то есть набор корпоративных документов, и по ним условно может агент консультировать. Вот. Аэ, фактически, значит, э я для по вкусной точка нашёл, что мог информацию о товарах, услугах, положил в PDFки, они режутся на кусочки, индексируются в специальную векторную базу данных хрома. И у этого агента есть инструмент. Он при подготовке ответа на мой вопрос может сходить в эту базу Хрома, там поискать и подготовить мне ответ по этим данным, в том числе. Также он может искать в интернете. И также аэ я добавил ещё, собственно, моя работа здесь заключалась в том, что я добавил инструмент геопоиска ближайшего ресторана, вкусная точка. То есть я ввожу ему адрес, он, ээ, по API геокодирования, мм, находит координаты этого адреса, потом находит ближайший ресторан по сохранённым данным, закшированным, и мне говорит, что, мо, вам туда. Давайте посмотрим, как это работает.

Так, значит, закрываю, выключаю этот и включаю следующий. Так, здесь это уже, собственно, тот самый Jupiter ноутбук, да, у него такой характерный вид, у него ячейки, в которых код, который выполняется, да, последовательно можно выполнять и под ним, под ячейками результат выполнения кода. Соответственно, совокупность ячеек, да, это как бы есть некий проект запущен, вроде мы проверим, может и запущен. А что посоветуешь съесть? Так, что посоветуешь съесть? Он о чём-то думает. Вот. И он говорит: "Попробуйте классический бургер". То есть у него есть информация о товарах-услугах Вкусная точка, полученный через RAG, да? То есть в PDFках это дело хранится. А я ему скажу: "А с какой рыбой есть бургер? Посмотрим, что он мне ответит. >> Угу. Бургер с рыбой. Филе белой рыбы в хрустящей панировки. Ну да, в общем, о'кей. Хорошо. Ха, какой ближайший ресторан к, не знаю, площадивской площади. Так, вот тут уже должен он воспользоваться инструментом поиска ближайшего ресторана. Посмотрим. Вот он пишет: "Нашёл координаты". Угу. Находится в кирпичном переулке шесть. Возможно, это правда. Ча ча чаще всего это похоже на правду. О'кей. А, значит, что такое, в принципе, инструмент здесь, да? Инструмент - это функция на Python, э, для которой указаны, я постараюсь найти, для которой указаны, м, или не постараюсь для которой указаны описания и ожидаемые аргументы. И это передаётся в модель. И модель может по своему выбору, по своему желанию запустить конкретные инструменты. Вот. То есть инструментов может быть много.

Ну, и наконец, проект 4 - это у меня MCP сервер. Значит, что такое MCP? Это Multi-agent Context Protocol, открытый протокол, разработанный Anthropic. Он, по сути, унифицирует доступ моделей, э, больших языковых моделей к ресурсам сторонним, в частности, источникам данных или каких-то инструментам. Вот. А, значит, и в этом проекте я с нуля по спецификации разработал MCP-сервер, который предоставляет вот ту функцию, да, из предыдущего проекта. Вот. И как я это сделал? Он также разработан по SPC Driving Development, то есть изначально есть идея продукта и так далее, вплоть до тасклиста. Где тасклист? Вот он. То есть за пять итераций он это дело сделал. Я ему сказал: "По сути, а разработай мне MCP-сервер, а по спецификации, которая находится по такой-то ссылке, и сделаем функционал поиска, мм, ресторана. Вот из вот как бы оттуда, да, из того файла. Вот так запустился MCP сервер. То есть что я сделал дальше? Да, дальше я пошёл в LM Studio. Вот зарегистрировал там свой MCP-сервер. Сейчас посмотрим, как это выглядит. То есть вот здесь прописано, что он находится там-то. Вот. И для в модели подключено здесь, что можно конкретную этот MCP функцию использовать. И я ему говорю, то есть это уже локальная модель у меня запущенная. Я говорю, не знаю, э, ближайшие три ресторана хсяной площади. Так вот, он здесь пишет всё. Ага, он написал, что он использовал инструмент search Restaurants, получил результат и дал мне результат, что три ближайших ресторана находятся там. То есть, в принципе, после этого этот MCP сервер можно сделать публичным, да, и предоставлять такую вот такой вот сервис.

Так, ну что ж, что я узнал и понял, в принципе, в процессе обучения и выполнения этих проектов. А узнал, что есть огромная система доступных LLM-моделей. Они доступны, их можно скачать к себе, их можно использовать от конкретного провайдера, можно использовать через ну, короче, агрегаторы и так далее. Вот. И в том числе, как бы, да, даже на моей начального уровня видеокарте может работать что-то вполне осмысленное. Вот важное отличие, которое есть и агента от чатбота всех нам известного, что агент он активно принимает решения, выполняет действия, обходит ошибки для достижения цели, да? То есть он действует итеративно и использует разные инструменты, как бы это важно. И что для меня было важно, интересно, что workflow разработки у него такой же, как у человека, да? То есть у него нет готового решения сразу, у него есть некая начальная версия, да, которую он пробует. Вот. И точно так же, как человек в конкретных условиях он сталкивается с ошибками и их исправляет. И я так понимаю, что путь к разработке серьёзных проектов таким подходом с агентами через грамотную постановку задач и документирование довольно-таки всеобъемлющее, в том числе с пользованием опять же агентов.

Что планирую делать дальше? Э мне ещё предстоит полноценно как бы освоить эту методику. для рабочих проектов. Вот я понимаю, что, видимо, мм для того, чтобы это работало, нужна универсальная документация по проекту. Я имею в виду, что не не завязана на какого-то конкретного агента и, может быть, даже не для агента, для людей, да, которые могут её читать. И тут я написал, э, про метапроект. Вот я так назвал, наверное, совокупность всех исходников, документации, баз данных, которые разработчик использовал бы для разработки, да, соответственно, агенты, которые мне будут помогать, они, в принципе, тоже должны иметь доступ ко всем этим ресурсам, да, для того, чтобы осмысленно решать комплексные задачи. Вот. Э, в принципе, всё. Мне будет интересно посмотреть очень следующий доклад Станислава, потому что, я так понимаю, у него более продвинутый уровень владения инструментами. Собственно говоря, то, к чему я тоже хочу прийти. Спасибо. А готов ответить на вопросы. Только вопрос, где мне где мне их посмотреть?

Обучение, да, про которое я говорил, да, это в моём случае это был двухнедельный курс, интенсивный курс, ээ, вот этот вот по курсору. Это было интересно. Крайне, конечно, там было в 100-1 100.000 раз больше информации, чем я сейчас мог как бы вам тоже рассказать. Вот. Ну и как бы рекомендую надо делать домашнее задание. Готовьтесь к тому, что надо будет работать плотно над домашними заданиями, если туда пойдёте. Иначе это не очень правильно. Как записаться? Да поищите lmста. Вот я думаю, там будет >> Дада. Да, там будет лендинг, собственно говоря. Там сразу сразу этот сразу этого ещё не видно. >> Так, вот есть вопрос. Правила какие-то для курсора прописывал? Да, безусловно, даже их показывал. Могу сейчас ещё раз показать. Секунду. Угу. >> Вот это правило, да? То есть здесь правила разработки кода, вот, ээ, стиль, структура, работа с данными и так далее. И правила работы, выполнения работ, да, то есть итерации и что в итерации должно стоять, из каких этапов. Будет ли ссылка на исходный код? А-а, если надо, сделаю. Мне надо будет докоммитить, в принципе, без вопросов. >> Угу. Ну тогда мы, наверное, под видео, когда отдельно выложим, там в комментарии добавим ссылку на исходный код. >> Угу, я запишу. Ссылка на исходный код. >> Так, следующий вопрос. Правила пишут своими руками или можно также сгенерировать с помощью И >> Да, безусловно. Смотрите, вся эта документация, включая правила, она сгенерирована, да? То есть сравнительно небольшие промпты нужны, чтобы сгенерировать эту документацию, условно, то есть вот всё, что написано, допустим, в conventions, да, будет, наверное, там пять строк, например, да, запроса к модели. >> Угу. Ну, то есть можно в тандеме, да, писать что-то и что-то само поправить. >> Безусловно, безусловно, да. Здесь, то есть, здесь всё можно поправить. Спасибо. >> Большое спасибо. Да, >> спасибо.