LoginSignup
75

【誰でも簡単ChatGPT、GPT-4 利用】Azure OpenAI Serviceを使ってみた with LINE Bot【Azureでより安心・安全にAI機能が使える】

Last updated at Posted at 2023-04-10

こんにちは、もっちゃんと申します。

今AIの快進撃が続いておりますね!2000年代に第三次AIブームが始まってからはや十数年、ここ数年の進化のスピードは眼を見張るものがあるのではないでしょうか。そしてその話題の中心となっているのがOpenAIやMicrosoftなどが開発を行っているChatGPT,GPT-4といった大規模言語モデルです。
特に今年に入ってからは本当にあまりにも各所でアップデートが巻き起こっていてついていくのに必死な状態ですよね(笑)

また、情報を追うのと同時に実際に触っていくことも大事ですので、今回はAzure OpenAI ServiceのChatGPT、GPT-4を触っていきたいと思います!

※ なお、現時点ではプレビューの機能を扱ったりと事前に利用申請が必要なものがあります。あらかじめご了承ください。

Azure OpenAI Serviceとは

image.png

Azure OpenAI Serviceは、OpenAIの強力な言語モデル(GPT-3、Codex、Embeddingsなど)をREST APIとして使用できるサービスです。これらのモデルは、特定のタスクに合わせて簡単に調整できます。また、現在プレビューですがChatGPT, GPT-4といったかなり高い精度のモデルもあります。 Azure OpenAI Serviceは、重要なエンタープライズ セキュリティ、コンプライアンス、リージョンの可用性など、運用環境のニーズを満たすために、Azure グローバル インフラストラクチャ上で実行されます。
なお、OpenAIとMicrosoftは、人工一般知能(AGI)の開発と普及を目指して、2019年からパートナーシップを結んでいます。

Azure OpenAI Serviceについては下記の方がしっかりまとめてくださってますので参考に見ていただくと良いと思います!

※ なお、この記事を書くにあたってはChatGPT, GPT-4といったOpenAI, MicrosoftAIの恩恵をかなりうけております
  • Azure OpenAI Serviceの概要は新しいBingから持ってきました。(もはやググらずビングってます!)
    ↓↓
    image.png

  • Azure OpenAI ServiceのPlaygroundでGPT-4に、不明点をピンポイントで解決してもらってます!
    ↓↓
    image.png

Azure OpenAI Serviceを使ってみる

事前準備

下記の準備ができている前提でAzure OpenAI ServiceのChatGPT(GPT-3.5)やGPT-4を使うことができます。

モデルのデプロイは例えば下記のようにAzure OpenAI Studio上からも簡単に行えます。

Azure Portalにアクセスします
image.png
Azure OpenAI Serviceの作成ページに移動し作成を行います
image.png

③ Azure OpenAI Studio上に移動してモデルのデプロイ
image.png

まずはPlaygroundで試行錯誤する

Playground利用手順は下記の公式ドキュメントに記載されています。

Azure OpenAI Studio上に移動し、プレイグラウンドへ移動するボタンを押します。
image.png

下記の赤枠の様にシステムメッセージを指定するところからスタートです。今回は英語と日本語を相互翻訳してくれるように設定を行っています。(英語で設定してますが、日本語で設定しても動作しました。)

このようにプログラミングの領域ではなく、自然言語で機能を決定できているのがお分かりいただけたと思います。そして自然言語による指示で、多くの機能を内包しているモデルから欲しい機能を抽出しているという表現もできそうでしょうか?

真ん中の「チャットセッション」の領域で実際に、メッセージを打って動作を確認することができます。しっかり英語と日本語を相互翻訳してくれていますね。

(ちなみにAzure OpenAI Serviceではシステムメッセージのサンプルがいくつか用意もされており、まずはそちらを使って練習することも可能です)

image.png

image.png
(おまけ)プレイグラウンドの他の実行結果

たまたまとあるキャラクターを指定して試してみたところ。キャラクターの指定はあまり重要ではないかもですが、口調の指定をしっかりくんでくれており、なかなか興味深いですね。

338386035_3550074435221864_1460766291132662048_n.png

339554374_1209679416578703_3182664640540300073_n.png

