NFLabs. エンジニアブログ

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

Azure OpenAI + Add Your Dataによる自社データを基に回答可能な閉域AIサービスを試作したお話

はじめに

こんにちは。研究開発部の待井と申します。
本記事はNFLaboratories Advent Calendar 2023の2日目となり、Microsoftが提供しているAzure OpenAI Serviceおよび拡張機能である独自データに基づいた応答を実現するAdd Your DataをAI初心者が触ってみたお話です。 adventar.org

Azure OpenAI ServiceとAdd Your Dataについて全くご存じでない方のために公式ドキュメントを引用して簡単に紹介すると、できることは以下の通りです。 learn.microsoft.com

独自のデータに基づく Azure OpenAI は、OpenAI の強力な GPT-35-Turbo および GPT-4 言語モデルで動作し、独自のデータに基づいて応答を提供できるようにします。 REST API または Azure OpenAI Studio の Web ベースのインターフェイスを使用して独自のデータに基づく Azure OpenAI にアクセスし、独自のデータに接続してチャット エクスペリエンスを強化するソリューションを作成できます。

Azure OpenAI StudioというWebベースで簡単に検証等を行うことができると共にREST API経由でのアクセスも可能であるため、様々な形でAI Chatbotを実現することが可能になります。
分かりやすい利用例としては社内で利用しているチャットツール(Slack/Teams等)にBotを構築し、Add Your Dataによる独自データに基づいた問い合わせ対応の自動化等を実現することができます。

そこで今回はAzure OpenAI ServiceおよびAdd Your Dataの構築方法とサービス化を考慮した閉域網化やAIを触ってみた感想などについてお話できればと思います。

目的

前提として今回なぜAzure OpenAI + Add Your Dataを触ってみようと思ったかについてお話しておくと、弊社では社内ドキュメントやナレッジを自由に蓄積する場として誰でも記事を投稿・共有できるサービスを利用しています。
自由に記事を投稿・共有できることはもちろん良いことなのですが、大量に記事が蓄積されていくとユーザにとって本当に必要な情報を検索で見つけることが難しくなることがありました。

そこで蓄積された記事を独自データとしてAzure OpenAI Serviceに取り込み、ユーザがAIに問い合わせることで必要な情報を適切な回答として得ることができるかどうかを検証することが目的となります。

実現イメージ

目的に沿ったサービスを実現する際のイメージは以下のようなものを想定しています。 Bot部分の実装等については様々なパターンがあるかと思います。
(今回お話する範囲は画像内で赤線で囲んだ部分です。)

実現イメージ図

Azure OpenAI Serviceについて

Azure OpenAI Service + Add Your Dataに関するドキュメントやAzureの利用に当たっての規約は以下参照
Azure OpenAI: https://learn.microsoft.com/en-us/azure/ai-services/openai/
Add Your Data: https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/use-your-data?tabs=ai-search
Azureサービスの規約: https://www.microsoft.com/licensing/terms/productoffering/MicrosoftAzure/EAEAS

前提条件

