NFLabs. エンジニアブログ

セキュリティやソフトウェア開発に関する情報を発信する技術者向けのブログです。

Azure OpenAI Serviceでマッチングアプリの返信を自動生成してみた

はじめに

こんにちは。NFLabs. 研究開発部のkuriです。普段はセキュリティトレーニングプラットフォームの開発業務に携わっています。

先日、NTT Generative AI Hack daysというイベントに参加してきました。このイベントは、NTT・Micsoroft合同のGenerative AIをテーマとする、Azure OpenAI Serviceを使ったハッカソンイベントです。

本稿では、Azure OpenAI Serviceの基本的な使い方と、ハッカソンで作成したWebアプリを紹介します。

Azure OpenAI Serviceとは

Azure OpenAI Service*1とは、Microsoft AzureのクラウドプラットフォームでOpenAIを利用できるサービスです。OpenAIは、OpenAI LPによって開発された人工知能のライブラリです。MicrosoftのAzureは、このライブラリをクラウドサービスとして提供し、REST APIを通じてユーザーが簡単にAI機能を自身のアプリケーションに組み込むことができます。

Azure OpenAI Serviceのセットアップ

Azure OpenAI Serviceを始めるには、以下の手順に従って準備を進めます。

  1. Azureサブスクリプションを作成する
  2. Azure OpenAI Serviceへのアクセスを申請する
  3. Azure PortalでAzure OpenAI Serviceリソースを作成する

1. Azureサブスクリプションを作成する

Azure OpenAI Serviceを利用するには、Azureサブスクリプションが必要です。以下のリンクからAzureサブスクリプションを作成します。Micsrosoftアカウントが無い場合、account.microsoft.comからアカウントを作成します。

azure.microsoft.com

2. Azure OpenAI Serviceへのアクセスを申請する

2023年6月現在、Azure OpenAI Serviceは利用制限がされており、以下のリンクからアクセス申請をすることで利用できるようになります。申請後、承認されるとメールが届きます。

Dynamics 365 Customer Voice

3. Azure PortalでAzure OpenAI Serviceリソースを作成する

  1. Azure Portalにアクセスし、Azure OpenAI Serviceが有効化されたサブスクリプションが紐づいているアカウントでサインインします。

  2. リソースの作成をクリックします。

    Azure Portalトップ画面

  3. Azure OpenAIを検索し、選択します。

    Azure OpenAIを検索

  4. プランはAzure OpenAIを選択し、作成をクリックします。

    Azure OpenAIを選択

  5. Azure OpenAIの作成が表示されるので、各項目を以下のように入力します。

    • サブスクリプション:既存のもの
    • リソースグループ:新規作成
    • リージョン:任意 (ここではEast USを選択)
    • 名前:任意
    • 価格レベル:Standard S0

    リソースの設定

  6. 検証に成功すると、作成がクリックできるようになります。作成をクリックすると、Azure OpenAI Serviceリソースが作成されます。

    リソースの作成

ChatGPTモデルを試す

ChatGPTモデルをデプロイして、チャット機能を使ってみます。

モデルのデプロイ

Azure OpenAI Serviceリソースが作成できたので、モデルをデプロイします。今回はgpt-35-turboをデプロイします。gpt-35-turboは、会話型インターフェイス用に設計されたChatGPTモデルです。モデルをデプロイする手順を以下に示します。

  1. Azure OpenAI Studioを開き、左のサイドバーからデプロイをクリックします。

    Azure OpenAI Studioトップ画面

  2. 新しいデプロイの作成をクリックします。

    新しいデプロイの作成

  3. gpt-35-turboのモデルを選択し、デプロイ名を入力して作成します。

    モデルのデプロイ

  4. デプロイが完了すると、一覧に表示されるようになります。

    デプロイしたモデルの一覧

チャットを試す

デプロイしたChatGPTモデルを使って、チャットを試してみます。Azure OpenAI Studioの左のサイドバーからチャットをクリックします。

Azure OpenAI Studioトップ画面

ChatGPTプレイグラウンドが開きます。画面右のConfigurationエリアのデプロイに先ほど作成したモデルを選択します。

ChatGPTプレイグラウンド

これでChatGPTモデル準備ができました。チャットセッションエリアのUser message欄に「ChatGPTは何ができますか?」と入力すると、モデルが回答してくれます。

