НЕЙРОСЕТИ

Как использовать Copilot AI для OpenAI API в Visual Studio 2022?

Обновлено 14 января 2025 - 2 месяца назад. Visualstudiomagazine.com.

Double Horizontal frame

Использование Copilot AI для вызова API OpenAI из Visual Studio 2022

Сможет ли продвинутый искусственный интеллект в Visual Studio 2022 превратить сложную IDE в инструмент, пригодный для создания бизнес-приложений не программистами?

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

Некоторые утверждают, что продвинутые ИИ, такие как GitHub Copilot и GitHub Copilot Chat, освобождают разработчиков низкоуровнего кода и позволяют использовать более надежные инструменты разработки, такие как Visual Studio, для создания более производительных приложений.

Я рассмотрю вариант использования доступа к конечным точкам OpenAI API из Visual Studio 2022 для внедрения возможностей искусственного интеллекта в бизнес-приложения .NET.

Для этого вам нужно заплатить OpenAI за доступ к ее API. У меня есть подписка ChatGPT Plus, которая включает в себя возможность генерировать секретные ключи API, которые, как я думал, могут быть использованы для доступа к конечным точкам API OpenAI. Это не так. Доступ к API и ChatGPT - это совершенно разные услуги, которые оплачиваются отдельно. Так зачем ChatGPT Plus секретный ключ API? Аутентификация.

Пополнив свой API-счет, следующим шагом было просто подтверждение доступа к конечным точкам API OpenAI.

OpenAI's Developer Quickstart показывает три способа доступа к конечным точкам OpenAI API: curl, Python или Node.js - никаких упоминаний о .NET или C#.

Я думал, что у Microsoft будет официальный готовый SDK, библиотека или что-то в этом роде для работы с API OpenAI в Visual Studio, ведь компании являются близкими партнерами, благодаря инвестициям Microsoft в OpenAI в размере более 10 миллиардов долларов. Однако этого не произошло.

На самом деле, использование Visual Studio, похоже, не является чем-то особенным для разработчиков OpenAI. На форуме разработчиков OpenAI мало упоминаний о Visual Studio, но много о VS Code, благодаря его расширениям для Python.

В руководстве Microsoft "Начало работы с OpenAI в .NET с апреля 2023 года" объясняется, что доступ к моделям OpenAI, таким как GPT-4, можно получить с помощью REST API и библиотек. Для последних компания рекомендует Azure OpenAI .NET SDK.

Однако для этого нужно подать заявку на доступ к Azure OpenAI Service, что я и сделал. Но Microsoft, похоже, строго проверяет эти заявки, просит указать контактное лицо Microsoft и так далее, так что я не рассчитываю получить доступ в ближайшее время или вообще.

Хотя я ожидал, что официальные .NET/OpenAI SDKS или библиотеки или что-то еще от Microsoft станут готовыми плагинами для Visual Studio, но их не оказалось, я нашел несколько сторонних предложений, которые пытались заполнить этот пробел. Я попробовал один из них, OpenAI.Net, и он выглядел многообещающе, пока при выполнении его примера не возникла ошибка, возвращенная OpenAI, которая ссылалась на устаревшую модель, text-davinci-003.

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

На самом деле, многие учебники и другие руководства, которые я изучал, были устаревшими, потому что в сфере ИИ все меняется очень быстро.

После этой проблемы с устареванием OpenAI.Net я даже не пытался связываться с другими вариантами, такими как OpenAI-API-dotnet или OpenAiNg или Betalgo.OpenAI или OpenAI-DotNet, о которых OpenAI говорит: "Используйте их на свой страх и риск!", потому что не проверяет их корректность или безопасность.

Таким образом, у меня осталась вторая альтернатива после рекомендованного компанией Microsoft варианта Azure с контролем доступа - REST API.

Во-первых, я хотел убедиться, что могу получить доступ к конечным точкам API OpenAI. Я думал, что моя подписка ChatGPT Plus, которая может генерировать секретные ключи API, будет работать. Но это не так.

Я узнал, что доступ к API и доступ к ChatGPT - это две совершенно разные вещи, которые оплачиваются отдельно. Так зачем ChatGPT Plus секретные ключи API? Аутентификация.

