Udostępnij za pośrednictwem


Biblioteka klienta usługi Azure OpenAI dla języka JavaScript — wersja 1.0.0-beta.12

Biblioteka klienta usługi Azure OpenAI dla języka JavaScript to adaptacja interfejsów API REST platformy OpenAI, która zapewnia idiotyczny interfejs i bogatą integrację z resztą ekosystemu zestawu Azure SDK. Może ona łączyć się z zasobami usługi Azure OpenAI lub z punktem końcowym wnioskowania innego niż Azure OpenAI, dzięki czemu jest to doskonały wybór nawet w przypadku programowania w usłudze Azure OpenAI.

Użyj biblioteki klienta dla usługi Azure OpenAI, aby:

Azure OpenAI to usługa zarządzana, która umożliwia deweloperom wdrażanie, dostosowywanie i generowanie zawartości na podstawie modeli OpenAI na zasobach platformy Azure.

Wyewidencjonuj następujące przykłady:

Kluczowe linki:

Wprowadzenie

const { OpenAIClient, AzureKeyCredential } = require("@azure/openai");

const client = new OpenAIClient(
  "https://<resource name>.openai.azure.com/", 
  new AzureKeyCredential("<Azure API key>")
);
const { id, created, choices, usage } = await client.getCompletions("<deployment ID>", ["YOUR PROMPT HERE"]);

Obecnie obsługiwane środowiska

Wymagania wstępne

Jeśli chcesz użyć zasobu usługi Azure OpenAI, musisz mieć subskrypcję platformy Azure i dostęp do usługi Azure OpenAI. Pozwoli to utworzyć zasób usługi Azure OpenAI i uzyskać zarówno adres URL połączenia, jak i klucze interfejsu API. Aby uzyskać więcej informacji, zobacz Szybki start: rozpoczynanie generowania tekstu przy użyciu usługi Azure OpenAI Service.

Jeśli chcesz użyć biblioteki klienta azure OpenAI JS, aby nawiązać połączenie z usługą Inną niż Azure OpenAI, musisz mieć klucz interfejsu API z konta dewelopera pod adresem https://platform.openai.com/.

Instalowanie pakietu @azure/openai

Zainstaluj bibliotekę klienta klienta usługi Azure OpenAI dla języka JavaScript przy użyciu polecenia npm:

npm install @azure/openai

Tworzenie i uwierzytelnianie OpenAIClient

Aby skonfigurować klienta do użycia z usługą Azure OpenAI, podaj prawidłowy identyfikator URI punktu końcowego dla zasobu usługi Azure OpenAI wraz z odpowiednimi poświadczeniami klucza, poświadczeniami tokenu lub poświadczeniami tożsamości platformy Azure, które są autoryzowane do korzystania z zasobu usługi Azure OpenAI. Aby zamiast tego skonfigurować klienta w celu nawiązania połączenia z usługą OpenAI, podaj klucz interfejsu API z portalu deweloperskiego openAI.

Używanie klucza interfejsu API z platformy Azure

Użyj witryny Azure Portal , aby przejść do zasobu OpenAI i pobrać klucz interfejsu API lub użyć poniższego fragmentu wiersza polecenia platformy Azure :

Uwaga: Czasami klucz interfejsu API jest nazywany "kluczem subskrypcji" lub "kluczem interfejsu API subskrypcji".

az cognitiveservices account keys list --resource-group <your-resource-group-name> --name <your-resource-name>

Po utworzeniu klucza interfejsu AzureKeyCredential API i punktu końcowego możesz użyć klasy do uwierzytelnienia klienta w następujący sposób:

const { OpenAIClient, AzureKeyCredential } = require("@azure/openai");

const client = new OpenAIClient("<endpoint>", new AzureKeyCredential("<API key>"));

Używanie poświadczeń usługi Azure Active Directory

Uwierzytelnianie klucza interfejsu API klienta jest używane w większości przykładów, ale można również uwierzytelnić się w usłudze Azure Active Directory przy użyciu biblioteki tożsamości platformy Azure. Aby użyć dostawcy DefaultAzureCredential pokazanego poniżej lub innych dostawców poświadczeń dostarczonych z zestawem Azure SDK, zainstaluj @azure/identity pakiet:

npm install @azure/identity

Należy również zarejestrować nową aplikację usługi AAD i udzielić dostępu do usługi OpenAI, przypisując "Cognitive Services User" rolę do jednostki usługi (uwaga: inne role, takie jak "Owner" nie będą udzielać niezbędnych uprawnień, wystarczy "Cognitive Services User" uruchomić przykłady i przykładowy kod).

