Если вы хотите создавать код по запросу, делать переводы текстов, генерировать резюме, и при этом всем не хотите чтобы данные уходили в сеть, то вы наверняка задумывались как развернуть свой ИИ(например deepseek) на локальном компьютере. Эта статья расскажет о том, как просто это сделать. Для этого нам понадобится небольшое знание C# и «docker» для ИИ моделей — Ollama.
Для того чтобы реализовать о чем сказано выше, мы воспользуемся обычным консольным приложением .Net, которое у нас будет выступать клиентом. Для создания клиента мы будем использовать относительно недавно появившуюся библиотеку от Microsoft — Microsoft.Extensions.AI. В качестве сервера запускающего ИИ будем использовать Ollama.
Шаг первый. Разворачиваем ИИ через Ollama
Ollama — это программа которая имеет кроссплатформенные реализации (можно запускать на Windows, Linux и Mac). Она создает контейнер для запуска ИИ модели. Доступных моделей очень много, их можно посмотреть на сайте — https://ollama.com/search
ИИ модели которые можно скачать — разные по размеру и по возможностям. Можно скачать модель на пару гигабайт, а можно на полтерабайта. Если хотите использовать «умную модель», придется раскошелиться на хорошее «железо».
Если вы сами создаете ИИ модели, то тоже можете подгрузить их в Ollama (в этой статье не будем рассматривать).
Итак, скачиваем и устанавливаем Ollama — https://ollama.com/
После установки проверим, что все работает. Должен появиться значок в трее.
Теперь установим какую-нибудь доступную на сайте модель. Выбираем модель по ссылке, и копируем строчку для установки в Ollama. Открываем командную строку и пишем:
ollama run phi4-mini
После скачивания модели, она запуститься. Проверим что все работает:
Кстати, чтобы просмотреть все доступные команды, достаточно ввести в командной строке:
ollama
Просмотреть список доступных локально моделей(скачанных) можно так:
ollama list
Если все что описано выше заработало, значит все отлично. Первую часть по разворачиванию сервера ИИ мы выполнили, осталось внедрить ИИ в наше приложение.
Шаг второй. Пишем клиента на .Net
Пространство имен Microsoft.Extensions.AI может работать не только с Ollama, но и с другими ИИ. Например с ChatGPT(мы в этой статье рассматривать не будем). И если вам нужно использовать в приложении несколько ИИ, то все это можно реализовать через общий интерфейс IChatClient.
Итак, создаем консольное Net приложение и устанавливаем nuget пакет Microsoft.Extensions.AI.Ollama.
Я набросал небольшой пример кода, отправляющего и получающего ответы от ИИ установленного в Ollama:
using Microsoft.Extensions.AI; //Для запуска кода необходимо установить Ollama и модель ИИ - "ollama pull phi4-mini" try { //Создаем клиента для Ollama. По умолчанию Ollama запускается по адресу - "http://localhost:11434/" using IChatClient client = new OllamaChatClient(new Uri("http://localhost:11434/"), "phi4-mini"); //Для простоты создаем обертку при помощи паттерна Фасад using var facade = new ChatFacade(client); await facade.Run(); } catch (Exception exception) { //Если что-то пошло не так Console.WriteLine(exception.Message); } /// <summary> /// Обертка для запуска программы /// </summary> public class ChatFacade : IDisposable { private readonly IChatClient _client; private readonly RequestResponseService _requestResponseService; private readonly ConsoleService _consoleService; private readonly string _currentQuery = string.Empty; private const string ExitAi = "/exitAI"; public ChatFacade(IChatClient client) { _client = client; _requestResponseService = new(_client); _consoleService = new(); } public async Task Run() { //Запускаем в цикле запрос к ИИ - ответ от ИИ while (true) { //Получаем с консоли запрос var queryMessage = _consoleService.GetQueryFromConsole(); //Если команда на выход, то завершаем if (queryMessage == ExitAi) break; //Получаем ответ от ИИ var response = _requestResponseService.GetMessageResponseStream(queryMessage); //Выводим ответ от ИИ на консоль await _consoleService.PrintResponseToConsoleAsync(response); } } public void Dispose() { //Не забываем чистить ресурсы при завершении _client.Dispose(); } } /// <summary> /// Непосредственно сервис для запросов клиента к ИИ /// Самая главная часть программы /// </summary> public class RequestResponseService { private readonly IChatClient _client; public RequestResponseService(IChatClient client) { _client = client; } /// <summary> /// Метод для запросов клиента к ИИ /// </summary> /// <param name="queryMessage">Запрос к ИИ</param> /// <returns>Ответ от ИИ</returns> public IAsyncEnumerable<ChatResponseUpdate> GetMessageResponseStream(string queryMessage) { //Посылаем наш запрос ИИ модели(то есть Ollama) // и получаем IAsyncEnumerable return _client.GetStreamingResponseAsync(queryMessage); } } /// <summary> /// Сервис для работы с консолью /// </summary> public class ConsoleService { /// <summary> /// Метод получения запроса с консоли /// </summary> /// <returns>Возвращает строку запроса</returns> public string GetQueryFromConsole() { var queryString = string.Empty; while (string.IsNullOrEmpty(queryString)) { Console.Write("Напиши запрос к ИИ: "); queryString = Console.ReadLine(); } return queryString; } /// <summary> /// Метод для печати ответа ИИ модели /// </summary> /// <param name="response">Ответ от ИИ для печати на консоль</param> public async Task PrintResponseToConsoleAsync(IAsyncEnumerable<ChatResponseUpdate> response) { //Так как используется IAsyncEnumerable, в коде пишем await foreach - асинхронный перебор //с ожиданием получения строки ответа, и вывод на консоль. await foreach (var item in response) { Console.Write(item); } Console.Write(Environment.NewLine); } }
Попробуем запустить приложение и протестировать:
Некоторые пояснения. Этого примера должно хватить для старта. Сам запрос к Ollama выполняется в строчке _client.GetStreamingResponseAsync(queryMessage) На этот запрос возвращается IAsyncEnumerable с ответами от ИИ. Для тех, кто еще не имел дела с IAsyncEnumerable, это набор данных (по аналогии с IEnumerable), которые могут приходить с задержкой по времени (асинхронно).
Эпилог
Первое и важное, что хочу отметить в заключении, это то, что библиотека Microsoft.Extensions.AI.Ollama является устаревшей к моменту выходу статьи. И Microsoft рекомендует OllamaSharp вместо нее. Изменений в коде приведенном выше будет немного при переходе на OllamaSharp.
Я специально не стал приводить в статье громоздких примеров, для того чтобы было доступно даже начинающим разработчикам.
Также есть отличный туториал на английском по новой библиотеке Microsoft.Extensions.AI и ее возможностях, причем с примерами. Он лежит тут. Статья в блоге Microsoft, в которой описание этого туториала, лежит тут.
И наконец, пример проекта приведенного в статье лежит тут.
ссылка на оригинал статьи https://habr.com/ru/articles/940276/
Добавить комментарий