Ampliación de OpenAI mediante Herramientas y ejecución de una función local con .NET
Empiece a trabajar con la inteligencia artificial 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 gpt-3.5-turbo
de OpenAI, y Herramientas para ampliar las funcionalidades del modelo mediante una llamada a un método .NET local. Siga estos pasos para acceder a OpenAI y obtener información sobre cómo usar el kernel semántico.
Requisitos previos
- SDK de .NET 8.0: Instalación del SDK de .NET 8.0.
- Una clave de API de OpenAI para poder ejecutar este ejemplo.
- 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
.
Empiece a trabajar con la inteligencia artificial 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. Usa Herramientas para ampliar las funcionalidades del modelo mediante una llamada a un método de .NET local. Siga estos pasos para aprovisionar Azure OpenAI y aprenda a usar el kernel semántico.
Requisitos previos
- SDK de .NET 8: Instalación del SDK de .NET 8.
- 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
.
Obtención del proyecto de ejemplo
Clone el repositorio de GitHub que contiene las aplicaciones de ejemplo para todas las guías de inicio rápido:
git clone https://github.com/dotnet/ai-samples.git
Creación de Azure OpenAI Service
El repositorio de GitHub de ejemplo se estructura como una plantilla de Azure Developer CLI (azd
), que azd
puede usar para aprovisionar automáticamente el servicio y el modelo de Azure OpenAI.
Desde un terminal o símbolo del sistema, vaya al directorio src\quickstarts\azure-openai del repositorio de ejemplo.
Ejecute el comando
azd up
para aprovisionar los recursos de Azure OpenAI. Puede tardar varios minutos en crear el servicio Azure OpenAI e implementar el modelo.azd up
azd
también configura los secretos de usuario necesarios para la aplicación de ejemplo, como la clave de acceso de OpenAI.Nota:
Si se produce un error durante la implementación de
azd up
, visite la sección Solución de problemas.
Prueba del ejemplo de excursionista profesional
Desde un terminal o símbolo del sistema, vaya al directorio
azure-openai\04-HikerAIPro
.Ejecute los siguientes comandos para configurar la clave de API de OpenAI como un secreto para la aplicación de ejemplo:
dotnet user-secrets init dotnet user-secrets set OpenAIKey <your-openai-key>
Use el comando
dotnet run
para ejecutar la aplicación:dotnet run
Desde un terminal o símbolo del sistema, vaya al directorio
azure-openai\04-HikerAIPro
.Use el comando
dotnet run
para ejecutar la aplicación:dotnet run
Sugerencia
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.
Comprendiendo el código
La aplicación usa el paquete Microsoft.SemanticKernel
para enviar y recibir solicitudes al servicio OpenAI.
Toda la aplicación está contenida en el archivo Program.cs. En las primeras líneas del código se establecen valores de configuración y se obtiene la clave de OpenAI que se ha establecido antes mediante el comando dotnet user-secrets
.
var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build();
string model = "gpt-3.5-turbo";
string key = config["OpenAIKey"];
La clase Kernel
facilita las solicitudes y respuestas con la ayuda del servicio AddOpenAIChatCompletion
.
// Create a Kernel containing the OpenAI Chat Completion Service
IKernelBuilder b = Kernel.CreateBuilder();
Kernel kernel = b
.AddOpenAIChatCompletion(model, key)
.Build();
La aplicación usa el paquete Microsoft.SemanticKernel
para enviar y recibir solicitudes al servicio OpenAI.
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.
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"];
La clase Kernel
facilita las solicitudes y respuestas con la ayuda del servicio AzureOpenAIChatCompletion
.
// Create a Kernel containing the Azure OpenAI Chat Completion Service
IKernelBuilder b = Kernel.CreateBuilder();
Kernel kernel = b
.AddAzureOpenAIChatCompletion(deployment, endpoint, key)
.Build();
Las funciones ImportPluginFromFunctions
y CreateFromMethod
definen la función local a la que llamará el modelo.
// Add a new plugin with a local .NET function that should be available to the AI model
// For convenience and clarity of into the code, this standalone local method handles tool call responses. It will fake a call to a weather API and return the current weather for the specified location.
kernel.ImportPluginFromFunctions("WeatherPlugin",
[
KernelFunctionFactory.CreateFromMethod(
([Description("The city, e.g. Montreal, Sidney")] string location, string unit = null) =>
{
// Here you would call a weather API to get the weather for the location
return "Periods of rain or drizzle, 15 C";
}, "get_current_weather", "Get the current weather in a given location")
]);
Una vez que se crea el cliente kernel
, el código usa un símbolo del sistema para proporcionar contexto e influir en el tono de finalización y el contenido. Tenga en cuenta cómo se resalta el tiempo en la solicitud del sistema.
ChatHistory chatHistory = new("""
You are a hiking enthusiast who helps people discover fun hikes in their area.
You are upbeat and friendly. Good weather is important for a good hike.
Only make recommendations if the weather is good or if people insist.
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.
""");
La aplicación también agrega un mensaje de usuario al modelo mediante la función AddUserMessage
. La función GetChatMessageContentAsync
envía el historial de chat al modelo para generar una respuesta basada en los mensajes del sistema y del usuario.
chatHistory.AddUserMessage("""
Is the weather is good today for a hike?
If yes, I live in the greater Montreal area and would like an easy hike.
I don't mind driving a bit to get there. I don't want the hike to be over 10 miles round trip.
I'd consider a point-to-point hike.
I want the hike to be as isolated as possible. I don't want to see many people.
I would like it to be as bug free as possible.
""");
Console.WriteLine($"{chatHistory.Last().Role} >>> {chatHistory.Last().Content}");
chatHistory.Add(await service.GetChatMessageContentAsync(
chatHistory,
new OpenAIPromptExecutionSettings()
{
MaxTokens = 400
}));
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.
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
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 IA de .NET ahora tiene configurados los secretos de usuario y se pueden probar.