見出し画像

Azure x ChatGPT DEMO の構築

はじめまして!ChatGPT部の河西です。
本記事では、Azure VM 上に ChatGPT で遊べるデモを構築しましたので、その手順を解説していきたいと思います。AWS EC2 上に類似プロダクトをデプロイしているので、そちらをベースに構築していきます。

AWS 上に構築したものはBtoC 向けに設計され、ユーザが LINE チャットで気軽に利用できるようになっています。一方こちらは BtoB シーンでの利用を想定し、web フロントを介してユーザから送られたメッセージに対して返答します。

想定される利用シーンの違いから、プロダクト全体がマイクロソフト製品で完結するように意識して構築しています。オフィスやTeamsなどのMS製品を導入している企業も多いと思いますので、安心してご利用いただけるようになるかと思います。
そのため、AWS 上に構築したものが OpenAI の API を呼び出していたのに対して、こちら は Azure OpenAI Service の API を使用しています。これにより、Azure 機能とのシームレスな統合が実現されています。

それでは、Azure VM の構築手順や必要な設定、API の呼び出し方法などについて詳細に説明していきます。

Azure VM 環境構築

VM の作成

Azure のホームから Virtual Machines > 作成 > Azure 仮想マシン と進みます。仮想マシン作成ページが開き、スペックや OS などの設定を行います。
注意点は VM の region で、Azure OpenAI Service は 2023 年 5 月 19 日現在Japan West 含め多くの region でサポートされていません(参考)。
サポートされていない region で VM を立てても、Azure OpenAI Service の設定 (後述) でセキュアな呼び出しが可能ですが、同 region にしておくと同ー subnet に入れ、 subnet 外からのアクセスを弾く設定にすることができます。

ここでは事前に取り決めていた仕様より下記の設定で作成します。

  • OS : Ubuntu Server 20.04 LTS - Gen 2

  • CPU : Standard B1ms

  • Storage : Premium SSD LRS 32 GiB

セキュリティグループの設定

ネットワークタブでは仮想ネットワークを新規作成して割り当てます。
ここで NIC ネットワーク セキュリティ グループ の項目を Basic から詳細に変更し、セキュリティグループを新規作成します。これをデフォルトのまま進めると全ての IP に対して Port 22 が開けられた状態で VM が作成されてしまい、大変危険なので注意してください。

セキュリティグループを新規作成すると、ネットワーク セキュリティ グループの作成ページへ移動します。このままだと先ほどと同様全ての IP に対して Port 22 が開けられているので、アクセス元 IP アドレスを設定します。

受信規則では外部から VM へのアクセスを設定します。ssh のポートである 22 は VM を操作するユーザ以外アクセスする必要がないので、弾く設定にします。
受信規則にデフォルトで存在する default-allow-ssh を削除し、default-allow-ssh のソースの箇所を IP Address にして、特定の IP Address 以外を許可しない受信規則を新規作成します。
また、後ほど Let's Encrypt を用いて証明書を発行する際に必要なため、ソース Any で 80 番、 443 番を開けておきます。

VM セキュリティグループの設定

他の項目を任意に設定したら作成と確認タブに移動し、作成を押下します。作成時に VM に ssh するための秘密鍵がダウンロードできます。

VM の環境構築

VM 上でサーバを構築していきます。基本的な構築手順は AWS で構築した時と同じで、docker 上で構築されている typescript の web サーバと mysql の DB をdocker-compose によって起動します。

また Let's Encrypt を用いて SSL 証明書を発行します。
この際予めドメインを取得しておく必要があります。ドメイン登録サービスには価格とメンテナンス性などのトレードオフがありますが、ここでは AWS Route 53 にて登録したドメインからサブドメインを発行しています。

sudo certbot certonly --standalone -d ドメイン名

証明書ファイルは /etc/letsencrypt/live/ドメイン名/ に生成されるため、これらを compose.yml にてマウントし、サーバで参照することで SSL 化できます。

Azure OpenAI Service の利用

