{"id":14293,"url":"\/distributions\/14293\/click?bit=1&hash=05c87a3ce0b7c4063dd46190317b7d4a16bc23b8ced3bfac605d44f253650a0f","hash":"05c87a3ce0b7c4063dd46190317b7d4a16bc23b8ced3bfac605d44f253650a0f","title":"\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0435 \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0432 \u043d\u0438 \u043a\u043e\u043f\u0435\u0439\u043a\u0438","buttonText":"","imageUuid":""}

GigaChat API для .NET Core

Всем привет! Если Вы решили подключить в свою разработку на .NET Core поддержку GigaChat, то эта статья для Вас.

Пару слов для предисловия (можете пропустить, если прелюдия не интересует, и переходить к следующему заголовку)

В конце 2023 года я решил в один из своих пет-проектов добавить поддержку GigaChat. Выбор может показаться странным, на фоне YandexGPT и ChatGPT. Но я провел с каждым из них примерно десяток тестов, и, на мое удивление, под мои нужды самые релевантные ответы для рунета дал именно GigaChat.

Что проверял у ИИ: Мне нужно было получить по 5 ассоциаций связанных с запрашиваемым словом. ChatGPT давал ассоциации "западные" или "шаблонные". YandexGPT выдавал не 5 слов, а несколько абзацев в качестве ответа. Да и YandexGPT самый "боязливый" из всех как будто - многие вопросы он считает "нетолерантными", на которые остальные дают ответы, если правильно их разогреть. А вот GigaChat давал наиболее приемлемые для русского слуха ассоциации по моей задаче - поэтому выбор пал на него.

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

Предварительные требования и шаги

1) Получить ключ разработчика.

Для этого нужно зарегистрироваться на сайте разработчиков сбера https://developers.sber.ru/. Далее в рабочем пространстве создать Проект, в котором нужно выбрать "GigaChat API".

Создание нового проекта под GigaChat API

Далее я активировал бесплатный некоммерческий тариф (картинка тут в статье разъезжается по экрану некрасиво, но как уменьшить до нужной ширины - не знаю)

Фримиум

И получил код, который далее используется для подключения к GigaChat API

Получить новые авторизационные данные

2) Скачать сертификат минцифры

Информация о требуемых сертификатах здесь:

Тут все как обычно, скачал, установил

3) Скачать с NuGet библиотеку GigaChatAdapter.

Команды для скачивания приводить не буду, т.к. пока что периодически обновляю версии сборки. Команды с последней версией можно найти на NuGet:

Со временем планирую назвать её GigaChatAdapter .NET Core так как написана под Core. Но получится или нет - пока не знаю.

Работа с библиотекой GigaChatAdapter .NET Core

Перехожу к основной части.

Работу в целом можно разделить на 4 части, как часто происходит с подобными API:

  1. Авторизация

  2. Основная бизнесовая часть (в данном случае общение с ИИ)

  3. Настройки

  4. Пример

1. Авторизация

Чтобы авторизоваться необходимо создать экземпляр авторизации и отправить свои авторизационные данные, а также указать scope (персональное использование, или коммерческое). Если все удачно, то вернется 200 ОК с токеном доступа, который, кстати, дается на 30 минут и который потребуется для отправки запросов, то будет установлен статус Authorization.AuthorizationSuccess == true.

Если же была ошибка на уровне Http или на уровне сервиса GigaChat, то Authorization.AuthorizationSuccess == false, а текст ошибки можно найти в Authorization.ErrorTextIfFailed

Если по какой-то причине возникает ошибка, которой нет в поле ErrorTextIfFailed, то тогда можно углубиться в экземпляр Authorization, получить свойство LastResponse, в нем хранятся HttpResponse (а через него можно выйти и на httpRequest, если нужно) и GigaChatResponse.

using GigaChatAdapter; //Укажите аутентификационные данные из личного кабинета string authData = "{Авторизационные данные из скрины выше}"; //Запуск авторизации в гигачате Authorization auth = new Authorization(authData, GigaChatAdapter.Auth.RateScope.GIGACHAT_API_PERS); var authResult = await auth.SendRequest(); if (authResult.AuthorizationSuccess) { /// Общение с ИИ } else { Console.WriteLine(authResult.ErrorTextIfFailed); }

2. Общение с ИИ

Для отправки запроса нужно создать экземпляр Completion и через него отправить вопрос к ИИ. Ниже в коде это сделано в цикле, чтобы общение было продолжительным, пока не будет закрыто консольное приложение. При этом обращаю внимание, что перед вызовом желательно использовать обновление токена (строка 12) в случае, если у него закончился срок жизни. Т.е. если Вы не хотите контролировать время действия токена, то за Вас это сделает метод UpdateToken(). Он обновляется только в случае, если токен пустой, или не было еще запросов на авторизацию, или же истек срок действия токена. Если же Вам нужно в любом случае обновить его, то тогда в метод можно передать параметр Force = true, и токен обновится при любом раскладе.

Ответы от гигачата приходят в виде объекта "массив данных объекта Choices", поэтому берется последний ответ из всего массива.