Ustaw wartości identyfikatora klienta, identyfikatora dzierżawy i wpisu tajnego klienta aplikacji usługi AAD jako zmienne środowiskowe: AZURE_CLIENT_ID, , AZURE_CLIENT_SECRETAZURE_TENANT_ID.

const { OpenAIClient } = require("@azure/openai");
const { DefaultAzureCredential } = require("@azure/identity");

const client = new OpenAIClient("<endpoint>", new DefaultAzureCredential());

Używanie klucza interfejsu API z interfejsu OpenAI

Aby zamiast tego skonfigurować klienta w celu nawiązania połączenia z usługą OpenAI, podaj klucz interfejsu API z portalu deweloperskiego openAI. Po utworzeniu klucza interfejsu OpenAIKeyCredential API możesz użyć klasy do uwierzytelnienia klienta w następujący sposób:

const { OpenAIClient, OpenAIKeyCredential } = require("@azure/openai");

const client = new OpenAIClient(new OpenAIKeyCredential("<API key>"));

Kluczowe pojęcia

Główną koncepcją do zrozumienia jest uzupełnianie. Krótko wyjaśniono, ukończenie zapewnia jej funkcjonalność w postaci monitu tekstowego, który przy użyciu określonego modelu podejmie próbę dopasowania kontekstu i wzorców, podając tekst wyjściowy. Poniższy fragment kodu zawiera przybliżone omówienie:

const { OpenAIClient, AzureKeyCredential } = require("@azure/openai");

async function main(){
  const client = new OpenAIClient(
  "https://your-azure-openai-resource.com/",
  new AzureKeyCredential("your-azure-openai-resource-api-key"));

  const { choices } = await client.getCompletions(
    "text-davinci-003", // assumes a matching model deployment or model name
    ["Hello, world!"]);

  for (const choice of choices) {
    console.log(choice.text);
  }
}

main().catch((err) => {
  console.error("The sample encountered an error:", err);
});

Przykłady

Możesz zapoznać się z różnymi interfejsami API przy użyciu przykładów.

Generowanie odpowiedzi czatbota

W tym przykładzie uwierzytelnia się przy użyciu wartości DefaultAzureCredential, a następnie generuje odpowiedzi czatu na pytania i wiadomości czatu.

const { OpenAIClient } = require("@azure/openai");
const { DefaultAzureCredential } = require("@azure/identity");

async function main(){
  const endpoint = "https://myaccount.openai.azure.com/";
  const client = new OpenAIClient(endpoint, new DefaultAzureCredential());

  const deploymentId = "gpt-35-turbo";

  const messages = [
    { role: "system", content: "You are a helpful assistant. You will talk like a pirate." },
    { role: "user", content: "Can you help me?" },
    { role: "assistant", content: "Arrrr! Of course, me hearty! What can I do for ye?" },
    { role: "user", content: "What's the best way to train a parrot?" },
  ];

  console.log(`Messages: ${messages.map((m) => m.content).join("\n")}`);

  const events = await client.streamChatCompletions(deploymentId, messages, { maxTokens: 128 });
  for await (const event of events) {
    for (const choice of event.choices) {
      const delta = choice.delta?.content;
      if (delta !== undefined) {
        console.log(`Chatbot: ${delta}`);
      }
    }
  }
}

main().catch((err) => {
  console.error("The sample encountered an error:", err);
});

Generowanie wielu uzupełniania przy użyciu klucza subskrypcji

W tym przykładzie są generowane odpowiedzi tekstowe na monity wejściowe przy użyciu klucza subskrypcji platformy Azure

const { OpenAIClient, AzureKeyCredential } = require("@azure/openai");

async function main(){
  // Replace with your Azure OpenAI key
  const key = "YOUR_AZURE_OPENAI_KEY";
  const endpoint = "https://myaccount.openai.azure.com/";
  const client = new OpenAIClient(endpoint, new AzureKeyCredential(key));

  const examplePrompts = [
    "How are you today?",
    "What is Azure OpenAI?",
    "Why do children love dinosaurs?",
    "Generate a proof of Euler's identity",
    "Describe in single words only the good things that come into your mind about your mother.",
  ];

  const deploymentName = "text-davinci-003";

  let promptIndex = 0;
  const { choices } = await client.getCompletions(deploymentName, examplePrompts);
  for (const choice of choices) {
    const completion = choice.text;
    console.log(`Input: ${examplePrompts[promptIndex++]}`);
    console.log(`Chatbot: ${completion}`);
  }
}

main().catch((err) => {
  console.error("The sample encountered an error:", err);
});

Podsumowywanie tekstu za pomocą uzupełniania

W tym przykładzie jest generowane podsumowanie danego monitu wejściowego.

const { OpenAIClient } = require("@azure/openai");
const { DefaultAzureCredential } = require("@azure/identity")