ChatGPTへ質問を送信

サンプルコードを表示する

チャットセッションエリアのコードの表示をクリックすると、Pythonのサンプルコードが表示されます。また、サンプルコードのスタイルを以下から選ぶことができます。

  • json
  • python
  • c#
  • curl

サンプルコードの表示

ChatGPTをPythonから呼び出す

以下は、コンソールで質問を入力すると、ChatGPTからの回答が表示されるPythonスクリプトです。実行するには、環境変数 OPENAI_API_KEY にAPIキーを設定し、pip install openai でパッケージをインストールしておく必要があります。

import os
import openai
openai.api_type = "azure"
openai.api_base = "https://***.openai.azure.com/"
openai.api_version = "2023-03-15-preview"
openai.api_key = os.getenv("OPENAI_API_KEY")

# 標準入力から質問を受け取る
user_input = input("Enter your question: ")

# ChatGPTで回答を生成する
response = openai.ChatCompletion.create(
  engine="gpt-35-turbo-sample",
  messages=[{"role": "user", "content": user_input}],
  temperature=0.5,
  max_tokens=800,
  top_p=0.95,
  frequency_penalty=0,
  presence_penalty=0,
  stop=None)

# 回答を表示する
print("Answer:", response.choices[0].message['content'])

スクリプトを実行し、コンソールに質問を入力するとChatGPTからの回答が得られます。

$ python3 main.py
Enter your question: 太陽に寿命はありますか?
Answer: はい、太陽にも寿命があります。現在の科学的見解では、太陽は約50億年後に水素の核融合反応が尽き、徐々に膨張して赤色巨星になり、最終的に白色矮星になると考えられています。

ChatGPTにプロンプトを与える

ChatGPTへの命令をプロンプトとして与えると、モデルが応答を生成するときの動作を指示することができます。openai.ChatCompletion.create メソッドのパラメータ messages は、キーが rolecontent からなる辞書のリストで、以下のような構造になっています。

[
  {
    "role": "system",
    "content": "プロンプト"
  },
  {
    "role": "user",
    "content": "モデルに送信するテキスト"
  },
  {
    "role": "assistant",
    "content": "モデルからの応答"
  }
]

role キーには、system, user, assistant のいずれかを指定します。system の場合は、content キーにChatGPTへの命令を指定することでプロンプトを与えることができます。プロンプトとして英語翻訳の命令を与える際の具体例を以下に示します。

messages=[
  {"role": "system", "content": "英語に翻訳してください"},
  {"role": "user", "content": user_input}]

messages の部分を上記に変更してスクリプトを実行し、同じ質問を入力すると、回答が変化し、入力した文章を英語に翻訳した結果が返ってきました。

$ python3 main.py
Enter your question: 太陽に寿命はありますか?
Answer: Does the sun have a lifespan?

このようにプロンプトを与えることで、モデルの振る舞いを指定することができます。

Azure OpenAI Serviceのコスト

Azure OpenAI Serviceを使うことで掛かる料金を紹介します。モデルごとの価格は Azure OpenAI Service - 価格 | Microsoft Azure から確認できます。1000トークンあたりの価格が記載されており、日本語の場合1000トークンは約750文字に相当します。2023年6月時点では、主なモデルの価格は以下のようになっています。

モデル 価格(1000トークンあたり)
Text-Davinci ¥2.809901
Code-Davinci ¥14.049501
ChatGPT (gpt-3.5-turbo) ¥0.280991
GPT-4 8Kコンテキスト ¥8.430

テキストの正確なトークンは OpenAI Platform で計算できます。 また、実際にかかったコストはAzrue Portralのコスト分析から確認できます。

ハッカソンで作成したWebアプリ

ハッカソンで作成したのは、「マッチングアプリで相手とのやり取りをサポートしてくれるWebアプリ」です。マッチングアプリでは、マッチングした相手とチャットをし、ある程度やり取りをしてから直接会うのが一般的な流れになっています。そこで、最初のデートにこぎつけるまでの相手とのやり取りが大変!という人向けに、相手のメッセージを入力すると返信を提案してくれるWebアプリを作成しました。

