Transcription
Добро пожаловать в видео, в создание которого я вложил больше всего усилий на своём канале на сегодняшний день. Это мастер-класс по локальному ИИ, и мы погрузимся во всё, что вам нужно знать о локальном ИИ. Что это такое, почему это так важно для вас, независимо от того, что вы создаёте с помощью ИИ. Как вы можете запускать собственные большие языковые модели и самостоятельно размещать собственную инфраструктуру. Как вы можете создавать 100% приватных и автономных агентов ИИ и развёртывать их в облаке безопасным способом. У меня есть всё, что вам нужно, чтобы начать, даже если вы раньше ничего не делали с локальным ИИ, и я затрону довольно много тем. Для вас здесь собрано много ценной информации. Итак, пристегнитесь, наслаждайтесь поездкой и следите за ходом событий.
Итак, первое дело, начнём с повестки дня мастер-класса. Столько всего, чем я не могу дождаться, чтобы поделиться с вами. И у меня есть очень подробные главы для этого видео на YouTube, поэтому вы можете легко перемещаться между всем, что я вам покажу. Я просто хочу максимально упростить вам получение именно того, что вы хотите от этого мастер-класса. Ни больше, ни меньше. Мы начнём с того, что погрузимся в вопрос, что такое локальный ИИ, и у меня есть быстрая демонстрация, чтобы сделать это очень, очень практичным.
А затем, с этим, мы перейдём к вопросу «почему». Почему локальный ИИ? Почему вы должны заботиться об этом? Почему я так твёрдо верю, что это будущее ИИ? Я расскажу обо всех своих рассуждениях по этому поводу. А затем мы перейдём к требованиям к оборудованию, потому что эти локальные БЯМ — это монстры, и вам необходимо иметь определённое оборудование, чтобы иметь возможность их запускать. Поэтому я расскажу обо всём этом на основе различных больших языковых моделей и некоторых альтернатив. Затем мы перейдём ко всем сложным вещам. Есть несколько моментов, которые обычно довольно пугают людей. Поэтому я хочу сломать эти барьеры, чтобы вы чувствовали себя очень уверенно, работая со своими собственными локальными БЯМ и инфраструктурой.
А затем, с этим, мы перейдём к тому, как вы можете использовать локальный ИИ где угодно. Потому что Olama и другие решения для запуска собственных больших языковых моделей совместимы с API OpenAI. Я объясню, что это значит, когда мы дойдём до этого момента. Но в основном, любые агенты, которые вы уже запустили с помощью Python или N8N, всё равно. Если вы используете OpenAI или Gemini или Anthropic, вы можете очень легко заменить их на использование локального ИИ. Таким образом, вы можете превратить свои существующие агенты в те, которые на 100% автономны, бесплатны и приватны.
А затем, с этим, мы перейдём к пакету локального ИИ. Это набор сервисов, которые я для вас подготовил, чтобы запустить всю вашу локальную инфраструктуру ИИ, такую как ваш пользовательский интерфейс, ваша база данных, ваши большие языковые модели и многое другое. Здесь мы действительно начинаем создавать нашу полную инфраструктуру. Я проведу вас через настройку пакета локального ИИ, углубившись в мельчайшие детали, чтобы убедиться, что у вас всё настроено на этом этапе.
А затем, как только мы это настроим, мы можем перейти к созданию полностью локального агента ИИ с помощью N8N. А затем мы переведём того же агента в Python. Так что вы увидите, как только мы настроим пакет локального ИИ, как вы можете создать 100% автономного и приватного агента как без кода, так и с кодом. А затем мы возьмём этих агентов и развернём их в облаке, в частности, на платформе Digital Ocean. Но я проведу вас через процесс, который вы можете использовать независимо от используемого вами облачного провайдера. И мы развернём всё очень безопасным способом как для пакета, так и для нашей инфраструктуры, и для самого агента ИИ.
И наконец, я хочу закончить некоторыми дополнительными ресурсами, чтобы убедиться, что у вас есть всё необходимое, чтобы продолжить этот мастер-класс и действительно использовать его для создания любого агента ИИ, который вы только можете пожелать, на 100% локально. А также, если вы заинтересованы в освоении не только локального ИИ, но и создании целых агентов ИИ в локальной среде ИИ или даже с облачным ИИ, обязательно ознакомьтесь с dynamis.ai. Это моё сообщество для ранних пользователей ИИ, таких же, как вы. И большая часть этого сообщества — это курс по освоению агентов ИИ, где я очень глубоко погружаюсь в свой полный процесс создания агентов ИИ. Я говорю о планировании и создании прототипов, и кодировании, и использовании помощи в кодировании ИИ, и создании полных интерфейсов для наших агентов ИИ, и обеспечении безопасности, и развёртывании. В этом курсе тоже скоро появится много нового. Я очень активно работаю над ним. И большая часть этого курса — это полный агент, который я создаю на протяжении всего курса. Я создаю его как с облачным ИИ, так и с локальным ИИ. И этот мастер-класс поможет вам стать очень, очень комфортно работать с локальным ИИ. Но когда дело доходит до создания сложных агентов и действительно глубокого погружения в создание агентов, то вам определённо стоит ознакомиться с курсом по освоению агентов ИИ здесь, в Dynamis.AI.
Итак, давайте вернёмся к мастер-классу, погрузившись в то, что такое локальный ИИ. Начнём с закладки фундамента. Что такое локальный ИИ в первую очередь? Ну, очень просто говоря, локальный ИИ — это запуск ваших собственных больших языковых моделей и инфраструктуры, таких как ваша база данных и ваш пользовательский интерфейс, полностью на вашей собственной машине, на 100% автономно.
Итак, когда вы думаете о том, когда вы обычно хотите создать агента ИИ, вам нужна большая языковая модель, возможно, такая как GPT-4.1 или Claude 4, а затем вам нужно что-то вроде вашей базы данных, например, Superbase, и вам нужен способ создать пользовательский интерфейс. У вас есть все эти разные компоненты для вашего агента, и обычно вы используете API для доступа к вещам, которые размещаются от вашего имени. Но с локальным ИИ мы можем взять все эти вещи под свой полный контроль, управляя ими сами. Это возможно благодаря моделям больших языковых моделей и программному обеспечению с открытым исходным кодом. Таким образом, всё работает на вашем собственном оборудовании, вместо того, чтобы платить за API. Таким образом, мы сами запускаем большую языковую модель на своей собственной машине, вместо того, чтобы платить, например, за API OpenAI.
И так, для больших языковых моделей существуют тысячи различных больших языковых моделей с открытым исходным кодом, которые доступны для нас для использования множеством различных способов. И о некоторых из них вы, вероятно, слышали раньше, например, DeepSeek R1, Quen 3, Mistral 3.1, Llama 4. Это лишь несколько примеров самых популярных из тех, о которых вы, вероятно, слышали раньше. Мы будем возиться с использованием некоторых из них в этом мастер-классе. А затем у нас также есть программное обеспечение с открытым исходным кодом. Таким образом, вся наша инфраструктура, которая идёт вместе с нашими агентами и БЯМ, такие вещи, как Olama для запуска наших БЯМ, Superbase для нашей базы данных, N8N для наших автоматизаций рабочих процессов без кода/с низким кодом и open web UI для приятного пользовательского интерфейса для общения с нашими агентами и БЯМ. И мы также углубимся в использование всех этих инструментов.
Теперь, поскольку локальный ИИ означает запуск больших языковых моделей на нашем собственном компьютере, это не так просто, как просто зайти на claw.ai или chatgbt.com и ввести запрос. Нам нужно фактически что-то установить, но начать всё ещё очень легко. Итак, позвольте мне показать вам прямо сейчас на практическом примере.
Итак, мы находимся на веб-сайте Olama. Это just.com. Я оставлю ссылку на него в описании видео. Это одна из платформ с открытым исходным кодом, которая позволяет нам очень легко загружать и запускать локальные большие языковые модели. Итак, вам просто нужно перейти на их домашнюю страницу и нажать на эту большую кнопку загрузки. Вы можете установить её для Windows, Mac или Linux. Она действительно работает для любой операционной системы. Затем, как только вы запустите её на своей машине, вы можете открыть любой терминал. Например, я работаю в Windows, поэтому я в сеансе PowerShell, и теперь я могу запускать команды Olama, чтобы делать такие вещи, как просмотр моделей, которые у меня есть на моей машине. Я могу загружать модели, и я также могу их запускать. И то, как я знаю, как извлекать и запускать определённые модели, это то, что я могу просто перейти на эту вкладку «модели» в их навигации, и я могу просматривать и фильтровать все модели больших языковых моделей с открытым исходным кодом, которые доступны мне, например, DeepSeek R1. Почти все знакомы с DeepSeek. Он просто взорвался в феврале и марте. У нас есть Gemma 3, Quen 3, Llama 4, несколько из тех, которые я упоминал ранее, когда у нас была презентация. Итак, мы можем перейти к любой из них, например, я могу перейти к DeepSeek R1, и затем у меня есть команда прямо здесь, которую я могу скопировать, чтобы загрузить и запустить эту конкретную модель в моём терминале. И существует множество различных вариантов модели DeepSeek R1. Поэтому мы немного поговорим о различных размерах и требованиях к оборудованию и о том, что всё это значит, но я просто возьму один из них и запущу его в качестве примера. Итак, прямо сейчас я возьму очень маленький. Я возьму большую языковую модель с 1,5 миллиарда параметров. И ещё раз, я объясню, что это значит немного позже. Я могу скопировать эту команду. Это просто lama run, а затем уникальный ID этой большой языковой модели. Итак, я вернусь в свой терминал. Я очищу его здесь, а затем вставлю эту команду. Итак, сначала ему придётся извлечь эту большую языковую модель. И общий размер для этого составляет 1,1 ГБ. Итак, ему придётся загрузить её. А поскольку я использовал команду run, она немедленно переведёт меня в интерфейс чата с моделью, как только она будет загружена. Также, если вы не хотите запускать её прямо сейчас, вы просто хотите установить её, вы можете сделать Olama pull вместо Olama run. А затем, опять же, чтобы просмотреть модели, которые у вас уже установлены, вы можете просто использовать команду Olama list, как я делал раньше. Итак, прямо сейчас я сделаю паузу и вернусь, как только она будет установлена, примерно через 30 секунд.
Хорошо, она теперь установлена. И теперь я могу просто отправить сообщение, например, привет. И вуаля, мы теперь общаемся с большой языковой моделью. Но вместо того, чтобы она размещалась где-то ещё, и мы просто используем веб-сайт, это работает на моей собственной инфраструктуре, большая языковая модель и все миллиарды параметров загружаются на мою видеокарту и выполняют вывод. Это называется, когда мы генерируем ответ от БЯМ непосредственно в этом терминале. Итак, я могу задать другой вопрос, например, какая сейчас лучшая видеокарта? Посмотрим, что она скажет. Итак, она сначала думает. Это на самом деле модель, которая думает. Deepseek R1 — это БЯМ с рассуждениями. А затем она даёт нам ответ. Это лучшие модели видеокарт на сегодняшний день. 3080 RX6700. Очевидно, у нас есть отсечка обучения для локальных больших языковых моделей, как и у облачных, таких как GPT. И поэтому информация здесь немного устарела, но да, это хороший ответ. Итак, у нас есть большая языковая модель, с которой мы общаемся напрямую на нашей машине. А затем, чтобы закрыть это, я могу просто нажать Ctrl+D или Cmd+D на Mac. И если я сделаю list, у нас есть все другие модели, которые вы видели ранее, плюс теперь та, которую я только что установил. Итак, все они доступны для меня для повторного запуска просто с помощью команды Olama run. И ей не нужно будет переустанавливаться, если она у вас уже установлена. Run просто устанавливает её, если её у вас ещё нет. Итак, это просто быстрая демонстрация использования Olama. Мы гораздо глубже погрузимся в Olama позже, например, как мы можем фактически использовать её в нашем коде Python и в наших рабочих процессах N8N. Это просто наш быстрый способ попробовать её в терминале.
Теперь, чтобы действительно перейти к вопросу о том, почему мы должны заботиться о локальном ИИ, теперь, когда мы знаем, что это такое, я хочу рассказать о плюсах и минусах локального ИИ и того, что я называю облачным ИИ. Это просто когда вы платите за то, чтобы вещи размещались для вас, например, используя Claude или Gemini или используя облачную версию N8N вместо того, чтобы размещать её самостоятельно. И я также хочу рассказать о преимуществах каждого из них, потому что я не хочу приукрашивать вещи и просто расхваливать этот мастер-класс, говоря вам, что вы всегда должны использовать локальный ИИ. Это, безусловно, не так. Есть время и место для обеих этих категорий, но есть так много вариантов использования, где локальный ИИ абсолютно необходим. Вы не представляете, со сколькими компаниями я разговаривал, которые готовы потратить десятки тысяч долларов на запуск собственных БЯМ и инфраструктуры, потому что конфиденциальность и безопасность так важны для того, что они создают с помощью ИИ.
И это на самом деле переходит к первому преимуществу локального ИИ, которым является конфиденциальность и безопасность. Вы можете запускать всё на 100% автономно. Данные, которые вы предоставляете своим БЯМ в виде запросов, теперь не покидают ваше оборудование. Они остаются полностью под вашим контролем. И для многих компаний это на 100% важно, особенно когда они работают в строго регулируемых отраслях, таких как здравоохранение, финансы, даже недвижимость. Есть так много вариантов использования, когда вы работаете с интеллектуальной собственностью или просто действительно конфиденциальной информацией. Вы не хотите отправлять свои данные поставщику БЯМ, такому как Google или OpenAI или Anthropic. И поэтому, как владелец бизнеса, вы определённо должны обращать на это внимание, если вы работаете со случаями использования автоматизации, где вы имеете дело с любыми конфиденциальными данными. А также, если вы фрилансер, вы создаёте агентство по автоматизации ИИ, всё, где вы создаёте для других компаний, у вас откроется так много возможностей, когда вы сможете работать с локальным ИИ, потому что вы теперь можете обрабатывать те варианты использования, когда им нужно работать с конфиденциальными данными, и вы не можете просто использовать API OpenAI. И это главное преимущество локального ИИ. Это очень важно. Но есть и несколько других моментов, на которые стоит обратить внимание. Начиная с тонкой настройки модели, вы можете взять любую большую языковую модель с открытым исходным кодом и добавить дополнительное обучение поверх неё с вашими собственными данными. По сути, сделав её экспертом в вашей области бизнеса или в той проблеме, которую вы решаете. Это так, так мощно. Вы можете сделать модели с помощью тонкой настройки более мощными, чем лучшие из лучших в облаке, в зависимости от того, что вы можете настроить, в зависимости от имеющихся у вас данных. И вы можете выполнять тонкую настройку с некоторыми облачными моделями, например, с GPT, но ваши возможности довольно ограничены, и это может быть довольно дорого. И поэтому это определённо огромное преимущество локального ИИ.
И локальный ИИ в целом может быть очень экономичным, включая инфраструктуру. Таким образом, ваши БЯМ и ваша инфраструктура. Вы управляете всем сами, и вы ни за что не платите, кроме счета за электроэнергию, если он работает на вашем компьютере у вас дома, или если у вас есть какой-то частный сервер в облаке. Вам просто нужно платить за этот сервер, и всё. Нет счета за N8N, нет счета за Superbase, нет счета за OpenAI. Вы можете сэкономить много денег. Это действительно, действительно здорово. И вдобавок ко всему, когда всё работает на вашей собственной инфраструктуре, агенты, которые вы создаёте, могут работать на том же сервере, в том же месте, что и ваша инфраструктура. И поэтому это может быть даже быстрее, потому что у вас нет сетевых задержек при вызове API для всех ваших различных сервисов для ваших БЯМ и вашей базы данных и тому подобного.
А затем, с этим, мы можем теперь перейти к преимуществам облачного ИИ. Начиная с того, что его гораздо проще настроить. Есть причина, по которой мне нужно провести для вас этот мастер-класс. Есть некоторые первоначальные препятствия, которые нам нужно преодолеть, чтобы действительно полностью настроить всё для наших локальных БЯМ и инфраструктуры. И у вас просто этого нет с облачным ИИ, потому что вы можете очень просто обращаться к этим API. Вам просто нужно зарегистрироваться и получить ключ API, и всё. Итак, начать работу, безусловно, проще, и в целом требуется меньше обслуживания, потому что они размещают всё для вас. Superbase размещает базу данных для вас. OpenAI размещает БЯМ для вас. Поэтому вам не нужно управлять всем на своём собственном оборудовании. С локальным ИИ вам нужно применять исправления и обновления, если у вас есть частный сервер в облаке. Вам нужно управлять своим собственным оборудованием, если вы работаете на своём собственном компьютере, убеждаясь, что оно работает круглосуточно, если вы хотите, чтобы ваша база данных работала круглосуточно, и тому подобное. С облачным ИИ требуется меньше обслуживания.
А затем, наверное, самое большое преимущество облачного ИИ в целом заключается в том, что у вас есть лучшие модели, доступные вам. Claude 4, Sonnet или Opus, например, мощнее любого локального ИИ, который вы могли бы запустить. Итак, у нас есть этот разрыв, и этот разрыв был намного больше в какой-то момент, даже год назад. Лучшие локальные БЯМ абсолютно разгромили лучшие локальные БЯМ, и этот разрыв начинает сокращаться. И поэтому я действительно вижу будущее, в котором этот разрыв полностью исчезнет, и все лучшие локальные БЯМ будут фактически наравне с лучшими облачными. Это будущее, которое я вижу. Вот почему я думаю, что облако… почему я думаю, что локальный ИИ — это такое большое дело, потому что преимущества локального ИИ будут становиться всё более распространёнными с течением времени, когда компании поймут, что им действительно нужны приватные и безопасные решения. А преимущества облачного ИИ, я думаю, со временем будут уменьшаться. Это ключ. Минимальная настройка, меньшее обслуживание. Ну, эти преимущества исчезнут, поскольку у нас будут платформы и лучшие инструкции и решения для упрощения настройки и обслуживания локального ИИ, и у нас будет разрыв, который продолжает уменьшаться между мощностью этих БЯМ. Все эти преимущества фактически исчезнут, и тогда будет совершенно логично использовать локальный ИИ, честно говоря, наверное, для каждого решения в будущем. Именно к этому, я считаю, мы и движемся.
А затем последнее преимущество облачного ИИ, которое, я также думаю, со временем исчезнет, заключается в том, что у вас есть некоторые функции «из коробки», например, у вас есть память, которая встроена непосредственно в ChatGPT. Gemini имеет встроенный веб-поиск, даже когда вы используете его через API, например, такие возможности «из коробки», которые вам нужно реализовывать самостоятельно с локальным ИИ, возможно, как инструменты для вашего агента, и вы определённо можете это сделать, но приятно, что эти вещи «из коробки» для облачного ИИ.
Итак, это плюсы и минусы обоих вариантов. Я надеюсь, что это сделает для вас очень ясным выбор прямо сейчас для вашего собственного варианта использования. Должен ли я внедрить локальный ИИ или облачный ИИ? Многое зависит от требований к безопасности и конфиденциальности для вашего варианта использования.
Теперь, следующая важная вещь, о которой нам нужно поговорить для локального ИИ, — это требования к оборудованию. Потому что вот в чём дело, большие языковые модели очень ресурсоёмки. Вы не можете просто запустить любую БЯМ на любом компьютере. И причина этого в том, что большие языковые модели состоят из миллиардов или даже триллионов чисел, называемых параметрами. И все они связаны между собой в сети, которая выглядит примерно так. Это очень упрощённое представление с лишь несколькими параметрами. Но каждый из параметров — это узлы, и они связаны между собой. Входной слой — это то место, куда поступает наш запрос, и наш запрос подаётся через все эти скрытые слои, а затем у нас есть выход в конце. Это ответ, который мы получаем от БЯМ. Но, как я уже сказал, это очень упрощённое представление. GPT-4, например, как вы можете видеть справа, по оценкам, имеет 1,4 триллиона параметров. И поэтому, если вы хотите поместить всю большую языковую модель на свою видеокарту, вам нужно сохранить все эти числа. И хотя мы можем обрабатывать гигабайты за раз на своих видеокартах с помощью так называемой VRAM, хранение миллиардов или триллионов чисел — это абсолютно безумие. И поэтому для больших языковых моделей вам на самом деле нужна довольно хорошая видеокарта, если вы хотите запустить некоторые из лучших.
Итак, глядя на Olama, когда мы видим эти разные размеры, возвращаясь к их списку моделей, например, 1,5 миллиарда параметров или 27 миллиардов параметров, существуют разные размеры для локальных БЯМ. Очевидно, чем больше локальная БЯМ, которую вы запускаете, тем больше производительности вы получите, но вы будете ограничены тем, что вы можете запустить на своей видеокарте или своём оборудовании. Итак, имея это в виду, я теперь хочу углубиться в мельчайшие детали с вами, чтобы вы точно знали, какие модели вы можете запустить, какую скорость вы можете ожидать в зависимости от вашего оборудования. И если вы хотите инвестировать в новое оборудование для запуска локального ИИ, у меня также есть некоторые рекомендации.
Итак, в целом существует четыре основных диапазона размеров для больших языковых моделей в зависимости от скорости и мощности, которые вы ищете. У вас есть модели, которые имеют около семи или восьми миллиардов параметров. Это, как правило, самые маленькие, которые я рекомендую попробовать запустить. Существует множество меньших БЯМ, таких как 1 миллиард параметров или 3 миллиарда параметров, но я так разочарован, когда использую эти БЯМ…
That I don't really want to focus on them here. 7 billion parameters is still tiny compared to the large cloud AI models like Claude or GBT, but you can get pretty good results with them for just simple chat use cases.
And so for these models, assuming a Q4 quantization, which I'll get into quantization in a little bit, it's basically just a way to make the LLM a lot smaller without hurting performance that much; a 7 billion parameter model will need about four to 5 GB of VRAM on your graphics card. And so if you have something like a 3060 Ti from Nvidia with 8 GB of VRAM, you can very comfortably run a 7 billion parameter model, and you can expect to get very roughly around 25 to 35 tokens per second. A token is roughly equivalent to a word. And so your local large language model at 7 billion parameters with this graphics card will get about 25 to 35 words per second out on the screen to you, being streamed out. And then if you use much more powerful hardware like a 3090 to run a 7 billion parameter model, then you'll just jack up the speed a lot more.
So that's 7 billion or 8 billion parameters. Another very common size is something around 14 billion parameters. This will take about 8 to 10 GB of VRAM. And so just a couple of options for this: you have the 4070 Ti, which is usually 16 GB of VRAM, or you could go as low as 12 GB of VRAM with the 3080 Ti. And you could expect to get about 15 to 25 words per second.
And then this is where you start to get into basic tool calling. So I find that when you are building with a 7 billion parameter model, they don't do tool calling very well. So you can't really build that powerful of agents around a 7 billion parameter model. But once you get to something around 14 billion parameters, that's when I see agents being able to really accept instructions well around tools and system prompts and leveraging tools to do things on our behalf. That's when we can really start to use LLMs to make things that are agentic.
And then the next big category of LLMs is somewhere between 30 and 34 billion parameters. You see a lot of LLM that fall in that size range. This will typically need 16 to 20 GB of VRAM. And so a 3090 is a really good example of a graphics card that can run this; it has 24 GB of VRAM. I actually have two 3090s myself. And I'll have a link to my exact PC that I built for running local AI in the description of this video. So I have two 3090s, which we'll need in a second for a 70 billion parameter, but one is enough for a 32 billion parameter model. And then also Macs with their new M4 chips are very powerful with their unified memory architecture. So if you get a Mac M4 Pro with 24 GB of unified memory, you can also run 32 billion parameter models. Now the speed isn't going to be the best necessarily, and again, this does depend a lot on your computer overall, but you can expect something around 10 to 15, maybe up to 20 tokens per second.
And 32 billion parameters is when you really start to see LLMs that are actually pretty impressive. Like 7 billion and 14 billion, they are disappointing quite a bit. I'll be totally honest, especially when you try to use them with more complicated agentic tasks. 32 billion, when you start to get into this range, is when I, I'm actually genuinely impressed. I'm like, "Oh, this is actually pretty close to the performance of some of the best cloud AI."
And then 70 billion parameters. This is going to take about 35 to 40 GB of VRAM for most consumer GPUs like 3090s and 4090s, even 5090s. It's not actually enough VRAM. And so this is when you have to start to split a large language model across multiple GPUs, which solutions like Olama will actually help you do this right out of the box. So it's not this insane setup, even though it might feel kind of daunting like, "Oh, I have to split the layers of my LLM between GPUs." It's not actually that complicated. And so 2 3090s, 2 4090s, that will be necessary, um, or you could have more of like an enterprise-grade GPU like an H100. So Nvidia has a lot of these non-consumer-grade GPUs that have a lot more VRAM to handle things like 70 billion parameter models. And the speed won't be the best if you're using something like 2 3090s, especially because performance is hurt when you have to split an LM between GPUs. You could expect something like 8 to 12 tokens per second. And this is obviously if you have the most complex agents that you're really trying to match the performance of cloud AI as much as possible; that's when you'd want to use a 70 billion parameter model.
And then if you're investing in hardware to run local AI, I have a couple of quick recommendations here. And a lot of this depends on the size of the model that's going to be good enough for your use case. And so I'll dive into some alternatives for running local AI directly if you want to do testing before you buy infrastructure. I'll get into that in a little bit, but recommended builds: if you want to spend around $800 to build a PC, I'd recommend getting a 4060 Ti graphics card and then 32 GB of RAM. If you want to spend $2,000, I'd recommend either getting a PC with a 3090 and 64 GB of RAM or getting that Mac M4 Pro with 24 GB of unified memory. And then lastly, if you want to spend $4,000, which is about what I spent for my PC, then I'd recommend getting two 3090 graphics cards, and I got both of mine used for around $700 each, um, and then also getting 128 GB of RAM, or you can get a Mac M4 Max with 64 GB of unified memory.
So, I wanted to really get into the nitty-gritty details there. So, I know I spent a good amount of time diving into super specific numbers, but I hope this is really helpful for you. No matter the large language model or your hardware, you now know generally where you're at for what you can run.
So, to go along with that information overload, I want to give you some specifics, individual LLMs that you can try right now based on the size range that you know will work for your hardware. So, just a couple of recommendations here. The first one that I want to focus on is Deepseek R1. This is the most popular local LLM ever. It completely blew up a few months ago. And the best part about DeepSeek R1 is they have an option that fits into each of the size ranges that I just covered in that chart. So they have a 7 billion parameter, 14, 32, and 70; the exact numbers that I mentioned earlier. And then there is also the full real version of R1, which is 671 billion parameters. I'm sorry though, you probably don't have the hardware to run that unless you're spending tens of thousands on your infrastructure. So, probably stick with one of these based on your graphics card or if you have a Mac computer, pick the one that'll work for you and just try it out. You can click on any one of these sizes here. And then here's your command to download and run it. And this is defaulting to a Q4 quantization, which is what I was assuming in the chart earlier. And again, I will cover what that actually means in a little bit here.
The other one that I want to focus on here is Quen 3. This is a lot newer. Quen 3 is so good. And they don't have a 70 billion parameter option, but they do have all the other um sizes that fit into those ranges that I mentioned earlier. Like they got 8 billion, 14 billion, and 32 billion parameters. And the same kind of deal where you click on the size that you want, and you've got your command to install it here. And this is a reasoning LLM just like DeepSeek R1.
And then the other one that I want to mention here is Mistral Small. I've had really good results with this as well. There are less options here, but you've got 22 or 24 billion parameters, which is going to work well with a 3090 graphics card or if you have a Mac M4 Pro with 24 GB of unified memory. Really, really good model. And then also, there is a version of it that is fine-tuned for coding specifically called Devstrol, which is another really cool LLM worth checking out as well if you have the hardware to run it.
So, that is everything for just general recommendations for local LLMs to try right now. This is the part of the master class that is going to become outdated the fastest because there are new local LLMs coming out every single month. I don't really know how long my recommendations will last for. But in general, you can just go to the model list in Olama, search for the ones, find one that has the size that works with your graphics card and just give it a shot. You can install it and run it very easily with Olama.
And the other thing that I want to mention here is you don't always have to run open-source large language models yourself. You can use a platform like Open Router. You can just go to openrouter.ai, sign up, add in some API credits. You can try these open-source LLMs yourself. Maybe if you want to see what's powerful enough for your agents before you invest in hardware to actually run them yourself. And so within Open Router, I can just search for Quen here. And I can go down to Quen and I can go to 32 billion. They have a free offering as well that doesn't have the best rate limits. So I'll just go to this one right here, Quen 3 32B. So I can try the model out through Open Router; they actually host it for me. So it's an open-source non-local version, but now I can try it in my agents to see if this is good. And then if it's good, it's like, okay, now I want to buy a 3090 graphics card so that I can install it directly through um Olama instead. And so the 32 billion Quen 3 is exactly what we're seeing here in Open Router. And there are other platforms like Grock as well where you can run these open-source large language models um not on your own infrastructure if you just want to do some testing beforehand or whatever that might be. So I wanted to call that out as an alternative as well.
But yeah, that's everything for my general recommendations for LLMs to try and use in your agents. All right, it is time to take a quick breather. This is everything that we've covered already in our master class: What is local AI? Why we care about it? Why it's the future and hardware requirements. And I really wanted to dive deep into this stuff because it sets the stage for everything that we do when we actually build agents and deploy our infrastructure.
And so the last thing that I want to do with you before we really start to get into building agents and setting up our package is I want to talk about some of the tricky stuff that is usually pretty daunting for anyone getting into local AI. I'm talking things like offloading models, quantization, environment variables to handle things like uh flash attention, all the stuff that is really important that I want to break down simply for you so you can feel confident that you have everything set up right, that you know what goes into using local LLMs.
The first big concept to focus on here is quantization. And this is crucial. It's how we can make large language models a lot smaller so they can fit on our GPUs without hurting performance too much. We are lowering the model precision here. And so what basically what that means is we have each of our parameters, all of our numbers for our LLMs that are 16 bits with the full size, but we can lower the precision of each of those parameters to 8, 4, or 2 bits. Don't worry if you don't understand the technicalities of that. Basically, it comes down to LLMs are just billions of numbers; that's the parameters that we already covered. And we can make these numbers less precise or smaller without losing much performance. So, we can fit larger LLMs within a GPU that normally wouldn't even be close to running the full-size model. Like with 32 billion parameter LLMs, for example, I was assuming a Q4 quantization like four bit per parameter in that diagram earlier. If you had the full 16-bit parameter for the 32 billion parameter LLM, there's no way it could fit on your Mac or your 3090 GPU, but we can use quantization to make it possible. It's like rounding a number that has a long decimal to something like 10.44 instead of this thing that has like 10 decimal points, but we're doing it for each of the billions of parameters, those numbers that we have.
And so just to give you a visual representation of this, you can also quantize images just like you can quantize LLMs. And so we have our full-scale image on the left-hand side here comparing it to different levels of quantization. We have 16 bit, 8 bit, and 4 bit. And you can see that at first with a 16-bit quantization, it almost looks the same. But then once we go down to 4 bit, you can very much see that we have a huge loss in quality for the image. Now with images, it's more extreme than LLMs; when we do an 8-bit or a 4-bit quantization, we don't actually lose that much performance like we lose a lot of quality with images. And so that's why it's so useful for us.
And so I have a table just to kind of describe what this looks like. So FP16, that's the 16-bit precision that all LLMs have as a base. That is the full size. The speed is obviously going to be very slow because the model is a lot bigger, but your quality is perfect compared to what it could be. I mean, obviously that doesn't mean that you're going to get perfect answers all the time. I'm just saying it's it's the 100% results from this LLM. And then going down to a Q8 precision, so it's half the size. The speed is going to be a lot better. And the quality is near-perfect. So it's not like performance is cut in half just because size is. You still have the same number of parameters. Each one is just a bit less precise. And so you're still going to get almost the same results. And then going down to a Q4 4-bit, it's a fourth the size. It's going to be very fast compared to 16 bit. And the quality is still going to be great. Now, these numbers are very vague on purpose. There's not a huge way for me to like qualify exactly the difference, especially because it changes per LLM and your hardware and everything like that. So, I'm just being very general here. And then once you get to Q2, um the size goes down a lot. It's going to be very, very fast, but usually your performance starts to go down quite a bit once you go down to a Q2. And then like the note that I have in the bottom left here, a Q4 quantization is generally the best balance. And so when you are thinking to yourself, which large language model should I run? What size should I use? My rule of thumb is to pick the largest large language model that can work with your hardware with a Q4 quantization. That is why I assumed that in the table earlier. And then also like we saw in Olama earlier, it always defaults to a Q4 quantization because the 16 bit is just so big compared to Q4 that most of the LLMs you couldn't even run yourself. And a Q4 of a 32 billion parameter model is still going to be a lot more powerful than the full 7 billion parameter or 14 billion parameter because you don't actually lose that much performance. So that is quantization.
So just to make this very practical for you, I'm back here in the model list for Quen 3. We have all these models that don't specify a quantization, but we can see that it defaults to Q4 because if I click on any one of them, the quantization right here is a Q4 KM. And don't worry about the KM. That's just a way to group parameters. You have KS, KM, and KL. It's kind of outside of the scope of what really matters for you. The big thing is the Q4, like the actual number here. So Q4 quantization is the default for Quen 3 32B and really any model in Olama. But if we want to see the other quantized variants and we want to run them, you can click on the view all. This is available no matter the LLM that you're seeing in Olama. Now we can scroll through and see all the levels of quantization for each of the parameter sizes for Quen 3. So, if I scroll all the way down, the absolute biggest version of Quen 3 that I can run is the full 16-bit of the 235 billion parameter Quen 3. And it is a whopping 470 GB just to install this. And there is no way that you're ever going to lay hands on infrastructure to run this unless you're working for a very large enterprise. But I can go down here, let's say, to 14 billion parameters, and I can run the Q4 like this. So, you can click on any one that you want to run. Like let's say I want to run Q8. I can click on this, and then I have the command to pull and run this specific quantization of the 14 billion parameter model. So each of the quantized variants they have a unique ID within Olama. So you can very specifically choose the one that you want. Again, my general recommendation is just to go with also what Olama recommends, which is just defaulting to Q4. Like if I go to DeepSec R1, you can see that also defaults to Q4 no matter the size that I pick. But if you do want to explore different quantizations, you want to try to run the absolute full model for maybe something smaller like 7 billion or 14 billion, you can definitely do that through Olama and really any other provider of local LLMs. So that is everything for quantization. It's important to know how that works, but yes, generally stick with a Q4 of the largest LLM that you can run.
The next concept that is very important to understand is offloading. All offloading is is splitting the layers for your large language model between your GPU and your CPU and RAM. It's kind of crazy, but large language models don't have to fit entirely in your GPU. All large language models can be split into layers, layers of the different weights, and you can have some of it running on your GPU. So, it's stored in your VRAM and computed by the GPU. And then some of the large language models stored in your RAM, computed by the CPU. Now, this does hurt performance a lot. And so, generally, you want to avoid offloading if you can. You want to be able to fit everything in your GPU, which by the way, the context, like your prompts for your local LLMs, that is also stored in VRAM. And so, sometimes you'll see what happens when you have very long conversations for a large language model that barely fit in your GPU. That'll actually tip it over the edge. So, it starts to offload some of it to the CPU and RAM. So keep that in mind when you have longer conversations and all of a sudden things get really slow; you know that offloading is happening. Sometimes this is necessary though as context grows. And if you're only offloading a little bit of the LLM or a little bit of the conversation, whatever to the CPU and RAM, it won't affect performance that much. And so sometimes if you're trying to squeeze the biggest size you can into your machine for an LLM, you can take advantage of offloading to run something bigger or have a much larger conversation. Just know that usually it kind of sucks. Like when I have offloading start to happen, my machine gets bogged down, and the responses are a lot slower. It's really not fun, but it is possible. And fun fact, by the way, if your GPU is full and your CPU and RAM is full, you can actually offload to storage, like literally using your hard drive or SSD. That's when it's like incredibly slow and just terrible. But just fun fact, you can actually do that.
Now, the very last thing that I want to cover before we dive into some code, setting up the local AI package, and building out some agents is a few very crucial parameters, environment variables for Olama. So, these are environment variables that you can set on your machine just like any other based on your operating system. And Olama does have an FAQ for setting up some of these things, which I'll link to in the description as well. But yeah, these are a bit more technical, so people skip.
Пару раз я настраивал всё это, но на самом деле очень, очень важно сделать всё максимально эффективно при работе с локальными большими языковыми моделями (LLM). Итак, первая переменная окружения — flash attention. Вы хотите установить её в значение один или true. Когда это значение установлено в true, вычисление attention станет намного эффективнее. Звучит заумно, но в основном большие языковые модели, когда они генерируют ответ, должны вычислять, каким частям вашего запроса уделять больше всего внимания. Это и есть вычисление. И вы можете сделать его намного эффективнее, практически не теряя производительности, настроив flash attention, установив его в true.
Затем, для ещё одной оптимизации, так же как мы можем квантовать сам LLM, вы также можете квантовать или сжимать контекст. Итак, ваш системный запрос, описания инструментов, ваш запрос и история разговора — весь этот контекст, который отправляется в ваш LLM, вы можете квантовать и его. Итак, Q4 — моя общая рекомендация для квантования LLM. Q8 — общая рекомендация для квантования контекстной памяти. Это очень упрощённое объяснение, но оно действительно, действительно полезно, потому что длинный разговор может также занимать много VRAM, как и более крупный LLM. Поэтому его хорошо сжимать.
И затем третья переменная окружения, это, пожалуй, самая важная для настройки Olama. Есть такая странная вещь. Я не знаю, почему Olama так делает, но по умолчанию они ограничивают каждую большую языковую модель лимитом контекста в 2000 токенов, что просто ничтожно мало по сравнению, например, с Gemini, имеющим 1 миллион токенов, и Claude, имеющим 200 000 токенов. Они обрабатывают очень, очень большие запросы. И многие локальные большие языковые модели также могут обрабатывать большие запросы. Но Olama будет ограничивать вас по умолчанию 2000 токенами. И поэтому вам нужно переопределить это самостоятельно с помощью этой переменной окружения. Поэтому я обычно рекомендую начинать примерно с 8000 токенов. Вы можете увеличить это значение до, например, 32 000 токенов, если ваша локальная большая языковая модель это поддерживает. И если вы посмотрите страницу модели на Alama, вы увидите поддерживаемый LLM лимит контекста. Но вы определённо захотите увеличить это значение с 2000, потому что во многих случаях, когда у вас более длинные разговоры, вы очень быстро пройдёте отметку в 2000 токенов. Так что не пропустите это. Если ваша большая языковая модель начинает сходить с рельсов, игнорировать ваш системный запрос и забывать, что у неё есть эти инструменты, которые вы ей дали, это, вероятно, потому что вы достигли предела длины контекста. Так что имейте это в виду. Я вижу, что люди часто пропускают это.
И затем самая последняя переменная окружения, наверное, наименее важная из всех этих четырёх, но если вы запускаете много разных больших языковых моделей одновременно и пытаетесь запихнуть их все в свой GPU, во многих случаях у вас могут возникнуть проблемы. Итак, в Olama вы можете ограничить количество моделей, которые могут находиться в вашей памяти одновременно. В этом случае обычно вы хотите установить это значение равным единице или двум. Обязательно установите это значение равным единице, если вы используете большие языковые модели, которые в основном подходят для вашего GPU, то есть они будут точно помещаться в вашу VRAM, и у вас не будет места для другой большой языковой модели. Но если вы запускаете более мелкие модели, и, возможно, вы действительно можете разместить две на своём GPU с имеющейся у вас VRAM, вы можете установить это значение равным двум. Итак, снова, в целом, более технически сложная настройка, но очень важно правильно настроить эти параметры. И мы перейдём к пакету local AI, где я уже настроил эти параметры в конфигурации.
И, кстати, это FAQ Olama, на который я ссылался минуту назад, ссылку на который я оставлю в описании. Итак, здесь есть много полезной информации, например, проверка совместимости вашего GPU с Olama. Как вы можете определить, загружена ли модель на ваш GPU? Много вещей для проверки, которые они описывают в FAQ. Также обсуждаются переменные окружения, которые я только что рассмотрел. Итак, здесь есть инструкции в зависимости от вашей ОС, как их настроить. Поэтому, если что-то непонятно, это очень хороший ресурс для начала. Поэтому я пытаюсь дать вам возможность более подробно изучить что-то, если что-то не совсем понятно из того, что я объяснил здесь. И, конечно, всегда дайте мне знать в комментариях, если у вас есть какие-либо вопросы по этому поводу, особенно по более техническим моментам, которые я только что рассмотрел, потому что это очень важно, хотя я знаю, что мы действительно хотим углубиться в суть вещей, что мы сейчас и сделаем.
Хорошо, вот всё, что мы рассмотрели на данный момент. И поздравляю, если вы добрались до этого момента, потому что я рассмотрел все сложные моменты с квантованием и требованиями к оборудованию, выгрузкой и некоторыми нашими маленькими параметрами конфигурации. Итак, если вы всё это поняли, остальное будет прогулкой в парке, когда мы начнём погружаться в код, настраивать наш локальный ИИ и создавать агентов. Теперь вы понимаете основы, на которых мы будем строить, чтобы создавать интересные вещи.
Итак, теперь следующее, что мы сделаем, это поговорим о том, как мы можем использовать локальный ИИ где угодно. Мы погрузимся в совместимость с OpenAI, и я покажу вам пример. Мы можем взять то, что сейчас использует OpenAI, и преобразовать это в то, что использует Olama и локальные LLM. Итак, мы действительно погрузимся в некоторый код здесь. И у меня есть и своя доля вещей без кода в этом мастер-классе, но я хочу сосредоточиться на обоих подходах, потому что я считаю, что очень важно использовать как код, так и отсутствие кода, когда это применимо. И это относится к локальному ИИ, так же как и к созданию агентов в целом.
Итак, я уже пару раз обещал, что мы погрузимся в совместимость с API OpenAI, что это такое и почему это так важно. И мы сейчас в это погрузимся, чтобы вы действительно могли начать понимать, как вы можете взять существующих агентов и преобразовать их в полностью локальные с локальными большими языковыми моделями, практически не касаясь кода или вашего рабочего процесса. Это замечательно, потому что OpenAI создала стандарт для предоставления больших языковых моделей через API. Это называется API завершения чата. Это похоже на то, как протокол контекста модели (MCP) является стандартом для подключения агентов к инструментам. API завершения чата — это стандарт для предоставления больших языковых моделей через API. Итак, у вас есть эта общая конечная точка /v1/chat/completions, а также ещё несколько, которые реализуют все эти поставщики. Это способ получить доступ к большой языковой модели, чтобы получить ответ на основе некоторой истории разговора, которую вы передаёте.
Итак, Olama реализует это с февраля. У нас есть и другие поставщики, например, Gemini совместим с OpenAI. Grock — это Open Router, который мы видели ранее. Практически каждый поставщик совместим с API OpenAI. Итак, не только очень легко переключаться между большими языковыми моделями в пределах одного поставщика, но также очень легко переключаться между поставщиками в целом. Вы можете перейти от Gemini к OpenAI или от OpenAI к Olama или от OpenAI к Grock, просто изменив, в основном, один фрагмент конфигурации, указывающий на другой базовый URL, как его называют. Итак, вы можете получить доступ к этому поставщику, а фактическая конечная точка API, к которой вы обращаетесь после подключения к этому конкретному поставщику, всегда точно такая же, и ответ, который вы получаете обратно, тоже всегда точно такой же.
И Olama реализовала это сейчас. И я также размещу ссылку на эту статью в описании, если вы хотите её прочитать, потому что у них есть действительно интересный пример на Python. Он показывает, как мы создаём клиента OpenAI, и единственное, что нам нужно сделать, чтобы подключиться к Olama вместо OpenAI, — это изменить этот базовый URL. Итак, теперь мы указываем на Olama, размещённую локально, а не на URL для OpenAI. Поэтому мы будем обращаться к ним через Интернет и общаться с их LLM. А с Olama вам на самом деле не нужен ключ API, потому что всё работает локально. Поэтому вам просто нужно какое-то заполнительное значение здесь. Но никакой аутентификации не происходит. Вы можете это настроить. Я не буду вдаваться в это прямо сейчас. Но по умолчанию, поскольку всё просто работает локально, вам даже не нужен ключ API для подключения к Olama.
И затем, как только у нас настроен клиент OpenAI, который фактически взаимодействует с Olama, а не с OpenAI, мы можем использовать его точно так же. Но теперь мы можем указать модель, которую мы уже загрузили локально через Olama. Мы передаём нашу историю разговора таким же образом и получаем доступ к ответу, например, к контенту, созданному ИИ, использованию токенов — ко всему тому, что мы получаем обратно из ответа, таким же образом. У них есть и пример на JavaScript. У них есть несколько примеров с использованием различных фреймворков, таких как Vercel AI SDK и Autogen. Практически любая инфраструктура агента ИИ может работать с совместимостью API OpenAI, чтобы очень легко переключаться между этими различными поставщиками, например, Pydantic AI, мой любимый фреймворк агента ИИ, также поддерживает совместимость API OpenAI. Итак, вы можете легко в своих агентах Pydantic AI переключаться между этими различными поставщиками.
И поэтому сейчас у меня есть две кодовые базы, которые я хочу рассмотреть. Первая — это пакет local AI, в который мы немного углубимся. Но прямо сейчас у нас есть все агенты, которые мы будем создавать в этом мастер-классе. Итак, у меня есть пара для N8N, которые также доступны в этом репозитории. И затем ещё пара скриптов, которыми я хочу с вами поделиться. Итак, самое первое, что я хочу вам показать, — это этот простой скрипт, который я назвал OpenAI compatible demo. Итак, вы можете загрузить этот репозиторий. Я также размещу ссылку на него в описании. Здесь есть инструкции по загрузке и настройке всего этого. И это всё на 100% локальный ИИ. Итак, после этого я перейду к своему windsurf, где у меня настроен этот демонстрационный пример совместимости с OpenAI.
Итак, у меня есть комментарий вверху, напоминающий нам, как выглядит совместимость с API OpenAI. Мы устанавливаем наш базовый URL для указания на локально размещённый Olama, и он размещается на порту 11434 по умолчанию. Итак, я могу на самом деле показать вам это. У меня Olama работает в контейнере Docker, в который мы погрузимся, когда настроим пакет local AI, но вы можете видеть, что он предоставляется на порту 11434. И, кстати, вы можете видеть 127.0.0.1 в этом URL, который я выделил здесь, это синоним localhost. Итак, это здесь вы также можете заменить на 127.0.0.1. Просто небольшая деталь. Это не очень важно. Я обычно оставляю его как localhost. И затем вы можете изменить порт. Я просто придерживаюсь значения по умолчанию. И затем, опять же, нам не нужно устанавливать наш ключ API. Мы можем просто установить его в любое значение, которое мы хотим здесь. Нам просто нужен какой-то заполнитель, хотя в случае с Olama реальной аутентификации нет, если вы не настроите её. Итак, это совместимость с OpenAI. И важное значение в этом скрипте — у меня здесь две разные конфигурации. У меня есть одна для взаимодействия с OpenAI, а затем одна для Olama. Итак, для OpenAI мы устанавливаем наш базовый URL для указания на api.openai.com. У нас есть наш ключ API OpenAI, установленный в переменных среды. Итак, вы можете просто установить все свои переменные среды здесь, а затем переименовать это в env. У меня есть инструкции для этого в файле readme, конечно. А затем, возвращаясь к скрипту, мы используем GPT4.1 nano для нашей большой языковой модели. Это что-то супер быстрое и дешёвое. А затем для нашей конфигурации Olama мы устанавливаем базовый URL здесь, localhost:11434 или просто то, что мы установили в наших переменных среды. То же самое для ключа API. И то же самое для нашей большой языковой модели. И то, что я буду использовать в этом случае, это Quen 314B. Это одна из больших языковых моделей, которые я показал вам на веб-сайте Olama. Определённо меньшая по сравнению с тем, что я мог бы запустить, но я просто хочу запустить что-то быстрое. И очень маленькие большие языковые модели отлично подходят для простых задач, таких как суммирование или просто обычный чат. И это то, что я буду использовать здесь просто для простого демонстрационного примера.
И независимо от того, включена она или нет, эта конфигурация основана только на том, что мы установили для наших переменных среды. И важно то, что код, который выполняется для каждой из этих конфигураций, точно такой же, когда мы проходим этот демонстрационный пример. Мы параметризуем конфигурацию для базового URL и ключа API. Итак, мы настраиваем точно такого же клиента OpenAI, как мы видели в статье Olama, но только изменяя базовый URL и ключ API. И поэтому, например, когда мы используем его здесь, это client.chat.completions.create, вызов точно такой же функции, независимо от того, используем ли мы OpenAI или Olama. И затем мы обрабатываем ответ таким же образом. Итак, я сейчас вернусь к своему терминалу. Итак, я уже прошёл все шаги, чтобы настроить свою виртуальную среду, установить все свои зависимости. Итак, теперь я могу выполнить команду OpenAI compatible demo. И теперь он предоставит мне два варианта конфигурации. Итак, я могу выполнить через OpenAI. Итак, давайте сделаем это сначала. И эти два демонстрационных примера будут выглядеть точно так же, но в этом и смысл. Итак, у нас есть наш базовый URL здесь для OpenAI. У нас есть базовый пример завершения с GPT4.1 Nano. Вот. Итак, это модель, которая использовалась. Вот количество токенов. И это наш ответ. И затем я могу нажать Enter, чтобы увидеть теперь и потоковый ответ. Итак, мы видели, как он набирал наш ответ в реальном времени. И затем я могу ещё раз нажать Enter. Это последняя часть демонстрационного примера. Просто скажите многоходовый разговор. Итак, у нас есть пара сообщений здесь в нашей истории разговора. Очень приятно и просто. Суть здесь — теперь показать вам, что я могу запустить это и выбрать Olama теперь, и всё будет выглядеть точно так же, и весь код будет таким же. Изменяется только наша конфигурация. И поэтому это займёт немного времени, когда вы запустите это в первый раз, потому что Olama должна загрузить большую языковую модель на ваш GPU. Итак, переходя к журналам Olama, я могу показать вам, как это выглядит здесь. Итак, когда мы впервые отправляем запрос, когда Quen 314B ещё не загружен на наш GPU, вы увидите, как здесь появляется много журналов, и у вас будет этот контейнер запущен и работает, когда у вас будет пакет local AI, который мы рассмотрим немного позже. Итак, он показывает все метаданные о нашей модели, например, это Quen 314b. Мы видим здесь, что у нас есть квантование Q4 KM, как мы видели на веб-сайте Olama. Какая ещё информация у нас есть здесь? Здесь так много всего, чтобы переварить. А, ещё одна очень важная вещь — у нас есть лимит контекста. Я установил его на 8192, как и рекомендовалось в переменных среды. И затем мы видим, что мы выгрузили все слои на GPU. Итак, мне не нужно выполнять какую-либо выгрузку на ЦП или ОЗУ. Я могу хранить всё на GPU, что, безусловно, идеально, как я уже говорил, чтобы убедиться, что это действительно быстро. И затем, когда мы получаем ответ от quen 314b, мы вызываем конечную точку v1/chat/completions, потому что она совместима с API OpenAI. Итак, та самая конечная точка, к которой мы обращаемся для OpenAI, — это та, к которой мы обращаемся здесь с большой языковой моделью, которая полностью работает на нашем компьютере в Olama. Итак, ответ, который я получаю обратно, это на самом деле и LLM рассуждения. Итак, у нас даже есть токены размышления здесь, что очень круто. Итак, мы получили наш ответ. Он просто выводит первую его часть здесь, чтобы сократить его. И затем я могу нажать Enter. И мы также можем увидеть демонстрацию потоковой передачи. И на этот раз она будет намного быстрее, потому что у нас уже загружена модель на наш GPU. Итак, первый запрос, когда он должен сначала загрузить модель, всегда самый медленный. И затем он работает быстрее в дальнейшем, как только эта модель уже загружена на наш GPU. И затем, пока мы не переключимся на другую большую языковую модель и не используем её, она останется на нашем GPU некоторое время. И затем все наши ответы после этого будут быстрее. И затем у нас просто есть последняя часть нашего демонстрационного примера здесь с многоходовым разговором. Итак, мы можем видеть историю разговора в действии, просто без потоковой передачи здесь. И всё немного медленнее с этой большой языковой моделью, потому что она является моделью рассуждения. И поэтому вы можете, конечно, если хотите более быстрый вывод, всегда использовать нерассуждающую локальную LLM, например, Mistral или Gemini, например. Итак, это наш очень простой демонстрационный пример, показывающий, как это работает. Надеюсь, вы видите это, и опять же, это работает с другими фреймворками агентов ИИ, такими как LangChain или Pydantic AI или LlamaIndex, они все работают таким образом, где вы можете использовать совместимость API OpenAI, чтобы так легко переключаться между поставщиками, поэтому вам не нужно пересоздавать вещи для использования локального ИИ, и это что-то настолько важное, что я хочу сообщить вам, потому что если я тот, кто знакомит вас с локальным ИИ, я также хочу показать вам, как он может очень легко интегрироваться в ваши существующие системы и автоматизацию.
Хорошо. Теперь мы добрались до части мастер-класса по локальному ИИ, которая мне на самом деле нравится больше всего, потому что за последние несколько месяцев я очень много вкладывал свою душу в создание чего-то, чтобы сделать для вас бесконечно проще запустить всё для локального ИИ. И это пакет local AI. Итак, сейчас мы пройдёмся по его установке пошагово. Я не хочу, чтобы вы что-то пропустили здесь, потому что так важно запустить это, заставить всё работать хорошо. Потому что если у вас работает пакет local AI на вашем компьютере и всё работает, вам больше ничего не нужно, чтобы начать создавать агентов ИИ, работающих на 100% в автономном режиме и полностью конфиденциально.
И вот в чём дело. На данном этапе мы в основном сосредоточились на Olama и запуске наших локальных больших языковых моделей. Но есть ещё один компонент локального ИИ, который я представил в начале мастер-класса для нашей инфраструктуры. Вещи, такие как наша база данных и локальный и частный веб-поиск, наш пользовательский интерфейс, мониторинг агентов. У нас есть все эти другие платформы с открытым исходным кодом, которые мы также хотим запускать вместе с нашими большими языковыми моделями, и пакет local AI — это решение, которое объединяет всё это, подобранное для вас, чтобы установить всего за несколько шагов.
Итак, вот репозиторий GitHub для пакета local AI. Я размещу ссылку на него в описании ниже. Для ясности, для этого мастер-класса есть два репозитория GitHub. У нас есть этот, который мы рассматривали ранее. В нём находятся наши агенты N8N и Python, которые мы немного рассмотрим позже, а также демонстрационный пример совместимости с OpenAI, который мы видели ранее. Итак, вы хотите, чтобы это было клонировано, а также пакет local AI. Очень легко запустить и то, и другое. И если вы прокрутите вниз в пакете local AI, у меня есть очень подробные инструкции по настройке всего, включая то, как развернуть его на частном сервере в облаке, что мы рассмотрим в конце этого мастер-класса, и раздел по устранению неполадок внизу. Итак, всё, что я сейчас буду делать, есть инструкции в файле readme, если вы просто хотите вернуться, чтобы уточнить что-либо. Также я рассматриваю все платформы, которые включены в пакет local AI. И это очень важно, потому что, как я уже говорил, когда вы хотите создать 100% автономного и частного агента ИИ, это гораздо больше, чем просто большая языковая модель. У вас есть вся вспомогательная инфраструктура, такая как ваша база данных и ваш пользовательский интерфейс. И поэтому я включил всё это. Во-первых, у меня есть N8N, это наша платформа автоматизации рабочих процессов с низким/нулевым кодом. Мы немного позже создадим агента с N8N в пакете local AI, как только настроим его. У нас есть Supabase для нашей базы данных с открытым исходным кодом. У нас есть Olama. Конечно, мы также хотим иметь это в пакете для наших LLM. Open Web UI, который даёт нам интерфейс, похожий на ChatGPT, для общения с нашими LLM и таких вещей, как история разговора. Очень, очень удобно. Итак, мы смотрим на это здесь. Это включено в пакет. Затем у нас есть Flowise. Он похож на N8N.
Ещё один действительно хороший инструмент для построения агентов ИИ без кода или с минимальным кодом. Quadrant — это открытая векторная база данных. Neo4j — это движок графа знаний, а затем seir xng для открытого, полностью бесплатного и частного веб-поиска. Caddy — это будет очень важно для нас, как только мы развернём локальный пакет ИИ в облако, и мы действительно захотим иметь домены для наших различных сервисов, таких как nn и открытый веб-интерфейс. И последнее — это Langfuse, это открытая платформа разработки больших языковых моделей, она помогает нам с наблюдаемостью агентов. Некоторые из этих сервисов находятся за пределами области действия этого мастер-класса по локальному ИИ. Я не хочу тратить полчаса на каждый из этих сервисов и делать из этого 10-часовое видео. В этом видео я буду фокусироваться на N8N, Superbase, Olama, Open WebUI, CRXNG и Caddy, как только мы развернём всё в облако. Таким образом, я охватываю примерно половину этих сервисов.
И ещё один момент, который я хочу затронуть здесь, заключается в том, что здесь включено довольно много вещей. Поэтому вам потребуется около 8 ГБ оперативной памяти на вашем компьютере или облачном сервере, чтобы всё работало. В целом, это довольно много. Поэтому вы можете удалить некоторые вещи, например, если вы не хотите Quadrant и Langfuse, вы можете удалить их из пакета. Подробнее об этом позже. Он не обязательно должен быть очень раздутым, вы можете уменьшить его до того, что вам нужно. Но да, в создание агентов ИИ входит много разных вещей. И поэтому у меня есть все эти сервисы здесь, чтобы независимо от того, что вам нужно, я вас обеспечил. И с этим мы можем перейти к установке локального пакета ИИ.
Эти инструкции будут работать для вас на любой операционной системе, на любом компьютере. Даже если у вас нет действительно хорошего графического процессора для запуска локальных больших языковых моделей, вы всё равно можете использовать OpenAI или Anthropic, что-то в этом роде, а затем запустить всё остальное локально, чтобы сэкономить на расходах или просто иметь всё работающим на вашем компьютере. Так что есть пара предварительных условий, которые вы должны иметь, прежде чем вы сможете выполнить инструкции ниже. Вам нужен Python, чтобы вы могли запустить скрипт запуска, который запускает всё. Git или GitHub Desktop, чтобы вы могли клонировать этот репозиторий GitHub, перенести всё на свою машину. И затем вам нужен Docker или Docker Desktop. Итак, у меня есть ссылки на всё это. Docker и Docker Desktop нам нужны, потому что все эти локальные сервисы ИИ, которые я для вас подобрал, они все работают как отдельные контейнеры Docker, которые объединены вместе в стеке. Итак, я на самом деле покажу вам, это конечный результат, как только у нас всё будет запущено и работает в вашем Docker Desktop. У вас есть этот локальный стек Docker compose ИИ, в котором работают все сервисы, такие как Superbase, Redis, N8N, Flowise, Caddy, Neo4j. Все они работают в этом стеке. Именно к этому мы сейчас стремимся. Поэтому убедитесь, что у вас установлены все эти вещи. У меня есть ссылки, которые приведут вас к установке независимо от вашей операционной системы. Очень легко запустить всё это на вашей машине.
Затем мы можем перейти к нашей первой команде здесь, которая заключается в клонировании этого репозитория GitHub, перенесении всего этого кода на вашу машину, чтобы вы могли запустить всё. Итак, вы хотите открыть новый терминал. Итак, у меня открыт новый сеанс PowerShell. Я вставлю эту команду. И я буду делать это полностью с нуля вместе с вами. Вы клонируете репозиторий, а затем я просто изменю свой каталог на локальный пакет ИИ, который только что был создан с помощью этой команды get clone. Итак, это первые два шага. Следующее, что нам нужно сделать, это настроить все наши переменные среды. И хотите верьте, хотите нет, это на самом деле самая долгая часть процесса. И как только мы с этим разберёмся, остальное будет очень легко запустить. Но есть много настроек, которые нам нужно настроить для наших разных сервисов, таких как учетные данные для входа в нашу панель управления Superbase или Neo4j. Например, наш анонимный ключ Superbase и закрытый ключ. Все эти вещи нам нужно настроить.
Итак, в нашем терминале здесь вы можете использовать code . для открытия этого в VS Code или windsurf. Откройте это в windsurf. Вы просто хотите открыть эту папку в своей IDE и в той конкретной IDE, которую вы используете. На самом деле это не имеет значения. Вам просто нужно добраться до этого .env.example здесь. Я скопирую его, а затем вставлю. А затем я переименую это в .env. Итак, мы берём example.example, превращая его в .env файл. Итак, вы должны убедиться, что скопировали его и переименовали таким образом. Затем мы можем начать устанавливать все наши конфигурации. И я даже увеличу масштаб, чтобы вам было очень легко увидеть всё, что мы здесь настраиваем. Итак, для начала у нас есть пара учетных данных для N8N. У нас есть наш ключ шифрования и наш секрет JWT. Их очень легко генерировать. Фактически, мы будем делать это несколько раз, но мы будем использовать эту команду OpenSSL для генерации случайной 32-символьной буквенно-цифровой строки, которую мы будем использовать для таких вещей, как наш ключ шифрования и секрет JWT. Итак, OpenSSL — это команда, которая доступна вам по умолчанию в Linux и Mac. Вы можете просто открыть любой терминал и выполнить эту команду, и она выдаст длинную строку, которую вы затем можете просто вставить для этого значения. Для Windows вы не можете просто открыть любой терминал и использовать OpenSSL, но вы можете использовать Git Bash, который будет поставляться с GitHub Desktop при его установке. Итак, я просто выполню поиск. Если вы просто перейдете в свою панель поиска в левом нижнем углу в Windows и выполните поиск Git Bash, он откроет этот терминал вот так. Итак, я могу скопировать эту команду, перейти сюда и вставить её. А затем я могу запустить её. И затем, вуаля, вот и всё. Я знаю, что сейчас вам очень трудно это увидеть. Я собираюсь скопировать это, потому что это теперь значение, которое я могу использовать для своего ключа шифрования. А затем вы хотите сделать точно то же самое, чтобы сгенерировать секрет JWT. А затем другой способ сделать это, если вы не хотите устанавливать Git Bash или он не работает по какой-либо причине, вы можете использовать Python для генерации этого. Итак, я могу просто скопировать эту команду, а затем перейти в терминал здесь, и я могу просто вставить её. Итак, это будет, как и с OpenSSL, генерировать эту случайную 32-символьную строку, которую я могу скопировать и затем использовать для своего секрета JWT. Вот и всё. Итак, я немного углублюсь в детали здесь с каждым из этих разных параметров, но я действительно хочу убедиться, что мне ясно, как всё настроить для вас, чтобы вы могли действительно пройти это шаг за шагом со мной. И как я уже сказал, настройка переменных среды — это самая долгая часть настройки локального пакета ИИ. Поэтому, если вы потерпите со мной это, вы пройдёте через эту конфигурацию, у вас будет всё, что вам нужно для локального ИИ для больших языковых моделей и вашей инфраструктуры.
Итак, это всё для N8N. Теперь у нас есть некоторые секреты для Superbase. В документации Superbase есть некоторые инструкции о том, как получить некоторые из этих значений. Это ссылка прямо здесь, которую я открыл в своём браузере. Итак, мы немного сошлёмся на это здесь. Но сначала мы можем настроить несколько других вещей. Первое, что нам нужно определить, это наш пароль Postgress. Superbase использует Postgress в качестве основы для базы данных. Итак, мы хотим установить здесь пароль, который мы будем использовать для подключения к Postgress в N8N или строку подключения, которая у нас есть для нашего кода Python, что бы это ни было. Это значение может быть чем угодно. Просто обратите внимание, что вы должны быть очень осторожны при использовании специальных символов, таких как знаки процента. Поэтому, если у вас когда-либо возникают проблемы с Postgress, это, вероятно, потому, что у вас есть специальные символы, которые мешают ему. Это то, что я видел несколько раз. Итак, как я уже сказал, я хочу упомянуть шаги по устранению неполадок и вещи, чтобы убедиться, что это очень ясно для вас. Итак, для этого пароля Postgress здесь я просто скажу testPostgressPass. Я просто дам какое-то случайное значение здесь. Просто заканчивается парой цифр. Мне всё равно, что я раскрываю вам эту информацию, потому что это локальный пакет ИИ. Эти пароли предназначены для сервисов, которые никогда не покидают мой компьютер. Поэтому вы не сможете взломать меня, подключившись к чему-либо здесь. А затем у нас есть секрет JWT. И вот здесь мы переходим к этой ссылке здесь в документах Superbase. Итак, они проведут вас через генерацию секрета JWT, а затем его использование для создания как ваших анонимных, так и ключей ролей сервиса. Если вы вообще знакомы с Superbase, нам нужны обе эти части информации. Анонимный ключ — это то, что мы передаём нашему фронтенду. Это наш открытый ключ. А затем ключ роли сервиса имеет все разрешения для Superbase. Мы будем использовать это в наших бэкендах для таких вещей, как наши агенты. Итак, вы можете просто скопировать. Вы можете скопировать этот секрет JWT. А затем вы можете вставить это прямо сюда. Это 32 символа в длину, как и те, которые мы генерировали с помощью OpenSSL. Я просто буду использовать именно то, что говорит мне Superbase. А затем то, что вы можете сделать с этим, это вы можете выбрать анонимный ключ. Нажмите на «Generate JWT», а затем я могу скопировать это значение, а затем я вставлю это для своего анонимного токена. Итак, я просто заменяю значение по умолчанию там для анонимного ключа. А затем, вернувшись и выбрав сервисный ключ, я также сгенерирую его. Итак, он выглядит очень похожим. Они всегда будут начинаться с ey, но эти значения будут отличаться, если вы перейдёте к концу. Итак, я вставлю это для своего ключа service ro. Вуаля. Вот и всё. Хорошо. А затем для панели управления Superbase, в которую мы войдём, чтобы увидеть наши таблицы, наш редактор SQL, аутентификацию и всё такое, у нас есть наше имя пользователя здесь, которое я просто оставлю как superbase. А затем для пароля я могу просто сказать testSuperbasePass. Я просто буду использовать это как свою общую номенклатуру здесь для своих паролей, потому что мне всё равно, что это прямо сейчас. А затем последнее, что нам нужно настроить, это наш идентификатор клиента pooler. На самом деле не важно вдаваться в подробности о том, что это значит. Просто знайте, что вы можете установить это на что угодно. Например, я обычно выбираю здесь четыре цифры, например, 1000 для моего идентификатора клиента pooler. Итак, это всё, что нам нужно для Superbase. И на самом деле большая часть конфигурации предназначена для Superbase.
Затем у нас есть Neo4j. Это очень просто. Вы можете оставить Neo4j для имени пользователя, а затем я просто скажу testNeo4jPass для своего пароля здесь. Итак, вы просто устанавливаете пароль для графа знаний, и даже если вы не используете Neo4j, вам всё равно нужно установить это, но да, это занимает всего две секунды. Затем у нас есть Langfuse. Это для наблюдаемости агента. У нас есть несколько секретов, которые нам здесь нужны. И для этих значений они действительно могут быть чем угодно. Это не имеет значения, потому что это просто пароли, как и пароли для таких вещей, как Neo4j. Итак, я могу просто сказать testClickHousePass. Эм, и тогда я могу сделать testMoPass. И, я имею в виду, это действительно не имеет значения здесь. Случайная соль Langfuse. Я просто делаю совершенно бредовые значения здесь. Возможно, в этом случае вам стоит использовать что-то более безопасное, но, эм, я просто делаю что-то в качестве заглушки на данный момент. Эм, да, вот и всё. Хорошо. А затем последнее, что нам нужно для Langfuse, — это ключ шифрования. Он также генерируется с помощью OpenSSL, как мы делали для учетных данных N8N. Итак, я вернусь к своему терминалу Git Bash. И снова вы можете сделать это с помощью Python. Я просто выполню ту же самую команду. На этот раз я получу другое значение. Итак, я пойду вперёд и скопирую это. Технически вы могли бы использовать одно и то же значение снова и снова, если бы хотели, но, очевидно, гораздо безопаснее использовать разные значения для каждого из ключей шифрования, которые вы генерируете с помощью OpenSSL. Вот и всё. Это наш ключ шифрования. И это на самом деле всё, что нам нужно настроить для наших переменных среды, когда мы просто запускаем локальный пакет ИИ на нашем компьютере. Как только мы развернём его в облаке и мы действительно захотим иметь домены для наших различных сервисов, таких как Open Web UI и N8N, тогда нам придётся настроить Caddy. Итак, здесь мы углубимся в домены, и мы доберёмся до этого в конце этого мастер-класса. Но всё, что находится за этой точкой для переменных среды, совершенно необязательно. Вы можете оставить всё это как есть, и всё будет работать. Большая часть этого — это просто дополнительная конфигурация для Superbase. Итак, Superbase — это определённо самый большой сервис, включённый в этот список, знаете ли, отобранных сервисов для вас. Итак, есть много разных вещей для конфигурации, с которыми вы можете поиграть, если вы хотите глубже погрузиться в это. Вы определённо можете посмотреть ту же страницу документации, которую мы использовали для секретов Superbase. Итак, вы можете прокрутить это, если хотите узнать больше, например, настроить аутентификацию по электронной почте или аутентификацию Google. углубиться во все эти различные вещи конфигурации для Superbase, если вы хотите глубже погрузиться в это. Я не буду вдаваться во всё это прямо сейчас, потому что основу запуска Superbase мы уже позаботились об этом с помощью учетных данных, которые мы настроили вверху, прямо здесь. Итак, это, это просто базовые вещи, и поэтому мы будем придерживаться этого прямо сейчас. Итак, это всё для наших переменных среды.
Затем, возвращаясь к нашему readme, который я теперь открыл непосредственно в windsurf, а не в браузере, мы завершили нашу конфигурацию, и у меня есть заметка здесь, что вы хотите настроить вещи для Caddy, если вы развертываете в продакшн. Очевидно, мы делаем это позже, а не сейчас, как я уже сказал, и поэтому с этим мы готовы начать всё. Теперь, прежде чем мы запустим весь локальный пакет ИИ, есть одна вещь, которую я хочу рассмотреть. Важно рассмотреть это, прежде чем мы запустим вещи. Если вы не хотите запускать всё в пакете, потому что это много, например, вы хотите использовать только половину этих сервисов, и вам не нужны Neo4j, Langfuse и Flowise прямо сейчас. У вас есть два варианта. Самый простой прямо сейчас — это перейти в файл docker-compose. Это основной файл, в котором все сервисы объединены, и вы можете просто удалить сервисы, которые вы не хотите включать. Например, если вам сейчас не нужен Quadrant, потому что это на самом деле один из самых больших сервисов. Это примерно 600 мегабайт оперативной памяти, просто запустив это, вы можете найти Quadrant, и вы можете просто удалить этот сервис из стека вот так. Вуаля. Теперь у меня нет Quadrant. Он больше не будет запускаться как часть стека. А затем у меня также есть том для Quadrant. Итак, вы можете удалить его тоже. Тома, кстати, — это то, как мы можем сохранять данные для этих контейнеров. Поэтому, если мы всё остановим, а затем снова запустим, у нас всё равно будут наши разговоры Open Web UI и наши рабочие процессы N8N, всё в Superbase, всё это будет сохранено, потому что мы храним всё в томах. Итак, мы можем делать всё, что захотим с этими контейнерами. Мы можем остановить их. Мы можем обновить их, я покажу вам, как это сделать позже. Мы можем снова запустить их. И все наши данные всегда будут сохранены. Поэтому вам не нужно беспокоиться о потере информации. И вы всегда можете создавать резервные копии, если хотите быть действительно в безопасности, но я никогда раньше этого не делал, и я обновляю этот пакет месяцами и месяцами, и все мои рабочие процессы полугодовой давности всё ещё есть. Я ничего не потерял. Итак, это просто небольшое замечание о том, как вы можете удалить сервисы, если хотите. А затем ещё одна вещь, которая у нас ещё не доступна, но я очень рад, знаете ли, поговорить об этом прямо сейчас. Сейчас он находится в бета-версии. Мы создаём, я и ещё один парень, который на самом деле находится в моей команде Dynamist. Томас, у него тоже есть канал на YouTube. Он отличный парень. Мы работаем над этим вместе. На самом деле он выполнил большую часть работы по созданию для нас фронтенд-приложения для управления нашим локальным пакетом ИИ. И одна из главных особенностей этого заключается в том, что мы предоставим вам возможность включать и выключать сервисы, которые вы хотите иметь в своём локальном пакете ИИ. Таким образом, вы можете очень сильно настраивать пакет в соответствии с сервисами, которые вы хотите запустить. Таким образом, вы можете поддерживать его лёгким, только для тех вещей, которые вам интересны. Кроме того, мы сможем управлять переменными среды и контролировать контейнеры. На данный момент не всё это работает, но это бета-версия. Мы работаем над этим. Я очень рад этому. Итак, пока это недоступно, но как только это станет доступно, это будет очень хороший способ настроить пакет в соответствии с вашими потребностями. Таким образом, вам не придётся редактировать файл docker-compose напрямую. Итак, это то, что я просто хотел убрать сейчас. Но мы можем начать и фактически выполнить наш пакет сейчас. Запустить все эти контейнеры.
Итак, команда, которую вы запускаете для запуска локального пакета ИИ, отличается в зависимости от вашей операционной системы и используемого вами оборудования. Например, если вы пользователь графического процессора Nvidia, вы хотите запустить этот скрипт start_services.py. Он запускает все контейнеры, и вы хотите специально передать профиль GPU Nvidia. Это запустит Olama таким образом, чтобы контейнер Olama мог автоматически использовать ваш графический процессор. А затем, если вы используете графический процессор AMD и работаете в Linux, вы можете запустить его так. Кстати, к сожалению, если у вас графический процессор AMD в Windows, вы не сможете запустить Olama в контейнере. И то же самое с компьютерами Mac. К сожалению, как вы видите здесь, вы не можете предоставить доступ к вашему графическому процессору экземпляру Docker. Итак, если у вас графический процессор AMD в Windows или вы работаете на Mac, вы не можете запустить Olama в локальном пакете ИИ. Вам просто нужно установить его на свой компьютер, как я уже показал вам в этом мастер-классе, а затем вы просто запустите всё остальное через локальный пакет ИИ, и они фактически смогут выйти на вашу машину и напрямую общаться с Olama. Итак, небольшое ограничение для Mac и AMD в Windows. Но если вы работаете в Linux или с графическим процессором Nvidia в Windows, как я использую, вы можете запустить эту команду прямо здесь. Итак, если вы не можете запустить графический процессор в контейнере Olama, вы всегда можете просто запустить его в режиме CPU или запустить с профилем none. Это фактически сделает так, что Olama никогда не запустится в локальном пакете ИИ. Итак, вы можете просто использовать Olama, который уже запущен на вашем компьютере, как я уже показал вам, как установить. Итак, всего лишь пара небольших замечаний, которые я действительно хочу отметить. Мне нужно убедиться, что вы используете правильную команду. Итак, в моём случае у меня Nvidia в Windows. Итак, я скопирую эту команду. Вернусь в свой терминал. Я просто очищу его здесь. Итак, у нас чистый лист. И я вставлю эту команду. Итак, изначально он сделает довольно много вещей. Во-первых, он клонирует репозиторий Superbase, потому что Superbase фактически управляет стеком в другом месте. Итак, нам нужно загрузить это. Затем идёт некоторая конфигурация для CRXNG для нашего локального и частного веб-поиска. А затем у меня есть пара предупреждений, говорящих о том, что имя пользователя и пароль Flowise не установлены, что, кстати, для этого, если вы хотите установить имя пользователя и пароль Flow Wise, это необязательно, но вы можете сделать это, если я прокручу вниз прямо здесь. Итак, вы можете установить эти значения, эти предупреждения фактически исчезнут, но вы также можете игнорировать их. Итак, в любом случае, я просто хотел упомянуть это очень быстро. Но сейчас здесь происходит то, что
И это начинается с запуска всех контейнеров Superbase. И в Superbase, как я уже говорил, довольно много всего. Так что мы запускаем всё это. Всё это запускается. И как только мы запустим всё это, он перейдёт к развёртыванию остальной части нашего стека. И если вы запускаете это в первый раз, это займёт некоторое время, чтобы загрузить все эти образы. Они не очень маленькие. Здесь запускается много инфраструктуры. И поэтому это займёт немного времени. Вам просто нужно быть терпеливыми. Может быть, сходите за кофе или приготовьте свой следующий приём пищи, что бы это ни было. И тогда всё будет запущено и готово к работе, как только вы вернётесь. И да, теперь вы видите, что мы запускаем остальные контейнеры здесь. А теперь просто подождём, пока это закончится. И затем я покажу вам, как это выглядит в Docker Desktop. Итак, я дам ему секунду, чтобы закончить. Похоже, мой терминал немного глюкнул. Как будто я прокручивал, и поэтому он немного сломался. Но в любом случае, всё запущено и работает. Это будет выглядеть так: все контейнеры будут здоровы, запущены или запущены. И затем, если я перейду в Docker Desktop и разверну локальный стек AI compost, вы должны убедиться, что у вас есть зелёная точка для всего, кроме Olama pull и N8N import. Они запускаются только один раз изначально, а затем отключаются, поскольку они отвечают за извлечение некоторых вещей для нашего локального пакета AI. Итак, да, у меня зелёные точки для всего, кроме двух здесь. Сейчас я оставляю это здесь специально, потому что есть ошибка в Superbase, особенно если вы работаете в Windows. Поэтому вы увидите эту проблему, когда пулер Superbase постоянно перезапускается, и это также влияет на N8N, потому что N8N полагается на пулер Superbase. Поэтому он постоянно перезапускается. Если вы видите эту проблему, я на самом деле говорю об этом в разделе устранения неполадок файла readme. Если вы прокрутите до самого конца, если пулер Superbase перезапускается, вы можете проверить этот вопрос на GitHub. И так я связал это прямо здесь, и он точно скажет вам, какой файл вы хотите изменить. Это вот этот. Итак, это docker volumes poolerpooler.exs. И вам нужно изменить файл, чтобы он заканчивался на lf. Итак, я покажу вам, что я имею в виду под этим. Я покажу вам, как это сделать. Это как супер мелкая случайная вещь, но это зацепило так много людей. Поэтому я хочу включить это явно в мастер-класс. Итак, вы хотите перейти в папку superbase в docker volumes, а затем в pooler, а затем у нас есть pooler.exs, и в основном, независимо от вашей IDE, вы можете видеть crlf в правом нижнем углу. Вы хотите нажать на это и изменить его на lf, а затем убедиться, что вы сохранили этот файл. Очень легко это исправить. И затем вы можете выполнить ту же самую команду, чтобы снова запустить всё. Итак, я собираюсь сделать это сейчас. Он пройдёт через все те же шаги. На этот раз это будет быстрее, потому что у вас уже всё загружено. И это, кстати, как вы можете очень быстро перезапустить всё, если хотите применить новые переменные среды или что-то подобное. Поэтому я хочу включить это явно по этой причине. И я закрою это. И пока всё это перезапускается, другая вещь, которую я хочу показать вам в readme, это то, что у меня также есть инструкции по обновлению контейнеров в локальном пакете AI. Итак, когда у N8N есть обновление или у Superbase есть обновление, это ваша ответственность, потому что вы управляете инфраструктурой, чтобы обновлять вещи самостоятельно. И поэтому вам очень просто нужно выполнить эти три команды, чтобы обновить всё. Вы хотите демонтировать все контейнеры и убедиться, что вы указали свой профиль, например, GPU Nvidia, а затем вы хотите извлечь все последние контейнеры, снова указав свой профиль. И затем, как только вы сделаете эти две вещи, у вас будут загружены самые последние версии контейнеров. Итак, вы можете запустить запуск служб со своим профилем, как мы только что сделали, чтобы перезапустить вещи. Очень легко обновить всё. И хотя мы полностью демонтируем наши контейнеры здесь, прежде чем обновить их, мы не теряем никакой информации, потому что мы сохраняем вещи в томах, которые мы настроили вверху нашего стека Docker Compose. Итак, здесь мы храним все наши данные в нашей базе данных и рабочих процессах. Все эти вещи сохраняются. Поэтому нам не нужно беспокоиться об их потере. Очень легко обновлять вещи, и вы всё ещё можете сохранить всё. Вам не нужно делать резервные копии и тому подобное, если только вы не хотите быть очень-очень безопасными. Итак, теперь мы можем вернуться к нашему Docker desktop, и у нас есть зелёные точки для всего, так как мы исправили проблему pooler.exs. Единственное, чего у нас нет зелёных точек, это импорт N8N, и у нас также есть Olama pull, потому что, как я уже сказал, это две вещи, которые должны запускаться только в начале, а затем они не являются постоянными процессами, как остальные наши службы. Итак, у нас всё запущено и работает. И если что-то является белой точкой, кроме Olama pull или n import, или если что-то постоянно перезапускается, просто напишите комментарий, и я обязательно вам помогу. А также проверьте раздел устранения неполадок. Одна вещь, которую я упомяну очень быстро, это то, что иногда ваш N8N будет постоянно перезапускаться, и он будет говорить что-то вроде того, что ключ шифрования N8N не соответствует тому, что у вас есть в конфигурации. И самое главное, что нужно помнить об этом, это то, что вы хотите убедиться, что вы установили это значение для ключа шифрования, прежде чем вы когда-либо запустите его в первый раз. В противном случае он сгенерирует какое-то случайное значение по умолчанию, и если вы измените это позже, оно не будет соответствовать тому, что он ожидает. Итак, да, моя главная рекомендация заключается в том, чтобы убедиться, что у вас всё настроено в переменных среды, прежде чем вы когда-либо запустите start services в первый раз. Это должно быть запущено после того, как вы настроите переменные среды. В противном случае вы рискуете тем, что любая из этих служб создаст значения по умолчанию, которые затем не будут соответствовать ключам и вещам, которые вы настроите позже. Итак, с этим мы теперь можем перейти в наш браузер и фактически изучить все эти локальные службы AI, которые работают на нашем компьютере сейчас. Теперь в нашем браузере мы можем начать посещать различные службы, которые мы запустили. Например, вот N8N. Вам просто нужно перейти на localhost порт 5678. При первом посещении он предложит вам создать локальную учетную запись. И затем у вас будет это представление рабочего процесса, которое должно показаться вам очень знакомым. если вы раньше использовали NAND. И затем у нас есть open web UI localhost порт 8080. Это наш интерфейс типа chat GPT, где мы можем напрямую общаться со всеми моделями, которые мы загрузили в наш контейнер Olama. Очень, очень здорово. И затем у нас есть локальный хост порт 8000 для нашей панели управления Superbase. Вход в систему определённо не очень приятен по сравнению с управляемой версией Superbase. Но как только вы введёте своё имя пользователя и пароль, которые вы установили для переменных среды для панели управления, у вас будет очень типичный вид, где у нас есть наши таблицы, и у нас есть наш редактор SQL. Всё, с чем вы знакомы в Superbase. И это ключевая вещь со всеми этими различными службами. Они все будут выглядеть для вас практически одинаково. Например, ещё один пример, если я перейду на localhost порт 3000, у нас есть языки. Это для наблюдаемости и мониторинга агента. И это то, что я не буду рассматривать в этом мастер-классе. Как я уже говорил, я не охватываю все службы. Но да, я просто хочу показать, что почти каждую из них можно получить доступ в вашем браузере. И, кстати, то, как мы знаем конкретный порт для доступа к каждой из этих служб, это взглянув на то, что он говорит нам в Docker Desktop. Итак, мы видим, что Neo4j это, давайте посмотрим, у нас есть порт 7474. Для CR XNG это порт 8081. Для Flowwise это порт 3001. Какой мы уже видели? Да, например, Open Web UI это порт 8080. Итак, порт слева - это тот, к которому мы обращаемся в нашем браузере. А порт справа - это тот, который сопоставлен с контейнером. Итак, когда мы посещаем порт 8080 на нашем компьютере, это попадает в порт 8080 в контейнере. И это то, что мы раскрыли. Другой способ увидеть порт, который вам нужно использовать, это просто взглянуть на этот файл docker compose. И вам не нужно иметь очень хорошее понимание этого файла docker compose. Но если вы хотите настроить свой стек или даже помочь мне, внеся вклад в локальный пакет AI, это основное место для внесения изменений. Итак, например, я могу перейти к flowwise и увидеть, что порт равен 3001. Или если я перейду к, скажем, N8N, мы можем увидеть, что порт равен 5678. Итак, порт всегда будет где-то в службе, которую вы настроили. Например, для Langfuse worker это 3030. Это больше служебная служба. Но позвольте мне просто найти ещё один пример для вас здесь. Да, например, Reddus это 6379. Таким образом, вы можете видеть порты в Docker Compose. Я просто хочу отметить это, чтобы хотя бы немного освоиться и познакомиться с файлом Docker Compose, если вы хотите настроить вещи. Но главное - это использовать то, что вы видите здесь в Docker Desktop. Последнее в Docker Desktop очень быстро, если вы хотите добавить больше локальных больших языковых моделей, вы можете сделать это, не перезапуская ничего. Вам просто нужно найти контейнер Olama в стеке Docker Compose. Перейдите на вкладку exec. И теперь здесь мы можем запускать любые команды, которые захотим. Мы находимся непосредственно внутри контейнера. И мы можем использовать команды Lama, как мы делали раньше на нашей хост-машине. Итак, например, я уже запустил Lama list. Поэтому я могу видеть большие языковые модели, которые уже были загружены в мой контейнер Olama. Если я хочу загрузить больше, я могу просто сделать Olama pull, а затем найти этот ID для модели, которую я хочу использовать на веб-сайте Olama. И, как я уже сказал, вам не нужно ничего перезапускать. Если я загружу его здесь, он теперь находится в контейнере, и я могу сразу же начать использовать его в Open Web UI или N8N. Мы увидим это немного позже. Итак, это очень важно, потому что во многих случаях вы захотите начать использовать различные большие языковые модели, и вам не нужно будет ничего перезапускать. Те, которые загружаются на машину по умолчанию, определяются этой строкой здесь. Итак, если вы хотите изменить те, которые загружаются по умолчанию, у меня есть Quinn 2.57B instructs, как очень маленькая лёгкая модель, которую я загрузил в ваш контейнер Lama по умолчанию. Если вы хотите добавить другие, вы можете просто обновить эту строку здесь, чтобы включить несколько Olama pulls. Таким образом, вы можете загрузить Quen 3 или Mistral 3.1 small, что угодно. Это просто то, что у меня есть по умолчанию. И все остальные, которые вы видели в моём списке здесь, я загрузил сам. Хорошо. Теперь, когда у нас есть локальный пакет AI, запущенный и работающий, пришло время создать некоторых агентов. Теперь мы можем использовать наш локальный пакет AI, чтобы фактически разработать приложение. Итак, я начну с того, что познакомлю вас с Open Web UI, и мы будем использовать его, чтобы общаться с нашим Olama LLM. Итак, у нас есть приложение прямо из коробки для нас. Затем я расскажу о создании локального агента AI с помощью N8N, даже подключив его к Open Web UI. Итак, у нас есть этот пользовательский агент, который мы создали в N8N, и затем у нас сразу же есть очень хороший интерфейс для общения с ним. А затем мы перейдём к Python, создавая того же самого агента в Python. Как я уже говорил, я хочу сосредоточиться как на no-code, так и на code, чтобы действительно сделать этот мастер-класс полным, так что независимо от того, хотите ли вы создавать с помощью N8N или Python, вы можете увидеть, как подключиться к нашим различным службам, которые работают локально, например Superbase и CRXNG и Open Web UI. Итак, мы рассмотрим всё это, а затем я перейду к развёртыванию после этого. Но да, давайте прямо сейчас сосредоточимся на Open Web UI и создании некоторых агентов. Итак, вернёмся к Open Web UI, помните, это localhost порт 8080. Вам нужно настроить подключение к Olama, чтобы мы могли начать общаться с нашими локальными LLM в этом удобном интерфейсе. Итак, в левом нижнем углу перейдите на панель администратора, затем перейдите к настройкам, а затем на вкладку подключения. Здесь мы можем настроить наши подключения как к OpenAI с нашим API-ключом, чего мы не будем делать прямо сейчас, но также и к API Olama. Это то, что мы хотим настроить. Обычно по умолчанию это значение просто localhost. И это на самом деле неправильно. Это то, что очень важно понять. И это будет применяться, когда мы будем настраивать учетные данные в N8N и Python. Когда вы находитесь внутри контейнера, localhost означает, что вы ссылаетесь всё ещё внутри контейнера. Open Web UI должен обратиться к контейнеру Olama, а не к самому себе. Поэтому localhost здесь не подходит. Это обычно значение по умолчанию, потому что Open Web UI предполагает, что вы работаете на своей машине, и тогда у вас также будет работать Lama на вашей машине. Поэтому localhost обычно работает, когда вы находитесь за пределами контейнеров. Но здесь мы должны изменить это. Это очень важно сделать правильно. Итак, у нас есть два варианта. Если вы работаете на Mac или AMD в Windows и хотите использовать Lama, работающую на вашей машине, а не внутри контейнера, то вам нужно использовать host.docker.internal. Это способ в docker сказать контейнеру посмотреть за пределы хост-машины, где вы запускаете контейнеры, и вы запускаете их отдельно. Очень важно знать это. И затем, если вы запускаете Olama в контейнере, как я это делаю. У меня Ola работает в моём Docker desktop. Вам нужно изменить это на Olama, вы специально вызываете службу, которая запускает контейнер Olama в вашем стеке Docker Compose. И то, как мы знаем, что это именно это имя, это потому, что мы просто возвращаемся к нашему очень важному файлу Docker Compose. Olama. Итак, всякий раз, когда есть X и тире, вы просто игнорируете это. Это просто то, что после него. Итак, ola - это имя нашей службы, запускающей контейнер. И затем, если бы мы хотели подключиться к чему-то другому, например, flow-wise, flow-wise - это имя службы. Open WebUI, это open-web-UI. Все эти ключевые слова, это имена, когда мы хотим, чтобы наши контейнеры общались друг с другом. И всё это возможно, потому что они находятся в одной сети Docker. Итак, я просто покажу вам это, чтобы вы знали, о чём я говорю. Если я вернусь к Docker Desktop, у нас есть этот локальный стек AI compos. Все эти контейнеры теперь могут взаимодействовать друг с другом, ссылаясь на имена, такие как Reddus или CRXNG. Итак, мы будем видеть это очень часто, когда будем создавать наших агентов. Итак, я хотел потратить пару минут, чтобы сосредоточиться на этом. Итак, вы можете нажать на кнопку «Сохранить» в правом нижнем углу. Я знаю, что моё лицо закрывает это прямо сейчас, но у вас есть кнопка «Сохранить» здесь. Убедитесь, что вы действительно это сделали. И для этого API-ключа я не знаю, почему он просит меня заполнить его. Мне всё равно, как подключаться к OpenAI. Поэтому я просто поставлю какое-то случайное значение и нажму «Сохранить». И затем бац, вот и всё. Мы закончили. И затем во многих случаях с Open Web UI также помогает обновление, иначе по какой-то причине модели не загружаются. Поэтому я просто обновил сайт здесь. Control F5. И теперь мы можем выбрать все локальные LLM, которые мы загрузили в наш контейнер Olama. Итак, например, я могу сделать Quinn 2.57B. Это то, что у меня есть по умолчанию. Я могу сказать привет. И это займёт немного времени, потому что ему нужно загрузить эту модель на мой графический процессор, как мы видели с quen 3 ранее. Но через секунду мы получим ответ. И на самом деле здесь выполняется несколько вызовов. У нас есть один, чтобы получить наш ответ, один, чтобы получить заголовок для нашей беседы слева. А также, если вы нажмёте на три точки здесь, вы увидите, что он создал пару тегов для этой беседы. Итак, пара вещей, которые запускаются одновременно. И я могу проверить историю разговоров. Что я только что сказал? Итак, да, я имею в виду, что всё работает очень хорошо. У нас есть история чата, история разговоров слева. Есть так много того, что мы получаем из коробки. Итак, я хотел показать вам это очень быстро. Теперь мы можем перейти к созданию агента в N8N. И я даже покажу вам, как подключить его к Open Web UI через этот соединитель агента N8N. Очень захватывающие вещи. Итак, давайте сразу же приступим к этому. Итак, я начну очень просто, создав базового агента. Главное, на чём я хочу сосредоточиться, это просто подключение к нашим различным локальным службам AI. Итак, я буду предполагать, что у вас есть базовые знания N8N, потому что это не мастер-класс по N8N. Итак, я начинаю с триггера чата, чтобы мы могли общаться с нашим агентом непосредственно в интерфейсе. Мы также подключим его к Open Web UI. А затем я хочу подключить узел AI agent. Итак, что мы хотим сделать, это подключиться к модели чата, а затем к локальному Superbase для истории наших разговоров, памяти нашего агента. Итак, для модели чата я сделаю lama chat model. Я собираюсь создать совершенно новые учетные данные. Вы можете видеть, как я делаю это с нуля. URL-адрес, который вам нужен для базового URL-адреса, точно такой же, как тот, который мы только что ввели в Open Web UI. Итак, если вы запускаете Olama на своей хост-машине, например, на AMD в Windows, или вы работаете на Mac, или вы просто не хотите запускать контейнер Olama, то это host.docker.internal. А затем, если вы ссылаетесь на контейнер Olama, мы просто ссылаемся на Olama. Это имя службы, запускающей контейнер Olama в нашем стеке. А затем порт по умолчанию равен 11434. И вы можете проверить это соединение. Итак, он выполнит быстрый ping к контейнеру, чтобы убедиться, что мы готовы к работе. И я даже покажу вам, как это выглядит. Итак, прямо здесь в моём контейнере Olama у меня есть журналы. И последние два запроса были просто простым запросом get к корневой конечной точке. У нас есть два из них прямо здесь. И если я нажму на «Повторить» и вернусь к журналам, бац, мы уже на трёх. Итак, он сделал три запроса. Итак, он просто делает этот простой ping каждый раз, чтобы убедиться, что контейнер доступен. Итак, я собираюсь нажать «Сохранить» и закрыть. Итак, теперь у нас есть наши учетные данные, и затем мы можем автоматически выбрать модель, которая теперь загружена в наш контейнер. Итак, чтобы сохранить всё очень лёгким, я собираюсь использовать модель с 7 миллиардами параметров прямо сейчас от Quen 2.5. Отлично. Хорошо. Итак, это всё, что нам нужно для подключения Olama. Это так просто. И затем мы могли бы даже проверить это прямо сейчас. Итак, я собираюсь сохранить этот рабочий процесс. И я просто скажу привет. И нам не нужна история разговоров или инструменты или что-либо ещё на этом этапе. Мы уже получаем ответ от LLM. Он работает над загрузкой модели на мой графический процессор прямо сейчас. Итак, вот и всё. Мы получили наш ответ, выглядит очень хорошо. Отлично. Итак, теперь мы можем добавить память. Итак, я собираюсь добавить Postgress, потому что помните, Superbase использует Postgress под капотом. А затем я собираюсь создать совершенно новые учетные данные здесь. И это на самом деле, вероятно, самый сложный из всех учетных данных для подключения к нашей локальной службе AI. Итак, я покажу вам, как выглядит файл Docker Compose, просто чтобы было понятно, как я получаю эти различные значения. Итак, я укажу на всё
О них. Итак, первый для нашего хоста — это DB, потому что это имя конкретного сервиса Superbase, который у нас есть, это базовая база данных Postgress. И я могу показать вам, как я это сделал, очень быстро. Если вы перейдете в папку superbase, которую мы получаем, когда запускаем скрипт start services, я перехожу в docker, а затем в docker compose. Если я найду db, здесь довольно много зависимостей от db. Так что позвольте мне найти фактическую ссылку на него. Где db? Вот он. Итак, да, это действительно коротко. Uh db — это имя нашего сервиса, который на самом деле является superbase DB. Итак, это имя контейнера, это то, что вы увидите в docker desktop. Но это базовый сервис, на который мы хотим ссылаться, когда наши контейнеры общаются друг с другом. Как в этом случае, наш контейнер N8N взаимодействует с контейнером базы данных superbase. А затем база данных и имя пользователя будут Postgress. Это значения, которые у нас есть по умолчанию. Если вы немного прокрутите вниз, вы увидите их здесь. База данных Postgress — это Postgress, и пользователь также Postgress. И вы можете настроить эти вещи, но это некоторые необязательные параметры, которых я не касался при настройке с вами. И поэтому вы можете просто оставить их как есть. Теперь пароль Postgress — это один из тех, которые мы установили. Это было первое значение superbase, которое мы там установили. Убедитесь, что у вас есть это из того, что у вас есть в .env. А затем все остальное вы можете оставить по умолчанию. Порт будет 5432. Итак, это все для настройки нашего соединения с Postgress. Вы также можете проверить это соединение. А затем мы можем перейти к добавлению некоторых инструментов и тому подобного. Но да, это как самая первая базовая версия агента, которую я хотел вам показать. И надеюсь, с помощью этого вы увидите, как бы ни был сервис, который у вас работает в локальном пакете AI. Очень легко понять, как к нему подключиться как с помощью N8N, потому что N8N всегда очень легко подключается к вещам. Затем также знание того, что вам просто нужно сослаться на имя сервиса, которое у нас есть для контейнера в стеке Docker Compose. Вот как мы можем с ним поговорить. Так что вы можете добавить Quadrant или вы можете добавить язык. Например, вы можете подключить все, что хотите, к нашему агенту здесь. Итак, теперь у нас есть история разговоров. Далее я хочу показать вам, как построить более сложного агента с помощью N8N, используя некоторые инструменты. А затем я также покажу вам, как подключить его к Open Web UI. Итак, прямо сейчас это демонстрация в реальном времени. Вместо подключения к одному из Olama LLMs, я иду прямо к N8N. У меня есть этот пользовательский соединитель агента N8N. Итак, мы разговариваем с этим агентом, который я покажу вам, как построить немного позже. Этот имеет инструмент для использования CRXNG для локального и частного веб-поиска. Это одна из платформ, которые мы включили в локальный пакет AI. Итак, этот ответ займет немного времени, потому что ему нужно искать в Интернете. И ответ, который он генерирует на этот вопрос, довольно длинный. Например, вот. Хорошо. Итак, мы получили ответ. Он довольно длинный. Но да, мы теперь можем искать в Интернете с помощью локального агента. N8N подключен к Open Web UI. Мы становимся довольно изысканными здесь. И у нас также есть название, которое было сгенерировано слева. А затем у нас есть теги здесь тоже. Итак, как все это работает, я начну с объяснения того, как мы можем подключить N8N к Open Web UI. И это просто очень важно. Это делает для нас очень легким тестирование агентов локально, когда мы их разрабатываем. Итак, если вы перейдете в настройки и панель администратора в левом нижнем углу и перейдете к функциям, Open Web UI имеет эту вещь, называемую функциями, которая дает нам возможность добавлять пользовательские функции, как пользовательские модели, которые мы можем затем использовать, как вы видели с соединителем агента N8N. Итак, что у меня есть здесь, это то, что я называю N8N pipe. И у меня будет ссылка на это в описании тоже. Я создал это сам и загрузил его в каталог функций Open Web UI. Итак, вы можете перейти по этой ссылке прямо здесь. Вы даже можете просто найти в Google N8N pipe для Open Web UI. А затем вы нажимаете на эту кнопку получить. Вам просто нужно будет ввести URL-адрес вашего Open Web UI. Итак, я могу просто вставить это сюда. Нажмите импорт в Open Web UI, и он автоматически перенаправит вас на ваш экземпляр Open Web UI. Итак, у вас теперь будет эта функция. И нам не нужно углубляться в код для всего того, как все это работает. Я очень много работал, чтобы создать это для вас. Uh довольно давно я это сделал. И то, о чем нам нужно заботиться, это настройка этого для связи с нашим агентом N8N. Итак, если вы нажмете на клапаны, значок настроек в правом верхнем углу, есть несколько значений, которые мы должны установить. Итак, теперь я перейду к показу того, как создавать вещи в N8N. Тогда все это щелкнет, и все станет понятно. Сейчас, глядя на эти значения, вы, наверное, думаете: «Как, черт возьми, я получу все это?» Но не волнуйтесь, мы углубимся во все это. Но сначала давайте перейдем к нашему агенту N8N. Я объясню, как все это работает. Итак, прежде всего, у нас есть наш триггер чата, который дает нам возможность очень легко общаться с нашим агентом в рабочем процессе. У нас теперь есть новый триггер для веб-хука. Итак, это превращает нашего агента в конечную точку API. Итак, мы можем общаться с ним с помощью других сервисов, таких как Open Web UI. Итак, чтобы настроить веб-хук здесь, вы должны убедиться, что это тип запроса POST. А затем вы можете определить здесь пользовательский путь. Все, что вы установите здесь, будет определять, какой у нас будет URL-адрес. Итак, у нас есть наш тестовый URL. А также, если вы переключите рабочий процесс в активное состояние, это очень важно. Рабочий процесс в N8N должен быть активным. Затем у вас есть доступ к этому URL-адресу производства. И это на самом деле первое значение, которое нам нужно установить в клапанах для этой функции Open Web UI. У нас есть наш URL N8N. И поскольку это контейнер, взаимодействующий с другим контейнером, мы на самом деле не хотим использовать это значение localhost, которое у него есть здесь для нас. Мы хотим указать N8N, потому что N8N снова является именем сервиса, запускающего контейнер N8N в нашем стеке Docker Compose. Итак, порт N8N 5678. А затем это пользовательский URL-адрес, который мы можем определить на основе этого. А затем другое, что мы хотим сделать, это настроить аутентификацию заголовка. Мы не хотим раскрывать эту конечную точку без какой-либо безопасности. И поэтому мы хотим настроить некоторую аутентификацию. Итак, вы можете выбрать заголовок off из раскрывающегося списка аутентификации. А затем для учетных данных здесь я просто создам совершенно новые, чтобы показать вам, как это выглядит. Имя должно быть authorization с заглавной A. Это должно быть очень конкретным. Имя в левом верхнем углу и имя ваших учетных данных. Это может быть что угодно, но это должно быть authorization. А затем значение здесь, способ, которым мы хотим отформатировать это, будет bearer, а затем пробел, а затем все, что вы хотите, чтобы ваш токен bearer был. Итак, это то, что вы можете определить, но оно должно начинаться с bearer заглавной B и пробела. А затем все, что вы наберете после bearer space, это входит как токен NAN bearer. Итак, вы не включаете bearer space здесь, потому что предполагается, что это будет так. Он будет добавлен с этим префиксом. Итак, вы просто вводите test off, как у меня. Итак, мой токен bearer — это bearer test off вот так. А затем это то, что я ввожу для этого поля. Теперь у меня уже все настроено. Итак, я просто закрою это. А затем последнее, что нам нужно настроить для веб-хука. И не волнуйтесь, это узел, на котором мы проводим больше всего времени. Вы должны перейти к раскрывающемуся списку здесь и изменить это на ответ с помощью узла respond to web hook. Очень важно, потому что в конце нашего рабочего процесса, когда мы получаем ответ от нашего агента, мы отправим его обратно тому, кто запросил наш API, который в данном случае будет Open Web UI. Итак, это все для нашей конфигурации веб-хука. Теперь следующее, что нам нужно сделать, это определить, отправляет ли Open Web UI запрос на получение ответа от нашего основного агента или он просто хочет сгенерировать заголовок разговора или теги для нашего разговора? Потому что, как мы видели ранее, я закрою это сейчас и вернусь к разговору, нашему последнему разговору здесь. Мы получаем наш основной ответ, но также есть запрос к LLM для создания очень простого заголовка для нашего разговора и тегов, которые мы видим в правом верхнем углу. Итак, наш рабочий процесс N8N фактически вызывается три отдельных раза только для первого сообщения в новом разговоре. Итак, нам нужно определить, получаем ли мы основной ответ? Например, должны ли мы обратиться к нашему главному агенту или мы должны просто обратиться к простому LLM, который я настроил здесь, чтобы помочь сгенерировать теги или заголовок? Итак, способ, которым мы можем это определить, заключается в том, что всякий раз, когда Open Web UI запрашивает что-то вроде заголовка для разговора, он всегда добавляет префикс к подсказке тремя символами решетки, пробелом и затем словом task. Итак, мы можем от этого отталкиваться. Если подсказка начинается с этого, и эта подсказка просто поступает от нашего веб-хука здесь. Если она начинается с этого, то мы просто перейдем к этому простому LLM, мы просто будем использовать Quen 2.514b instruct. У нас нет инструментов, памяти или чего-либо еще, как у нашего основного агента, потому что мы просто очень просто сгенерируем этот заголовок или теги. Я даже могу показать вам в истории выполнения, как это выглядит. Итак, в этом случае у нас есть наш веб-хук, который поступает. Ввод чата начинается с тройного фунта и task. Итак, конечно же, мы считаем его запросом метаданных, как я его называю. Итак, затем он переходит к этому LLM, который просто генерирует какой-то текст здесь. У нас просто есть этот JSON-ответ с тегами для разговора, технологии, оборудования и игр. Итак, мы спрашиваем о цене графического процессора 5090. А затем мы делаем то же самое, чтобы также сгенерировать заголовок Спецификации графического процессора. Итак, именно то, что мы видим здесь, это заголовок этого последнего разговора. Надеюсь, это понятно. А затем, если он не начинается с task и тройного фунта, и это на самом деле наш запрос. Тогда мы переходим к нашему главному агенту. Мы не хотим, чтобы наш главный агент обрабатывал эти очень простые задачи. Вы также можете просто использовать действительно крошечный LLM. Например, это был бы идеальный случай, чтобы использовать действительно крошечный LLM, например, даже DeepSec R1 1.5B. Вы могли бы, потому что это такая простая задача. В противном случае мы перейдем к нашему главному агенту. Итак, я не буду подробно разбирать все эти узлы, но в основном мы ожидаем, что ввод чата будет содержать подсказку для нашего агента. И способ, которым мы знаем, что ожидаем ввода чата специально, заключается в том, что, возвращаясь к настройкам функции здесь с клапанами, мы говорим здесь ввод чата. Итак, вы должны убедиться, что значение, которое вы введете здесь для ввода, точно соответствует тому, что вы ожидаете от нашего веб-хука. Итак, ввод чата — это то, что у меня есть по умолчанию. Итак, вы можете просто скопировать меня, если хотите. Затем мы переходим к нашему агенту, где мы подключены к Olama, и у нас есть наш локальный superbase. Я уже показал вам, как все это соединить, и это выглядит точно так же. Единственное, что отличается сейчас, это то, что у нас есть один инструмент для поиска в Интернете с помощью CRXNG. Итак, это инструмент веб-поиска. У меня есть описание здесь, просто говорящее ему, что он получит обратно, используя этот инструмент. А затем для идентификатора рабочего процесса, это если я перейду к добавлению узла здесь и просто перейду к инструментам рабочего процесса, вызову инструмент рабочего процесса N8N. Итак, это в основном использование рабочего процесса N8N в качестве инструмента для нашего агента. Итак, это узел, который у нас есть прямо здесь. Но затем я ссылаюсь на идентификатор этого рабочего процесса N8N. Итак, этот идентификатор, потому что я просто вызову подрабочий процесс, который я определил ниже. И снова, я не хочу углубляться во все детали NAN прямо сейчас и как все это работает, но агент будет решать запрос. Что мне следует искать в Интернете? Он решает это, а затем вызывает этот подрабочий процесс здесь, где у нас есть вызов CR XNG. Итак, имя сервиса контейнера в нашем стеке docker и compost — это просто CR XNG, и он работает на порту 8080. А затем, если вы посмотрите документацию CXNG, вы можете посмотреть, как вызывать их API и тому подобное. Итак, я просто делаю простой поиск здесь, а затем есть несколько разных узлов, потому что я хочу разделить поиск, и я могу показать вам это, перейдя к истории выполнения, где мы фактически используем этот инструмент. Итак, посмотрите на это. Итак, в этом случае LLM решил вызвать этот инструмент, и запрос, который он решил, — это текущая цена графического процессора 5090. Итак, это согласуется с разговором, который у нас был последний раз в Open Web UI. Мы получаем некоторые результаты от CRXNG, которые будут просто кучей разных веб-сайтов. Итак, у нас еще нет ответа. У нас просто есть куча ресурсов, которые могут помочь нам добраться до него. Итак, я собираюсь разделить. Итак, у нас есть куча разных веб-сайтов. Теперь мы ограничимся только одним. Я просто хочу сейчас получить один веб-сайт, чтобы сделать его действительно, действительно простым, потому что теперь мы фактически посетим этот веб-сайт. Я собираюсь сделать HTTP-запрос к этому веб-сайту, который, да, я имею в виду, если это буквально официальный сайт Nvidia для 5090, например, это определенно имеет информацию, которая нам нужна. Мы сделаем запрос к нему, а затем мы также будем использовать этот узел HTML, чтобы убедиться, что мы выбираем только тело сайта. Итак, мы убираем все нижние и верхние колонтитулы и весь этот мусор. Итак, у нас есть только ключевая информация. А затем это то, что мы агрегируем и возвращаем обратно нашему агенту AI. Итак, теперь у него есть контент, основной контент этого веб-сайта, чтобы получить этот ответ. Вот как мы вызываем наш инструмент веб-поиска. А затем в самом конце мы просто установим это выходное поле. И это будет ответ, который мы получили либо от генерации заголовка, либо от вызова нашего главного агента. И это очень важно. выходное поле, специально то, как мы его называем здесь, мы должны убедиться, что оно соответствует этому значению, как последнее, что нам нужно установить для настроек нашей функции Open Web UI. Итак, вывод здесь должен совпадать с выводом здесь, потому что это то, что мы вернем в этом ответе на веб-хук. Все, что Open Web UI получит обратно, оно получит обратно из того, что мы вернем прямо здесь. Итак, это все для нашего агента. Я, вероятно, мог бы немного подробнее рассказать о том, как все это работает и создавать гораздо более сложных агентов, что я определенно делаю с локальным AI в курсе Dynamis AI agent mastery. Итак, проверьте это, если вас это заинтересовало. Я просто хотел дать вам простой пример здесь, показывающий, как мы можем взаимодействовать с нашими различными сервисами, такими как Olama, Superbase и Seir XNG. А также Open Web UI тоже. Итак, как только вы установите все эти настройки, обязательно нажмите «Сохранить». Это очень, очень важно. Эти две вещи внизу, кстати, не имеют значения. Но да, нажмите «Сохранить», как только у вас будут все настройки. А затем вы можете начать разговор со своим агентом, как я делал, когда демонстрировал вещи, прежде чем мы углубились в рабочий процесс. И, кстати, этот агент NAN, который работает с Open Web UI, у меня есть как шаблон для вас. Вы можете скачать его в этом репозитории GitHub, где я храню всех агентов для этого мастер-класса. Итак, у нас есть JSON для него прямо здесь. Вы можете скачать этот файл. Перейдите в свой экземпляр N8N. Нажмите на три точки в правом верхнем углу, как только вы создадите новый рабочий процесс. Импорт из файла, а затем вы можете импортировать этот рабочий процесс JSON. Вам просто нужно будет настроить все свои собственные учетные данные для таких вещей, как Lama и Superbase и CRXNG. Но тогда все будет готово, и вы можете пройти тот же процесс, который я сделал, настроив функцию в Open Web UI, и через 15 минут у вас все будет работать, чтобы взаимодействовать с N8N в Open Web UI. Далее я хочу создать теперь версию Python нашего локального агента AI. Итак, это будет перевод один к одному. Точно то, что мы построили здесь в NN, мы теперь сделаем в Python. Итак, я могу показать вам, как работать как с узлами, так и с кодом с нашим локальным пакетом AI. Итак, этот репозиторий GitHub, в котором находится рабочий процесс N8N, который мы только что рассматривали, и та демонстрация, совместимая с OpenAI, которую мы видели ранее, содержит практически все для агента. Итак, большая часть этого репозитория предназначена для этого агента, в который мы сейчас собираемся погрузиться с помощью Python. И в этом readme здесь у меня есть очень подробные инструкции по настройке всего. И многое из того, что мы делаем с агентом Python, особенно когда мы настраиваем наши переменные среды, будет очень похоже на многие из тех значений, которые мы установили в N8N. Например, у нас есть наш базовый URL-адрес здесь, который вы хотели бы установить на что-то, знаете ли, например, HTTP lama порт 11434. Нам просто нужно добавить это /view one, что, я думаю, немного отличается, но да, у меня есть инструкции здесь по настройке всех наших переменных среды, нашего API-ключа, который вы также можете использовать OpenAI или Open Router с этим агентом, используя совместимость с API OpenAI. Это живой пример этого, потому что вы можете изменить базовый URL-адрес, API-ключ и выбор LLM на что-то из Open Router или OpenAI, и тогда все будет готово немедленно. Это действительно, действительно легко. Мы будем использовать Olama в этом случае, конечно, хотя. А затем вы захотите установить свой URL-адрес superb base и сервисный ключ. Вы можете получить это из своих переменных среды. То же самое с CRXNG с этим базовым URL-адресом. Мы установим его так же, как и в N8N. У нас есть наш токен bearer, как в нашем случае был test off. Это просто все, что идет после bearer и пробела. А затем API-ключ OpenAI вы можете игнорировать. Это только для совместимой демоверсии, которую мы видели ранее. Это все, что нам нужно для нашего главного агента сейчас. Итак, мы используем библиотеку Python, называемую fast API, чтобы превратить нашего агента AI в конечную точку API, как мы это делали в N8N. Итак, fast API — это своего рода то, что дает нам этот веб-хук как с точкой входа, так и с выходом для нашего агента, а затем все, что между ними, будет логикой, где мы используем нашего агента. И я буду использовать paidantic AI. Это моя любимая структура агентов AI с Python прямо сейчас. Это делает очень легким настройку агентов, и мы будем это делать здесь. И я не хочу углубляться в тонкости кода Python здесь, потому что это не мастер-класс по созданию агентов. Я действительно просто хочу показать вам, как мы можем подключаться к нашим локальным сервисам AI. Этот агент на 100% автономный. Например, я мог бы отключить Интернет на своей машине и все равно использовать все здесь. Итак, мы создаем клиент Superbase и экземпляр нашей конечной точки fast API. У меня есть некоторые модели здесь, которые определяют запросы, поступающие, ответы, выходящие. Итак,
Мы имеем входные данные чата и идентификатор сессии, точно так же, как мы видели в N8N. А затем выходные данные будут в этом выходном поле. И это точно соответствует тому, чего мы ожидаем с этими настройками, которые мы настроили в функции в Open Web UI. Таким образом, этот Python-агент также будет работать напрямую с Open Web UI.
Затем у нас есть некоторые зависимости для нашего агента Pantic AI, потому что ему нужен HTTP-клиент и базовый URL CRXNG для выполнения этих запросов к инструменту веб-поиска. А затем мы настраиваем здесь нашу модель. Это модель OpenAI, но мы можем переопределить базовый URL и API-ключ для связи с Olama или Open Router, как мы и будем делать. Затем мы создаем нашего агента Pantic AI, получая эту модель на основе переменных окружения. У меня есть очень простой системный запрос, а затем зависимости здесь, потому что нам нужен этот HTTP-клиент для общения с CRXNG. И затем я просто разрешаю ему повторить попытку дважды. Таким образом, если возникает какая-либо ошибка, агент может автоматически повторить попытку, что является одной из действительно замечательных вещей, которые у нас есть в Pyantic AI.
Затем я также создаю второго агента здесь. Это агент, который будет отвечать, как у нас в NADM, за обработку метаданных для Open Web UI, таких как названия бесед и теги для нашей беседы. Итак, это совершенно отдельный агент, потому что у нас просто есть другой системный запрос. В этом случае я делаю здесь что-то очень простое. У нас нет никаких зависимостей для этого агента, потому что он не будет использовать инструмент веб-поиска. А затем для модели я использую точно такую же модель, что и для нашего основного агента. Но, как я делился с N8N, вы можете сделать так, чтобы это была гораздо меньшая модель, например, модель с одним или тремя миллиардами параметров, потому что задача настолько проста, или, может быть, модель с семью миллиардами параметров. Поэтому вы можете это настроить, если хотите. В целях упрощения я использую один и тот же LLM для обоих этих агентов.
Затем мы переходим к нашему инструменту веб-поиска. Итак, в Pantic AI, способ, которым вы предоставляете инструмент своему агенту, это @ и затем имя вашего агента, а затем инструмент, а затем функция, которую вы определите ниже, теперь будет предоставлена как инструмент агенту. А затем это описание, которое у нас есть в строке документации здесь, которое дается как часть запроса вашему агенту. Таким образом, он знает, когда и как использовать этот инструмент. Итак, точные детали того, как мы используем CRXNG здесь, я не буду углубляться, но это точно так же, как мы делали в N8N, где мы делаем этот запрос к конечной точке поиска CRXNG. Мы просматриваем результаты страницы здесь. Мы ограничиваемся только тремя лучшими результатами, или я даже могу изменить это, чтобы сделать его еще проще, и только лучшим результатом. Таким образом, у нас есть самый короткий возможный запрос к LLM. А затем мы получаем содержимое этой страницы. А затем мы возвращаем это нашему агенту AI с помощью некоторого JSON здесь.
Итак, теперь, когда он вызывает этот инструмент, у него есть полная страница с информацией, которая поможет ответить на вопрос пользователя. Веб-поиск теперь завершен. А затем у нас есть здесь безопасность, чтобы убедиться, что токен-носитель соответствует тому, что мы получаем в нашу конечную точку API. Это аутентификация заголовка, которую мы настроили в N8N. Таким образом, эта часть здесь, где мы проверяем аутентификацию заголовка, соответствует этой функции проверки токена. А затем у нас есть функция для извлечения истории разговоров для хранения нового сообщения в истории разговоров. Таким образом, оба они просто делают запросы к нашему локально размещенному Superbase, используя созданный выше клиент Superbase.
А затем у нас есть определение нашей фактической конечной точки API. Итак, в N8N мы использовали invoke N8N agent для нашего пути к нашему агенту. Это был наш производственный URL. В этой конечной точке FastAPI наша конечная точка - /invoke python agent. А затем мы специально ожидаем входные данные чата и идентификатор сессии. Это наш тип запроса чата. Простите, я выделил не то. У нас есть здесь наша модель ответа, которая имеет выходное поле. Таким образом, мы определяем точные типы для входных и выходных данных для этой конечной точки API. А затем мы также используем эту проверку токена для защиты нашей конечной точки в начале. А затем главное здесь: если входные данные чата начинаются с этой задачи, то мы вызовем нашего агента метаданных. Итак, он просто выведет заголовок или теги, что бы это ни было. В противном случае мы получим историю разговоров, отформатируем ее для Pyantic AI, сохраним сообщение пользователя, чтобы у нас была эта история разговоров, создадим наши зависимости, чтобы мы могли общаться с CRXNG, и затем мы просто сделаем agent.run. Мы передадим последнее сообщение от пользователя, прошлую историю разговоров и созданные нами зависимости. Таким образом, он может использовать их, когда вызывает инструмент веб-поиска, и затем мы просто получаем ответ от агента, и вы можете распечатать его в терминале, а затем мы просто сохраним его в Superbase и вернем выходное поле.
Я иду довольно быстро здесь. Там определенно много больше видео на моем канале, где я более подробно разбираю создание агентов с помощью Podantic AI и превращение их в конечные точки API и тому подобное. Но да, я иду немного быстрее здесь. Здесь. А затем последнее - это любая ошибка, с которой мы сталкиваемся, мы просто вернем ответ на фронтенд, сообщая, что возникла проблема, и указав, что это такое. А затем мы используем Uvicorn для размещения нашей конечной точки API специально на порту 8055. Это все для нашего Python-агента, точно так же, как мы настроили в N8N.
А теперь перейдем к файлу README, я открою предварительный просмотр. Способ, которым мы можем запустить этого агента, нам просто нужно открыть терминал, как мы делали с демонстрацией, совместимой с OpenAI. У меня есть инструкции здесь для настройки таблицы базы данных, которая использует ту же таблицу, что и в N8N, и N8N создает ее автоматически. Поэтому, если вы уже использовали агента N8N, вам фактически не нужно запускать этот SQL-код здесь. А затем вы, очевидно, хотите настроить ваши переменные окружения, как мы рассмотрели. Откройте свою виртуальную среду и установите там необходимые компоненты. А затем вы можете запустить команду python main.py. И это запустит конечную точку API. Она просто будет висеть здесь, потому что теперь она ожидает входящих запросов на порту 8055. Итак, что я могу сделать, так это вернуться в Open Web UI. Я могу перейти к функциям администрирования. Перейдите к настройкам. Теперь я могу изменить этот URL. Все остальное то же самое. У меня есть мой токен-носитель, входное поле и выходное поле, такие же, как в N8N. Единственное, что мне нужно изменить сейчас, это мой URL. Итак, я знаю, что это конвейер N8N, и у меня везде в названии написано N8N, но это работает с любой конечной точкой API, которую мы создали с этим форматом здесь. Итак, я скажу, что для моего URL это будет host.docker.internal, потому что моя конечная точка API для Python работает снаружи на моей хост-машине. Поэтому моему контейнеру Open Web UI нужно выйти за пределы моей хост-машины. А затем конкретный порт будет 8055. А затем конечная точка здесь, я удалю этот веб-хук здесь, потому что это invoke-python-agent. Посмотрим на это. Хорошо. Бац. Итак, я собираюсь сохранить это. А затем я могу перейти к своему чату. И здесь все еще написано «коннектор агента N8N». Но это на самом деле сейчас общается с моим Python-агентом. Поэтому я начну с того, что задам ему тот же самый вопрос, что и агенту N8N. И у меня этот конвейер настроен так, чтобы всегда говорить, что он вызывает N8N, но это действительно вызывает нашу конечную точку API Python. И мы можем это увидеть сейчас. Итак, вот и все. Мы получили все входящие запросы, ответ от агента, а также метаданные для заголовка и тегов для разговора. Посмотрите на это. Итак, у нас есть наш заголовок здесь. У нас есть наши теги, а затем у нас есть наш ответ. Это начальная цена в 2000 долларов, которая сейчас намного больше. Начальная точка, начальная цена немного вводят в заблуждение, но да, это хороший ответ. И он использовал CRXNG для выполнения веб-поиска для нас. Это действительно очень здорово.
Теперь последнее, что мы хотим сделать для нашего Python-агента, прежде чем мы сможем начать развертывать вещи в облаке, на частном сервере в облаке, это контейнеризировать его. Теперь причина, по которой мы хотим это сделать, и это файл Docker, который я настроил, чтобы превратить нашего Python-агента в контейнер, как и наши локальные службы AI, заключается в том, что если у нас есть контейнеризованный агент, то он может общаться в сети Docker, точно так же, как наши различные локальные службы AI общаются друг с другом. Потому что сейчас, работая напрямую с Python для связи с Olama, например, нам нужно, чтобы наш URL был localhost, а не Olama. Помните, вы можете использовать только конкретное имя службы контейнера, когда вы находитесь внутри стека docker compose. И поэтому нам пришлось бы сказать localhost прямо сейчас. Но если мы также добавим контейнер для агента в стек, то мы сможем общаться напрямую внутри частной сети. Например, я могу сказать lama, а затем для CRXNG я могу использовать этот URL вместо этого. Сейчас нам фактически нужно использовать localhost порт 8081. И поэтому это очень хорошо по соображениям безопасности и просто для того, чтобы сделать ваше развертывание в удобном пакете, чтобы агенты, которые вы запускаете, находились в той же сети, что и ваша инфраструктура. И именно это мы сейчас и сделаем. Итак, в файле README, у меня есть инструкции по настройке всего. У меня есть инструкции, которым мы следуем, чтобы запускать вещи с помощью Python. У меня также есть инструкции по запуску его с помощью Docker. Итак, все, что вам нужно сделать, это запустить эту единственную команду. Это на самом деле очень легко, потому что у меня есть этот файл Docker, настроенный для превращения нашего агента в контейнер, и у меня все учтено, включая безопасность. Мы запускаем его на порту 8055, как и с Python. А затем у меня есть этот очень простой файл Docker Compose. Это всего лишь одна служба, которую мы добавим ко всем другим службам, которые у нас уже работают для локального пакета AI. И я называю этот Python local AI agent. Итак, мы используем все наши переменные окружения из нашего ENV, как и в случае с локальным пакетом AI. А затем то, что у меня есть вверху, это то, что я включаю файл docker compose для локального пакета AI. Это просто укрепляет связь там. В противном случае вы получите эту странную ошибку, которая говорит, что есть осиротевшие контейнеры, когда вы запускаете это, хотя на самом деле их нет. Итак, это необязательно. Вы просто получите предупреждение об осиротевшем контейнере, которое можете игнорировать. Но если вы не хотите получать это предупреждение, вы можете включить это здесь. Вам просто нужно убедиться, что этот путь соответствует пути к вашему docker compose в локальном пакете AI. В моем случае мне просто нужно было подняться на два каталога, а затем перейти в папку локального пакета AI. Итак, да, это необязательно, но я хочу включить это здесь, просто чтобы все было в отличном состоянии для вас. Итак, да, это docker compose. А затем то, что мы можем сделать сейчас, я вернусь к своему терминалу, и я вставлю эту команду. И это сделает следующее: запустит или перезапустит мой контейнер Python local AI agent. И убедитесь, что вы указали это здесь, потому что если вы этого не сделаете, то он попытается перестроить весь локальный пакет AI, потому что у нас есть это включение. Поэтому очень важно, что вы хотите просто перестроить или построить в первый раз этот контейнер агента. Итак, я собираюсь запустить это, и он даст мне эти предупреждения flow-wise. Итак, у меня не установлены имя пользователя и пароль, но помните, мы можем игнорировать их. Но в любом случае, он собирается построить контейнер Python local AI agent здесь. И есть несколько шагов, которые ему нужно сделать. Ему нужно обновить некоторые внутренние пакеты, а также установить все пакеты pit, которые у нас есть для наших Python-требований для таких вещей, как FastAPI и Pyantic AI. Поэтому это займет немного времени, обычно всего минуту или две. Итак, я собираюсь приостановить и вернуться, как только это будет сделано.
И вот и все. Ваш вывод должен выглядеть примерно так. Он проходит через все этапы сборки, а затем внизу говорится, что контейнер запущен. И это сейчас в нашем локальном стеке Docker Compose AI. Итак, возвращаясь к Docker Desktop. Это займет немного времени, чтобы найти его здесь, потому что у нас так много служб. Но если мы прокрутим вниз, хорошо, вот и все. Внизу здесь у нас есть наш Python local AI agent, ожидающий на порту 8055, как и когда мы запускали его напрямую с помощью Python, но теперь он находится внутри контейнера, который находится непосредственно внутри нашего стека. Итак, теперь, как я уже говорил, это очень важно, поэтому я снова обращаюсь к этому. Теперь, когда мы настраиваем переменные окружения для нашего контейнера, мы будем ссылаться на имена служб наших различных локальных служб AI, таких как circ или lama, а не localhost. Итак, все это, например, localhost против host.docker.internal против использования имени службы, это то, на чем, как я вижу, люди больше всего спотыкаются, когда они настраивают разные вещи в среде Docker, например, локальный пакет AI. Вот почему я уделяю много времени, действительно подчеркивая это, потому что я хочу, чтобы вы сделали это правильно. И, конечно же, если у вас возникнут какие-либо проблемы с этим, сообщите мне. Я с удовольствием помогу вам пройтись по тому, как именно должна выглядеть ваша конфигурация.
Итак, наш агент теперь запущен и работает в контейнере. И я не буду снова демонстрировать это прямо сейчас, потому что следующее, чем мы займемся, а затем я проведу заключительную демонстрацию, это развертывание всего на частном сервере, который у нас есть в облаке. Хорошо. Итак, мы действительно прошли через все сложные вещи. Итак, если вы добрались до этого места, поздравляю. У вас действительно есть все необходимое, чтобы начать создавать агентов AI с помощью локального AI сейчас, и небо - предел тому, чего вы можете достичь.
И последнее, на чем я действительно хочу сосредоточиться здесь в этом мастер-классе, это взять все, что мы создавали на своем собственном компьютере с нашей инфраструктурой и нашими агентами, и развернуть его на частной машине в облаке, потому что тогда мы можем иметь всю нашу инфраструктуру и агенты, работающие круглосуточно. Нам не нужно полагаться на то, что наш собственный компьютер всегда включен. Действительно приятно иметь это там, потому что тогда мы также можем поделиться им с другими людьми. Таким образом, локальный AI все еще считается локальным, пока он работает на машине в облаке, которую вы контролируете. Итак, это не просто OpenAI или Superbase и оплата их API. Это все еще мы, запускающие все сами на частном сервере. Именно это я собираюсь показать вам, как сделать прямо сейчас. И этот процесс, который я рассмотрю с вами, будет работать независимо от того, какой облачный провайдер вы выберете в итоге. И есть некоторые оговорки к этому, которые я объясню немного позже. Но да, вы можете выбрать из множества различных вариантов.
Таким образом, облачная платформа, которую мы будем сегодня развертывать, - это DigitalOcean. Я много использую DigitalOcean. Именно там я развертываю большинство своих агентов AI. Поэтому я настоятельно рекомендую его. И лучшая часть DigitalOcean заключается в том, что у них есть как машины с GPU, если вам нужно много мощности для ваших локальных LLM, так и очень доступные экземпляры CPU. Если вы хотите развернуть все для локального пакета AI, за исключением Olama, вы определенно можете пойти более гибридным путем, если не хотите много платить, потому что эти экземпляры GPU в облаке могут быть довольно дорогими, например, 1, 2 или даже 5 долларов в час. Итак, что вы можете сделать с гибридной настройкой, это развернуть все в локальном пакете AI. Таким образом, по крайней мере, у вас все это локально, и вы не платите за эти подписки. Но затем вы все еще можете использовать что-то вроде OpenAI, OpenRouter или Anthropic для своих LLM. Таким образом, DigitalOcean дает нам возможность делать и то, и другое, и мы углубимся в это, когда будем настраивать все.
Еще один действительно хороший вариант для экземпляров GPU - это TensoDo. TensoDo не выглядит для меня так же хорошо, как DigitalOcean. В целом, я чувствую, что у меня лучший опыт работы с DigitalOcean, но я раньше развертывал локальный пакет AI на TensoDo на GPU 4090, который они предлагают за 37 центов в час. Это очень доступно для экземпляров GPU. Итак, это тоже хорошая платформа. А затем также, если вы согласны не запускать Olama на экземпляре GPU, например, вы просто хотите очень доступный способ размещения всего в локальном пакете AI, за исключением LLM, то вы можете использовать Hostinger. Hostinger - это еще один действительно очень хороший вариант. Супер-супер доступный, например, 7 долларов в месяц за KVM2, который я рекомендую получить, если вы хотите развернуть все, кроме Olama, потому что требование для локального пакета AI, за исключением запуска более ресурсоемких локальных LLM, заключается в том, что у вас должно быть 8 ГБ ОЗУ. Поэтому не получайте облачную машину с 4 или 2 ГБ. Вы хотите иметь 8 ГБ ОЗУ, тогда все будет хорошо. Таким образом, вы можете сделать это буквально за 7 долларов в месяц через Hostinger, и это будет что-то вроде 28 долларов в месяц через DigitalOcean, если вы не хотите экземпляр GPU.
Итак, я просто хочу потратить пару минут на обсуждение различных вариантов платформы. Единственное, что я скажу, это то, что локальный пакет AI работает как множество контейнеров Docker, верно? И поэтому вам нужно избегать использования такой платформы, как RunPod. Итак, RunPod - это платформа для запуска локального AI. Проблема в том, что когда вы платите за экземпляр GPU, вы на самом деле не получаете базовую машину. Вы просто подключаетесь к контейнеру через SSH. Таким образом, вы получаете доступ к контейнеру. И я просто избавлю вас от боли прямо сейчас. Это так сложно и практически невозможно запускать контейнеры Docker внутри контейнеров Docker. Таким образом, вы действительно не можете запускать локальный пакет AI на RunPod. Есть и другие платформы, например, Lambda Labs - еще одна, которую я использовал раньше, не для локального пакета AI, а для других вещей, но это также запускает контейнеры, как если бы вы получали доступ к контейнеру, поэтому вы не можете использовать локальный пакет AI. Итак, в зависимости от выбранной вами платформы, вы должны убедиться, что вы получаете доступ к базовой машине, когда вы арендуете экземпляр GPU, например, DigitalOcean - это тот, который я буду использовать. Вы можете использовать экземпляр GPU через Google Cloud или Azure или AWS, если хотите перейти на более корпоративный уровень. Все они предоставляют вам доступ к базовой машине. Это ваш собственный частный сервер, как и в DigitalOcean. Таким образом, вы можете использовать его для развертывания локального пакета AI и агента, который мы создали с помощью Python. Итак, именно это мы сейчас и сделаем.
Итак, как только вы войдете в DigitalOcean и настройте свой профиль и выставление счетов, и у вас будет создан проект, или вы можете просто использовать проект по умолчанию, теперь мы можем приступить к созданию нашего частного сервера в облаке для размещения локального пакета AI и нашего агента. Итак, вы можете нажать «Создать» в правом верхнем углу. И здесь есть два варианта. Если вы хотите экземпляр CPU, то есть гибридный подход, когда вы размещаете все, кроме LLM, вы можете выбрать каплю. В противном случае, что мы будем делать прямо сейчас, чтобы я мог продемонстрировать все полностью, так это создать каплю GPU. Теперь они будут дороже. Как я уже говорил, запуск GPU H100 стоит 3,40 доллара в час. Это довольно дорого. Но, как я уже говорил в начале этого мастер-класса, я знаю так много предприятий, которые готовы вкладывать десятки тысяч долларов в год в запуск своей собственной инфраструктуры и LLM. И самая большая стоимость, которая способствует тому, что это десятки тысяч долларов…
Использование GPU-дроплетов, работающих круглосуточно, в облаке. Поэтому гибридный подход, который я определённо рекомендую, если вы не хотите переплачивать, обойдётся вам всего в 7 долларов в месяц с Hostinger. Таким образом, существует очень широкий спектр вариантов в зависимости от того, сколько вы хотите платить за хостинг пакета, больших языковых моделей и ваших агентов. И ещё я скажу, что если вы хотите, вы можете просто создать этот экземпляр на день, поэкспериментировать с вещами, а затем удалить его. Таким образом, вам нужно будет заплатить всего около 20 долларов или около того. Итак, здесь много разных вариантов гибкости.
Поэтому я выберу дата-центр в Торонто, потому что здесь больше вариантов GPU, и он относительно близок ко мне. А для образа я выберу готовый к AI/ML, это рекомендуется, потому что вы получаете Linux с пакетом всех необходимых драйверов GPU, и он использует дистрибутив Ubuntu Linux. Этот процесс, который я вам покажу для развертывания локального пакета AI в облаке, будет работать для любого экземпляра Ubuntu, работающего на AWS, Hostinger или Tensor Do. Это просто очень стандартный дистрибутив Linux.
И затем для GPU у нас здесь есть несколько вариантов с Digital Ocean. H100 – это абсолютный зверь. 80 ГБ VRAM, так что он может легко запускать большие языковые модели Q4, более 100 миллиардов параметров, даже 240 ГБ ОЗУ. Поэтому я не буду запускать этот. Я просто указываю, что это абсолютный зверь. Думаю, тот, который я выберу, будет RTX 6000 ADA. Итак, это 48 ГБ VRAM. Этого достаточно для запуска больших языковых моделей с 70 миллиардами параметров или меньше при квантовании Q4, и он поставляется с 64 ГБ ОЗУ, и он будет стоить около 1,90 долларов в час. Итак, я выберу это, и у меня уже создан ключ SSH. Если у вас нет ключа SSH, вы можете нажать на эту кнопку, чтобы добавить его. Затем вы можете следовать инструкциям в правой части экрана. Независимо от вашей ОС, у них есть инструкции, которые помогут вам. Вам просто нужно вставить свой открытый ключ и дать ему имя. Итак, мой уже добавлен.
А единственное, что мне ещё нужно выбрать, это уникальное имя. Я просто назову его local AI package. И я просто напишу GPU, потому что у меня уже есть обычная версия, просто развёрнутая на экземпляре CPU. А для своего проекта я выберу Dynamis. Я могу добавить его вместе с другими моими работающими экземплярами. И вот так. Теперь я могу просто нажать «Создать GPU-дроплет». Вот так просто подготовить наш экземпляр для доступа, начать установку всего необходимого и запустить всё, как мы делали на своём компьютере. Поэтому я приостановлю и вернусь, как только наша машина будет создана через несколько минут.
И вот, всего через минуту наш GPU-дроплет работает. И единственное, что я скажу, это то, что мне пришлось запросить доступ к созданию GPU-экземпляра на платформе Digital Ocean. Однако они одобрили его менее чем за 24 часа. Так что это очень легко сделать, если вы хотите создать GPU-экземпляр. В противном случае вы можете просто создать один из их обычных дроплетов, один из их CPU-экземпляров.
Теперь, прежде чем подключаться к этой машине, вам следует обратить внимание на публичный IPv4-адрес. Мы будем использовать его для настройки поддоменов немного позже. Итак, вот как мы получаем доступ к GPU-дроплету. Для CPU-дроплета это выглядит немного иначе. Обычно вы видите IPv4 где-то в правом верхнем углу. Итак, обратите на это внимание. Сохраните на потом. Мы будем использовать это немного позже.
А затем, чтобы подключиться к нашему дроплету, мы можем сделать это либо через SSH с помощью нашего IPv4 и ключа SSH, который мы настроили при настройке этого экземпляра, либо мы можем получить доступ к веб-консоли. Для CPU-экземпляра обычно вы переходите на вкладку «Доступ», а затем можете запустить веб-консоль. Для GPU-экземпляра я могу просто нажать на это, чтобы запустить его прямо здесь. Таким образом, у нас открывается отдельное окно, и вуаля, теперь у нас есть доступ к нашему экземпляру. Вот так просто подключиться. И теперь мы можем пройти тот же процесс, что и на нашем компьютере, чтобы установить локальный пакет AI.
Теперь есть некоторые дополнительные шаги, которые мы должны предпринять, и именно поэтому я включаю это в конце мастер-класса. Поэтому, если вы прокрутите вниз в файле README, есть некоторые конкретные инструкции по развертыванию в облаке. Поэтому вы должны убедиться, что у вас есть машина Linux, предпочтительно на дистрибутиве Ubuntu, который мы используем. А затем есть ещё несколько шагов. Итак, первое, что нам нужно настроить, это наш брандмауэр. Нам нужно открыть несколько портов, чтобы мы могли получить доступ к нашей машине из Интернета. Настройте наши поддомены для таких вещей, как N8N и Open Web UI. Поэтому вы хотите использовать эту команду UFW enable. Я просто вставлю её. Итак, мы собираемся, и вы можете просто набрать Y, чтобы продолжить. Это прервёт соединения SSH, но нас это не волнует. Итак, UFW enable. Итак, мы включаем брандмауэр. А затем вы хотите скопировать эту команду, чтобы разрешить как порты 80, так и 443. Итак, 80 – это HTTP, а 443 – HTTPS. А затем вы можете просто выполнить последнюю команду здесь, UFW reload. Теперь у нас есть эти порты для связи со всеми нашими службами.
Это точка входа в Caddy. Caddy – это служба в локальном пакете AI, которая позволит нам настроить поддомены для всех наших служб. И поэтому любая связь с нашим дроплетом будет проходить через Caddy, а затем Caddy будет распределять её между нашими различными службами в зависимости от порта или поддомена, который мы используем. Это называется обратным прокси-сервером. Вы, вероятно, слышали о таких вещах, как EngineX или Traffic раньше. Caddy очень похож на это. И это также позволяет нам получить HTTPS, поэтому мы можем автоматически настроить защищённые конечные точки, и он управляет этим шифрованием для нас. Это очень хорошая платформа.
Итак, позвольте мне прокрутить вниз к конкретным шагам по развертыванию в облаке. Здесь есть быстрое предупреждение о том, как Docker управляет портами и другими вещами, но это так же безопасно, как мы только можем сделать. Поэтому доверьтесь мне, мы приложили много усилий, и мне очень помог участник сообщества Dynamis, Бенни. Он очень помог мне с безопасностью локального пакета AI. Спасибо, Бенни, за помощь! Мы действительно убеждаемся, что, поскольку локальный AI, вся суть в том, что вы хотите, чтобы всё было конфиденциально и безопасно, поэтому мы убеждаемся, что этот пакет использует лучшие методы для этого. Поэтому это очень важно для нас.
А затем мы можем выполнить обычные шаги по настройке локального пакета AI. Единственное, что нам нужно сделать, что уникально для облака, это настроить записи для нашего поставщика DNS, чтобы мы могли настроить наш поддомен для наших различных служб. Мы немного позже перейдём к этому. Но сначала я хочу запустить локальный пакет AI. Поэтому я собираюсь вставить эту команду, чтобы клонировать репозиторий. Git автоматически устанавливается с нашими GPU-дроплетами. А затем я могу изменить свой каталог на локальный пакет AI. И позвольте мне немного увеличить масштаб, чтобы вам было очень легко увидеть, потому что теперь я хочу скопировать файл .env.ample в новый файл под названием. Итак, если я выполню команду ls, мы увидим все файлы, доступные в нашем каталоге. Мы, я думаю, не видим, я сделаю ls -a. Теперь мы видим env.env.example. example. А теперь я могу сделать nano .env. Это даст нам, по сути, текстовый редактор прямо в терминале, чтобы мы могли установить все наши переменные среды, как мы это делали с локальным пакетом AI на нашем компьютере. На этот раз я не буду вдаваться в подробности настройки всех этих переменных среды, потому что это точно такой же процесс. На самом деле вы можете буквально использовать все секреты, которые вы уже настроили, когда разместили его на своём собственном компьютере, если они действительно защищены. Я знаю, что часто вы можете просто использовать какие-то заполнительные значения, когда он работает только на вашем компьютере, а затем вы хотите, чтобы он был более защищённым в облаке. Поэтому убедитесь, что у вас есть реальные значения для всего, но да, вы можете использовать много того же самого.
Однако для наилучшей практики безопасности вы, вероятно, захотите сделать всё по-разному. Но да, единственное, на чём я хочу сосредоточиться с вами, что меняется, это наша конфигурация для Caddy. Теперь, когда мы развертываемся в облаке, мы хотим иметь поддомены для наших различных служб. Например, для NN мы хотим установить для него имя хоста. Вы хотите сделать то же самое для N8N, Open Web UI, Superbase и вашего электронного письма Let's Encrypt. Очевидно, вы также хотите раскомментировать это, потому что это электронная почта, которую вы хотите установить для шифрования SSL. Поэтому я просто сделаю coal dynamis.ai. И вы можете просто установить это на любой адрес электронной почты, который хотите использовать. Таким образом, в основном, вам нужно раскомментировать строку для каждой из служб, для которых вы хотите создать поддомены. Поэтому, если вы также используете Flowwise, чего я не делаю в этом мастер-классе, но если вы используете, то вы также хотите раскомментировать эту строку. Если вы используете Langfuse, то раскомментируйте эту строку. Я оставлю их закомментированными прямо сейчас для простоты. Две, которые я вообще не рекомендую раскомментировать, это Olama и CRXNG. Мы не хотим выставлять их через поддомен, потому что мы будем использовать их только как внутренние инструменты для наших агентов и приложений, работающих на этом сервере. Поэтому мы хотим сохранить их красивыми и частными. Но для всего, что мы хотим выставить, что защищено именем пользователя и паролем, например, N8N, Open Web UI и Superbase, мы можем раскомментировать их.
Итак, мы это настроили. Но мы, очевидно, должны предоставить для них реальные значения. Например, я просто скажу nyt для YouTube dynamis, а затем я сделаю. Поэтому вам нужно определить ваш точный URL-адрес, который вы хотите использовать для этого домена. Очевидно, это должен быть домен, которым вы управляете, потому что мы перейдём и настроим записи в DNS немного позже. Поэтому я сделаю то же самое для Open Web UI. Итак, это Open Web UI, и я просто делаю YT, потому что у меня уже есть локальный пакет AI, размещённый на моём домене. Поэтому я не могу просто сделать Open Web UI, потому что он уже занят. Итак, open web UIT.dynamis.ai. И, наконец, для Superbase это будет superbaseyt.dynamis.ai. Вуаля. Хорошо. Вот так. Продолжайте это делать. Настройте остальные переменные среды, а затем мы можем продолжить. А способ выхода и сохранения изменений – это Ctrl+X или Cmd+X на Mac, введите Y, а затем нажмите Enter. Итак, ещё раз, это Ctrl+X, затем введите Y, затем нажмите Enter. Вот как выйти. А теперь, если я сделаю cat .env, вот как вы можете распечатать его в терминале. Поэтому мы можем убедиться, что изменения, которые мы внесли, например, всё для Caddy, действительно внесены. Сделайте это. Измените также все остальные переменные среды. Я сделаю это вне камеры и вернусь, как только это будет сделано.
Хорошо. Итак, мои переменные среды установлены. Теперь последнее, что нам нужно сделать, прежде чем запускать все наши службы, это настроить DNS. Итак, помните, скопируйте свой IPv4-адрес, а затем перейдите к своему поставщику DNS. Этот процесс будет очень похож независимо от того, какой у вас поставщик DNS. Например, я использую NameCheap. Многие люди используют Hostinger или Bluehost. Вы можете со всеми этими поставщиками перейти к чему-то, что обычно называется «Расширенный DNS» или «Управление DNS», а затем вы можете настроить здесь пользовательские записи A, что мы и сделаем, чтобы установить соединение для всех наших поддоменов с IPv4 нашего дроплета Digital Ocean или любого другого облачного провайдера, который вы используете. Поэтому я собираюсь нажать на «Добавить новую запись». Это будет запись A для хоста. Это будет поддомен, который я хочу. Например, N8NYT. А затем для IP-адреса я просто вставляю IPv4 моего GPU-дроплета Digital Ocean. А затем я нажму на флажок, чтобы сохранить изменения. А затем я просто сделаю то же самое для open web UIT. Я не могу забыть YT. Вот так. А для вас это может быть не просто три, но для меня единственный другой, который у меня есть прямо сейчас, это Superbase, потому что я держу всё очень-очень простым. Итак, superbase yt, а затем снова вставьте IP. Хорошо, вот так. Вуаля. Хорошо, так что у нас настроены все наши записи. И очень важно сделать это, прежде чем запускать что-либо в первый раз, потому что в противном случае Caddy очень путается. Он пытается использовать эти поддомены, которые у вас фактически ещё не настроены. Поэтому позаботьтесь об этом. Затем мы можем вернуться к нашему экземпляру и выполнить последнюю команду.
Итак, возвращаясь к файлу README, если я прокручу вниз до развёртывания в облаке, есть конкретный параметр, который вы хотите добавить. Это очень важно для развёртывания в облаке, потому что при выборе среды public он закроет гораздо больше портов, чтобы сделать это очень-очень безопасным. Поэтому любая из служб, к которым вы обращаетесь извне дроплета, должна проходить через Caddy. Поэтому мы используем обратный прокси-сервер в качестве единственной точки входа в любые наши локальные службы AI. Вот как мы можем сделать всё максимально герметичным. Как я уже говорил, мы учитываем безопасность. Поэтому убедитесь, что вы запускаете эту команду с указанной средой. Мы не делали этого локально, потому что, когда мы запускаем что-то локально, нас не так волнует безопасность, потому что наша машина не доступна в Интернете, как облачный сервер. Поэтому по умолчанию используется среда private, которая просто не делает столько же вещей для безопасности. Поэтому продолжайте и запустите это. А затем, конечно, убедитесь, что вы используете правильный профиль. Поэтому, если вы используете просто экземпляр CPU с обычным дроплетом или Hostinger или чем-то ещё, вам нужно изменить это на CPU вместо GPU Nvidia. Но в нашем случае, поскольку мы платим 2 доллара в час за убийственный GPU-дроплет, я могу выполнить эту команду с профилем GPU Nvidia.
Я специально оставил эту ошибку здесь, потому что хочу показать вам, как она выглядит. Если вы получите unknown shorthand flag p-p, это значит, что у вас фактически не установлен docker compose. Это происходит у некоторых поставщиков облачных услуг. И для этого есть очень простое решение, которое я хочу показать вам. Вы даже можете проверить это. Просто docker compose. Он скажет, что compose – это не команда docker. Итак, возвращаясь к файлу README, у меня есть несколько команд, которые вам просто нужно выполнить, если это произойдёт с вами. Это внизу раздела «Развёртывание в облаке» файла README. Поэтому вы можете просто скопировать их по одной, перенести их в свой дроплет или вашу машину, где бы вы ни размещали её, и выполнить их. Поэтому я сделаю это очень быстро вне камеры. Я просто скопирую каждый из них в свой дроплет. Это очень просто. Вы можете просто запустить все эти команды. Они также очень быстрые. Поэтому ни одна из них не займёт много времени. Это просто подготовит всё для вас, чтобы Docker Compose была допустимой командой. Поэтому вы сможете запустить скрипт запуска служб. Вот так.
Хорошо. Я выполнил все эти команды. Я снова очищу свой терминал, а затем вернусь к основной команде, чтобы запустить наши службы. Вуаля. Хорошо. Теперь мы извлекли всё из Superbase, настроили конфигурацию CRXNG. Теперь мы извлекаем наши контейнеры Superbase. Итак, снова, тот же процесс выполняется на нашем компьютере, где он извлечёт Superbase, запустит всё для Superbase, затем извлечёт и запустит всё для остальных наших служб. Поэтому я приостановлю и вернусь, как только всё будет завершено.
И вуаля, вот так. Все наши службы работают. Вы должны видеть зелёные галочки повсюду, как здесь. Мы готовы. И у нас нет Docker Desktop, поэтому не так просто погрузиться в журналы наших контейнеров. Но одна быстрая проверка, которую вы можете сделать просто в терминале, – это выполнить команду docker ps -a. Это даст вам список всех наших контейнеров, которые работают здесь. Мы можем убедиться, что все они работают, что мы не видим никаких постоянно перезапускающихся или неработающих. Итак, у нас есть два, которые завершены, но это Nit и import и Olama pull. Это два, которые, как мы знаем, должны быть завершены. Просто убедитесь, что всё хорошо. Затем мы можем перейти в наш браузер. И поскольку у нас уже настроен DNS, мы настроили Caddy. Теперь мы можем перейти к нашим различным службам. Например, я могу перейти на nadnyt.dynamus.ai. И вуаля, вот так. Он заставляет нас настроить учётную запись владельца, или мы можем просто перейти на open web ui yt.dynamis.ai. Вуаля. И вот наш Open Web UI.
Хорошо. Итак, я начну. Нам придётся создать учётную запись. Я сделаю это вне камеры, но да, вы просто создаёте свои учётные записи для всего. А затем мы сделаем то же самое для, давайте сделаем superbaseyt.dynamis.ai. И вуаля, вот так. Итак, все наши службы работают. А теперь мы можем войти в них и создать свои учётные записи, и мы можем взаимодействовать с нашими агентами и вводить их. Мы можем работать с Llama так же. Итак, давайте сделаем это. Я просто создам эти учётные записи вне камеры.
Итак, я создал свои учётные записи для N8N, а также для Open WebUI. И вы можете сделать то же самое для всех других учётных записей, которые вам, возможно, придётся создать для таких вещей, как Langfuse. А затем в Open Web UI мы перейдём в панель администратора, настройки, подключения. Убедитесь, что ваш API Olama правильно ссылается на службу Olama. Обычно это будет по умолчанию localhost или host.docer.in internal. Вы можете получить это там. Вам также нужно установить ключ API OpenAI, просто какое-нибудь случайное значение. Это просто небольшой баг в Open Web UI. Затем нажмите «Сохранить», и вы сможете вернуться, и ваши модели будут загружены. Теперь, теперь одна вещь, которую я обнаружил с Open Web UI, после того, как вы измените базовый URL-адрес Olama, вам нужно полностью обновить веб-сайт. В противном случае вы получите ошибку при использовании LLM. Поэтому просто небольшой отрывок, небольшая мелочь, но да, мы выберем модель, которая загружается по умолчанию. И вы можете загрузить другие в свой контейнер Llama, как мы уже говорили. Вам не нужно перезапускать что-либо. Итак, давайте проведём небольшой тест. Я просто скажу «привет», и мы посмотрим, сможем ли мы загрузить модель сейчас. И вуаля, посмотрите, как быстро это было, потому что у нас сейчас есть мощный экземпляр GPU. Я мог бы запустить гораздо более крупные LLM, если бы захотел. Поэтому да, давайте посмотрим. Что я только что сказал? Хорошо, мы сделаем ещё один тест здесь. И да, посмотрите, как быстро это происходит. Это невероятно быстро, потому что всё работает локально на одной и той же инфраструктуре. Нет задержек сети. Поэтому у нас есть мощный GPU, нет задержек сети. Мы получаем очень быстрые ответы от этих LLM прямо сейчас. Поэтому я не хочу…
Идите и проверьте всё с N8N ещё раз. Но что я действительно хочу вам показать прямо сейчас, так это как взять Python-агент, который у нас есть в этом репозитории, и развернуть его в облаке. Добавить его в локальный AI Docker Compose стек, как мы делали на нашем компьютере, но теперь разместив всё это в облаке. Так что это самое последнее, что я хочу с вами рассмотреть для нашего облачного развертывания. И так же, как и с локальным AI пакетом, мы можем следовать инструкциям здесь, в readme, чтобы всё заработало на нашей машине. Итак, первое, что нам нужно сделать, это клонировать наш репозиторий. Итак, я собираюсь скопировать эту команду, вернуться в свой терминал здесь, для моего экземпляра. И я отступаю на один уровень каталогов, кстати. Так что теперь я нахожусь в том же месте, где у меня есть локальный AI пакет, так что мы можем запускать их бок о бок. Итак, я вставлю эту команду для клонирования automator agents. А затем я могу перейти в него. И затем я также хочу изменить свой каталог внутри Python local AI agent специально. Итак, теперь, выполнив ls -a, мы можем видеть enenv.ample. Итак, я собираюсь, как мы делали раньше, скопировать это и превратить в .env. А затем я могу сделать nano .env. И там мы можем отредактировать все наши переменные среды. И так как мы запускаем это в контейнере docker, прикрепляя его к локальному AI стеку, способ, которым я ссылался, будет заключаться в вызове имени сервиса. Порт 111434 /v1. А затем API ключ. Это просто заполнитель там для lama для выбора LLM. Если я хочу получить точный ID того, что я уже загрузил, я на самом деле покажу вам, как это сделать очень быстро. Итак, я собираюсь сделать control+x, y, enter, чтобы сохранить и выйти. И затем способ, которым вы можете выполнить контейнер, это docker exec -it, а затем имя нашего контейнера, который является lama. У нас это уже работает. А затем /bin/bash. Итак, что это будет делать, так это то, что теперь, вместо того, чтобы находиться внутри нашей машины, мы находимся внутри нашего контейнера Olama. Итак, теперь я могу выполнить команду Olama list, и затем я могу увидеть LLM, которые у меня есть. Итак, у меня есть Quen 2.57B. Итак, я собираюсь скопировать этот ID. Я не запомнил его. Так что это мой способ быстро найти его. И это также то, как вы можете получить доступ к каждому из ваших контейнеров, когда у вас нет Docker Desktop. Вы просто делаете docker exec -it имя вашего контейнера, а затем bin/bash. Так что это похоже на то, как у нас была эта вкладка exec в Docker Desktop. И затем, когда я закончу здесь, я могу просто сделать exit. И теперь я снова на своей хост-машине, своем GPU droplet. Так что это ещё одна мелочь, ещё один золотой самородок, который я хотел вам дать. Но да, мы вернёмся к нашим переменным среды. И у меня скопирован этот ID для quen 2.57b. Итак, я вставлю это. И вот, пожалуйста. А затем для нашего URL Superbase, это будет http:// и затем это kong. Думаю, я должен был быть более ясным в этом, когда я настраивал всё локально. Итак, я обязательно обновлю документацию для этого, но это будет Kong порт 8000, потому что Kong - это сервис, который у нас есть в Superbase специально для панели управления. А затем ключ сервиса, ну, я просто возьму его из своего локального AI пакета, потому что у меня это настроено в переменных среды. Итак, мне просто нужно обратиться к своим переменным среды, чтобы получить мой ключ сервиса ro. И вот, пожалуйста. Хорошо. Итак, я собираюсь вставить это. И э-э, теперь я просто удалю этот экземпляр после. Мне всё равно, что я показываю это сейчас. А затем для URL CRNG base URL, HTTP CRXNG 8080. А затем для моего токена bearer, я просто установил его на test off. И затем нам не нужно устанавливать API ключ OpenAI, потому что это было просто для демонстрации совместимости с OpenAI ранее. Так что это вся моя конфигурация для этого контейнера. Я должен быть очень ясен в этом. Я обновлю документацию для этого. Но в остальном, наши переменные среды выглядят хорошо. Итак, control+x, y, enter, чтобы сохранить. Вы можете сделать cat .env просто для проверки, чтобы убедиться, что всё сохранено. Мы хорошо выглядим. Хорошо. Итак, теперь в readme здесь, итак, я вернусь к инструкциям. Мы уже всё это сделали. Мы изменили наш каталог. Мы настроили наши переменные среды и настроили их. Теперь нам нужно запустить это в нашем SQL редакторе в Superbase. Так мы можем настроить нашу таблицу, потому что мы ещё не запускали вещи с N8N. Так что у нас ещё нет этой таблицы. Итак, теперь мне просто нужно войти в Superbase. Итак, у меня есть моё имя пользователя, которое Superbase. А затем я просто копирую и вставляю имя пользователя и пароль, которые у меня есть, э-э, которые я установил здесь в своих переменных среды. Итак, я перейду в свой SQL редактор и вернусь сюда. Я знаю, что я двигаюсь довольно быстро, но у меня есть эти инструкции, изложенные в readme. Я вставлю это так и нажму на запуск. И вот, пожалуйста. Итак, теперь, если я перейду в таблицы и найду NN, у нас есть NN chat histories, новая, пока пустая таблица. Хорошо, всё хорошо. А затем, вернувшись после того, как мы сделаем это, теперь мы можем запустить агента. Итак, мне просто нужно взять эту команду прямо здесь, а затем я вернусь к своему droplet. И одна вещь, которую я упомянул ранее, но хочу снова рассмотреть. Если я перейду в, э-э, подождите, мне нужно изменить свой каталог обратно. Итак, automator agents, а затем python local AI. Если я перейду в свой docker compose, вы должны убедиться, что путь включения правильный. Итак, я обновлю это к тому времени, как вы получите это, где это будет просто идти на два уровня назад. Это то, что нам нужно сделать. Итак, убедитесь, что мы ссылаемся на правильный путь к локальному AI пакету на нашей машине, а затем ctrl+x, y, enter, чтобы сохранить. Это потому, что мы должны вернуться из Python local AI agent, затем вернуться из каталога automator agents, а затем в этом же каталоге у нас есть локальный AI пакет. Итак, мы готовы. Теперь я могу вставить команду сюда, чтобы собрать нашего агента и включить его в локальный AI стек. Итак, ему придётся всё собрать. Занимает минуту, как мы уже видели. Итак, я сделаю паузу и вернусь, как только это будет сделано. И хорошо, вот и всё. Примерно через 30 секунд, и мы готовы. Итак, теперь я могу снова сделать docker ps -a. И на этот раз, если я очень внимательно посмотрю на этот список, немного подожду, я должен увидеть своего Python-агента. Вот он. Local AI, Python, local AI agent. И он начинается с Local AI, потому что он является частью этого стека docker compose. И кстати, я могу сделать docker exec -it. А затем я могу сделать python-lo agent bin bash. Я могу, я могу запустить это тоже. И затем, что я могу сделать, если я сделаю команду print env, я могу увидеть все переменные среды, которые установлены внутри этого контейнера. Это всё, что мы настроили в .env. Я очень всеобъемлющ в этом мастер-классе, показывая вам, как вы можете возиться с разными вещами, такими как доступ к вашим контейнерам и просмотр переменных среды, убеждаясь, что всё, что мы указали в .env, действительно работает здесь. И конечно же, это так. Итак, мы хорошо выглядим. Итак, я собираюсь выйти. Мы вернулись на свою корневую машину. Наш контейнер запущен и работает, а также работает на порту 8055. Итак, теперь мы можем вернуться к open web UI в open webyt.dynamus.ai и настроить нашу трубу. Итак, я перейду в панель администратора функций. У нас здесь нет функции. Итак, мне нужно импортировать её. Итак, что я могу сделать, я на самом деле сделаю это здесь. Я просто погуглю, вы можете буквально ввести в Google np pipe open web UI. И это приведёт вас к той, которая у меня есть здесь. Вам просто нужно войти в open web UI. Я нажму на get. И затем на этот раз для моего URL, вместо того, чтобы быть чем-то на localhost, я скопирую свой фактический поддомен здесь. Итак, импорт в open web UI, и вот, пожалуйста, у нас есть труба. Итак, я нажму на сохранить, подтвердить, а затем в значениях здесь я могу установить все свои значения. Итак, я просто нажму на default для всех этих, чтобы получить здесь начальную точку. И затем да, входной чат хороший, вывод хороший, токен bearer - test off, а затем для моего URL это будет http://, а затем это будет имя моего сервиса python local aai agent порт 8055. Позвольте мне правильно это сделать. 8055, а затем /invoke-python-agent. Думаю, я запомнил это. Думаю, мы здесь хорошо. Итак, я возвращаюсь, если я очищу это и запущу docker ps -a, это действительно называется python local AI agent, это имя нашего сервиса, поэтому open web UI может подключаться к агенту напрямую с этим именем, потому что мы разворачиваем его в той же сети docker, и поэтому я думаю, что мы хорошо выглядим. Хорошо, итак, я собираюсь нажать на сохранить. Хорошо, а затем вернуться и начать новый чат, а также, как я много раз говорил, часто помогает просто полностью обновить open UI, полностью open web UI, полностью. Хорошо, вот и всё. А затем теперь вместо, О, я должен фактически включить. Позвольте мне вернуться на панель администратора. Функции, вы должны убедиться, что это отмечено. Э-э, чтобы у нас была включена труба. Теперь возвращаясь сюда, и я также обновлю. У нас выбрана наша труба. И теперь я могу сказать привет. И вот, пожалуйста. Супер, супер быстро. Мы получили ответ от нашего Python-агента. Посмотрите на это. А затем, также перейдя в мою базу данных здесь, вы можете увидеть, что у меня есть все эти сообщения в таблице NAN chat histories. Мы посмотрим на это. Хорошо. А затем мы можем также попросить его выполнить поиск в интернете. Я могу сказать, например, что такое последний LLM от Anthropic, например. Итак, ему нужно выполнить быстрый поиск Seir XNG, используя это. Э-э, последний - это Claude Opus 4. Хорошо. И это было так быстро. У нас нет задержек сети, потому что всё работает в одной сети, и у нас есть абсолютно мощный GPU. Так что это так круто. Также, одна вещь, которую я хочу упомянуть, это то, что иногда, в зависимости от вашего поставщика облачных услуг, CRXNG не будет запускаться успешно. Есть одна вещь, которую вы должны сделать. Это просто очень маленькая мелочь. Если вы столкнулись с этой проблемой, когда контейнер CRXNG постоянно перезапускается, вам нужно перейти к вашему локальному AI пакету и выполнить команду chmod 755 SER XNG. Это папка Seir XNG. Итак, папка CRXNG отвечает за хранение конфигурации, которую мы имеем для CRXNG по умолчанию. Иногда у вас нет разрешений на запись этого файла, и это нужно сделать. Итак, я обновлю раздел устранения неполадок, чтобы включить это. Но да, просто маленькая мелочь. А затем вы можете просто выполнить команду, чтобы снова запустить всё. Э-э, очевидно, вам нужно вернуться на один каталог, а затем вы можете запустить это, э-э, и перезапустить всё. Так легко перезапустить вещи, чтобы изменения вступили в силу для вашего пакета, и затем вы будете готовы. Итак, да, у нас всё работает здесь. Итак, это практически всё для мастер-класса. Теперь у нас есть наш локальный AI пакет, запущенный с агентом и сетью. Мы общаемся с ним напрямую в Open Web UI. Мы прошли через так много всего. Итак, поздравляю с тем, что дошли до этого момента. Хорошо. Я буду совершенно честен. Было очень трудно сделать этот мастер-класс, но это того стоило. И я надеюсь, что вы многое извлекли из этого. Мы действительно всё рассмотрели. Начиная с того, что такое локальный AI и почему мы должны заботиться об этом, до развертывания его на нашей машине, создания агентов, развертывания его в облако и конфигурирования всего с DNS. Как, чувак, мы в основном сделали всё, что вам может понадобиться, чтобы заложить основу для создания всего, что вы хотите, с локальным AI и агентами локального AI. Итак, самое последнее, что я хочу рассмотреть здесь, это всего лишь несколько дополнительных ресурсов, которые у меня есть для вас сейчас, когда вы знаете, как работает локальный AI и как его настроить. Теперь вы хотите углубиться в создание более сложных агентов с его помощью. Итак, есть несколько вещей, которые я хочу отметить для вас. Начиная с моего YouTube-канала, у меня есть много видео на моём канале, которые более подробно рассматривают создание более сложных AI-агентов с локальным AI. И главный ресурс, на который я хочу сейчас указать вас, если вы действительно хотите глубже изучить создание агентов с локальным AI, это ultimate N8N rag AI agent template local AI edition. Итак, это используется локальный AI пакет, и я очень подробно рассматриваю rag и локальный AI, что выходило за рамки этого мастер-класса, потому что это больше о создании агентов, чем о настройке локального AI. Но это отличное видео, в которое можно углубиться. Э-э, и затем я должен снова упомянуть сообщество Dynamus, потому что, чувак, я вложил столько усилий в создание локального AI в качестве основной части этого курса здесь. Итак, как я сказал в начале этого мастер-класса, когда я создаю полного агента на протяжении всего курса AI agent mastery, локальный AI является вариантом всё время, и я показываю, как настроить всё для локального AI, используя локальный AI пакет. Как, я действительно внедрил это во всё в Dynamus и на моём YouTube-канале. Этот локальный AI пакет - это ядро всего, что я делаю с локальным AI. Отличные ресурсы для вас. На этом всё, что у меня есть для этого мастер-класса. Итак, я знаю, что это мой третий раз, когда я говорю это, но поздравляю, если вы дошли до этого момента. Теперь у вас есть всё необходимое, чтобы действительно создавать всё, что вы хотите, с помощью локального AI, и вы можете использовать эти дополнительные ресурсы, чтобы продвинуться ещё дальше. Итак, я надеюсь увидеть вас в сообществе Dynamist. Дайте мне знать в комментариях, если у вас есть какие-либо вопросы по всему, что я здесь рассмотрел, потому что я знаю, что это очень много, очень много для усвоения, но я стараюсь изо всех сил сделать его как можно более усваиваемым. Итак, если вам понравился этот мастер-класс и вы с нетерпением ждёте большего количества материалов о локальном AI или AI-агентах, я был бы очень признателен за лайк и подписку. И на этом я увижу вас в следующем