async function main(){
  const endpoint = "https://myaccount.openai.azure.com/";
  const client = new OpenAIClient(endpoint, new DefaultAzureCredential());

  const textToSummarize = `
    Two independent experiments reported their results this morning at CERN, Europe's high-energy physics laboratory near Geneva in Switzerland. Both show convincing evidence of a new boson particle weighing around 125 gigaelectronvolts, which so far fits predictions of the Higgs previously made by theoretical physicists.

    ""As a layman I would say: 'I think we have it'. Would you agree?"" Rolf-Dieter Heuer, CERN's director-general, asked the packed auditorium. The physicists assembled there burst into applause.
  :`;

  const summarizationPrompt = [`
    Summarize the following text.

    Text:
    """"""
    ${textToSummarize}
    """"""

    Summary:
  `];

  console.log(`Input: ${summarizationPrompt}`);

  const deploymentName = "text-davinci-003";

  const { choices } = await client.getCompletions(deploymentName, summarizationPrompt, {
    maxTokens: 64
  });
  const completion = choices[0].text;
  console.log(`Summarization: ${completion}`);
}

main().catch((err) => {
  console.error("The sample encountered an error:", err);
});

Korzystanie z narzędzi do czatów

Narzędzia rozszerzają uzupełnianie czatu, umożliwiając asystent wywoływanie zdefiniowanych funkcji i innych możliwości w procesie wypełniania żądania ukończenia czatu. Aby użyć narzędzi do czatu, zacznij od zdefiniowania narzędzia funkcji:

const getCurrentWeather = {
    name: "get_current_weather",
    description: "Get the current weather in a given location",
    parameters: {
      type: "object",
      properties: {
        location: {
          type: "string",
          description: "The city and state, e.g. San Francisco, CA",
        },
        unit: {
          type: "string",
          enum: ["celsius", "fahrenheit"],
        },
      },
      required: ["location"],
    },
  };

Po zdefiniowaniu narzędzia dołącz nową definicję do opcji żądania ukończenia czatu:

const deploymentName = "gpt-35-turbo-1106";
const messages = [{ role: "user", content: "What is the weather like in Boston?" }];
const options = {
    tools: [
      {
        type: "function",
        function: getCurrentWeather,
      },
    ],
  };
const events = client.getChatCompletions(deploymentId, messages, options);

Gdy asystent zdecyduje, że należy użyć co najmniej jednego narzędzia, komunikat odpowiedzi zawiera co najmniej jedno "wywołania narzędzi", które muszą zostać rozwiązane za pośrednictwem komunikatów narzędzi w kolejnym żądaniu. Ta rozdzielczość wywołań narzędzi do nowych wiadomości żądań może być uważana za rodzaj "wywołania zwrotnego" na potrzeby uzupełniania czatu.

// Purely for convenience and clarity, this function handles tool call responses.
function applyToolCall({ function: call, id }) {
    if (call.name === "get_current_weather") {
      const { location, unit } = JSON.parse(call.arguments);
      // In a real application, this would be a call to a weather API with location and unit parameters
      return {
        role: "tool",
        content: `The weather in ${location} is 72 degrees ${unit} and sunny.`,
        toolCallId: id,
      }
    }
    throw new Error(`Unknown tool call: ${call.name}`);
}

Aby zapewnić rozwiązania wywołań narzędzi do asystent, aby umożliwić kontynuowanie żądania, podaj wszystkie wcześniejsze konteksty historyczne — w tym oryginalny system i komunikaty użytkownika, odpowiedź z asystent, która zawierała wywołania narzędzi, oraz komunikaty narzędzi, które rozwiązały każde z tych narzędzi — podczas wykonywania kolejnego żądania.

const choice = result.choices[0];
const responseMessage = choice.message;
if (responseMessage?.role === "assistant") {
  const requestedToolCalls = responseMessage?.toolCalls;
  if (requestedToolCalls?.length) {
    const toolCallResolutionMessages = [
      ...messages,
      responseMessage,
      ...requestedToolCalls.map(applyToolCall),
    ];
    const result = await client.getChatCompletions(deploymentName, toolCallResolutionMessages);
    // continue handling the response as normal
  }
}

Generowanie obrazów przy użyciu modeli generowania obrazów DALL-E

W tym przykładzie są generowane obrazy wsadowe z danego monitu wejściowego.

const { OpenAIClient, AzureKeyCredential } = require("@azure/openai");

async function main() {
  const endpoint = "https://myaccount.openai.azure.com/";
  const client = new OpenAIClient(endpoint, new AzureKeyCredential(azureApiKey));

  const deploymentName = "dalle-3";
  const prompt = "a monkey eating a banana";
  const size = "1024x1024";
  const n = 1;
  
  const results = await client.getImages(deploymentName, prompt, { n, size });

  for (const image of results.data) {
    console.log(`Image generation result URL: ${image.url}`);
  }
}