前提として Microsoft に利用申請が承認されている必要があります。
こちらのフォームから利用申請を行い、返答がメールにて返ってきたタイミングでAzure Portal から Azure OpenAI Service のリソースが作成可能になります。

デプロイの作成

ホーム > Cognitive Services > Azure OpenAI > 作成 と進み、リソースを作成します。VM と同 region にリソースがある場合はネットワークタブにて、VM 作成時に作成した仮想ネットワークを選択することで、リソースへのセキュアなアクセスが可能となります。
別 region で作成した場合は。 プライベートエンドポイントを作成するか、ファイアウォール設定にて VM の IP アドレスを許可することでセキュアにアクセス可能になります。

リソースを作成したらモデルのデプロイへと入ります。ダッシュボードから先程作成したモデルを選択し、Azure OpenAI Studio を開く > デプロイ > 新しいデプロイの作成 と移動します。
デプロイ作成画面では任意のモデルを選択し、デプロイ名を入力します。ここでは gpt3.5-turbo を用います。

Azure OpenAI Service の API 利用

デプロイの作成が完了したらチャットへと移動し、チャットセッションよりコードの表示を押下するとサンプルコードおよび APIのエンドポイント、キーが閲覧できます。
User message に文章を入力しておくと、それを入力した際のサンプルコードが表示されます。右上のプルダウンメニュー (default は Python) より言語を選択してサンプルコードを取得できます。

Azure OpenAI Studio からサンプルコード及び API Key の閲覧
Azure OpenAI Studio にて表示されるサンプルコード

ファイアウォール設定が正しく動作しているかなどのテストのため、プルダウンメニューより curl を選択して Azure VM 上で実行し疎通を確認しましょう。VM 以外の疎通を許可していないホストで実行した際には Access denied のエラーが出ることを確認しておきます。
サンプルコードの画面にて ENDPOINT 及び API_KEY が取得できますので、正しいものに置き換えて実行してください。

curl YOUR_ENDPOINT \
  -H "Content-Type: application/json" \
  -H "api-key: YOUR_API_KEY" \
  -d '{
  "messages": "[{\"role\":\"user\",\"content\":\"Hello\"}]",
  "max_tokens": 800,
  "temperature": 0.7,
  "frequency_penalty": 0,
  "presence_penalty": 0,
  "top_p": 0.95,
  "stop": null
}'

アプリケーションへの組み込み

それでは 上記 curl コマンドによって呼び出せたように API を web フロントから呼び出せるようにします。 axios と呼ばれるライブラリを用いた最もシンプルな実装を下記に示します。

import axios from 'axios';
const recieveTokenMax = 1000

async function callAzureOAIAPI(content: any) {
    const url = process.env.AZURE_OAI_ENDPOINT;
    const apiKey = process.env.AZURE_OAI_KEY;
    const data = {
        messages: content,
        max_tokens: recieveTokenMax,
        temperature: 0.7,
        frequency_penalty: 0,
        presence_penalty: 0,
        top_p: 1,
        stop: ['Human:', 'AI:'],
    };
    const headers = {
        'Content-Type': 'application/json',
        'api-key': apiKey,
    };

    try {
        const response = await axios.post(url, data, { headers });
        console.log(response.data);
        return response.data;
    } catch (error) {
        console.error(error);
    }
}

const content = "[{\"role\":\"user\",\"content\":\"Hello\"}]";
callAzureOAIAPI(content);

API 呼び出し箇所は関数によって定義されており、呼び出し時に content にこちらから送りたいメッセージを任意形式で渡して呼び出すことで実行が可能です。この例ではユーザから Hello と入力された際の呼び出しを示しています。

まとめ

以上より Azure で VM 及び OpenAI Service を立ち上げ、利用するシンプルな例を示しました。Azure OpenAI Service の API を利用することで、Azure 機能とのシームレスな統合が実現されています。
また、ChatGPT と比較すると、無料期間こそないものの同じコストで利用することができ、 GPT 以外のモデルを利用できる利点もあるため企業で本格的に AI サービスを構築したい際に活躍するかと思われます。

それでは良き ChatGPT / Azure ライフを〜!


この記事が気に入ったらサポートをしてみませんか?