Azure OpenAI + Add Your Dataを利用するに当たっては以下の前提条件を満たす必要があります。

  • 利用可能なAzure Subscriptionを保有している
  • MicrosoftへのAzure OpenAI利用申請および承認(申請フォーム: https://aka.ms/oai/access
  • Azure OpenAIはgpt-35-turboかgpt-4モデルをデプロイする

Azure OpenAIの構築

Azure OpenAI自体を構築するのはAzureポータル上から簡単に行うことができます。

Azure Subscriptionの作成およびAzure OpenAI Serviceの利用申請承認後、Azureポータル上から「Azure OpenAI」にアクセスし、「Model deployments」メニューから「Azure OpenAI Studio」にアクセス その後、「Create new deployment」からモデル等を選択し、デプロイすることで導入完了となります。

OpenAIのデプロイ画面

デプロイ後、導入したデプロイメントを選択し「Open in Playground」をクリックするとデプロイしたモデルに対するチャットでの問い合わせが可能になり、画像の様にテストを行うことができます。

Chat playground画面

ここまでの段階でAzure OpenAI自体は利用可能ですが、社内ドキュメントなどを取り込んで回答を行うことができないため「Azure AI Search」および「Azure Storage account(Azure Blob)」を導入し、「Azure AI Document Intelligence」を利用して日本語ドキュメントの取り込みおよびインデックス化を行い、それらの情報に基づいてAzure OpenAIが回答を行うことができるようにします。

Add Your Dataについて

Azure OpenAI Serviceにおいて独自のデータソースを追加する機能で「Add Your Data」と呼ばれています。
利用方法としてはAzure OpenAI Service上で「Chat playground」にアクセスし、チャット → データの追加(プレビュー) → データソースの追加をクリックすることでデータソースを指定し、独自データを取り込むことが可能となります。

データソースの追加画面

指定可能なデータソース

データソースとして現在追加できるものは以下の3つとなります。

  • Azure Blob Storage
    • ストレージに格納されているデータを利用してAzure AI Search上にインデックスを作成
  • Azure AI Search
    • 既に作成されているインデックスを保持しているAzure AI Searchおよびインデックス名を指定
  • Upload files
    • ローカルにあるファイルをBlob Storageへアップロードし、Azure AI Searchが自動でインデックスを作成

上記のデータソースを追加することで社内ドキュメント等の情報を基にAIに回答を行わせることが可能となり、オプションで追加したデータソースからのみで回答を生成するか、一般的なデータを含めて回答を生成するかを指定することも可能です。

ただし検証時点では日本語ドキュメントをUpload Filesなどでアップロードしても上手くインデックスを作成できない(英語でインデックス化される)ため、Azure AI Document Intelligenceを利用してAzure AI Search上に日本語のインデックスを作成する必要することで検索・回答精度を向上させることができます。

Azure AI Searchの導入

Azure AI Searchの導入に関しては以下の公式ドキュメント参照し、Azureポータル上から操作することで簡単に導入することができます。

learn.microsoft.com

注意点としてはプラン選択部分になり、今回の目的を達成するためにはBasicプラン以上を選択する形となります。

  • Freeプランを指定するとNW周りに関する設定はできません
  • Basic(基本)プラン以上を選択するとNW周りに関する設定ができ、各種サービスへのアクセスやプライベートエンドポイント等の設定が可能となるため、こちらを選択してください

Azure AI Document Intelligenceの導入

Azure AI Document Intelligenceの導入に関しても公式ドキュメントを参照し、Azureポータル上から操作することで簡単に導入することができます。

learn.microsoft.com

価格帯については月500ページの取り込みまではFreeプランで利用可能となっており、検証レベルであればFreeプランで十分かと思います。
価格帯の詳細については以下を参照してください。

価格 - Azure AI Document Intelligence | Microsoft Azure

日本語ドキュメントのインデックス作成

Microsoftが提供しているツールを利用してローカルにあるファイルをAzure AI Document Intelligence経由で処理し、Azure AI Search上にインデックスとして作成します。
Azureとの連携等を行うため、Azure CLIがツールの利用とは別に必要となります。

実施すべき手順は以下の通りです。

  • Azure CLIのインストール
  • ツールのダウンロードおよび必要なライブラリのインストール
  • ツールの利用に当たって必要なデータの準備および設定
    • ローカル上にOpenAIで利用したい独自データを格納(data_pathで指定されるフォルダ)
    • リポジトリからダウンロードしたファイルの内、scriptsフォルダ配下にあるconfig.jsonを編集
      • data_path : OpenAIで利用したい独自データを格納しているフォルダを指定
      • location : Azure AI Searchを導入したリージョン(例: japaneast)
      • subscription_id : Azure AI SearchのサブスクリプションID
      • resource_group : Azure AI Searchのリソースグループ名
      • search_service_name : Azure AI Searchのリソース名
      • index_name : ドキュメントを取り込んだAzure AI Search上のインデックス名
      • chunk_size : ドキュメントを分割する際のチャンクサイズ
      • token_overlap : 分割時のオーバーラップ
      • semantic_config_name : セマンティック検索に関する設定
      • language : 言語アナライザーの言語(必ずjaを指定すること)
  • Azure AI Document Intelligenceサービスを利用するためのAPIキーの取得
    • AzureポータルからAzure AI Document Intelligenceにアクセスし、「キーとエンドポイント」からキーの値を取得(キー1もしくはキー2のどちらか)
  • data_preparation.pyの実行
    • 上記で設定したconfig.jsonを基に独自データを日本語で指定されたAzure AI Search上にインデックスとして作成することができます。

Azure AI Search上に作成されたインデックス

Add Your Dataのテスト

これまでの手順でAzure AI Search上に日本語インデックスを作成したため、Add Your DataのソースとしてAzure AI Searchおよび作成したインデックスを指定し、Chat playground上でテストします。

  • Azure OpenAI Service上で「Chat playground」にアクセスし、チャット → データの追加(プレビュー) → データソースの追加からAzure AI Searchを指定し、データを追加
    データソースの追加画面
  • システムメッセージで日本語でドキュメントを解釈し、日本語で答えるように指示を行います
    • システムメッセージによりAIにどのように動いてほしいかを必ず指定する必要があり、デフォルトのままだと英語でドキュメントを解釈し、英語で回答を行うようになっています
    • システムメッセージの設定例については公式ドキュメントを参照し、指定してください

learn.microsoft.com

上記設定後、以下のようなチャットでシステムの利用方法(例としてAWS VPN)について問い合わせるとドキュメントに記載されている内容を基に以下の回答が返ってくることが分かります。

問い合わせのテスト

回答の最後には引用元(取り込んだドキュメントのチャンク)が表示され、回答を行う際に参照したドキュメントの内容についても確認することが可能となっています。

これらのサービスによりあまり知見が無い状態でも独自データを基に回答を行うAIを構築することが可能なことが分かりました。
ただし、実際のサービスに求められる高精度な回答を得られるようにするためには取り込むドキュメントをインデックス化する際のチャンクを上手く調整したり、AI側のパラメータ(厳密度など)やセマンティック検索やベクトル検索などの実装要否について十分に検討した上で実装していくことが必要になると思います。

プライベートアクセス(閉域網化)の実現について

実現イメージとしてお話した以下の図のようにサービスとして本格的に運用を行うことを検討する場合には、外部からのアクセスやAzure内でも意図していないNWやリソースからのアクセスを防ぐ方策を検討する必要があります。

実現イメージ図

少なくともAzure OpenAI Service、Azure AI Search、Azure Blob Storageなどへのアクセスについては互いのリソース間での通信のみを許可する形が望ましく、各リソース上でプライベートエンドポイントを作成することで、プライベートエンドポイントを介してのみリソースへアクセス可能となります。
プライベートエンドポイントの詳細については公式ドキュメントを参照ください。

learn.microsoft.com

ただし、検証時においてはAzure OpenAIでAdd Your Dataを利用する際にはOpenAIからAI Searchへのアクセスに関してはインターネット経由でアクセスを行う仕様であることから、AI Searchはインターネットアクセスを許可する必要があり、完全な閉域化を実現することができませんでした。

現時点では全員が利用できる訳ではありませんが、以下フォームより申請を行うことでOpenAI + Add Your DataからAI Searchに対してプライベートエンドポイントを作成することができる模様です。
(未検証のため、利用については良くドキュメント等を確認した上で実施ください) https://forms.office.com/pages/responsepage.aspx?id=v4j5cvGGr0GRqy180BHbRw_T3EIZ1KNCuv_1duLJBgpUMUcwV1Y5QjI3UTVTMkhSVUo3R09NNVQxSyQlQCN0PWcu

利用する各サービスの費用感について

これまで説明してきたサービスに関してざっくりと費用感についても書いておこうと思います。 もし検証などを行われる場合に参考になれば幸いです。

  • Azure OpenAI Service
    • 1000トークン当たり$0.002 = 約0.28円(米国東部にデプロイした場合)で、デプロイするリージョンにより若干費用は異なります
    • OpenAIへの入力、OpenAIからの出力、その他リクエストパラメータの文字数を基にトークン数は計算されます
    • ひらがなは1トークン以上、漢字は2トークン以上、英数字は1トークンでおおよそ処理されます
  • Azure AI Search
    • ネットワーク周りの機能を利用するシナリオ(Azure Storage accountと連携する等)の場合は最低でもBasicプラン以上を利用する必要があります
    • Basicプラン: ¥19.89/時間
  • Azure Storage account(Blob Storage)
    • Storage accountの課金体系はかなり複雑なため、以下を参照
    • 主なポイントは以下の通り
      • 利用容量: 1GB当たり月額¥2.9895(最初の50TBまで以降は単位価格が上昇)
      • 書き込み操作: 10000回当たり¥9.7159
      • 読み取り操作: 10000回当たり¥0.7474
  • Azure Private Endpoint
    • プライベートエンドポイント: ¥1.495/時間
    • 受信/送信データ処理量: ¥1.4948/GB(受信、送信それぞれ1PBまで以降は単位価格が情報)
  • Azure Virtual Network
    • 各VNET内およびVNET間における通信量に応じて課金
    • 100GBの通信: 約¥2000
  • Azure AI Document Intelligence
    • Free: 1 か月あたり500 ページまで無料
    • S0: 0-100万ページまで1,000 ページあたり ¥221.820

OpenAIについてはトークン使用量に応じた課金が行われるため、どれくらい利用するかに依存します。 その他ではAzure AI Searchが時間に応じた課金が行われるため、Basicプランでも月額当たり14,000円程度は定額でかかる形となります。
ちなみにイメージ図で記載した赤枠線内の構成であれば月額3万弱程度、Botを構築するためのApp Serviceを利用した場合には月額4~5万程度の費用感でした。

おわりに

これまでAIに関わる技術を触ったことが無かったのですが、それでもかなり簡単に独自データを用いた上で一定の精度の回答を得られるAIを構築することが出来ました。 一方で今後本格的にサービスとして実現する場合には以下のような課題があるな、と感じています。

  • より高精度な回答を導出するためのチューニング
    • AIに関する調整パラメータについて十分な知識を身につけつつ、どのような形が最適かを検討
  • 取り込むドキュメントの品質のバラつきへの対処
    • 取り込むドキュメントが長すぎたり、検索キーワードに対して記事の内容にばらつきなどがある場合、回答精度が落ちる可能性があるため、追加費用がかかるがセマンティック検索などの導入を検討
  • 取り込むドキュメントの選定
    • 記事のように詳細に書かれるドキュメントとパワーポイントのようなある程度伝えたい内容を要約した文書では文章量が大きく異なるため、回答精度にばらつきが出るため、AIに求められる回答を想定した上で取り込むドキュメント等の選定が必要
  • AI利用におけるセキュリティリスクへの対策
    • 機密情報などに対するアクセス制御(ユーザによる表示内容のフィルタ等)
    • プロンプトインジェクション対策

ここ近年でのAI領域の発達は非常に生産性/利便性の向上に寄与するとともに利用に対してかなり技術的、心理的ハードルが下がっている一方、適切に利用していかなければ気づかない内にリスクが発生することにも繋がるため、今回の検証を通して改めてしっかりと理解した上で適切に利用していきたいと感じました。