Azure OpenAI Service上のGPT-4を、Pythonから利用する方法を解説します。

Azure OpenAI Serviceは、OpenAIのChatGPTやGPT-4などのモデルを、Microsoft Azure環境で利用できるサービスです。

開発者は、GPTモデルをREST APIとして利用できます。タスクとしては、テキスト生成、質問応答、文章要約、感情分析などが実現できます。また、Azureの拡張性とセキュリティ機能を利用することで、企業向けの開発が可能です。

Azure OpenAI Serviceを利用するためには、Azureサブスクリプションの登録に加え、「Azure OpenAI Serviceのアクセス申請」が必要になります。
(追記:2023年9月に、GPT-4のWaiting Listの申請が不要になりました)

なお実際の申請手順は、以下の記事が分かりやすいです。
参考:Azure OpenAI Serviceを使ってみた〜申請・利用方法〜

Azure OpenAI Service上のGPT-4をPythonから呼び出す

mojahid-mottakin-f2MlXoFMy54-unsplash
Azure OpenAI Serviceに「gpt-3.5-turbo」や「GPT-4」などのモデルをデプロイできれば、次はクライアント側の操作になります。

クライアント側の環境設定

クライアント側の環境は、Python環境とopenaiライブラリが必要です。openaiのライブラリは、「pip install openai」でインストールできます。このクライアント端末から、Azure上のモデルに対して、APIからリクエストして、対話的な応答を取得できます。

リクエスト時は、「APIのタイプ」「APIキー」「エンドポイント」「APIのバージョン」の設定が必要です。Pythonのコードに直書きでも動作できます。
openai.api_type = "azure"
openai.api_key = "..."
openai.api_base = "https://example-endpoint.openai.azure.com"
openai.api_version = "2023-05-15"  # subject to change

ChatCompletion APIとCompletion APIの違い

APIの関数には、ChatCompletion関数とCompletion関数があります。迷われる場合は、ChatCompletion関数を利用しましょう。

ChatCompletion関数は、高性能なgpt-4やgpt-3.5-turboを指定できます。私も実際に、質疑応答タスクで動作比較してみましたが、ChatCompletion関数の方が高性能でした。

参考:Python を使用して OpenAI エンドポイントと Azure OpenAI エンドポイントを切り替える方法

ChatCompletion APIの引数を解説

# ChatGPT APIを呼び出し
response = openai.ChatCompletion.create(
    engine="gpt-4",
    messages=[
{"role": "system", "content": "Provide some context and/or instructions to the model."}, {"role": "user", "content": "Example question goes here."}, {"role": "assistant", "content": "Example answer goes here."}, {"role": "user", "content": "First question/message for the model to actually respond to."}
    ],
)

# 出力結果を表示
print(response['choices'][0]['message']['content'])
・engineは、Azure上でモデルをデプロイした際に命名したデプロイ名を指定する。
・messagesは、一つの辞書が一つのメッセージになる。
 ・roleは役割を指定する。種類は、system, user, assistantの3つ。
  ・system:ChatGPTに与える役を設定
  ・user:ユーザーからChatGPTへの発話
  ・assistant:GPTからの回答(過去の望ましい応答を保存するなどで利用)
 ・contentは、GPTに投げかけたいメッセージを設定

イメージ的には、userは実際にサービスを利用するユーザーの発話で、systemはサービスを作る開発側が事前にGPTに教えておく内容です。つまり、systemにGPTに演じてほしい役割を与えておけば、GPTが役割に沿った回答をしてくれます。ここがかなり強力で、応用性の高い部分だと感じます。

またAPI自体は、かなり簡単に使える印象です。Streamlitなどと組み合わせれば、とても手軽にGPTを搭載したWebアプリの開発が可能になりました。

参考:GPT-35-Turbo および GPT-4 モデルの操作方法を説明します

GPTのプロンプトエンジニアリング

生成AIを利用する上で避けられないのが、プロンプトエンジニアリングです。GPT に対して適切な質問や指示を与えることで、より望ましい結果を引き出す技術のことを指します。

書籍などで様々な情報が出ていますが、まずは、Microsoft社が2023年04月に公開したAzure OpenAI Developers セミナー(Youtube)の動画を視聴されることをおすすめます。22分あたりから、プロンプトエンジニアリングについて解説されています。

また、OpenAIの公式ドキュメントにも、プロンプトエンジニアリングの効果的な戦略・戦術が解説されています。大きく6つの戦略が提示されていますが、個人的に興味深いのは以下の3つでした。
明確な指示を書く: GPTは読者の意図を読み取ることができないため、要望に応じて具体的に指示を出す。
・より適切な回答を得るために、質問に詳細を含める
・モデルにペルソナを採用するよう依頼する
・区切り文字を使用して、入力内容が異なる部分を明確に示す
・タスクを完了するための必要なステップを指定する
・例を示す
・出力の長さを指定する

複雑なタスクをより単純なサブタスクに分割する:複雑なタスクは、単純なタスクのワークフローとして再定義する。
・ユーザーのクエリに対して最も関連性の高い指示を特定するために、インテントで分類する。
・非常に長い会話を必要とする対話アプリケーションでは、前回の対話を要約するかフィルタリングする。
・長い文書を分割して要約し、再帰的に完全な要約を構築する。

