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
- SDK de .NET 8.0: Instalación del SDK de .NET 8.0
- Una suscripción a Azure: cree una cuenta gratuita.
- Azure Developer CLI: Instalación o actualización de Azure Developer CLI
- Acceda al servicio Azure OpenAI.
- En Windows, se requiere PowerShell
v7+
. Para validar la versión, ejecutepwsh
en un terminal. Debe devolver la versión actual. Si devuelve un error, ejecute el siguiente comando:dotnet tool update --global PowerShell
.
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.
Clone el repositorio: dotnet/ai-samples
Desde un terminal o símbolo del sistema, vaya al directorio inicios rápidos.
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
- Desde un terminal o símbolo del sistema, vaya al directorio
semantic-kernel\02-HikerAI
.
- Desde un terminal o símbolo del sistema, vaya al directorio
azure-openai-sdk\02-HikerAI
.
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
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de