Compartir a través de


Creación de una aplicación de chat de Azure AI con .NET

Empiece a trabajar con el kernel semántico mediante la creación de una sencilla aplicación de chat de consola de .NET 8. La aplicación se ejecutará localmente y usará el modelo de OpenAI gpt-35-turbo implementado en una cuenta de Azure OpenAI. Siga estos pasos para aprovisionar Azure OpenAI y aprenda a usar el kernel semántico.

Empiece a trabajar con el SDK de Azure OpenAI de .NET mediante la creación de una sencilla aplicación de chat de consola de .NET 8. La aplicación se ejecutará localmente y usará el modelo de OpenAI gpt-35-turbo implementado en una cuenta de Azure OpenAI. Siga estos pasos para aprovisionar Azure OpenAI y aprenda a usar el SDK de Azure OpenAI de .NET.

Requisitos previos

Implementación de los recursos de Azure

Asegúrese de seguir los Requisitos previos para tener acceso a Azure OpenAI Service, así como a Azure Developer CLI y, a continuación, siga esta guía para establecer el inicio de la aplicación de ejemplo.

  1. Clone el repositorio: dotnet/ai-samples

  2. Desde un terminal o símbolo del sistema, vaya al directorio inicios rápidos.

  3. Esto aprovisiona los recursos de Azure OpenAI. Puede tardar varios minutos en crear el servicio Azure OpenAI e implementar el modelo.

    azd up
    

Nota:

Si ya tiene disponible un servicio Azure OpenAI, puede omitir la implementación y usar ese valor en el Program.cs, preferiblemente de IConfiguration.

Solución de problemas

En Windows, es posible que reciba los siguientes mensajes de error después de ejecutar azd up:

postprovision.ps1 no está firmado digitalmente. El script no se ejecutará en el sistema

El script postprovision.ps1 se ejecuta para establecer los secretos de usuario de .NET usados en la aplicación. Para evitar este error, ejecute el siguiente comando de PowerShell:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

A continuación, vuelva a ejecutar el comando azd up.

Otro posible error:

"pwsh" no se reconoce como un comando interno o externo, programa operable o archivo por lotes. ADVERTENCIA: Error en el enlace "postprovision" con código de salida: "1", Ruta de acceso: ".\infra\post-script\postprovision.ps1". : código de salida: 1 La ejecución continuará desde que ContinueOnError se ha establecido en true.

El script postprovision.ps1 se ejecuta para establecer los secretos de usuario de .NET usados en la aplicación. Para evitar este error, ejecute manualmente el script mediante el siguiente comando de PowerShell:

.\infra\post-script\postprovision.ps1

Las aplicaciones de .NET AI ahora tienen configurados los secretos de usuario y se pueden probar.

Prueba del ejemplo HikerAI

  1. Desde un terminal o símbolo del sistema, vaya al directorio semantic-kernel\02-HikerAI.
  1. Desde un terminal o símbolo del sistema, vaya al directorio azure-openai-sdk\02-HikerAI.
  1. Ahora es el momento de probar la aplicación de consola. Escriba lo siguiente para ejecutar la aplicación:

    dotnet run
    

    Si recibe un mensaje de error, es posible que los recursos de Azure OpenAI no hayan terminado de implementarse. Espere un par de minutos e inténtelo de nuevo.

Descripción del código

Nuestra aplicación usa el paquete Microsoft.SemanticKernel, que está disponible en NuGet, para enviar y recibir solicitudes a un servicio Azure OpenAI implementado en Azure.

Toda la aplicación se encuentra dentro del archivo Program.cs. Las primeras líneas de código cargan secretos y valores de configuración que se establecieron en dotnet user-secrets automáticamente durante el aprovisionamiento de aplicaciones.

// == Retrieve the local secrets saved during the Azure deployment ==========
var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build();
string endpoint = config["AZURE_OPENAI_ENDPOINT"];
string deployment = config["AZURE_OPENAI_GPT_NAME"];
string key = config["AZURE_OPENAI_KEY"];

El servicio AzureOpenAIChatCompletionService facilita las solicitudes y respuestas.

// == Create the Azure OpenAI Chat Completion Service  ==========
AzureOpenAIChatCompletionService service = new(deployment, endpoint, key);

Una vez creado el servicio AzureOpenAIChatCompletionService, proporcionamos más contexto al modelo agregando una solicitud del sistema. Esto indica al modelo cómo quiere que actúe durante la conversación.