なお、「チャットセッション」にある「コードの表示」を押すと、Playground上で入力した設定を使ってサンプルコードを提示してくれます。Playground上で色々と試して、良さそうだったらサンプルコードを使ってすぐに開発に移れそうですよね^^

image.png

ChatGPT、GPT-4のAPIを使う(開発を行う)

それではさっそく開発でChatGPT、GPT-4のAPIを使っていきましょう。
APIが公開されていることで様々なアプリやサービスなどに活用されていきそうですね。✨

なお、APIの使い方は公式のドキュメントにも記載されています。

ちなみに、ここでは簡単にアプリ化していきたいのでLINEのBotを活用していきます。
LINE Botを作成するにあたっては先にMessaging API チャネルの作成を行っておいてください。

Messaging API チャネルの作成時の入力例

LINE Developersのコンソール画面からチャネルを作成しているところ↓↓
image.png

システム構成図

これから作成していくアプリケーションの構成なんですが、シンプルに書くと下記のイメージです。(今回はとにかく簡単に必要最低限の構成を目指しています、またシステム図に表現しきれていない部分がありますのでご了承ください)
Dockerコンテナ系のサービスを使うとロックインなども無くなるのでわりと好きです。ですので今回は比較的新しいサービスかつ今後にも期待感のあるAzure Container Appsというサービスでアプリケーションを動かしていきます。
ちなみに、Microsoft Azureはコンテナ系のサービスが結構用意されていて充実している感じです!

image.png

それとアプリケーションの作成において、Microsoftではプログラミング不要で開発できるサービスが提供されているなど選択肢が豊富です。
昨今のスピード感、激動の時代においてはこういった選択肢を駆使していち早く形にしていくことがより重要になってきそうですね。
↓↓プログラミング不要のPower Automateでアプリケーションを作った時のツイート

Azure Portal画面でAzureのサービスリソース構築

Azure Portal画面からAzureのサービスリソースを構築していきます。

今回はPortal画面で構築していきますが、Azureのサービスリソースの構築方法はいくつかあります。例えばBicepで構築したパターンもあるので ここに置いておきますね^^

※ ちなみにAzureにはBicepという所謂IaC的にAzureのサービスリソースを構築する方法もあります。私は元々インフラのエンジニアをやっていたこともありPortal画面よりBicepで構築する方が多いです。(ただ慣れるまではPortal画面で構築した方がわかりやすいと思います!)

① まず最初にAzure Container Registryを作成しDockerのイメージをビルド、登録していきます。

公式ドキュメントの手順に従いAzure Container Registryを作成。
↓↓
image.png

次にAzure Cloud Shellを立ち上げて、いくつかファイルの作成とコマンドを実行していきます。Azure Cloud ShellはPortalの右上のアイコンから立ち上げることが可能です。
↓↓
image.png

Azure Cloud Shellが立ち上がったらターミナルに下記のコマンドを打ち込みます。

mkdir work
cd work
touch {Dockerfile,app.py,requirements.txt}

後はAzure Cloud Shellの下記赤枠のアイコンを押すと、エディターが開くので Dockerfile,app.py,requirements.txt 3ファイルをそれぞれ下記の内容で編集します。

image.png

  • Dockerfile
Dockerfileの中身
# For more information, please refer to https://aka.ms/vscode-docker-python
FROM python:3.8-slim

EXPOSE 5000

# Keeps Python from generating .pyc files in the container
ENV PYTHONDONTWRITEBYTECODE=1

# Turns off buffering for easier container logging
ENV PYTHONUNBUFFERED=1

# Install pip requirements
COPY requirements.txt .
RUN python -m pip install -r requirements.txt

WORKDIR /app
COPY . /app

# Creates a non-root user with an explicit UID and adds permission to access the /app folder
# For more info, please refer to https://aka.ms/vscode-docker-python-configure-containers
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser

# During debugging, this entry point will be overridden. For more information, please refer to https://aka.ms/vscode-docker-python-debug
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]
  • requirements.txt
requirements.txtの中身
line-bot-sdk
Flask
gunicorn
openai
  • app.py
app.pyの中身
# -*- coding: utf-8 -*-

