OpenAIのGPTsを活用してAzure AI Searchとシームレスに連携する方法

最近、OpenAIから新たにGPTsが発表され、その可能性に注目が集まっています。そこで、GPTsの機能をAzure AI Searchと組み合わせることで、新しいデータ検索が可能であるか調べてみました。

この記事では、GPTsとAzure AI Searchを連携させることによって、データアクセスと情報検索がどのように変わるか、その実践的な試みと成果についてご紹介します。

GPTsとは?

GPTsは、ユーザー自身が特定のニーズに合わせてカスタマイズできるChatGPTです。これにより、ユーザーは自分の用途に特化した対話型AIアプリケーションを作成できます。

たとえば、特定のトピックや業界に関する専門的な質問に答えるAI、あるいは特定の言語スタイルで会話するAIなど、様々な用途に合わせてカスタマイズすることが可能です。 openai.com

Azure AI Searchの概要

Azure AI Search(旧称 "Azure Cognitive Search")は、Microsoft Azureプラットフォーム上で提供される強力な検索サービスです。

このサービスは、テキストとベクトル検索を利用したフルテキスト検索エンジン、データのチャンキングとベクター化、豊富なクエリ構文、AIによるコンテンツエンリッチメントなどの機能を提供します。これにより、カタログやドキュメントの検索、データ探索、チャットスタイルのcopilotアプリなど様々なシナリオに対応することができます​​。

azure.microsoft.com

Azure Web Appsの役割

Azure Web Appsは、ウェブアプリケーションやAPIのホスティングを簡単にするマイクロソフトのプラットフォームです。

このプロジェクトでは、Azure Web Appsを使用して、GPTsとAzure AI Serviceを連携させるためのREST APIによるGetメソッドを作成しました。このGetメソッドは、GPTsからAzure AI Serviceへのリクエストを中継し、Azure AI Serviceからの応答をGPTsに戻す役割を果たします。

当初はGPTsからAzure AI ServiceのURLに直接接続して使用することを検討していましたが、GPTsの制限事項に引っかかり動作しませんでした。

中継サーバーを使用すればアクセスが可能になるので、今回はAzure Web Appsを使用しました。 azure.microsoft.com

データについて

今回使用したデータは、自治体における「子育てAIチャットボット」の普及に向けたオープンデータ化についての「報告書」及び「FAQデータセット」です。

このデータはオープンデータであり、CC-BY 4.0のライセンスに基づいて使用しています。

自治体における「子育てAIチャットボット」の普及に向けたオープンデータ化についての「報告書」及び「FAQデータセット」を公開 | LINE Corporation | CSR活動レポート

GPTsとAzure AI Searchを連携させた結果

GPTsとAzure AI Searchを連携させて、質問に対する詳細な答えを、Azure AI Searchに保存したデータから得ることができました。

連携は下記の図のような方法で行っています。

下記は「母子手帳の申請方法について教えてください」と質問した結果です。 GPTsは質問の文章から適切なキーワードを自動で生成し、Azure AI Searchに問い合わせて回答してくれました。

ユーザーが質問をすると、Web Appsに接続することを確認する画面が表示されます。

Azure AI Searchからどのようなデータを取得して回答したのか確認することもできます。

GPTsをAzure AI Searchに接続する設定方法

GPTsとAzure AI Searchを接続する方法を下記に記載します。 設定は下記の順番で行います。

  1. Azure AI Searchのセットアップ
  2. Azure Web Appsのセットアップ
  3. GPTsの設定

Azure AI Searchのセットアップ

Azure AI Searchをセットアップする基本的な手順は以下の通りです。

Azure AI Searchの作成

AzureポータルからAzure AI Searchサービスを作成します。

データの保存

任意のデータ(例:dataset.csv)をAzure BLOBストレージにアップロードします。

Azure AI Searchからデータをインポート

Azure AI SearchでデータソースとしてBLOBストレージを指定し、インポートプロセスを実行します。

インデックスで検索

作成したインデックスを使用して検索を実行し、データが正しくインポートされていることを確認します。

Azure Web Appsのセットアップ

Azure Web Appsをセットアップする基本的な手順は以下の通りです。今回はVisual Studio 2022を使用して作成しました。

Visual Studioでプロジェクトを作成

プロジェクトテンプレートで、ASP.NET Core Web APIを選択します。

OpenAPIサポートを有効にする

OpenAPI サポートを有効にする、にチェックを入れます。

Nugetパッケージをインストール

下記のNugetパッケージをインストールします。

コントローラーを作成する

任意のコントローラーを作成し、下記のソースコードを記述します。

using Azure;
using Azure.Search.Documents;
using Azure.Search.Documents.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using System.Text.Json;

