다음을 통해 공유


JavaScript용 Azure OpenAI 클라이언트 라이브러리 - 버전 1.0.0-beta.12

JavaScript용 Azure OpenAI 클라이언트 라이브러리는 Idiomatic 인터페이스를 제공하고 나머지 Azure SDK 에코시스템과 풍부한 통합을 제공하는 OpenAI의 REST API를 적응한 것입니다. Azure OpenAI 리소스 또는 비 Azure OpenAI 유추 엔드포인트에 연결할 수 있으므로 비 Azure OpenAI 개발에도 적합합니다.

Azure OpenAI용 클라이언트 라이브러리를 사용하여 다음을 수행합니다.

Azure OpenAI는 개발자가 Azure 리소스의 OpenAI 모델에서 콘텐츠를 배포, 조정 및 생성할 수 있는 관리형 서비스입니다.

다음 예제를 확인하세요.

주요 링크:

시작

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"]);

현재 지원되는 환경

사전 요구 사항

Azure OpenAI 리소스를 사용하려면 Azure 구독Azure OpenAI 액세스 권한이 있어야 합니다. 이렇게 하면 Azure OpenAI 리소스를 만들고 연결 URL과 API 키를 모두 가져올 수 있습니다. 자세한 내용은 빠른 시작: Azure OpenAI Service를 사용하여 텍스트 생성 시작을 참조하세요.

Azure OpenAI JS 클라이언트 라이브러리를 사용하여 비 Azure OpenAI에 연결하려면 의 개발자 계정 https://platform.openai.com/에서 API 키가 필요합니다.

@azure/openai 패키지를 설치합니다.

를 사용하여 JavaScript용 Azure OpenAI 클라이언트 라이브러리를 npm설치합니다.

npm install @azure/openai

OpenAIClient 만들기 및 인증

Azure OpenAI에서 사용할 클라이언트를 구성하려면 Azure OpenAI 리소스를 사용할 수 있는 권한이 부여된 해당 키 자격 증명, 토큰 자격 증명 또는 Azure ID 자격 증명과 함께 Azure OpenAI 리소스에 유효한 엔드포인트 URI를 제공합니다. 대신 OpenAI의 서비스에 연결하도록 클라이언트를 구성하려면 OpenAI의 개발자 포털에서 API 키를 제공합니다.

Azure에서 API 키 사용

Azure Portal을 사용하여 OpenAI 리소스로 이동하고 API 키를 검색하거나 아래 Azure CLI 코드 조각을 사용합니다.

참고: API 키를 "구독 키" 또는 "구독 API 키"라고도 합니다.

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

API 키와 엔드포인트가 있으면 클래스를 AzureKeyCredential 사용하여 다음과 같이 클라이언트를 인증할 수 있습니다.

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

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

Azure Active Directory 자격 증명 사용

클라이언트 API 키 인증은 대부분의 예제에서 사용되지만 Azure ID 라이브러리를 사용하여 Azure Active Directory로 인증할 수도 있습니다. 아래에 표시된 DefaultAzureCredential 공급자 또는 Azure SDK와 함께 제공되는 다른 자격 증명 공급자를 사용하려면 패키지를 설치 @azure/identity 하세요.

npm install @azure/identity

또한 새 AAD 애플리케이션을 등록 하고 서비스 주체에 역할을 할당하여 "Cognitive Services User" OpenAI에 대한 액세스 권한을 부여해야 합니다(참고: 와 같은 "Owner" 다른 역할은 필요한 권한을 부여하지 않으며 예제 및 샘플 코드를 실행하는 데만 "Cognitive Services User" 충분합니다).

AAD 애플리케이션의 클라이언트 ID, 테넌트 ID 및 클라이언트 암호 값을 환경 변수로 설정합니다. AZURE_CLIENT_ID, , AZURE_TENANT_IDAZURE_CLIENT_SECRET.

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

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

OpenAI에서 API 키 사용

대신 OpenAI의 서비스에 연결하도록 클라이언트를 구성하려면 OpenAI의 개발자 포털에서 API 키를 제공합니다. API 키가 있으면 클래스를 OpenAIKeyCredential 사용하여 다음과 같이 클라이언트를 인증할 수 있습니다.

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

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

주요 개념

이해해야 할 기본 개념은 완료입니다. 간단히 설명하면 완성은 특정 모델을 사용하여 컨텍스트 및 패턴과 일치하도록 시도하여 출력 텍스트를 제공하는 텍스트 프롬프트 형식의 기능을 제공합니다. 다음 코드 조각은 대략적인 개요를 제공합니다.

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);
});

