注目イベント!
春の新人向け連載企画開催中
新人エンジニアの皆さん、2024春、私たちと一緒にキャリアアップの旅を始めませんか?
IT業界への最初の一歩を踏み出す新人エンジニアをサポートする新連載スタート!
mameyose

独自のデータに基づくAzure OpenAI機能を使ってみた

| 16 min read
Author: kotaro-miura kotaro-miuraの画像

はじめに

#

今回はAzure OpenAI Service(以下AOAIとする)のプレビュー機能である「独自のデータに基づく Azure OpenAI」という機能を試してみた内容をまとめます。
独自のデータに基づくAzure OpenAI (プレビュー)

この機能では利用者の独自のデータ(txtファイル、pdf、wordファイルなど)に基づいてOpenAIが公開しているチャット対話モデル(GPT-3.5、GPT-4)に質問することができます。
利用者のデータをAzure Cognitive Search(以下ACSとする)というAzureの検索サービスに予めインデックス登録しておき、AOAIに質問するときには質問内容に関連したデータをACSから取得して質問文と関連データを一緒にプロンプトにまとめて送信します。いわゆるRAG(Retrieval Augmented Generation)と呼ばれる手法です。

構築手順

#

今回はIPAで公開されている「情報セキュリティ10大脅威 2023」(78ページ)というPDFについて質問できるようにしてみたいと思います。
情報セキュリティ10大脅威 2023

Azure Cognitive Searchリソースを作成する

#

まずはAzure PortalからACSリソースを作成します。

今回は以下の設定で作成します。

設定項目 設定値
リソースグループ OpenAIDemo
サービス名 csopenaimame
リージョン 東日本
価格レベル Basic

このリソースに対して、 検索インデックスデータ共同作成者 ロールを割り当てておきます。

PDFからテキストを抽出する

#

次に目的のPDFの内容をACSの検索インデックスに登録をします。

そのための登録スクリプトがMircorsoftから公開されているのでそれを利用したいと思います。(Data Preparation )

そのスクリプトは基本的にはテキストファイルの登録に対応しているので、まずはPDFファイルからそのテキスト内容を抽出します。
(Azureの別サービスのAzure AI Document Intelligenceを利用すれば、PDF形式のまま取り込みまで行う方法があるそうなのですが、構成が複雑になるため今回は使用を見送りました。)

事前に pypdf をインストールしておきます。

pip install pypdf

以下のpythonスクリプトを実行します。

from pypdf import PdfReader

reader = PdfReader(".\情報セキュリティ10大脅威2023.pdf")

with open('情報セキュリティ10大脅威2023.txt', 'w', encoding='utf-8') as f:
    for page in reader.pages:
        text = page.extract_text()
        f.write(text)
        f.write('\n')

以下が出力ファイル情報セキュリティ10大脅威2023.txtの冒頭の抜粋です。

   本書は、以下の URLからダウンロードできます。  
 
「情報セキュリティ 10大脅威  2023」 
https://www.ipa.go.jp/security/10threats/10threats2023.html  
 
 
 