main().catch((err) => {
  console.error("The sample encountered an error:", err);
});

Analizowanie danych biznesowych

W tym przykładzie są generowane odpowiedzi czatu na pytania wejściowe dotyczące danych biznesowych. Dane biznesowe są udostępniane za pośrednictwem indeksu Azure Cognitive Search. Aby dowiedzieć się więcej na temat konfigurowania indeksu Azure Cognitive Search jako źródła danych, zobacz Szybki start: czat z modelami usługi Azure OpenAI przy użyciu własnych danych.

const { OpenAIClient } = require("@azure/openai");
const { DefaultAzureCredential } = require("@azure/identity");

async function main(){
  const endpoint = "https://myaccount.openai.azure.com/";
  const client = new OpenAIClient(endpoint, new DefaultAzureCredential());

  const deploymentId = "gpt-35-turbo";

  const messages = [
    { role: "user", content: "What's the most common customer feedback about our product?" },
  ];

  console.log(`Messages: ${messages.map((m) => m.content).join("\n")}`);

  const events = await client.streamChatCompletions(deploymentId, messages, { 
    maxTokens: 128,
    azureExtensionOptions: {
      extensions: [
        {
          type: "AzureCognitiveSearch",
          endpoint: "<Azure Cognitive Search endpoint>",
          key: "<Azure Cognitive Search admin key>",
          indexName: "<Azure Cognitive Search index name>",
        },
      ],
    },
  });
  for await (const event of events) {
    for (const choice of event.choices) {
      const delta = choice.delta?.content;
      if (delta !== undefined) {
        console.log(`Chatbot: ${delta}`);
      }
    }
  }
}

main().catch((err) => {
  console.error("The sample encountered an error:", err);
});

Transkrypcja i tłumaczenie plików audio

Możliwości tłumaczenia tekstu i tłumaczenia mowy w usłudze Azure OpenAI mogą służyć do transkrypcji i tłumaczenia różnych formatów plików audio. W poniższym przykładzie pokazano, jak używać getAudioTranscription metody do transkrypcji dźwięku w języku, w jakim znajduje się dźwięk. Możesz również przetłumaczyć i transkrybować dźwięk w języku angielskim przy użyciu getAudioTranslation metody .

Plik audio można załadować do pamięci przy użyciu interfejsów API systemu plików NodeJS. W przeglądarce plik można załadować przy użyciu interfejsu FileReader API, a dane wyjściowe arrayBuffer metody wystąpienia można przekazać do getAudioTranscription metody .

const { OpenAIClient, AzureKeyCredential } = require("@azure/openai");
const fs = require("fs/promises");

async function main() {
  console.log("== Transcribe Audio Sample ==");

  const client = new OpenAIClient(endpoint, new AzureKeyCredential(azureApiKey));
  const deploymentName = "whisper";
  const audio = await fs.readFile("< path to an audio file >");
  const result = await client.getAudioTranscription(deploymentName, audio);

  console.log(`Transcription: ${result.text}`);
}

main().catch((err) => {
  console.error("The sample encountered an error:", err);
});

Rozmowa z obrazami przy użyciu biblioteki gpt-4-vision-preview

Model gpt-4-vision-preview umożliwia używanie obrazów jako składników wejściowych do uzupełniania czatu.

W tym celu podaj odrębne elementy zawartości w wiadomościach użytkownika dla żądania ukończenia czatu:

const url = "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg",
const deploymentName = "gpt-4-1106-preview";
const messages: ChatRequestMessage[] = [{role: "user", content: [{
  type: "image_url",
  imageUrl: {
    url,
    detail: "auto"
  }
}]}];

Ukończenie czatu będzie następnie kontynuowane w zwykły sposób, chociaż model może zgłosić więcej informacji finish_details zamiast finish_reason:

const result = await client.getChatCompletions(deploymentName, messages);
console.log(`Chatbot: ${result.choices[0].message?.content}`);

Rozwiązywanie problemów

Rejestrowanie

Włączenie rejestrowania może pomóc odkryć przydatne informacje o błędach. Aby wyświetlić dziennik żądań HTTP i odpowiedzi, ustaw zmienną AZURE_LOG_LEVEL środowiskową na info. Możesz też włączyć rejestrowanie w czasie wykonywania, wywołując polecenie w elemecie setLogLevel@azure/logger:

const { setLogLevel } = require("@azure/logger");

setLogLevel("info");

Aby uzyskać bardziej szczegółowe instrukcje dotyczące włączania dzienników, zapoznaj się z dokumentami dotyczącymi pakietu @azure/rejestratora.