使い方

  1. Webアプリにブラウザでアクセスすると、自分のプロフィールを入力する欄が表示されます。

    プロフィール登録画面

  2. 登録をクリックすると、設定したプロフィールが表示されます。

    プロフィール設定確認画面

  3. チャットに進むをクリックすると、設定したプロフィールに沿って、最初に送る自己紹介を提案してくれます。

    自己紹介の提案

  4. 相手から来たメッセージをチャット欄に入力すると、適切な返信を提案してくれます。

    返信内容の提案

使用した技術

簡易的に実装するため、ユーザのプロフィールやチャットの履歴のデータはDBに保存せず、Flaskのsessionを使用しました。

  • フロントエンド
    • HTML/CSS
  • バックエンド
    • Python(Flask)
    • Azure OpenAI

与えたプロンプトの内容

ユーザのプロフィールに合わせた自然なメッセージを提案してくれるよう、以下のようなプロンプトを与えています。

system_profile = f'''
  以下のプロフィールを持つ人物になりきって返答してください。
  - 名前は{profile['name']}
  - 年齢は{profile['age']}歳
  - 性別は{profile['gender']}
  - 趣味は{profile['hobby']}
  - 好きな食べ物は{profile['food']}
  - お酒は{profile['alcohol']}
  - 性格は{profile['personality']}
  - 仕事は{profile['job']}

  以下を守って応答を生成してください。
  - 最初のメッセージでは自己紹介をしてください
  - 5回目以降10回目以内のやりとりで、ご飯に行く約束をしてください
  - ご飯に行く場所は必ず自分が提案してください
  - 会話では共通点を探すようにしてください
  - '/start'が入力されたら、自己紹介をしてください
  - 年齢と性別は自己紹介に含めないでください
  '''

工夫したポイント

モデルの応答を生成する openai.ChatCompletion.create メソッドには、複数のパラメータが用意されており、temperature というパラメータを調整することで人間らしい自然な会話を実現しました。temperature は0から1の値を取り、モデルの出力のランダムさを決定するものです。値が小さいと正確かつ単純な応答をし、値が大きいと多彩で創造性のある応答をします。今回は temperature を0.7に設定しています。

また、会話の流れや中身が不自然にならないようにプロンプトで注意事項を与えて調整しています。

ハッカソンの様子

参加したNTT Generative AI Hack daysのイベントの様子を紹介します。

イベントは、docomo R&D OPEN LAB ODAIBAという開催時点では公開前の会場で行われました。NTTグループ各社から20~30チームが参加し、解放感があるスペースで議論を交わしており、和気あいあいとしていて筆者も楽しかったです。コーヒーやドーナツの提供もあり、お腹も満たされました。また、イベント中はMicrosoftのスタッフがいらっしゃり、AzureのサービスやOpenAIの使い方を質問できて非常に勉強になりました。

他チームが作っていたものを以下に紹介します。

  • Cognitive Searchと連携し、通信機器のマニュアルを参照して回答してくれるチャットボット
  • 自然言語をPythonに変換し、自動でデバッグして実行結果を出力してくれるWebアプリ
  • 人が話した内容を言語補完し、補完字幕を表示するARグラス
  • SNSの投稿内容のコンプライアンスチェックをするWebアプリ
  • ChatGPTによるTRPGシミュレーション
  • 自社商品の情報をもとに提案営業をサポートしてくれるWebアプリ

Cognitive Searchなど他のAzureサービスと組み合わせたものもあり、Azure OpenAI Serviceの無数の可能性を感じることができました。

最新の技術を学べるNFLabs.の環境

最後に、NFLabs.が社員に提供しているCloudLabを紹介します。NFLabs.では、社員が最新のクラウドサービスの検証や実験が手軽に行えるように、CloudLabという環境を提供しています。CloudLabでは、Slackによる簡単な申請をするだけで、AWSとAzureを自由に利用できます。社員は、CloudLabを業務でのクラウド環境構築や自身のスキルアップに活用しています。もちろん、今回紹介したAzure OpenAI Serviceも使うことができるため、筆者もこれを活用していくつもりです。

おわりに

今回は、Azure OpenAI Serviceの使い方とそれを活用したWebアプリを紹介しました。Azure OpenAI Studioを使えばサンプルコードを出力してくれるため、とりあえず動かしてみる、ということが出来て非常に便利だなと感じました。今回紹介したものはAzure OpenAI Serviceの一部であり、今後モデルや機能がアップデートされていくと予想されるので、セキュリティトレーニングプラットフォームへの応用など、さらなる活用方法を模索していきたいです。