if (authResult.AuthorizationSuccess) { Completion completion = new Completion(); Console.WriteLine("Напишите запрос к модели. В ином случае закройте окно, если дальнейшую работу с чатботом необходимо прекратить."); while (true) { //Чтение промпта с консоли var prompt = Console.ReadLine(); //Обновление токена, если он просрочился await auth.UpdateToken(); //отправка промпта var result = await completion.SendRequest(auth.LastResponse.GigaChatAuthorizationResponse?.AccessToken, prompt); if (result.RequestSuccessed) { Console.WriteLine(result.GigaChatCompletionResponse.Choices.LastOrDefault().Message.Content); } else { Console.WriteLine(result.ErrorTextIfFailed); } } }

Отдельно выделю работу с историей чата. Она хранится не у ИИ, а у Вас, пока жив экземпляр сompletion. По умолчанию история сохраняется в поле Сompletion.History (как вопросы, так и ответы) и отправляется вместе с запросом каждый раз. Её можно сериализовать и сохранить куда угодно. При последующих сессиях эту историю можно достать, десериализовать, установить в объект Completion (оно доступно для изменения) и продолжать чатиться с ИИ с историей.

Сompletion.History = {Ваша история}

Если Вы не хотите использовать историю чата, тогда в методе SendRequest() нужно указать аргумент useHistory = false. Тогда вопрос отправляется без истории, он не сохраняется в истории равно как и ответ ИИ.

var result = await completion.SendRequest(auth.LastResponse.GigaChatAuthorizationResponse?.AccessToken, prompt, false);

3. Настройки

GigaChat имеет несколько параметров для настройки ответов. Есть количество ответов, рандомизатор ответов, порог релевантности ответов, ограничения на использование токенов. Подробнее можно найти в описании документации GigaChat'а https://developers.sber.ru/docs/ru/gigachat/api/reference

Чтобы использовать свои настройки, а не дефолтные, необходимо создать экземпляр объекта CompletionSettings и передать его в метод completion.SendRequest().

CompletionSettings settings = new CompletionSettings("GigaChat:latest", 2, null, 4); var result = await completion.SendRequest(auth.LastResponse.GigaChatAuthorizationResponse?.AccessToken, prompt, true, settings);

Единственный минус заключается в том, что указывать нужно все настройки при создании экземпляра CompletionSettings. Это связано с тем, что если разработчик вдруг не передает какие-либо параметры, то можно читать двояко:

  • Установить настройку в дефолтное состояние

  • Не менять предыдущую настройку

Поэтому решил что лучше обязать разработчика каждый раз указывать все настройки

4. Пример использования

Привожу полный код небольшого примера для консольного приложения на .NET Core. Так как он небольшой, не делю его на методы, читается (имхо) и так легко. Его можно копипастить (выполнив предварительные шаги, указанные в статье ранее)

using GigaChatAdapter; using System.Text; //Настройка для работы консоли с кириллицей Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); Console.InputEncoding = Encoding.GetEncoding(1251); Console.OutputEncoding = Encoding.GetEncoding(1251); //Укажите аутентификационные данные из личного кабинета string authData = "{Ваш код}"; //Запуск авторизации в гигачате Authorization auth = new Authorization(authData, GigaChatAdapter.Auth.RateScope.GIGACHAT_API_PERS); var authResult = await auth.SendRequest(); if (authResult.AuthorizationSuccess) { Completion completion = new Completion(); Console.WriteLine("Напишите запрос к модели. В ином случае закройте окно, если дальнейшую работу с чатботом необходимо прекратить."); //RU while (true) { //Чтение промпта с консоли var prompt = Console.ReadLine(); //Обновление токена, если он просрочился await auth.UpdateToken(); //Установка доп.настроек CompletionSettings settings = new CompletionSettings("GigaChat:latest", 2, null, 4); //Отправка промпта (с историей) var result = await completion.SendRequest(auth.LastResponse.GigaChatAuthorizationResponse?.AccessToken, prompt, true, settings); if (result.RequestSuccessed) { foreach (var it in result.GigaChatCompletionResponse.Choices) { Console.WriteLine(it.Message.Content); } } else { Console.WriteLine(result.ErrorTextIfFailed); } } } else { Console.WriteLine(authResult.ErrorTextIfFailed); }

Проблемы и дальнейшее развитие

На текущий момент проблема заключается в том, что в исходном коде у меня присутствует описание всех методов и полей. Можно найти на ГитХабе. Но когда я загрузил сборку через NuGet, у меня в ней пропали все комментарии к методам и свойствам, что печально сказывается на юзабильности. Эту проблему попытаюсь решить в сборке 1.0.4 (отправил ее в нугет 10 минут назад, пока редактировал статью). Кроме того пока не понимаю, могу ли поменять отображаемое в NuGet название, добавив к нему .NET Core, или оно теперь окончательное?

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

Если будет кто-то желающий помочь с развитием библиотеки - велкам :)

0
Комментарии
-3 комментариев
Раскрывать всегда