// Start the conversation with context for the AI model
ChatHistory chatHistory = new("""
    You are a hiking enthusiast who helps people discover fun hikes in their area. You are upbeat and friendly. 
    You introduce yourself when first saying hello. When helping people out, you always ask them 
    for this information to inform the hiking recommendation you provide:

    1. Where they are located
    2. What hiking intensity they are looking for

    You will then provide three suggestions for nearby hikes that vary in length after you get that information. 
    You will also share an interesting fact about the local nature on the hikes when making a recommendation.
    """);

A continuación, puede agregar un mensaje de usuario al modelo mediante la función AddUserMessage.

Para que el modelo genere una respuesta basada en la solicitud del sistema y la solicitud del usuario, use la función GetChatMessageContentAsync.


// Add user message to chat history
chatHistory.AddUserMessage("Hi! Apparently you can help me find a hike that I will like?");

// Print User Message to console
Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");

// Get response
var response = await service.GetChatMessageContentAsync(chatHistory, new OpenAIPromptExecutionSettings() { MaxTokens = 400 });

Para mantener el historial de chats, asegúrese de agregar la respuesta del modelo.

// Add response to chat history
chatHistory.Add(response);

// Print Response to console
Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");

Personalice la solicitud del sistema y el mensaje del usuario para ver cómo responde el modelo para ayudarle a encontrar una caminata que le guste.

Descripción del código

Nuestra aplicación usa el SDK de cliente Azure.AI.OpenAI, que está disponible en NuGet, para enviar y recibir solicitudes a un servicio Azure OpenAI implementado en Azure.

Toda la aplicación se encuentra dentro del archivo Program.cs. Las primeras líneas de código cargan secretos y valores de configuración que se establecieron en dotnet user-secrets automáticamente durante el aprovisionamiento de aplicaciones.

// == Retrieve the local secrets saved during the Azure deployment ==========
var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build();
string openAIEndpoint = config["AZURE_OPENAI_ENDPOINT"];
string openAIDeploymentName = config["AZURE_OPENAI_GPT_NAME"];
string openAiKey = config["AZURE_OPENAI_KEY"];

// == Creating the AIClient ==========
var endpoint = new Uri(openAIEndpoint);
var credentials = new AzureKeyCredential(openAiKey);

La clase OpenAIClient facilita las solicitudes y respuestas. ChatCompletionOptions especifica parámetros de cómo responderá el modelo.

var openAIClient = new OpenAIClient(endpoint, credentials);

var completionOptions = new ChatCompletionsOptions
{
    MaxTokens = 400,
    Temperature = 1f,
    FrequencyPenalty = 0.0f,
    PresencePenalty = 0.0f,
    NucleusSamplingFactor = 0.95f, // Top P
    DeploymentName = openAIDeploymentName
};

Una vez creado el cliente OpenAIClient, proporcionamos más contexto al modelo agregando una solicitud del sistema. Esto indica al modelo cómo quiere que actúe durante la conversación.

var systemPrompt = 
"""
You are a hiking enthusiast who helps people discover fun hikes in their area. You are upbeat and friendly. 
You introduce yourself when first saying hello. When helping people out, you always ask them 
for this information to inform the hiking recommendation you provide:

1. Where they are located
2. What hiking intensity they are looking for

You will then provide three suggestions for nearby hikes that vary in length after you get that information. 
You will also share an interesting fact about the local nature on the hikes when making a recommendation.
""";

completionOptions.Messages.Add(new ChatRequestSystemMessage(systemPrompt));

A continuación, puede agregar un mensaje de usuario al modelo mediante la clase ChatRequestUserMessage.

Para que el modelo genere una respuesta basada en la solicitud del sistema y la solicitud del usuario, use la función GetChatCompletionsAsync.

string userGreeting = """
Hi! 
Apparently you can help me find a hike that I will like?
""";

completionOptions.Messages.Add(new ChatRequestUserMessage(userGreeting));
Console.WriteLine($"\n\nUser >>> {userGreeting}");

ChatCompletions response = await openAIClient.GetChatCompletionsAsync(completionOptions);
ChatResponseMessage assistantResponse = response.Choices[0].Message;
Console.WriteLine($"\n\nAI >>> {assistantResponse.Content}");
completionOptions.Messages.Add(new ChatRequestAssisstantMessage(assistantResponse.Content)); 

Para mantener el historial de chat o el contexto, asegúrese de agregar la respuesta del modelo como un ChatRequestAssistantMessage.

Personalice la solicitud del sistema y el mensaje del usuario para ver cómo responde el modelo para ayudarle a encontrar una caminata que le guste.

Limpieza de recursos

Cuando ya no necesite la aplicación o los recursos de ejemplo, quite la implementación correspondiente y todos los recursos.

azd down

Pasos siguientes