Как использовать Copilot AI для OpenAI API в Visual Studio 2022?
Обновлено 14 января 2025 - 2 месяца назад. Visualstudiomagazine.com.
Использование 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
Это реальная история!
Раздел с Текстами-спринтерами привлек 18 090 пользователей за 9 месяцев.
На новом сайте. Без ссылок.
Измеримые результаты и устойчивый успех.