😭Copilot Studioが回答してくれない（from SharePoint・OneDrive）

Copilot Studioを使用すると作成者は、公開 Webサイトや SharePointなどのデータソースに基づいた生成的な回答をするCopilot（チャットボット）を作成することができます。 

ただし、場合によってはCopilotが応答を提供せず、「すみません、どのようにサポートしたらよいかわかりません。言い換えてみてもらえますか?」 (実際のメッセージは異なります) のような内容を返すことがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/189353fe-962c-d463-b4a4-31465e88e6e4.png)


SharePoint または OneDrive がデータ ソースとして構成されている場合、生成回答ができない要因はいくつか存在します。
まずは、以下のリンクの通りに前提条件や手順が正しくクリアされていることを確認してください。
https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/nlu-boost-node

正しく設定をしてもうまく回答してくれない場合は、主に以下５つの要因を探り対処してください。
1. [検索結果がうまくとれていない](#1-検索結果がうまくとれていない)
1. [Copilotにアクセスするユーザーがデータソースに対する十分な権限がない](#2-copilotにアクセスするユーザーがデータソースに対する十分な権限がない)
1. [ファイルが3MBのサイズ制限を超えている](#3-ファイルが3mbのサイズ制限を超えている)
1. [アプリの登録またはCopilotが正しく構成されていない](#4-アプリの登録またはcopilotが正しく構成されていない)
1. [コンテンツモデレートによってコンテンツがブロックされている](#5-コンテンツモデレートによってコンテンツがブロックされている)


# 1. 検索結果がうまくとれていない
SharePoint・OneDriveを基にする生成的な回答は、Graph API検索 エンドポイントの呼び出しに依存します。
Graph API から返される**上位 3 つの結果のみが、要約と応答の生成に使用**されます。 
つまり、Graph API から結果が返されない場合、Copilotは応答を提供しません。

Copilot Studio が Graph API から結果を受け取っていないかどうかを診断するには、**Graph API 検索 エンドポイントを直接呼び出します**。 

## 確認方法
Graph API 検索 エンドポイント への呼び出しは、[Graph エクスプローラー](https://developer.microsoft.com/en-us/graph/graph-explorer) で次のテンプレートを使用して実行できます。

::: note
Graph エクスプローラーについて詳しくはこちら
https://learn.microsoft.com/ja-jp/graph/graph-explorer/graph-explorer-overview
:::

このとき、SharePoint/OneDriveテナントの適切な資格情報を使用してサインインしてください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/3dbb5e2f-c950-612e-b41e-a7274d17b0e7.png" width=50%>


以下のテンプレートをコピーして、Graph エクスプローラーで開くか、こちらの[ディープリンク](https://developer.microsoft.com/graph/graph-explorer?request=search%2Fquery&method=POST&version=v1.0&GraphUrl=https://graph.microsoft.com&requestBody=eyJyZXF1ZXN0cyI6W3siZW50aXR5VHlwZXMiOlsiZHJpdmVJdGVtIiwibGlzdEl0ZW0iXSwicXVlcnkiOnsicXVlcnlTdHJpbmciOiJTRUFSQ0ggVEVSTVMgZmlsZXR5cGU6ZG9jeCBPUiBmaWxldHlwZTphc3B4IE9SIGZpbGV0eXBlOnBwdHggT1IgZmlsZXR5cGU6cGRmIHBhdGg6XCJET01BSU4uc2hhcmVwb2ludC5jb20vc2l0ZXMvU0lURU5BTUUifSwiZnJvbSI6MCwic2l6ZSI6MywiUXVlcnlBbHRlcmF0aW9uT3B0aW9ucyI6eyJFbmFibGVNb2RpZmljYXRpb24iOnRydWUsIkVuYWJsZVN1Z2dlc3Rpb24iOnRydWV9fV19)をクリックします。

```.json
{
    "requests": [
        {
            "entityTypes": [
                "driveItem",
                "listItem"
            ],
            "query": {
                "queryString": "SEARCH TERMS filetype:docx OR filetype:aspx OR filetype:pptx OR filetype:pdf path:\"DOMAIN.sharepoint.com/sites/SITENAME"
            },
            "from": 0,
            "size": 3,
            "QueryAlterationOptions": {
                "EnableModification": true,
                "EnableSuggestion": true
            }
        }
    ]
}
```

右上のアイコンをクリックし、SharePoint/OneDriveテナントの適切な資格情報を使用してサインインできているか確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/7bf0ecaa-d121-4192-73ae-9f3e9bb5aa3a.png)


Request bodyの`DOMAIN`と`SITENAME`に、
今回確認したい該当サイトのURLにある、ドメイン名、サイト名を入れます。

例えば、以下のようなサイトの場合、以下のように設定します。
https://`<user-domain>`.sharepoint.com/sites/DemoSite
`DOMAIN`：`<user-domain>`
`SITENAME`：DemoSite

[Run query]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/a883c0ff-b1b0-f165-006a-39571c17ec8c.png)


今回「サインインしたユーザーに十分な権限がないか、[Modify permissions] タブのアクセス許可の 1 つに同意する必要があります。」というエラーが表示されたため、[Modify permissions]タブを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/8338dfa3-01da-dcbc-1a0b-c56d9a25b2d3.png)

[Modify permissions]タブの「File.Read.All」と「Sites.Read.All」を権限のあるアカウントで[Consent]します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/7d8af40b-9b6f-3f5b-eab3-eae7ca2c0e7f.png)

もう一度、[Run query]をクリックします。「OK」のメッセージが表示されたら完了です。
これができなければ、Copilotでも回答が返ってきません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/5f145ba9-6c27-783b-439d-f92d4404aea6.png)

## うまくいかないときの対処方法

1. 指定先が関連するコンテンツのあるSharePoint・OneDrive のURLであるかを確認
1. サポートされている形式（*）にある書類のみ 応答を生成するために使用されることを確認

::: note 
*注意
サポートされている形式は以下です。
- SharePoint ページ (モダン ページ)
- Word 文書 (docx)
- PowerPoint ドキュメント (pptx)
- PDF ドキュメント (pdf)
:::

3.ドキュメントが SharePoint・OneDrive にアップロードされてすぐの場合、まだインデックスされていない可能性を確認 
また、SharePoint・OneDrive側の設定で、一部のサイトが検索結果に表示されないように設定されている可能性を確認
詳細については、[SharePoint オンラインで検索結果が見つからない](https://learn.microsoft.com/ja-jp/sharepoint/troubleshoot/search/search-results-missing) を参照してください。

# 2. Copilotにアクセスするユーザーがデータソースに対する十分な権限がない

SharePoint と OneDrive 上の生成された回答は、Graph API を呼び出すときの[委任されたアクセス許可](https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/nlu-boost-node#authentication)に依存します。 
ユーザーは少なくとも、関連するサイトおよびファイルに対する読み取り権限を持っている必要があります。そうでない場合、Graph API の呼び出しは結果を返しません。

## 対処方法

関連するSharePoint と OneDriveのサイトやファイルにアクセスできるようにユーザーの権限を変更します。
 詳細については、 [SharePoint モダン エクスペリエンスにおける共有と権限](https://learn.microsoft.com/ja-jp/sharepoint/modern-experience-sharing-permissions) を参照してください。


# 3. ファイルが3MBのサイズ制限を超えている
現在、生成的回答は**最大 3 MB**のサイズのファイルのみを処理できます。
大きなファイルは SharePoint に保存でき、Graph API 検索によって返されますが、**生成的な回答では処理されません**。

https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/nlu-generative-answers-sharepoint-onedrive

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/019c5d03-441b-7aac-7443-9849b11c4d1b.png)


## 対処方法
ファイルを編集・分割して小さくするか、
[Microsoft 365 セマンティックインデックス](https://learn.microsoft.com/ja-jp/microsoftsearch/semantic-index-for-copilot) または[Azure Open AI for Generative Answersへ接続する](https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/nlu-generative-answers-azure-openai) (Add your Data) の使用など、代替アーキテクチャを検討することをお勧めします。

# 4. アプリの登録またはCopilotが正しく構成されていない

社内でCopilotを使用する前に、管理者は Microsoft Entra IDによる認証を設定し、追加のスコープを構成する必要があります。 

アプリの登録またはCopilotの認証設定にスコープが欠落している場合、または必要なスコープに同意が与えられなかった場合、結果は返されず、**エラーや例外も返されません**。 
エンドユーザーから見ると、ドキュメントが見つからなかったかのように見えます。

## 対処方法
①アプリ登録の確認
以下のサイトの手順を参考にアプリ登録を行ってください。

https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/configuration-authentication-azure-ad

正しく設定できていれば以下の画像のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/1d80a699-7e38-ae1f-bbe8-8f954b256bc2.png)


②認証設定の確認
以下のサイトの手順を参考に認証設定を行ってください。

https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/configuration-end-user-authentication


正しく設定ができていれば、以下のような設定内容で表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/f0aac11a-811f-b10d-9405-df8ba5e2baff.png" width=60%>



# 5. コンテンツモデレートによってコンテンツがブロックされている
応答を生成するとき、Copilot Studioは、次の可能性のあるコンテンツをブロックします。
- 有害である
- 悪意のある
- 非準拠である
- 著作権に違反している 

コンテンツがブロックされた場合、回答は行われず、その事実を示す応答や表示を提供しません。
こちらの挙動はサービスを使うユーザーを守るためのもので、簡単なレベル設定はできます。

また、ブロックされたかどうかを確認するための設定をすることも可能です。
Copilot Studioのテレメトリデータを Azure Applications Insights に送信するように構成されている場合、モデレーションイベント（ブロックされた回答）はログに記録されます。

### 対処方法

①コンテンツモデレーションのレベル設定で調整する
Copilotの生成AIページにある[Copilotのコンテンツモデレーション]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/cb8f7190-ea55-c945-8ebe-c15b60634c88.png)

規定値は[High]になっていますが、他に[Medium], [Low]を設定できます。
高いほど、厳しくブロックされます。
- [High]: Copilot の回答は適切
- [Medium]: Copilot はより多くの回答を生成するが、回答は無関係または望ましくない可能性あり
- [Low]: Copilot は最も多くの回答を生成するが、不正確である可能性あり

設定を変更したら[保存]を忘れずにしましょう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/47515a60-e11b-77ea-26e2-1b0f3e29242f.png)

https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/nlu-boost-conversations#content-moderation

②サポートに問い合わせ
回答が返ってこず、コンテンツをモデレート（ブロック）すべきではないと思われる場合は、以下のサイトの手順に従って、サポートに問い合わせをお願いいたします。

https://learn.microsoft.com/ja-jp/power-platform/admin/get-help-support

③ブロックされたかどうかを確認する設定を行う
回答だけ見ても、ブロックされた結果なのかどうかがわかりません。
こちらを確認したい場合は、設定で分析が行えるようにしましょう。

以下の手順に従って、Copilot Studioのテレメトリデータを Azure Applications Insights に接続します。
https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/advanced-bot-framework-composer-capture-telemetry?tabs=webApp#connect-your-microsoft-copilot-studio-bot-to-application-insights

Copilotを Azure App Insights に接続した後、Application Insights リソースの[Logs]セクションに移動します。

次の Kusto Query Language (KQL) クエリを使用して、コンテンツがブロックされたかどうかを確認できます。

```
customEvents
| extend cd = todynamic(customDimensions)
| extend conversationId = tostring(cd.conversationId)
| extend topic = tostring(cd.TopicName)
| extend message = tostring(cd.Message)
| extend result = tostring(cd.Result)
| extend SerializedData = tostring(cd.SerializedData)
| extend Summary = tostring(cd.Summary)
| extend feedback = tostring(todynamic(replace_string(SerializedData,"$","")).value)
| where name == "GenerativeAnswers" and result contains "Filtered"
| where cloud_RoleInstance == "myCopilot"
| project cloud_RoleInstance, name, timestamp, conversationId, topic, message, result, feedback, Summary
| order by timestamp desc

```

結果、ブロックされたときのデータが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/d05c630d-5f2a-4c62-ca82-3f1ccb67697d.png)


# 参照

https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/generative-answers-sharepoint-no-response