OpenAI をアプリに統合する

完了

Azure OpenAI には、開発者がアプリケーションに AI 機能を追加するために使用できる、言語固有の SDK と REST API の両方が用意されています。 Azure OpenAI の生成 AI 機能は、"モデル" を通して提供されます。 Azure OpenAI サービスで使用できるモデルは異なるファミリに属しており、それぞれに独自の対象があります。 これらのモデルのいずれかを使うには、Azure OpenAI Service を介してデプロイする必要があります。

Azure OpenAI リソースを作成してモデルをデプロイしたら、アプリを構成できます。

使用可能なエンドポイント

Azure OpenAI には、REST API または Python、C#、JavaScript などで使用できる SDK を介してアクセスできます。 デプロイされたモデルと対話するために使用できるエンドポイントは異なる方法で使用され、特定のエンドポイントでは特定のモデルのみを使用できます。 使用できるエンドポイントは次のとおりです。

  • Completion - 入力プロンプトを受け取り、予測された 1 つ以上の入力候補を生成するモデルです。 スタジオではこのプレイグラウンドが表示されますが、このモジュールでは詳しい説明は省略します。
  • ChatCompletion - チャット会話の形式で入力を受け取り (送信するメッセージでロールが指定されます)、次のチャット入力候補を生成するモデルです。
  • Embeddings - 入力を受け取り、その入力のベクトル表現を返すモデルです。

たとえば、ChatCompletion の入力は、メッセージごとに明確に定義されたロールを持つ会話です。

{"role": "system", "content": "You are a helpful assistant, teaching people about AI."},
{"role": "user", "content": "Does Azure OpenAI support multiple languages?"},
{"role": "assistant", "content": "Yes, Azure OpenAI supports several languages, and can translate between them."},
{"role": "user", "content": "Do other Azure AI Services support translation too?"}

この AI モデルに実際の会話を提供すると、より正確なトーン、言い回し、コンテキストを使って、より良い応答を生成できます。 ChatCompletion エンドポイントを使うと、チャットの履歴と次のユーザー メッセージを送信して、モデルがより現実的な会話を行うことができます。

ChatCompletion では、概要作成やエンティティ抽出など、チャット以外のシナリオにも対応できます。 これを実現するには、短い会話を提供し、システム情報と必要なものをユーザー入力と共に指定します。 たとえば、ジョブの説明を生成する場合は、次の会話入力のような ChatCompletion を提供します。

{"role": "system", "content": "You are an assistant designed to write intriguing job descriptions."},
{"role": "user", "content": "Write a job description for the following job title: 'Business Intelligence Analyst'. It should include responsibilities, required qualifications, and highlight benefits like time off and flexible hours."}

Note

Completion は以前の gpt-3 生成モデルで利用できます。一方、ChatCompletiongpt-4 モデルでのみサポートされるオプションであり、gpt-35-turbo モデルの使用時に望ましいエンドポイントです。

Azure OpenAI REST API を使用する

開発者は、Azure OpenAI で提供されている対話と応答生成のための REST API を使って、アプリケーションに AI 機能を追加できます。 このユニットでは、API の使用、入力、出力の例を示します。

REST API の呼び出しごとに、Azure OpenAI リソースのエンドポイントとキー、そしてデプロイしたモデルに指定した名前が必要です。 以下の例では、次のプレースホルダーが使われます。

プレースホルダー名 Value
YOUR_ENDPOINT_NAME このベース エンドポイントは、Azure portal 内の [キーとエンドポイント] セクション内にあります。 これは、リソースのベース エンドポイントです (https://sample.openai.azure.com/ など)。
YOUR_API_KEY キーは、Azure portal 内の [キーとエンドポイント] セクション内にあります。 リソースにはどちらのキーを使っても構いません。
YOUR_DEPLOYMENT_NAME このデプロイ名は、Azure AI Foundry でモデルをデプロイしたときに指定した名前です。

チャット入力候補

Azure OpenAI リソースにモデルをデプロイしたら、POST 要求を使ってサービスにプロンプトを送信できます。

curl https://YOUR_ENDPOINT_NAME.openai.azure.com/openai/deployments/YOUR_DEPLOYMENT_NAME/chat/completions?api-version=2023-03-15-preview \
  -H "Content-Type: application/json" \
  -H "api-key: YOUR_API_KEY" \
  -d '{"messages":[{"role": "system", "content": "You are a helpful assistant, teaching people about AI."},
{"role": "user", "content": "Does Azure OpenAI support multiple languages?"},
{"role": "assistant", "content": "Yes, Azure OpenAI supports several languages, and can translate between them."},
{"role": "user", "content": "Do other Azure AI Services support translation too?"}]}'

API からの応答は、次の JSON のようになります。

{
    "id": "chatcmpl-6v7mkQj980V1yBec6ETrKPRqFjNw9",
    "object": "chat.completion",
    "created": 1679001781,
    "model": "gpt-35-turbo",
    "usage": {
        "prompt_tokens": 95,
        "completion_tokens": 84,
        "total_tokens": 179
    },
    "choices": [
        {
            "message":
                {
                    "role": "assistant",
                    "content": "Yes, other Azure AI Services also support translation. Azure AI Services offer translation between multiple languages for text, documents, or custom translation through Azure AI Services Translator."
                },
            "finish_reason": "stop",
            "index": 0
        }
    ]
}