#  Licensed under the Apache License, Version 2.0 (the "License"); you may
#  not use this file except in compliance with the License. You may obtain
#  a copy of the License at
#
#       https://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
#  License for the specific language governing permissions and limitations
#  under the License.

import os
import sys
from argparse import ArgumentParser

from flask import Flask, request, abort
from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)
import openai

# https://learn.microsoft.com/en-us/azure/cognitive-services/openai/chatgpt-quickstart?tabs=command-line&pivots=programming-language-python
# openai.api_type = "azure"
# openai.api_base = "https://azureopenaiservices0226.openai.azure.com/"
# openai.api_version = "2022-12-01"
# openai.api_key = "0e10eb24d9c24a79a91c6312fc0e7918"

openai.api_type = "azure"
openai.api_base = os.getenv("OPENAI_API_BASE")
openai.api_version = "2023-03-15-preview"
openai.api_key = os.getenv("OPENAI_API_KEY")

app = Flask(__name__)

# get channel_secret and channel_access_token from your environment variable
channel_secret = os.getenv('LINE_CHANNEL_SECRET', None)
channel_access_token = os.getenv('LINE_CHANNEL_ACCESS_TOKEN', None)
if channel_secret is None:
    print('Specify LINE_CHANNEL_SECRET as environment variable.')
    sys.exit(1)
if channel_access_token is None:
    print('Specify LINE_CHANNEL_ACCESS_TOKEN as environment variable.')
    sys.exit(1)

line_bot_api = LineBotApi(channel_access_token)
handler = WebhookHandler(channel_secret)


@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)

    return 'OK'


@handler.add(MessageEvent, message=TextMessage)
def message_text(event):

    # https://learn.microsoft.com/en-us/azure/cognitive-services/openai/how-to/chatgpt
    # https://github.com/openai/openai-cookbook/blob/main/examples/How_to_format_inputs_to_ChatGPT_models.ipynb
    # response = openai.ChatCompletion.create(
    #     engine="gpt-4", # engine = "deployment_name".
    #     messages=[
    #         {"role": "system", "content": "You are a helpful assistant."},
    #         {"role": "user", "content": "Does Azure OpenAI support customer managed keys?"},
    #         {"role": "assistant", "content": "Yes, customer managed keys are supported by Azure OpenAI."},
    #         {"role": "user", "content": "Do other Azure Cognitive Services support this too?"}
    #     ]
    # )
    ## https://learn.microsoft.com/en-us/azure/cognitive-services/openai/chatgpt-quickstart?tabs=command-line&pivots=programming-language-python
    response = openai.ChatCompletion.create(
        engine=os.getenv("OPENAI_API_ENGINE_NAME"), # engine = "deployment_name".
        messages=[
            {
            "role": "system",
            "content": "You are an AI assistant that converts English into Japanese translation and Japanese into English translation. You will always see both English and Japanese."
            },
            {
            "role": "user",
            "content": "こんにちは"
            },
            {
            "role": "assistant",
            "content": "EN: Hello.\nJA: こんにちは"
            },
            {"role": "user", "content": event.message.text}
        ]
    )

    print(response['choices'][0]['message']['content'])

    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=response['choices'][0]['message']['content'])
    )


if __name__ == "__main__":
    arg_parser = ArgumentParser(
        usage='Usage: python ' + __file__ + ' [--port <port>] [--help]'
    )
    arg_parser.add_argument('-p', '--port', default=8000, help='port')
    arg_parser.add_argument('-d', '--debug', default=False, help='debug')
    options = arg_parser.parse_args()

    app.run(debug=options.debug, port=options.port)

そして下記の az acr buildコマンドを実行してコンテナイメージのビルドと登録をして完了です。公式のドキュメントも参考にすると良いでしょう。

ACR_NAME=<your registry name>
az acr build --registry $ACR_NAME --image helloacrtasks:v1 .
② Azure Container Appsの作成とアプリケーションのエンドポイントURLの取得

Azure Container Appsの作成をしていくのですが、その前にAzure Container RegistryのAdmin user設定をEnabledにしておいてください。

image.png

そしてAzure Container Appsの作成時の設定値は下記の画面キャプチャーの通りです。

image.png

