Title: OpenAIのGPTsを活用してAzure AI Searchとシームレスに連携する方法 URL Source: https://blog.jbs.co.jp/entry/2023/12/08/143248 Published Time: 2023-12-08T14:32:48+09:00 Markdown Content: 最近、OpenAIから新たにGPTsが発表され、その可能性に注目が集まっています。そこで、GPTsの機能をAzure AI Searchと組み合わせることで、新しいデータ検索が可能であるか調べてみました。 この記事では、GPTsとAzure AI Searchを連携させることによって、データアクセスと情報検索がどのように変わるか、その実践的な試みと成果についてご紹介します。 * [GPTsとは?](https://blog.jbs.co.jp/entry/2023/12/08/143248#GPTs%E3%81%A8%E3%81%AF) * [Azure AI Searchの概要](https://blog.jbs.co.jp/entry/2023/12/08/143248#Azure-AI-Search%E3%81%AE%E6%A6%82%E8%A6%81) * [Azure Web Appsの役割](https://blog.jbs.co.jp/entry/2023/12/08/143248#Azure-Web-Apps%E3%81%AE%E5%BD%B9%E5%89%B2) * [データについて](https://blog.jbs.co.jp/entry/2023/12/08/143248#%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6) * [GPTsとAzure AI Searchを連携させた結果](https://blog.jbs.co.jp/entry/2023/12/08/143248#GPTs%E3%81%A8Azure-AI-Search%E3%82%92%E9%80%A3%E6%90%BA%E3%81%95%E3%81%9B%E3%81%9F%E7%B5%90%E6%9E%9C) * [GPTsをAzure AI Searchに接続する設定方法](https://blog.jbs.co.jp/entry/2023/12/08/143248#GPTs%E3%82%92Azure-AI-Search%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95) * [Azure AI Searchのセットアップ](https://blog.jbs.co.jp/entry/2023/12/08/143248#Azure-AI-Search%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97) * [Azure AI Searchの作成](https://blog.jbs.co.jp/entry/2023/12/08/143248#Azure-AI-Search%E3%81%AE%E4%BD%9C%E6%88%90) * [データの保存](https://blog.jbs.co.jp/entry/2023/12/08/143248#%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E4%BF%9D%E5%AD%98) * [Azure AI Searchからデータをインポート](https://blog.jbs.co.jp/entry/2023/12/08/143248#Azure-AI-Search%E3%81%8B%E3%82%89%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88) * [インデックスで検索](https://blog.jbs.co.jp/entry/2023/12/08/143248#%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%81%A7%E6%A4%9C%E7%B4%A2) * [Azure Web Appsのセットアップ](https://blog.jbs.co.jp/entry/2023/12/08/143248#Azure-Web-Apps%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97) * [Visual Studioでプロジェクトを作成](https://blog.jbs.co.jp/entry/2023/12/08/143248#Visual-Studio%E3%81%A7%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90) * [OpenAPIサポートを有効にする](https://blog.jbs.co.jp/entry/2023/12/08/143248#OpenAPI%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B) * [Nugetパッケージをインストール](https://blog.jbs.co.jp/entry/2023/12/08/143248#Nuget%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB) * [コントローラーを作成する](https://blog.jbs.co.jp/entry/2023/12/08/143248#%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B) * [GPTsの設定](https://blog.jbs.co.jp/entry/2023/12/08/143248#GPTs%E3%81%AE%E8%A8%AD%E5%AE%9A) * [まとめ](https://blog.jbs.co.jp/entry/2023/12/08/143248#%E3%81%BE%E3%81%A8%E3%82%81) ### GPTsとは? GPTsは、ユーザー自身が特定のニーズに合わせてカスタマイズできるChatGPTです。これにより、ユーザーは自分の用途に特化した対話型AIアプリケーションを作成できます。 たとえば、特定のトピックや業界に関する専門的な質問に答えるAI、あるいは特定の言語スタイルで会話するAIなど、様々な用途に合わせてカスタマイズすることが可能です。 [openai.com](https://openai.com/blog/introducing-gpts) ### Azure AI Searchの概要 Azure AI Search(旧称 "Azure Cognitive Search")は、Microsoft Azureプラットフォーム上で提供される強力な検索サービスです。 このサービスは、テキストとベクトル検索を利用したフルテキスト検索エンジン、データのチャンキングとベクター化、豊富なクエリ構文、AIによるコンテンツエンリッチメントなどの機能を提供します。これにより、カタログやドキュメントの検索、データ探索、チャットスタイルのcopilotアプリなど様々なシナリオに対応することができます​​。 [azure.microsoft.com](https://azure.microsoft.com/ja-jp/products/ai-services/ai-search) ### 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](https://azure.microsoft.com/ja-jp/products/app-service/web/) ### データについて 今回使用したデータは、自治体における「子育てAIチャットボット」の普及に向けたオープンデータ化についての「報告書」及び「FAQデータセット」です。 このデータはオープンデータであり、CC-BY 4.0のライセンスに基づいて使用しています。 [自治体における「子育てAIチャットボット」の普及に向けたオープンデータ化についての「報告書」及び「FAQデータセット」を公開 | LINE Corporation | CSR活動レポート](https://linecorp.com/ja/csr/newslist/ja/2020/260) ### GPTsとAzure AI Searchを連携させた結果 GPTsとAzure AI Searchを連携させて、質問に対する詳細な答えを、Azure AI Searchに保存したデータから得ることができました。 連携は下記の図のような方法で行っています。 ![Image 52](https://cdn-ak.f.st-hatena.com/images/fotolife/j/jbs_mkabuki/20231204/20231204133238.png) 下記は「母子手帳の申請方法について教えてください」と質問した結果です。 GPTsは質問の文章から適切なキーワードを自動で生成し、Azure AI Searchに問い合わせて回答してくれました。 ![Image 53](https://cdn-ak.f.st-hatena.com/images/fotolife/j/jbs_mkabuki/20231201/20231201103209.png) ![Image 54](https://cdn-ak.f.st-hatena.com/images/fotolife/j/jbs_mkabuki/20231201/20231201103007.png) ユーザーが質問をすると、Web Appsに接続することを確認する画面が表示されます。 ![Image 55](https://cdn-ak.f.st-hatena.com/images/fotolife/j/jbs_mkabuki/20231201/20231201103030.png) Azure AI Searchからどのようなデータを取得して回答したのか確認することもできます。 ![Image 56](https://cdn-ak.f.st-hatena.com/images/fotolife/j/jbs_mkabuki/20231201/20231201103323.png) ### 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サービスを作成します。 ![Image 57](https://cdn-ak.f.st-hatena.com/images/fotolife/j/jbs_mkabuki/20231130/20231130160004.png) ##### データの保存 任意のデータ(例:`dataset.csv`)をAzure BLOBストレージにアップロードします。 ![Image 58](https://cdn-ak.f.st-hatena.com/images/fotolife/j/jbs_mkabuki/20231130/20231130160019.png) ##### Azure AI Searchからデータをインポート Azure AI SearchでデータソースとしてBLOBストレージを指定し、インポートプロセスを実行します。 ![Image 59](https://cdn-ak.f.st-hatena.com/images/fotolife/j/jbs_mkabuki/20231130/20231130160037.png) ##### インデックスで検索 作成したインデックスを使用して検索を実行し、データが正しくインポートされていることを確認します。 ![Image 60](https://cdn-ak.f.st-hatena.com/images/fotolife/j/jbs_mkabuki/20231130/20231130160059.png) #### Azure Web Appsのセットアップ Azure Web Appsをセットアップする基本的な手順は以下の通りです。今回はVisual Studio 2022を使用して作成しました。 ##### Visual Studioでプロジェクトを作成 プロジェクトテンプレートで、ASP.NET Core Web APIを選択します。 ![Image 61](https://cdn-ak.f.st-hatena.com/images/fotolife/j/jbs_mkabuki/20231130/20231130160158.png) ##### OpenAPIサポートを有効にする OpenAPI サポートを有効にする、にチェックを入れます。 ![Image 62](https://cdn-ak.f.st-hatena.com/images/fotolife/j/jbs_mkabuki/20231130/20231130160456.png) ##### Nugetパッケージをインストール 下記のNugetパッケージをインストールします。 ![Image 63](https://cdn-ak.f.st-hatena.com/images/fotolife/j/jbs_mkabuki/20231130/20231130160854.png) ##### コントローラーを作成する 任意のコントローラーを作成し、下記のソースコードを記述します。 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 \_logger; private readonly IConfiguration \_configuration; private string AZURESEARCH\_SERVICE = ""; private string AZURESEARCH\_INDEX = ""; private string AZURESEARCH\_API\_KEY = ""; public CognitiveSearchController(ILogger logger, IConfiguration configuration) { \_logger = logger; \_configuration = configuration; } \[HttpGet(Name = "GetCognitiveSearch")\] public async Task 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 response = await client.SearchAsync(searchText, searchOptions); List searchResults = new List(); // 応答を解析し、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の設定を記載します。 ![Image 64](https://cdn-ak.f.st-hatena.com/images/fotolife/j/jbs_mkabuki/20231130/20231130161322.png) #### GPTsの設定 GPTsでは、Instructionsに下記の設定を行いました。 ![Image 65](https://cdn-ak.f.st-hatena.com/images/fotolife/j/jbs_mkabuki/20231201/20231201110707.png) 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](https://blog.jbs.co.jp/entry/2023/06/08/121455) GPTsとAzure AI Searchを利用することで、情報検索とデータ活用の新しい地平が開かれ、ビジネスプロセスの効率化、顧客対応の向上、さらには新たなサービス開発への道が拓けることが期待されます。 ![Image 66: 株木 誠](https://cdn.blog.st-hatena.com/files/13574176438063302381/13574176438066644701) 株木 誠(日本ビジネスシステムズ株式会社) 先端技術部の株木です。 Azure OpenAI Service を活用するアプリ開発を担当しています。 [担当記事一覧](https://blog.jbs.co.jp/archive/author/jbs_mkabuki)