目次 
はじめに  ................................ ................................ ................................ ................................ .........................  4 
情報セキュリティ 10大脅威  2023  ................................ ................................ ................................ ................  5 
1. 情報セキュリティ 10大脅威(個人)  ................................ ................................ ................................ ... 9 
1位 フィッシングによる個人情報等の詐取  ................................ ................................ ...........................  10 
2位 ネット上の誹謗・中傷・デマ  ................................ ................................ ................................ ..........  12 
3位 メールや SMS等を使った脅迫・詐欺の手口による金銭要求  ................................ ........................  14 
4位 クレジットカード情報の不正利用  ................................ ................................ ................................ ... 16 
5位 スマホ決済の不正利用  ................................ ................................ ................................ .....................  18 
6位 不正アプリによるスマー トフォン利用者への被害  ................................ ................................ .........  20 
7位 偽警告によるインターネット詐欺  ................................ ................................ ................................ ... 22 
8位 インターネット上のサービスからの個人情報の窃取  ................................ ................................ ...... 24 
9位 インターネット上のサービスへの不正ログイン  ................................ ................................ .............  26 
10位 ワンクリック請求等の不当請求による金銭被害  ................................ ................................ ...........  28 
コラム:内部不正、あなた の組織は大丈夫?  ................................ ................................ .........................  30 
2. 情報セキュリティ 10大脅威(組織)  ................................ ................................ ................................ . 33 
1位 ランサムウ ェアによる被害  ................................ ................................ ................................ ..............  34 
2位 サプライチェーンの弱点を悪用した攻撃  ................................ ................................ ........................  36 
3位 標的型攻撃による機密情報の窃取  ................................ ................................ ................................ ... 38 
4位 内部不正による情報漏えい  ................................ ................................ ................................ ..............  40 
5位 テレワーク等のニューノーマルな働き方を狙った攻撃  ................................ ................................ .. 42 
6位 修正プログラムの公開前を狙う攻撃(ゼロデイ攻撃)  ................................ ................................ .. 44 
7位 ビジネスメール詐欺による金銭被害  ................................ ................................ ...............................  46 
8位 脆弱性対策情報の公開に伴う悪用増加  ................................ ................................ ...........................  48 
9位 不注意による情報漏えい等の被害  ................................ ................................ ................................ ... 50 
10位 犯罪のビジネス化(アンダーグラウンドサービス)  ................................ ................................ .... 52 
コラム:医療機関におけるランサムウェア被害の増加  ................................ ................................ ..........  54 
「情報セ キュリティ対策の基本」  と 「共通対策」  ................................ ................................ ...................  57 
参考資料  ................................ ................................ ................................ ................................ .......................  69 
 
4 
 はじめに  
本書「情報セキュリティ  10大脅威  2023」は、情報セキュリティ専門家を中心に構成する「 10大脅威選考会」
の協力により、 2022年に発生したセキュリティ事故や攻撃の状況等 から脅威を選出し、投票により順位付けし
て解説した資料である。 「個人」と「組織」 という異なる立場で、それぞれの脅威を順位付けし、立場毎に 10大
脅威を決定した。  
各脅威が自分自身や自組織にどう影響するか確認しながら本書を読み進めることで、様々な脅威と対策を
網羅的に把握できる。  
 
本書が、読者自身のセキュリティ対策への 取り組み と、各組織の研修やセキュリティ教育等に活用されるこ
とによるセキュリティ対策の普及の一助となることを期待する。  

Azure Cognitive Searchの検索インデックスを作成する

#

登録するファイルの準備ができたのでACSの検索インデックスに取り込みます。

まず登録スクリプトが公開されているGitHubリポジトリをクローンしてスクリプトが入っているディレクトリに移動します。

git clone https://github.com/microsoft/sample-app-aoai-chatGPT.git
cd .\sample-app-aoai-chatGPT\scripts\

このディレクトリにconfig.jsonというファイルがあるので適宜修正します。
以下はテキストを2048文字ごとに分割してインデックス登録してくれる設定となっています。

[
    {
        "data_path": "情報セキュリティ10大脅威2023.txtが保存してあるディレクトリパス",
        "location": "japaneast",
        "subscription_id": "作成したACSリソースと紐づいているサブスクリプションID",
        "resource_group": "OpenAIDemo",
        "search_service_name": "csopenaimame",
        "index_name": "openaiindex",
        "chunk_size": 2048,
        "token_overlap": 128,
        "semantic_config_name": "default",
        "language": "ja"
    }
]

そして登録スクリプトdata_preparation.pyを実行します。(事前にaz loginの実行が必要です)

python data_preparation.py --config config.json --njobs=4

実行に成功すると、ACSにインデックスが作成されます。

fig1