下記赤枠のEnvironment variablesの値は次の表の通りです。

Name Value
LINE_CHANNEL_SECRET  < Messaging API チャネルから取得>
LINE_CHANNEL_ACCESS_TOKEN  < Messaging API チャネルから取得>
OPENAI_API_KEY <先ほど作成したAzure OpenAI Serviceの画面から取得>
OPENAI_API_BASE <先ほど作成したAzure OpenAI Serviceの画面から取得>
OPENAI_API_ENGINE_NAME gpt-4-deployment
Messaging API チャネルから取得
  • LINE_CHANNEL_SECRETの値の取得場所

image.png

  • LINE_CHANNEL_ACCESS_TOKENの値の取得場所

image.png

先ほど作成したAzure OpenAI Serviceの画面から取得
  • OPENAI_API_KEYとOPENAI_API_BASEの値の取得場所

image.png

image.png

Azure Container Appsの作成が完了したら、ApplicationのURLを取得しておきます。(後ほどWebhook URLの設定で使います)

image.png

③ LINE Developersのチャネル管理画面でWebhookの設定を行う

LINE Developersのコンソール画面に戻り、チャネルの管理画面のWebhook設定のところに先ほどAzure Container Appsで取得したApplication URLを設定します、この際にURLの末尾に「/callback」を追加しておいてください。これで設定は全て完了です!

image.png

動作結果

下記が動作させた結果です。ここではグループトークに先ほど作った翻訳Botを入れています。ユーザの英語と日本語がグループトークで飛び交う中、見事に全て英語と日本語の相互翻訳を行っていますね!

翻訳Botを作成するにあたり、開発はあまり難しいことをやっておらず、ChatGPT,GPT-4のAPIを実行したのと、システムメッセージでどのような翻訳の仕方をして欲しいかを自然言語で指定しただけです^^v

とてつもないスピード感とハイクオリティ。これは可能性を感じずにはいられませんね!✨

image.png

まとめ

まずはサラッと一気通貫で触って見ていきましたが、何となくどうゆう物なのか、どうゆう風に使うのか、AIの機能はここまで来ているのか、そしてこんなに簡単に使えるのか、様々感じ取っていただけたのではないでしょうか。このレベルのAIの機能が簡単に組み込めてしまう、AIの民主化も加速してますね。

世間を騒がせているだけあって、様々な既存の事柄を大きく揺るがしうる、そんなイメージを持たれている方もいるのではないでしょうか。
まさに、今ものすごいスピードで導入を進めている方々は過去の既成概念にとらわれない考え方にシフトしているように見えます。

海外ではAIをいかに入れていくかという観点で議論が進んでいるようです。また、昨今のAIは非常に優れている反面、大変複雑な構造をしておりこのスピード感もあいまって、AI関連の課題がいくつか発生してきています。
そのあたりはResponsible AIでもおなじみですが、実はMicrosoftはこの点において非常に力を入れて取り組みを進めている企業です。今回あまり触れませんでしたがAIの優れた機能を安心・安全に使っていくにはMicrosoftの力が必要不可欠になっていきそうですね。

なお、現時点の精度などにとらわれすぎてもいけないかなと思います。精度などはどんどん変わっていくので、今後どうなる可能性がありそうかな?というところまで広く見ていくと、AIネイティブな時代にフィットしていけそうです。

よろしければTwitterのフォローお願いします

AI関連の情報は昨今のアップデートが早すぎるという点の難易度UPそうですが、そもそも扱っている内容が難しく、キャッチアップに結構時間がかかる場合があります。
そういう時はAI関連の情報を発信している人の解説などを追うのが1つ手だと思います。
私もAI関連の情報をツイッターで発信しています。これからも様々な情報発信、イベントなどを開催していく予定ですので、よろしければTwitterのフォローよろしくお願いいたします!

image.png

<アップデートが出たらすぐに試してツイートで共有>
https://twitter.com/kawamoto_LINER/status/1631146349004754945?s=20
image.png

<情報発信!>
https://twitter.com/kawamoto_LINER/status/1636221042216800256?s=20
image.png

<イベント開催>
https://rpacommunity.connpass.com/event/278639/

image.png

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
75