GPTに "考える "時間を与える:GPTは答えを導き出すことに時間をかけるより、すぐに答えようとする方が推論ミスが多くなる。答えの前に推論の流れを尋ねることで、GPTはより確実に正しい答えを導くことができる。
・結論を急ぐ前に、モデル自身に解決策を考えさせるように指示する。
・Inner Monologueまたはクエリのシーケンスを使用して、モデルの推論プロセスを隠す。
・前のパスで何かミスがなかったかモデルに尋ねる。
参考:GPT best practices(OpenAI)

とにかく具体的に指示するということですね。タスク分割は、例えば質疑応答タスクを検索タスクと要約タスクに分けるなど、自然言語処理の知見が生きる部分でしょう。

一方、「GPTに考える時間を与える」というのは面白いです。GPTは完璧な存在ではなく、あくまで確率的な存在です。GPTが問題を正しく理解していなかったり、問題は理解しているけど回答が間違っている場合もあります。

また僕たち人間もGPT以上に間違いを起こす存在です。不完全な両者が、いきなり結論を求めてもうまくいきません。なので、お互いに認識があっているか対話することが必要になるわけですね。

GPTのファインチューニング

GPT-3.5 Turboのファインチューニングが利用可能になりました。そして、「GPT-4」のファインチューニングも、2023年11月に実験アクセスプログラムが開始しました。

ファインチューニングとは、事前学習されたモデルに対し、追加データを再学習させてパラメーターを微調整することです。
GPTモデルの場合は、教師ありデータ(回答例のデータセット)から再学習することが基本です。プロンプトに収まりきらない多くの例を学習できるので、高品質な回答が期待できます。タスク特化モデル作成などで効果を発揮します。

しかし、ファインチューニングの学習処理には、計算リソースのコストやデータ準備のコストがかかります。また、必ずしも多くの例を学習できるファインチューニングが、少量の例しか学習できないプロンプトの精度を上回るわけではありません。というのも、ファインチューニングが学ぶ例はGPTの内部パラメータに反映されるため、長期記憶のような形で学習されます。一方プロンプトで学習した例は直前の短期記憶のような形として保持しているためです。

そのため、GPTのモデルを活用するにあたり、プロンプトエンジニアリングのみで行うか、ファインチューニングも実行するかはケースバイケースです。どのようなタスクでファインチューニングが有効かどうかは、これから様々な人たちが検証されていくことと思います。

ファインチューニングの方法は、以下の記事などをご参考ください。
参考:Fine-tuning(OpenAI)

Azure OpenAI Service リファレンスアーキテクチャ

Microsoftは、Azure OpenAI Serviceのリファレンスアーキテクチャを公開しています。このリファレンスアーキテクチャは、マイクロソフトが推奨するAzure OpenAI Serviceの活用シナリオ例とそのアーキテクチャを詳しく説明したドキュメントです。

具体的には、Azure OpenAI Serviceのシナリオ概要、デモUI、サンプルアーキテクチャ、デプロイ方法の詳細が公開されており、賛同パートナーを含めこれから順次追加していくようです。

ドキュメント:https://www.microsoft.com/ja-jp/events/azurebase/contents/
GitHub:https://github.com/Azure-Samples/jp-azureopenai-samples

ドキュメントはPPT形式です。また、GitHubではソースコードが公開されており、Azure Open AI サービスが有効になっているサブスクリプションがあれば、アーキテクチャを丸ごとデプロイできます。

企業が生成AI モデルを組み込む際には、真っ先に参考にされることでしょう。ソースコードからデプロイまでサポートされています。
企業向けにAIやLLMの導入支援するデータ分析企業やSIerが、今後どのように差別化し、存在意義を示していくかは興味深いところです。

ChatGPTとAzure AI Searchを活用した社内文書検索

近年、注目を集めているユースケースの一つとして、ChatGPTとAzure AI Searchを組み合わせた企業内の文書検索が挙げられます。いわゆるRAGです。ChatGPTの直感的なインターフェースを通じて、企業の社内文書を瞬時に検索するアプリケーションが増えています。

実際、Azure OpenAI Service リファレンスアーキテクチャの第5章でも取り上げられています。また、GitHubには具体的なソースコードが公開されており、ご丁寧にAzure環境へのデプロイも容易に行えるようなボタンが提供されています。

検索処理の中核となるAzure Cognitive Searchは、社内文書を検索インデックス化して、キーワード検索やベクトル化検索など様々な検索機能を提供するクラウド検索サービスです。
Cognitive Search は検索時に指定のストレージ内を直接検索するわけではありません。事前に検索対象のファイル群を分析して、 インデックスを作成します。インデックスは、json ファイルのようなキーと値のペアとして格納されます。

RAGの実装方法は、以下の記事をご参考ください。

関連記事:LangChainとRAGで実現する先進的なAIチャットボットの開発

終わりに

Azure OpenAI Serviceの使い方を解説しました。特にChatGPTとAzure Cognitive Searchのコンビは、かなり強力と感じます。企業のマニュアルやサポートの問い合わせをチャット化したり、医学・法学・会計など専門知識のアドバイザーを作成する流れはしばらくメインストリームになりそうです。

GPTとの対話から、これからどんな社会的価値が生まれてくるか楽しみです。