以下が登録されているインデックスの抜粋です。

    {
      "@search.score": 1,
      "id": "0",
      "content": "情報セキュリティ \n10大脅威 2023 \n~全部担当のせいとせず、組織的にセキュリティ対策の足固めを~ \n \n2023年3月 \n 本書は、以下の URLからダウンロードできます。 \n \n「情報セキュリティ 10大脅威 2023」 \nhttps://www.ipa.go.jp/security/10threats/10threats2023.html \n \n \n \n目次 \nはじめに ................................ ................................ ................................ ................................ ......................... 4 \n情報セキュリティ 10大脅威 2023 ................................ ................................ ................................ ................ 5 \n1. 情報セキュリティ 10大脅威(個人) ................................ ................................ ................................ ... 9 \n1位 フィッシングによる個人情報等の詐取 ................................ ................................ ........................... 10 \n2位 ネット上の誹謗・中傷・デマ ................................ ................................ ................................ .......... 12 \n3位 メールや SMS等を使った脅迫・詐欺の手口による金銭要求 ................................ ........................ 14 \n4位 クレジットカード情報の不正利用 ................................ ................................ ................................ ... 16 \n5位 スマホ決済の不正利用 ................................ ................................ ................................ ..................... 18 \n6位 不正アプリによるスマー トフォン利用者への被害 ................................ ................................ ......... 20 \n7位 偽警告によるインターネット詐欺 ................................ ................................ ................................ ... 22 \n8位 インターネット上のサービスからの個人情報の窃取 ................................ ................................ ...... 24 \n9位 インターネット上のサービスへの不正ログイン ................................ ................................ ............. 26 \n10位 ワンクリック請求等の不当請求による金銭被害 ................................ ................................ ........... 28 \nコラム:内部不正、あなた の組織は大丈夫? ................................ ................................ ......................... 30 \n2. 情報セキュリティ 10大脅威(組織) .............................",
      "title": "情報セキュリティ",
      "filepath": "情報セキュリティ10大脅威2023.txt",
      "url": null,
      "metadata": "{\"chunk_id\": \"0\"}"
    },
    {
      "@search.score": 1,
      "id": "20",
      "content": "告メッセージを音声で流したり、偽警告のポップア\nップ画面を閉じられないと誤解させたりすることでさ\nらに不安を煽る。 \n◆ 有償セキュリティソフトの購入へ誘導 \n閲覧者を偽警告の画面からダウンロードページ\nに誘導し、偽のセキュリティソフトをインストールさ\nせる。最終的に有償ソフトウェアの購入へ誘導する。 \n◆ サポート詐欺 \n偽警告の画面に 表示させたサポート窓口へ閲覧\n者に電話をかけさせ、遠隔操作用ソフトウェア をイ\nンストールさせ る。その上で、サポート契約や ウイ\nルスの除去など 修復代金の支払い へ誘導する。 サ\n23 \n ポート契約等の支払い方法はコンビニエンスストア\nで販売されているプリペイド 型電子マネーやギフト\nカードのほか、クレジットカード決済が使われる。 \n◆ スマホアプリのインストールへ誘導 \n偽警告をスマートフォンの画面に表示し、解決方\n法として、公式マーケットからスマホアプリをインス\nトールするように誘導する。誘導したことに より広\n告主からアフィリエイト 報酬を得たり、 サブスクリプ\nション(自動継続課金 )による利用者への料金請求\nで収益を得たりすることが目的と考えられる。 \n \n<事例または 傾向> \n◆ PCを遠隔操作 、通信販売で勝手に物品購入 \n2022年8月、沖縄県嘉手納署は偽警告による\nサポート詐欺が発生したことを発表した。被害者の\n女性が自宅で PC を使用していたところ、「トロイの\n木馬スパイウェアに感染」等と記載された画面が音\n声アナウンスとともに表示され、表示されている連\n絡先に電話してしまった。その後、片言の日本語で\n話す男に PC 操作を誘導され、 PC を遠隔操作さ\nれてしまい、電子マネー等を勝手に購入されたほ\nか、SNS を不正に利用された。なお、押収した PC\nを確認したところ自動音声が流れる仕組みだった\nことが分かった。1 \n◆ 偽警告被害の相談件数が増加傾向 \n2022年10月、IPA 安心相談窓口が公開したレ\nポートと、「安心相談 窓口だより」によると、「ウイル\nスに感染している」等、偽のセキュリティ警告に関\nする相談件数は、 2022年第 1四半期は 625件、\n第2四半期は 435件、第 3四半期は 544件、第\n4四半期は 761件となっており、前年同期の 246\n件、232件、192件、420件と比較して相談件数が\n大きく増加している。さらに、 2023年1月の相談件\n数は 401件となっており、月間の相談件数としては\n過去最高件数となっている。2,3,4 \n◆ 偽警告によるサポート詐欺に対する支払い方\n法はプリペイド型電子マネーが大半 \n2022年2月、国民生活センターの公表した情報\nによると、全国の消費生活センター等にはサポート\n詐欺に関する相談がここ数年は年間 5,000件以上寄せられており、有償サポートやセキュリティソフト\nの契約購入金額の平均金額は年々高額化してい\nる。また、支払い方法は、クレジットカードに代わり\nプリペイド型電子マネーが大半を占め、 2021年度\nにおいてはクレジットカードが 428件、プリペイド型\n電子マネーが 1,821件であった。5 \n \n<対策 /対応> \n個人(インターネット利用者等) \n⚫ 被害の予防(被害に備えた対策含む) \n・表1",
      "title": "情報セキュリティ",
      "filepath": "情報セキュリティ10大脅威2023.txt",
      "url": null,
      "metadata": "{\"chunk_id\": \"20\"}"
    },
    {
      "@search.score": 1,
      "id": "31",
      "content": ". 釜石市、職員 2人を懲戒免職 - 全住民情報を持出、監査の不正操作も (Security NEXT ) \nhttps://www.security -next.com/136850 \n2. 宇部市 “私的に個人情報検索”職員を懲戒処分( NHK NEWS WEB ) \nhttps://www3.nhk.or.jp/lnews/yamaguchi/20221219/4060015683.htm l \n3. 組織における内部不正防止ガイドライン( IPA) \nhttps://www.ipa.go.jp/security/guide/insider.html \n4. 内部犯行関連記事の一覧( Security NEXT ) \nhttps://www.security -next.com/category/cat191/cat25/cat173 \n \n33 \n \n \n \n \n \n \n \n \n \n \n2",
      "title": "情報セキュリティ",
      "filepath": "情報セキュリティ10大脅威2023.txt",
      "url": null,
      "metadata": "{\"chunk_id\": \"31\"}"
    },