В любом случае, мне пришлось отдать больше денег OpenAI, чтобы протестировать их API. Так что вот вам первый совет для гражданских разработчиков: секретный ключ API ChatGPT Plus не дает вам доступа к API.

В кратком руководстве для разработчиков OpenAI показаны три способа доступа к API: curl, Python или Node.js. Никаких упоминаний о .NET или C# (думаю, инвестиции в размере более 10 миллиардов долларов не так уж и далеко зашли).

Я попробовал использовать пример Node.js-кода OpenAI для выполнения API-запроса, который включает в себя создание файла openai-test.js и вызов его из командной строки. Я использовал точно такой же пример кода и точно такую же команду и получил следующую ошибку: "Невозможно использовать оператор import вне модуля".

Затем я попробовал вариант с curl, потому что OpenAI сказал: "curl - это популярный инструмент командной строки, используемый разработчиками для отправки HTTP-запросов к API [sic]. Он требует минимального времени на настройку, но обладает меньшими возможностями, чем полнофункциональные языки программирования, такие как Python или JavaScript".

Это звучало замечательно. Но это также не сработало.

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

Я сократил строки кода до одной строки и получил сообщение об ошибке, что не был предоставлен ключ API, хотя он был указан в команде curl как переменная окружения Windows, которую я установил: $OPENAI_API_KEY, в соответствии с инструкциями OpenAI.

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

Предположительно, есть способ использовать символы ^ в конце каждой строки в команде curl, чтобы она рассматривалась как одна строка, но у меня это не сработало, когда Copilot попробовал это.

В итоге я обнаружил, что установка Git Bash прекрасно справляется с многострочной командой curl.

Поскольку пример с Node.js оказался неудачным, а пример с curl не работает без установки дополнительных программ, я даже не стал пробовать вариант с Python от OpenAI. Я знаю немного C#, но не Python. Очевидно, что C# просто не является популярным в пространстве разработки OpenAI, поэтому VS Code и его суперпопулярные расширения для Python используются гораздо чаще, чем Visual Studio.

Интересно, что в наше время дает более 10 миллиардов долларов, если не хорошая поддержка флагманского языка программирования инвестора?

В любом случае, обратившись к конечной точке OpenAI API и получив в ответ обтекаемые ответы, я протестировал REST-подход в консольном приложении Visual Studio 2022.

Для этого использовались Microsoft Copilot в Интернете, а также GitHub Copilot и GitHub Copilot Chat из IDE.

Сначала я объяснил Microsoft Copilot в Интернете, что я делаю, и спросил, как действовать дальше. Он предоставил мне код Program.cs для начала, а дальше все было просто игрой в Whack-an-Error с молотком ИИ. Сейчас, можно сказать, что было бы лучше спросить Copilot Chat в Visual Studio.

Процесс превратился в повторяющиеся циклы проб и ошибок, когда я запускал код, получал новую ошибку и использовал команды Copilot Chat / slash и ссылки #, чтобы исправить ситуацию.

Иногда Copilot просто бегал по кругу, исправляя одну ошибку и вводя новую, которая исправлялась, но снова вводила старую ошибку, и так далее.

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

Почему он не смог "увидеть" мой текущий код, неизвестно. Я использовал механизм # reference, чтобы указать Copilot Chat на конкретный код, так что кто знает?

С другой стороны, ИИ удивил меня своей способностью заглядывать в другие репозитории и понимать их код. Я спросил Copilot Chat об устаревшей модели OpenAI, когда попытался использовать OpenAI.Net SDK. Мне ответили, что в SDK, возможно, нет прямого способа указать модель в методе TextCompletion.Get . Я указал URL-адрес SDK и попросил его изучить SDK, чтобы выяснить это, и он сказал:

Я изучил Newtonsoft.Json SDK по указанной ссылке на GitHub. К сожалению, оказалось, что этот SDK в настоящее время не поддерживает указание модели для текстовых завершений. Метод TextCompletion.Get не имеет параметра для модели, и нет других методов или свойств, позволяющих задать модель. В качестве обходного пути вы можете использовать API OpenAI напрямую с классом HttpClient, предоставляемым .NET. Это даст вам полный контроль над запросом API и позволит указать модель.