namespace GPTsTEST20231113.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class CognitiveSearchController : ControllerBase
    {

        private readonly ILogger<CognitiveSearchController> _logger;

        private readonly IConfiguration _configuration;

        private string AZURESEARCH_SERVICE = "";
        private string AZURESEARCH_INDEX = "";
        private string AZURESEARCH_API_KEY = "";

        public CognitiveSearchController(ILogger<CognitiveSearchController> logger, IConfiguration configuration)
        {
            _logger = logger;
            _configuration = configuration;
        }


        [HttpGet(Name = "GetCognitiveSearch")]
        public async Task<IActionResult> Get()
        {

            // APIキーをクエリ文字列から取得
            string searchText = Request.Query["searchText"];


            AZURESEARCH_SERVICE = _configuration["AZURESEARCH_SERVICE"];
            AZURESEARCH_INDEX = _configuration["AZURESEARCH_INDEX"];
            AZURESEARCH_API_KEY = _configuration["AZURESEARCH_API_KEY"];

            Uri serviceEndpoint = new Uri($"https://{AZURESEARCH_SERVICE}.search.windows.net/");
            AzureKeyCredential credential = new AzureKeyCredential(AZURESEARCH_API_KEY);
            SearchClient client = new SearchClient(serviceEndpoint, AZURESEARCH_INDEX, credential);

            var searchOptions = new SearchOptions
            {
                Filter = null,
                Size = 10
            };

            // 検索を実行し、結果を取得します。
            SearchResults<SearchDocument> response = await client.SearchAsync<SearchDocument>(searchText, searchOptions);

            List<SearchResult> searchResults = new List<SearchResult>();

            // 応答を解析し、SearchResultオブジェクトのリストに変換します。
            foreach (var result in response.GetResults())
            {
                var doc = result.Document;
                SearchResult searchResult = new SearchResult
                {
                    SearchScore = result.Score.HasValue ? result.Score.Value : 0.0,
                    ID = doc.TryGetValue("ID", out var id) ? id.ToString() : null,
                    SampleID = doc.TryGetValue("SampleID", out var sampleId) ? sampleId.ToString() : null,
                    SampleQuestion = doc.TryGetValue("SampleQuestion", out var sampleQuestion) ? sampleQuestion.ToString() : null,
                    SampleAnswer = doc.TryGetValue("SampleAnswer", out var sampleAnswer) ? sampleAnswer.ToString() : null
                };

                searchResults.Add(searchResult);
            }

            var options = new JsonSerializerOptions
            {
                Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
            };

            string jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(searchResults, Newtonsoft.Json.Formatting.Indented);

            return new OkObjectResult($"{jsonString}");
        }

        public class SearchResult
        {
            public double SearchScore { get; set; }
            public string ID { get; set; }
            public string SampleID { get; set; }
            public string SampleQuestion { get; set; }
            public string SampleAnswer { get; set; }
        }
    }
}

ローカル環境でテストする時は、secrets.jsonにAzure AI Searchの設定を記載します。

{
  "AZURESEARCH_SERVICE": "Azure AI Searchのデプロイ名",
  "AZURESEARCH_INDEX": "Azure AI Searchのインデックス名",
  "AZURESEARCH_API_KEY": "Azure AI SearchのAPIキー"
}

Visual Studio 2022からAzure Web Appsをデプロイしたら、下記の設定を追加します。

※Azure AI Searchの設定を記載します。

GPTsの設定

GPTsでは、Instructionsに下記の設定を行いました。

Actionsは、下記の設定を追加して接続させました。

{
  "openapi": "3.0.0",
  "info": {
    "title": "GPT-Azure WebApps Integration",
    "version": "1.0.0"
  },
  "servers": [
    {
      "url": "https://*************.azurewebsites.net/CognitiveSearch"
    }
  ],
  "paths": {
    "/": {
      "get": {
        "operationId": "getCognitiveSearchResults",
        "parameters": [
          {
            "name": "searchtext",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response"
          }
        }
      }
    }
  }
}

まとめ

GPTsとAzure AI Searchの連携により、保存されたデータからの情報検索と回答を提供するシステムの構築ができました。API接続に一定の制約があったものの、GPTsを用いて外部システムと連携するアプリケーションの作成は可能であり、その利便性を実感しました。

以前、OpenAIのプラグインを使用して類似の処理を行った経験がありますが、GPTsにおいては連携方法の探求が今後の課題です。特に、Show Meのような便利なプラグインとの連携可能性については、さらなる検討を進める価値があります。

※ 詳細については、下記ブログ記事を参照してください。

ChatGPTのプラグインを自作してAzure Cognitive Searchに接続し、ビジネスに新たな可能性を - JBS Tech Blog

GPTsとAzure AI Searchを利用することで、情報検索とデータ活用の新しい地平が開かれ、ビジネスプロセスの効率化、顧客対応の向上、さらには新たなサービス開発への道が拓けることが期待されます。

執筆担当者プロフィール
株木 誠

株木 誠

先端技術部の株木です。 Azure OpenAI Service を活用するアプリ開発を担当しています。

担当記事一覧