Azure OpenAIクライアントを用いて質問をする

#

以上でやっとデータ準備が完了しました。
これより実際にGPTモデルに質問をしてみます。

説明は割愛させていただくのですが事前にAOAIでgpt-3.5-turbo-16kモデルが使えるように設定済みです。

次のMicrosoft製のJavaのAOAIクライアントライブラリが独自データに基づく質問機能に対応していたので利用します。

pom.xmlのインポート箇所
    <dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-ai-openai</artifactId>
      <version>1.0.0-beta.5</version>
    </dependency>

次のJavaプログラムは標準入力から質問を受け付けAOAIに質問を行います。
作成済みのACSのエンドポイントURL、管理者キー、インデックス名を指定してあげるだけであとは自動で関連情報を取得して質問してくれました。

    public static void main(String[] args) {
        String azureOpenaiKey = "AOAIのAPIキー";
        String endpoint = "AOAIのエンドポイントURL";
        String deploymentOrModelId16k = "other-gpt-35-16k"; // AOAIで作成済みの言語モデルデプロイメント

        OpenAIClient client = createAzureClient(azureOpenaiKey, endpoint);

        String azureSearchEndpoint = "ACSのエンドポイントURL";
        String azureSearchAdminKey = "ACSの管理者キー";
        String azureSearchIndexName = "openaiindex";

        var cognitiveSearchConfiguration = new AzureCognitiveSearchChatExtensionConfiguration(
                azureSearchEndpoint,
                azureSearchAdminKey,
                azureSearchIndexName);
        var extensionConfiguration = new AzureChatExtensionConfiguration(
                AzureChatExtensionType.AZURE_COGNITIVE_SEARCH,
                BinaryData.fromObject(cognitiveSearchConfiguration));

        Scanner scan = new Scanner(System.in);
        System.out.print("質問:");
        String prompt = scan.next();
        System.out.println();

        chatCompletion(deploymentOrModelId16k, client, extensionConfiguration, prompt);
    }

    private static OpenAIClient createAzureClient(String azureOpenaiKey, String endpoint) {
        return new OpenAIClientBuilder()
                .endpoint(endpoint)
                .credential(new AzureKeyCredential(azureOpenaiKey))
                .buildClient();
    }

    private static void chatCompletion(String deploymentOrModelId, OpenAIClient client,
            AzureChatExtensionConfiguration extensionConfiguration, String prompt) {
        List<ChatMessage> chatMessages = new ArrayList<>();
        chatMessages.add(new ChatMessage(ChatRole.SYSTEM, "あなたは優秀なアシスタントです。参考文献の内容を優先的に説明してください"));
        chatMessages.add(new ChatMessage(ChatRole.USER, prompt));

        var chatCompletionsOptions = new ChatCompletionsOptions(chatMessages);
        chatCompletionsOptions.setDataSources(Arrays.asList(extensionConfiguration));

        ChatCompletions chatCompletions = client.getChatCompletions(deploymentOrModelId, chatCompletionsOptions);

        for (ChatChoice choice : chatCompletions.getChoices()) {
            ChatMessage message = choice.getMessage();
            System.out.println("Message:");
            System.out.println(message.getContent());
        }
    }