예제

샘플을 사용하여 다양한 API를 숙지할 수 있습니다.

챗봇 응답 생성

이 예제에서는 DefaultAzureCredential을 사용하여 인증한 다음 입력 채팅 질문 및 메시지에 대한 채팅 응답을 생성합니다.

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);
});

구독 키를 사용하여 여러 완료 생성

이 예제에서는 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);
});

완료를 사용하여 텍스트 요약

이 예제에서는 지정된 입력 프롬프트의 요약을 생성합니다.

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);
});

채팅 도구 사용

도구는 도우미 채팅 완료 요청을 수행하는 과정에서 정의된 함수 및 기타 기능을 호출할 수 있도록 하여 채팅 완료를 확장합니다. 채팅 도구를 사용하려면 먼저 함수 도구를 정의합니다.

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"],
    },
  };

도구가 정의된 경우 채팅 완료 요청에 대한 옵션에 새 정의를 포함합니다.

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);

도우미 하나 이상의 도구를 사용해야 한다고 결정하면 응답 메시지에는 후속 요청에서 "도구 메시지"를 통해 모두 확인해야 하는 하나 이상의 "도구 호출"이 포함됩니다. 새 요청 메시지에 대한 도구 호출의 이 해결은 채팅 완료를 위한 일종의 "콜백"으로 간주될 수 있습니다.

// 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}`);
}

요청을 계속할 수 있도록 도우미 도구 호출 확인을 제공하려면 원래 시스템 및 사용자 메시지, 도구 호출을 포함하는 도우미 응답 및 각 도구를 해결한 도구 메시지를 포함하여 모든 이전 기록 컨텍스트를 제공합니다.

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
  }
}

DALL-E 이미지 생성 모델을 사용하여 이미지 생성

이 예제에서는 지정된 입력 프롬프트에서 일괄 처리 이미지를 생성합니다.

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);
});

비즈니스 데이터 분석

이 예제에서는 비즈니스 데이터에 대한 입력 채팅 질문에 대한 채팅 응답을 생성합니다. 비즈니스 데이터는 Azure Cognitive Search 인덱스로 제공됩니다. Azure Cognitive Search 인덱스 를 데이터 원본으로 설정하는 방법에 대한 자세한 내용은 빠른 시작: 사용자 고유의 데이터를 사용하여 Azure OpenAI 모델과 채팅을 참조하세요.

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);
});

오디오 파일 전사 및 번역

Azure OpenAI의 음성 텍스트 변환 및 번역 기능을 사용하여 다양한 오디오 파일 형식을 전사하고 번역할 수 있습니다. 다음 예제에서는 메서드를 사용하여 오디오를 getAudioTranscription 오디오가 있는 언어로 전사하는 방법을 보여줍니다. 메서드를 사용하여 getAudioTranslation 오디오를 영어로 번역하고 전사할 수도 있습니다.

NodeJS 파일 시스템 API를 사용하여 오디오 파일을 메모리에 로드할 수 있습니다. 브라우저에서 API를 사용하여 FileReader 파일을 로드할 수 있으며 instance 메서드의 arrayBuffer 출력을 getAudioTranscription 메서드에 전달할 수 있습니다.

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);
});

gpt-4-vision-preview를 사용하여 이미지와 채팅

모델을 gpt-4-vision-preview 사용하면 이미지를 입력 구성 요소로 사용하여 채팅을 완료할 수 있습니다.

이렇게 하려면 채팅 완료 요청에 대한 사용자 메시지에 고유한 콘텐츠 항목을 제공합니다.

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"
  }
}]}];

그러면 모델이 대신 더 많은 정보를 finish_detailsfinish_reason보고할 수 있지만 채팅 완료는 평소와 같이 진행됩니다.

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

문제 해결

로깅

로깅을 사용하도록 설정하면 실패에 대한 유용한 정보를 파악하는 데 도움이 될 수 있습니다. HTTP 요청 및 응답 로그를 보려면 AZURE_LOG_LEVEL 환경 변수를 info로 설정합니다. 또는 @azure/logger에서 setLogLevel을 호출하여 런타임에 로깅을 사용하도록 설정할 수 있습니다.

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

setLogLevel("info");

로그를 사용하는 방법에 대한 자세한 내용은 @azure/logger package docs를 참조하세요.