【Microsoft×生成AI連載】寺澤です。今回はAzure AI SearchにSharePoint Onlineをデータソースにしたインデックスを作成します。
これまでの連載
これまでの連載記事一覧はこちらの記事にまとめておりますので、過去の連載を確認されたい方はこちらの記事をご参照ください。
前提
今回利用するAzure AI Search、SharePoint Onlineのサイトは作成されていることを前提とします。
※ 本記事の情報は2024/7/3時点の情報です
※ SharePoint Onlineインデクサーは記事作成時点でパブリックプレビューとして提供されています
実装
SharePoint Onlineをデータソースとするインデックスを作成し検索できるようにするには、5つのステップが必要です。
- (省略可能)システム割り当てマネージドIDを有効にする
- Microsoft Entra IDアプリケーション登録を作成する
- データ ソースを作成する
- インデックスを作成する
- インデクサーを作成する
各ステップの手順を記載します。
(省略可能)システム割り当てマネージドIDを有効にする
このステップは、Azure AI Search がテナントを自動的に検出するために必要なステップです。
※後続のステップで接続文字列にテナントIDを含める場合は、このステップは省略可能です。
AzureポータルのAzure AI Searchリソースを開き、[設定]>[ID]の状態を「オン」にして、保存後に表示されるオブジェクトIDを取得します。
Microsoft Entra IDアプリケーション登録を作成する
Microsoft Entra IDアプリを作成して必要なアクセス許可を付与します。
SharePoint Onlineに対するアクセス許可は「委任されたアクセス許可」と「アプリケーションのアクセス許可」の両方をサポートしていますが、今回は「アプリケーションのアクセス許可」を選択します。
Azureポータルの[Microsoft Entra ID]>[設定]>[アプリの登録]に移動します。
「+新規登録」を押します。
下記を参考に値を入力し、[登録]を押してアプリを作成します。
名前 | アプリの任意の名前 |
サポートされているアカウントの種類 | シングルテナント |
リダイレクトURI | 空欄 |
[APIのアクセス許可]の「+アクセス許可の追加」を押し、下記をアプリケーションのアクセス許可で追加します。
項目名 | APIの選択 | アクセス許可の種類 |
Files.Read.All | Microsoft Graph | アプリケーションの許可 |
Sites.Read.AII | Microsoft Graph | アプリケーションの許可 |
追加後、[○○に管理者の同意を与えます]を押します。
[認証]の「パブリック クライアント フローを許可する」を「はい」に変更します。
「+プラットフォームを追加」を押します。
[モバイル アプリケーションとデスクトップ アプリケーション] の順に選択します。
https://login.microsoftonline.com/common/oauth2/nativeclient のチェック ボックスをオンにしてから、[構成] を選択します。
[証明書とシークレット]>[クライアントシークレット]の「+新しいクライアントシークレット」を追加します。
シークレットをコピーします。
※ 作成したシークレットの値は必ずコピーしてください。画面を遷移させると値を確認できなくなります。
データ ソースを作成する
Azure AI Search上にSharePoint Onlineと接続するためのデータソースを作成します。
2024/7/3時点では、データソースの作成はREST API(プレビュー)で作成する必要があります。今回は、APIを実行するためにPOSTMANを使用しました。
下記のAPIを実行します。
POST https://[service name].search.windows.net/datasources?api-version=2024-05-01-preview
Content-Type: application/json
api-key: [admin key]
{
"name" : "sharepoint-datasource",
"type" : "sharepoint",
"credentials" : { "connectionString" : "[connection-string]" },
"container" : { "name" : "defaultSiteLibrary", "query" : null }
}
API内の各項目は下記の通りです。
- service name
- Azure AI Searchのリソース名
- admin key
- Azure AI SearchのAPIキー
- sharepoint-datasource(name)
- Azure AI Search上のデータソース名
- 一意である必要がある
- connection-string(connectionString)
- SharePointOnlineEndpoint=https://{テナント名}.sharepoint.com/sites/{SharePoint Onlineサイト名};ApplicationId={作成したアプリのクライアントId};ApplicationSecret={作成したアプリのシークレットの値}f;TenantId={テナントId}" }
- container
- 下記の値を設定してデータソースにするSharePoint Onlineのドキュメントライブラリを指定できる
- defaultSiteLibrary
- サイトのすべてのドキュメントライブラリ内のコンテンツをインデックス化する
- allSiteLibraries
- サイト内のすべてのドキュメントライブラリ内のコンテンツをインデックス化する
- ただし、サブサイトのドキュメントライブラリは対象外
- サブサイトの内容が必要な場合は、useQueryを使用し、includeLibrariesInSiteを指定する必要がある
- defaultSiteLibrary
- useQuery
- インデックスするコンテンツはqueryで定義された内容のみを指定
- つまり、特定の条件を持つアイテムやライブラリをインデックスしたい場合に役立つ
- ※includeLibraryで 特定のライブラリからすべてのコンテンツをインデックスする
- ただし、指定できるのドキュメントライブラリのみで、フォルダは指定できない
- 下記の値を設定してデータソースにするSharePoint Onlineのドキュメントライブラリを指定できる
インデックスを作成する
続いて、Azure AI Search上にインデックスを作成します。インデックスはフィールドを作成し、検索対象のデータを格納します。
この手順以降は、APIを使用せずともAzureポータルから作成が可能です。今回は、前のステップと同様に、APIをPOSTMANで実行します。
POST https://[service name].search.windows.net/indexes?api-version=2024-05-01-preview
Content-Type: application/json
api-key: [admin key]
{
"name" : "sharepoint-index",
"fields": [
{ "name": "id", "type": "Edm.String", "key": true, "searchable": false },
{ "name": "metadata_spo_item_name", "type": "Edm.String", "key": false, "searchable": true, "filterable": false, "sortable": false, "facetable": false },
{ "name": "metadata_spo_item_path", "type": "Edm.String", "key": false, "searchable": false, "filterable": false, "sortable": false, "facetable": false },
{ "name": "metadata_spo_item_content_type", "type": "Edm.String", "key": false, "searchable": false, "filterable": true, "sortable": false, "facetable": true },
{ "name": "metadata_spo_item_last_modified", "type": "Edm.DateTimeOffset", "key": false, "searchable": false, "filterable": false, "sortable": true, "facetable": false },
{ "name": "metadata_spo_item_size", "type": "Edm.Int64", "key": false, "searchable": false, "filterable": false, "sortable": false, "facetable": false },
{ "name": "content", "type": "Edm.String", "searchable": true, "filterable": false, "sortable": false, "facetable": false }
]
}
API内の各項目は下記の通りです。
- service name
- Azure AI Searchのリソース名
- admin key
- Azure AI SearchのAPIキー
- sharepoint-index(name)
- Azure AI Search上のインデックス名
- 一意である必要がある
- fields
- インデックスの列名と型、検索可能、フィルター可能などを定義
インデクサーを作成する
最後にインデクサーを作成し、データソースからインデクサーにデータを格納する処理を実行します。
POST https://[service name].search.windows.net/indexers?api-version=2024-05-01-preview
Content-Type: application/json
api-key: [admin key]
{
"name" : "sharepoint-indexer",
"dataSourceName" : "sharepoint-datasource",
"targetIndexName" : "sharepoint-index",
"parameters": {
"batchSize": null,
"maxFailedItems": null,
"maxFailedItemsPerBatch": null,
"base64EncodeKeys": null,
"configuration": {
"indexedFileNameExtensions" : ".pdf, .docx",
"excludedFileNameExtensions" : ".png, .jpg",
"dataToExtract": "contentAndMetadata"
}
},
"schedule" : { },
"fieldMappings" : [
{
"sourceFieldName" : "metadata_spo_site_library_item_id",
"targetFieldName" : "id",
"mappingFunction" : {
"name" : "base64Encode"
}
}
]
}
API内の各項目は下記の通りです。
- service name
- Azure AI Searchのリソース名
- admin key
- Azure AI SearchのAPIキー
- sharepoint-indexer(name)
- Azure AI Search上のインデクサー名
- 位置である必要がある
- sharepoint-datasource(dataSourceName)
- 前のステップで作成したデータソース名
- sharepoint-index(targetIndexName)
- 前のステップで作成したインデックス名。
- schedule
- 定期実行する場合の記載例(日本時間で2024年9月2日 00:00:00に開始で、1日ごとの実行の場合。startTimeはUTC時間で記載)
-
"schedule": { "interval": "P1D", "startTime": "2024-09-01T15:00:00Z" }
-
- 定期実行する場合の記載例(日本時間で2024年9月2日 00:00:00に開始で、1日ごとの実行の場合。startTimeはUTC時間で記載)
インデクサー作成後、処理の実行が成功するとインデクサーにデータが格納されて検索が可能になります。
インデクサー実行成功の画面:
Azure AI Search上で検索した画面:
参考:SharePoint Online indexer (preview) - Azure AI Search | Microsoft Learn
まとめ
今回は、SharePoint Onlineのドキュメントライブラリをデータソースに指定して、Azure AI Search上にインデックスを作成しました。
SharePoint Onlineは社内のサイトやTeamsのファイル保存先に使用されることが多い印象があり、RAGに使用したい情報が多く保存されていると思っています。そのため、その情報をインデックスに格納しRAGを構成するシナリオケースは多いのではないでしょうか。
次は、SharePoint Onlineの権限情報もインデックスに格納し、ユーザーに応じて検索できるファイル/できないファイルの制御ができるように実装したいです。