実行結果

#

今回のファイルの内容について質問してみます。

質問:情報セキュリティの10大脅威はなんですか?            

Message:
情報セキュリティの10大脅威は以下の通りです:

1. 個人情報の漏洩:個人情報や家庭でストレージやPCを利用する人々のプライバシーに関わる情報の盗難や不正利用が増加しています [doc5]。
[doc5]。
2. ネット上の悪意のある行為:インターネット上での詐欺、中傷、デマ、スパムなどの悪意のある行為が増えています [doc5]。      
3. メールやSMSを利用した詐欺:メールやSMSを通じて行われるフィッシングやスミッシングなどの詐欺行為が増えています 。        
4. クレジットカード情報の不正利用:クレジットカード情報の盗難や不正利用が増えています 。                                   えています 。
5. スマートデバイスの不正利用:スマートフォンやタブレットなどのスマートデバイスを悪用したスパイウェアやマルウェアの感染が  があります 。
増えています 。
6. 不正アプリによるスマートフォン利用者への被害:不正なアプリをダウンロードすることで、スマートフォン利用者が被害に遭うこ 
とがあります 。
7. 偽警告によるインターネット利用者への金銭要求:偽の警告によってインターネット利用者が金銭を要求されることがあります 。   。
8. インターネット上のサービスからの個人情報の漏洩:オンラインサービスからの個人情報の漏洩が増えています 。
9. インターネット上のサービスへの不正ログイン:オンラインサービスへの不正ログインが増えています 。
10. ワンクリック詐欺などの不当要求による金銭被害:ワンクリック詐欺などの不当な要求によって金銭被害が発生することがあります
 。

以上が情報セキュリティの10大脅威です。[doc5]

取り込んだPDFの内容に沿った返答が返ってきました。特に6ページ目の内容でしょうか。

補足

回答をよく見ると[doc5]という文字列が入っています。これはおそらくACSから取得したデータに付与されている番号だと思うのですが、今回利用しているJavaライブラリでは現状その情報を取得することはできないようでした。
REST APIによるリクエストのレスポンス例を見ると実際のhttpレスポンスには取得データの情報が入っているようでした。[1]

まとめ

#

今回は独自のデータに基づいてAzure OpenAIに質問する方法を試してみました。

実際にPDFの内容に基づいた回答をできたかなと思います。ローカルにあるファイルについて質問に答えてくれるチャットボットとして考えると、それは本家のChatGPTでは現状できないことなのでこの機能は便利だなと思いました。
データの準備が面倒くさいなという印象ですがPDFのテキスト変換からACS取り込みまでは一気にスクリプト実行して手間を省けそうです。

インデックスの作成には今回行った方法の他にAzure Blob上のデータを一気にインデックス化してくれる方法や[2]、検索の方式にはセマンティック検索やベクター検索という方式なども使えるようでした[3]。 方法によって回答の品質に変化があるのか気になりました。


  1. cURL コマンドの例 ↩︎

  2. データ ソース オプション ↩︎

  3. [検索のオプション] ↩︎

豆蔵では共に高め合う仲間を募集しています!

recruit

具体的な採用情報はこちらからご覧いただけます。