REST エンドポイントを使って、他の省略可能な入力パラメーター (temperaturemax_tokens など) を指定できます。 それらのパラメーターのいずれかを要求に含めたい場合は、要求の入力データにそれらを追加します。

埋め込み

埋め込みは、機械学習モデルで簡単に使用できる特定の形式に役立ちます。 入力テキストから埋め込みを生成するには、要求を embeddings エンドポイントに POST します。

curl https://YOUR_ENDPOINT_NAME.openai.azure.com/openai/deployments/YOUR_DEPLOYMENT_NAME/embeddings?api-version=2022-12-01 \
  -H "Content-Type: application/json" \
  -H "api-key: YOUR_API_KEY" \
  -d "{\"input\": \"The food was delicious and the waiter...\"}"

埋め込みを生成するときは、必ず Azure OpenAI の埋め込み用のモデルを使ってください。 これらのモデルは、探している機能に応じて、text-embedding または text-similarity で始まります。

API からの応答は、次の JSON のようになります。

{
  "object": "list",
  "data": [
    {
      "object": "embedding",
      "embedding": [
        0.0172990688066482523,
        -0.0291879814639389515,
        ....
        0.0134544348834753042,
      ],
      "index": 0
    }
  ],
  "model": "text-embedding-ada:002"
}

SDK で Azure OpenAI を使用する

REST API に加えて、ユーザーは C# と Python SDK を使って Azure OpenAI モデルにアクセスすることもできます。 REST とこれらの SDK のどちらでも同じ機能を使用できます。

このユニットで説明する両方の SDK では、Azure OpenAI リソースのエンドポイントとキー、そしてデプロイしたモデルに指定した名前が必要です。 以下のコード スニペットでは、次のプレースホルダーが使われます。

プレースホルダー名 Value
YOUR_ENDPOINT_NAME このベース エンドポイントは、Azure portal 内の [キーとエンドポイント] セクション内にあります。 これは、リソースのベース エンドポイントです (https://sample.openai.azure.com/ など)。
YOUR_API_KEY キーは、Azure portal 内の [キーとエンドポイント] セクション内にあります。 リソースにはどちらのキーを使っても構いません。
YOUR_DEPLOYMENT_NAME このデプロイ名は、モデルをデプロイしたときに指定した名前です。

ライブラリのインストール

最初に、使用する言語のクライアント ライブラリをインストールします。 C# SDK は REST API を .NET に適応したものであり、Azure OpenAI 専用に構築されていますが、Azure OpenAI リソースまたは Azure 以外の OpenAI エンドポイントへの接続に使用できます。 Python SDK は OpenAI によって構築および保守されています。

dotnet add package Azure.AI.OpenAI --version <insert preferred version>
pip install openai

Azure OpenAI リソースにアクセスするようにアプリを構成する

構成は言語ごとに若干異なりますが、どちらでも同じパラメーターを設定する必要があります。 必要なパラメーターは、endpointkey、および deployment name です。

ライブラリをアプリに追加し、クライアントに必要なパラメーターを設定します。

// Add Azure OpenAI packages
using Azure.AI.OpenAI;
using OpenAI.Chat;

// Define parameters and initialize the client
string endpoint = "<YOUR_ENDPOINT_NAME>";
string key = "<YOUR_API_KEY>";
string deploymentName = "<YOUR_DEPLOYMENT_NAME>"; 

AzureOpenAIClient azureClient = new AzureOpenAIClient(new Uri(endpoint), new AzureKeyCredential(key));
ChatClient chatClient = azureClient.GetChatClient(deploymentName);
# Add OpenAI library
from openai import AzureOpenAI

deployment_name = '<YOUR_DEPLOYMENT_NAME>' 

# Initialize the Azure OpenAI client
client = AzureOpenAI(
        azure_endpoint = '<YOUR_ENDPOINT_NAME>', 
        api_key='<YOUR_API_KEY>',  
        api_version="20xx-xx-xx" #  Target version of the API, such as 2024-02-15-preview
        )

Azure OpenAI リソースを呼び出す

Azure OpenAI への接続を構成したら、モデルにプロンプトを送信します。

// Get chat completion
ChatCompletion completion = chatClient.CompleteChat(
    [
        new SystemChatMessage(systemMessage),
        new UserChatMessage(userMessage),
    ]);

// Print the response
Console.WriteLine($"{completion.Role}: {completion.Content[0].Text}");
response = client.chat.completions.create(
    model=deployment_name,
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "What is Azure OpenAI?"}
    ]
)
generated_text = response.choices[0].message.content

# Print the response
print("Response: " + generated_text + "\n")

応答オブジェクトには、total_tokensfinish_reason など、いくつかの値が含まれています。 応答オブジェクトからの入力候補は、次の入力候補のようになります。

"Azure OpenAI is a cloud-based artificial intelligence (AI) service that offers a range of tools and services for developing and deploying AI applications. Azure OpenAI provides a variety of services for training and deploying machine learning models, including a managed service for training and deploying deep learning models, a managed service for deploying machine learning models, and a managed service for managing and deploying machine learning models."

C# と Python のどちらでも、呼び出しに、temperaturemax_tokens などの省略可能なパラメーターを含めることができます。