Tworzenie minimalnego asystenta sztucznej inteligencji przy użyciu platformy .NET
W tym przewodniku szybkiego startu dowiesz się, jak utworzyć minimalnego asystenta sztucznej inteligencji przy użyciu bibliotek SDK OpenAI lub Azure OpenAI. Asystenci sztucznej inteligencji udostępniają funkcje agentów, które ułatwiają użytkownikom wykonywanie zadań przy użyciu narzędzi i modeli sztucznej inteligencji. W kolejnych sekcjach poznasz następujące informacje:
- Podstawowe składniki i pojęcia asystentów sztucznej inteligencji
- Jak utworzyć asystenta przy użyciu zestawu Azure OpenAI SDK
- Jak ulepszyć i dostosować możliwości asystenta
Warunki wstępne
- zainstaluj program .NET 8.0 lub nowszy
- programu Visual Studio Code (opcjonalnie)
- Visual Studio (opcjonalnie)
- Klucz dostępu dla modelu OpenAI
- zainstaluj program .NET 8.0 lub nowszy
- programu Visual Studio Code (opcjonalnie)
- Visual Studio (opcjonalnie)
- Dostęp do wystąpienia usługi Azure OpenAI za pośrednictwem tożsamości platformy Azure lub klucza dostępu
Podstawowe składniki asystentów sztucznej inteligencji
Asystenci sztucznej inteligencji bazują na wątkach konwersacyjnych z użytkownikiem. Użytkownik wysyła monity do asystenta w wątku konwersacji, który kieruje asystenta do wykonywania zadań przy użyciu dostępnych narzędzi. Asystenci mogą przetwarzać i analizować dane, podejmować decyzje i wchodzić w interakcje z użytkownikami lub innymi systemami, aby osiągnąć określone cele. Większość asystentów obejmuje następujące składniki:
składników | opis |
---|---|
Asystent | Podstawowy klient i logika sztucznej inteligencji korzystająca z modeli usługi Azure OpenAI, zarządza wątkami konwersacji i korzysta ze skonfigurowanych narzędzi. |
wątek | Sesja konwersacji między asystentem a użytkownikiem. Wątki przechowują wiadomości i automatycznie obsługują skracanie, aby dopasować zawartość do kontekstu modelu. |
komunikat | Komunikat utworzony przez asystenta lub użytkownika. Wiadomości mogą zawierać tekst, obrazy i inne pliki. Komunikaty są przechowywane jako lista w wątku. |
uruchom | Aktywacja asystenta w celu rozpoczęcia działania na podstawie zawartości wątku. Asystent używa konfiguracji i komunikatów wątku do wykonywania zadań przez wywoływanie modeli i narzędzi. W ramach procesu asystent dołącza wiadomości do wątku. |
kroki uruchamiania | Szczegółowa lista kroków, które asystent wykonał w ramach procesu. Asystent może wywoływać narzędzia lub tworzyć komunikaty podczas jego uruchamiania. Analiza etapów uruchamiania pozwala zrozumieć, jak asystent uzyskuje swoje wyniki końcowe. |
Asystentów można również skonfigurować tak, aby używać wielu narzędzi równolegle do wykonywania zadań, w tym następujących:
- Narzędzie do interpretacji kodu: zapisuje i uruchamia kod w środowisku izolowanym (sandbox).
- funkcja wywołująca: uruchamia lokalne funkcje niestandardowe zdefiniowane w kodzie.
- możliwości wyszukiwania plików: rozszerza asystenta o wiedzę spoza modelu.
Zrozumienie tych podstawowych składników i sposobu ich interakcji umożliwia tworzenie i dostosowywanie zaawansowanych asystentów sztucznej inteligencji w celu spełnienia określonych potrzeb.
Tworzenie aplikacji .NET
Wykonaj następujące kroki, aby utworzyć aplikację konsolową platformy .NET i dodać pakiet wymagany do pracy z asystentami:
W oknie terminalu przejdź do pustego katalogu na urządzeniu i utwórz nową aplikację za pomocą polecenia
dotnet new
:dotnet new console -o AIAssistant
Dodaj pakiet OpenAI do swojej aplikacji.
dotnet add package OpenAI --prerelease
Otwórz nową aplikację w wybranym edytorze, na przykład Visual Studio Code.
code .
W oknie terminalu przejdź do pustego katalogu na urządzeniu i utwórz nową aplikację za pomocą polecenia
dotnet new
:dotnet new console -o AIAssistant
Dodaj pakiet Azure.AI.OpenAI do aplikacji:
dotnet add package Azure.AI.OpenAI --prerelease
Otwórz nową aplikację w wybranym edytorze, na przykład Visual Studio Code.
code .
Tworzenie klienta asystenta sztucznej inteligencji
Otwórz plik Program.cs i zastąp zawartość pliku następującym kodem, aby utworzyć wymaganych klientów:
using OpenAI; using OpenAI.Assistants; using OpenAI.Files; using Azure.AI.OpenAI; using Azure.Identity; // Create the OpenAI client OpenAIClient openAIClient = new("your-apy-key"); // For Azure OpenAI, use the following client instead: AzureOpenAIClient azureAIClient = new( new Uri("your-azure-openai-endpoint"), new DefaultAzureCredential()); #pragma warning disable OPENAI001 AssistantClient assistantClient = openAIClient.GetAssistantClient(); OpenAIFileClient fileClient = openAIClient.GetOpenAIFileClient();
Utwórz przykładowy dokument w pamięci i przekaż go do
OpenAIFileClient
:// Create an in-memory document to upload to the file client using Stream document = BinaryData.FromBytes(""" { "description": "This document contains the sale history data for Contoso products.", "sales": [ { "month": "January", "by_product": { "113043": 15, "113045": 12, "113049": 2 } }, { "month": "February", "by_product": { "113045": 22 } }, { "month": "March", "by_product": { "113045": 16, "113055": 5 } } ] } """u8.ToArray()).ToStream(); // Upload the document to the file client OpenAIFile salesFile = fileClient.UploadFile( document, "monthly_sales.json", FileUploadPurpose.Assistants);
Włącz funkcje narzędzi interpretera wyszukiwania plików i kodu za pośrednictwem
AssistantCreationOptions
:// Configure the assistant options AssistantCreationOptions assistantOptions = new() { Name = "Example: Contoso sales RAG", Instructions = "You are an assistant that looks up sales data and helps visualize the information based" + " on user queries. When asked to generate a graph, chart, or other visualization, use" + " the code interpreter tool to do so.", Tools = { new FileSearchToolDefinition(), // Enable the assistant to search and access files new CodeInterpreterToolDefinition(), // Enable the assistant to run code for data analysis }, ToolResources = new() { FileSearch = new() { NewVectorStores = { new VectorStoreCreationHelper([salesFile.Id]), } } }, };
Utwórz
Assistant
i wątek do zarządzania interakcjami między użytkownikiem a asystentem.// Create the assistant Assistant assistant = assistantClient.CreateAssistant("gpt-4o", assistantOptions); // Configure and create the conversation thread ThreadCreationOptions threadOptions = new() { InitialMessages = { "How well did product 113045 sell in February? Graph its trend over time." } }; ThreadRun threadRun = assistantClient.CreateThreadAndRun(assistant.Id, threadOptions); // Sent the prompt and monitor progress until the thread run is complete do { Thread.Sleep(TimeSpan.FromSeconds(1)); threadRun = assistantClient.GetRun(threadRun.ThreadId, threadRun.Id); } while (!threadRun.Status.IsTerminal); // Get the messages from the thread run var messages = assistantClient.GetMessagesAsync( threadRun.ThreadId, new MessageCollectionOptions() { Order = MessageCollectionOrder.Ascending });
Wydrukuj komunikaty i zapisz wygenerowany obraz z konwersacji z asystentem:
await foreach (ThreadMessage message in messages) { // Print out the messages from the assistant Console.Write($"[{message.Role.ToString().ToUpper()}]: "); foreach (MessageContent contentItem in message.Content) { if (!string.IsNullOrEmpty(contentItem.Text)) { Console.WriteLine($"{contentItem.Text}"); if (contentItem.TextAnnotations.Count > 0) { Console.WriteLine(); } // Include annotations, if any foreach (TextAnnotation annotation in contentItem.TextAnnotations) { if (!string.IsNullOrEmpty(annotation.InputFileId)) { Console.WriteLine($"* File citation, file ID: {annotation.InputFileId}"); } if (!string.IsNullOrEmpty(annotation.OutputFileId)) { Console.WriteLine($"* File output, new file ID: {annotation.OutputFileId}"); } } } // Save the generated image file if (!string.IsNullOrEmpty(contentItem.ImageFileId)) { OpenAIFile imageInfo = fileClient.GetFile(contentItem.ImageFileId); BinaryData imageBytes = fileClient.DownloadFile(contentItem.ImageFileId); using FileStream stream = File.OpenWrite($"{imageInfo.Filename}.png"); imageBytes.ToStream().CopyTo(stream); Console.WriteLine($"<image: {imageInfo.Filename}.png>"); } } Console.WriteLine(); }
Znajdź i otwórz zapisany obraz w katalogu bin aplikacji, który powinien wyglądać podobnie do następującego: