Azure OpenAI für Entwickler, Teil 2 Azure OpenAI mit REST-API und SDK

Von Dipl. -Ing. Thomas Drilling 4 min Lesedauer

Anbieter zum Thema

Azure OpenAI stellt eine REST-API für die Interaktion und zum Generieren von Antworten bereit. Diese können Entwickler nutzen, um Anwendungen KI-Funktionen hinzuzufügen. Wir zeigen im Folgenden, wie sich komfortabel mit REST-API und Software Development Kits arbeiten lässt.

Testen der Chat-Funktionen im AOAI-Playground.
Testen der Chat-Funktionen im AOAI-Playground.
(Bild: Drilling / Microsoft)

Für REST-Anfragen an den AOAI-Dienst benötigt man einen der Schlüssel.
Für REST-Anfragen an den AOAI-Dienst benötigt man einen der Schlüssel.
(Bild: Drilling / Microsoft)

Bevor eine Interaktion mit der API möglich ist, müssen wir eine OpenAI-Ressource im Azure-Portal erstellen, dort das Azure OpenAI Studio aufrufen, darin ein Modell bereitstellen und dann den Endpunkt und die zugehörigen Schlüssel abrufen. Schlüssel und Endpunkte finden sich in der Azure-OpenAI-Ressource u. a. unter „Ressourcenverwaltung / Schlüssel und Endpunkt“:

Für jeden Aufruf der REST-API werden jeweils der Endpunkt, ein Schlüssel aus der Azure OpenAI-Ressource und der für das bereitgestellte Modell verwendete Name benötigt. Das lässt sich einfach ausprobieren: Wurde ein Modell in einer AOAI-Ressource bereitgestellt, kann man im Falle des Modells vom Typ „Completion“ mit Hilfe einer HTTP-POST-Anforderung eine „Aussage“ an den Dienst senden. Dabei ist „completion“ der Endpunkt, der für Vervollständigungen zuständig ist.

Zum Senden der REST-Anforderung empfiehlt sich ein beliebiges geeignetes Werkzeug, wie z. B. „Postman“ oder die Development-Tools des favorisierten Browsers. Eine HTTP-POST-Anfrage wie …

curl https://<your endpoint>.openai.azure.com/openai/deployments/<your deployment>/chat/completions?api-version=2023-03-15-preview \
   -H "Content-Type: application/json" \
   -H "api-key: <your_api_key" \
   -d "{
      \"prompt\": \"Your favorite Shakespeare is\",
      \"max_tokens\": 5
   }"

… sollte ein vergleichbares JSON-Ergebnis wie das Folgende liefern:

{
   "id": "<id>",
   "object": "text_completion",
   "created": 1679001781,
   "model": "text-davinci-003",
   "choices": [
      {
         "text": "Hamlet",
         "index": 0,
         "logprobs": null,
         "finish_reason": "stop"
      }
   ]
}

Die zu suchende Vervollständigungsantwort findet sich innerhalb von „choices[].text“. Bemerkenswert ist, dass die Antwort auch „finish_reason“ enthält, was in diesem Beispiel „stop“ ist. Eine andere Möglichkeit für „finish_reason“ wären „in length“. Das würde bedeuten, dass der in der Anforderung angegebene Wert für „max_tokens“ überschritten ist. Ein „content_filter“ als Grund würde bedeuten, dass das System von der Äußerung generierte schädliche Inhalte erkannt hat. Ist das Fall, gibt die API-Anforderung einen Fehler zurück.

Testen der Chat-Funktionen im AOAI-Playground.
Testen der Chat-Funktionen im AOAI-Playground.
(Bild: Drilling / Microsoft)

„Normale“ Vervollständigungen sind sicher interessant, viele Entwickler und Entwicklerinnen sind aber wohl mehr an einer Chat-Integration in ihre Anwendung interessiert. Anstelle von „completions“ verwenden sie in ihrer Anforderung dann „chat/completions“. Wer mag, kann das auch vorab im „Playground“ des Azure-OpenAI-Studios ausprobieren.

Der AOAI-Studio kann unter anderem auch die Rohdaten einer Anfrage anzeigen.
Der AOAI-Studio kann unter anderem auch die Rohdaten einer Anfrage anzeigen.
(Bild: Drilling / Microsoft)

Der Playground im Azure OpenAI-Studio ist vielseitig. Beispielsweise können wir hier auf „JSON-Rohdaten anzeigen“ klicken, um selbige sichtbar zu machen.

Die Code-Anzeige im Playground.
Die Code-Anzeige im Playground.
(Bild: Drilling / Microsoft)

Alternativ können wir schauen, was passiert, wenn der Schieber bei „Code anzeigen“ bestätigt wird. Das Tool zeigt dann den Quellecode für „json“, „python“, „c#“ oder „curl“ entsprechend der Auswahl rechts oben. Außerdem findet sich unten den zuständigen Endpunkt, wie in unserem Beispiel „https://driopenai[...]?api-version=2023-07-01-preview“ und den zugehörigen Schlüssel.

Eine REST-Anfrage an AOAI in Postman.
Eine REST-Anfrage an AOAI in Postman.
(Bild: Drilling / Microsoft)

Das Tolle dabei ist, dass sich die benötigen Werte hier bequem kopieren lassen, falls man beispielsweise REST-Anfragen mit einem anderen Werkzeug, wie z. B. den Entwicklertools des Browsers oder mit Postman, an den Endpunkt senden möchte. In Postman sähe das etwa so aus, wie im vorangestellten Bild.

Den benötigten Endpunkt kennen wir ja bereits und können ihn oben im Anfrage-Feld eintragen. Als HTTP-REST-Methode verwenden wir „POST“. Der API-Schlüssel lässt sich im Tab „Authorization“ als Bearer-Token hinterlegen. Den übrigen Quellcode fügen wir im Tab „Body“ im „raw“-Format ein. Der „Typ“ wird in der Werkzeugleiste des Body-Tabs rechts oben auf „JSON“ eingestellt. Auf die gleiche Weise können wir nun weitere Fragen an den Dienst senden und damit das Code-Fragment für unsere Anwendung testen und optimieren.

OpenAI-SDK nutzen

Ergänzend zu den REST-APIs können wir auch über die Python- oder C#-SDKs auf Azure-OpenAI-Modelle zugreifen mit der gleichen Funktionalität. Dazu gilt es lediglich die erforderlichen Bibliotheken zu installieren.

Beim C#-SDK handelt es sich um eine .NET-Adaptation der REST-APIs, die von Microsoft speziell für Azure OpenAI entwickelt wurde. Das SDK kann allerdings nicht nur zum Herstellen einer Verbindung mit Azure-OpenAI-Ressourcen verwendet werden, sondern auch für Nicht-Azure-OpenAI-Endpunkte. Das Python-SDK hingegen wird exklusiv von OpenAI entwickelt und verwaltet. Ersteres stellen wir daher mit …

dotnet add package Azure.AI.OpenAI –prerelease

… zur Verfügung. Die Konfiguration ist für die jeweiligen Sprache leicht unterschiedlich. Jedoch müssen wir für beide letztlich die gleichen Parameter festlegen, nämlich „endpoint“, „key“ sowie den Namen des „Deployments“, welcher beim Senden der Eingabeaufforderung an das Modell als „engine“ bezeichnet wird. Nun gilt es noch, der Applikation die Bibliothek hinzuzufügen und die für den Client erforderlichen Parameter festzulegen. In C# sähe das dann so aus (Quelle Microsoft):

Jetzt Newsletter abonnieren

Täglich die wichtigsten Infos zu Softwareentwicklung und DevOps

Mit Klick auf „Newsletter abonnieren“ erkläre ich mich mit der Verarbeitung und Nutzung meiner Daten gemäß Einwilligungserklärung (bitte aufklappen für Details) einverstanden und akzeptiere die Nutzungsbedingungen. Weitere Informationen finde ich in unserer Datenschutzerklärung.

Aufklappen für Details zu Ihrer Einwilligung
// Add OpenAI library
using Azure.AI.OpenAI;
// Define parameters and initialize the client
string endpoint = "<YOUR_ENDPOINT_NAME>";
string key = "<YOUR_API_KEY>";
    //SDK calls this "engine", but naming it
    // "deploymentName" for clarity
string deploymentName = "<YOUR_DEPLOYMENT_NAME>";
OpenAIClient client = new OpenAIClient(new Uri(endpoint), new AzureKeyCredential(key));

Wurde eine Verbindung mit Azure OpenAI konfiguriert, ist es möglich, eine Eingabeaufforderung an einen der verfügbaren Endpunkte von Completion, ChatCompletion oder Embedding zu senden.

string prompt = "What is Azure OpenAI?";
Response<Completions> completionsResponse = client.GetCompletions(deploymentName, prompt);
string completion = completionsResponse.Value.Choices[0].Text;Console.WriteLine($"Chatbot: {completion}");

Das Antwort-Objekt enthält dann mehrere Werte, wie z. B. total_tokens und finish_reason. Die Bedeutung haben wir oben erklärt.

(ID:49870044)