Разумеется, именно так я и поступил в двух консольных приложениях, использующих HTTPClient , одно с Newtonsoft.Json, другое с System.Text.Json (по совпадению, в прошлом месяце Microsoft опубликовала статью "Migrate from Newtonsoft.Json to System.Text.Json").

Возможно, благодаря использованию библиотек Newtonsoft.Json, первое консольное приложение содержало гораздо меньше кода Program.cs:

Код приложения Newtonsoft.Json

	using System.Text; using Newtonsoft.Json; class Program { static async Task Main(string[] args) { var openAiApiKey =
	Environment.GetEnvironmentVariable("OPENAI_API_KEY"); // Получение ключа API из переменных окружения try { string
	prompt = "How long until we reach mars?"; string model = "gpt-3.5-turbo"; // Указываем модель здесь int maxTokens =
	60; var completionRequest = new { model = model, messages = new[] { new { role = "system", content = "Вы - полезный
	помощник." }, new { role = "user", content = prompt } }, max_tokens = maxTokens }; var json =
	JsonConvert.SerializeObject(completionRequest); var data = new StringContent(json, Encoding.UTF8,
	"application/json"); using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", $"Bearer
	{openAiApiKey}"); var response = await client.PostAsync("https://api.openai.com/v1/chat/completions", data); var
	result = await response.Content.ReadAsStringAsync(); Console.WriteLine("Сгенерированный текст:");
	Console.WriteLine(result); } catch (Exception ex) { Console.WriteLine($"Ошибка: {ex.Message}"); } } } 

чем в версии System.Text.Json:

Код приложения System.Text.Json

	using System.Net.Http.Json; using System.Text; using System.Text.Json; public class Program { public static async
	Task Main(string[] args) { var openAiApiKey = Environment.GetEnvironmentVariable("OPENAI_API_KEY"); if
	(string.IsNullOrEmpty(openAiApiKey)) { Console.WriteLine("API ключ не найден в переменных среды."); return; }
	var model = "gpt-3.5-turbo"; // Замените на желаемую модель var maxTokens = 50; // Замените на желаемый максимум
	токенов var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer
	{openAiApiKey}"); var chatRequest = new { model = model, messages = new[] { new { role = "system", content = "Once
	upon a time" }
	}, max_tokens = maxTokens }; var content = new StringContent(JsonSerializer.Serialize(chatRequest), Encoding.UTF8,
	"application/json"); var response = await httpClient.PostAsync("https://api.openai.com/v1/chat/completions",
	content); if (response.IsSuccessStatusCode) { var chatResponse = await response.Content.ReadFromJsonAsync();
	ProcessChatResponse(chatResponse!); // Используйте постфикс null-forgiving для подавления предупреждения }
	else { Console.WriteLine($"Ошибка: {response.StatusCode}"); } }
	static void ProcessChatResponse(ChatResponse chatResponse) { if (chatResponse?.Choices != null &&
	chatResponse.Choices.Any()) { var message = chatResponse.Choices[0].Message; if (message != null) {
	Console.WriteLine("Generated text:"); Console.WriteLine(message.Content); }
	else { Console.WriteLine("В ответе не обнаружено содержимого сообщения."); } } else { Console.WriteLine("В ответе не
	найдено вариантов ответа."); } } } public class ChatResponse { public string? Id { get; set; } public string? Object
	{ get; set; }
	public int Created { get; set; } public string? Model { get; set; }
	public Choice[]? Choices { get; set; }
	public string? SystemFingerprint { get; set; }
	public class Usage { public int PromptTokens { get; set; }
	public int CompletionTokens { get; set; }
	public int TotalTokens { get; set; } }
	public class Choice { public int Index { get; set; }
	public Message? Message { get; set; }
	public object? Logprobs { get; set; }
	// Предполагая, что Logprobs не используется, задаем его как объект public string? FinishReason { get; set; } }
	public class Message { public string? Role { get; set; } public string? Content { get; set; } } }

Эта статья является экземпляром Текста-спринтера. Такие тексты отлично продвигают сайты в ТОП органического поиска Яндекс и Google. Здесь я пишу об этом более подробно.

Nikita Interactive, founder

Искренне Ваш,

Nikita Interactive

Это реальная история!

Раздел с Текстами-спринтерами привлек 18 090 пользователей за 9 месяцев.
На новом сайте. Без ссылок.

Измеримые результаты и устойчивый успех.