AI-102試験対策のまとめ「QnA Makerクライアントライブラリを使用したナレッジベースの作成」

## はじめに
Azure AI Engineer Associate(AI-102)取得に向けた勉強でまとめた内容を本記事では投稿しています。
試験範囲の内容を私が勉強していく中で、
・忘れてしまっていた内容
・他の知識と絡めて理解した方が良い内容
・Microsoft Learnの読解に苦戦した内容
などをできるだけ分かりやすく簡潔にまとめることを意識しています。
Azureの勉強を一から始め、AI-102取得を目指している方の参考になれば幸いです。
※本記事の内容が必ず試験に出るわけではないこと、ご注意ください
※勉強しながら投稿しているため、追加で学んだことがあれば随時投稿内容を更新します。

## 試験対策のまとめ
### QnA Makerクライアントライブラリを使用したナレッジベースの作成
#### **QnA Maker**
* データに自然な会話レイヤーを作成できるクラウドベースの自然言語処理(NLP)サービス
* 任意の入力に対して、カスタムナレッジベース(KB)の情報から最も適切な回答を見つけるために使用
* ナレッジベースには次の3つのソースのCreateKbDTOオブジェクトに対する質問と回答のペアが格納
    - 本文：QnADTOオブジェクトを使用
        - メタデータとフォローアッププロンプトを使用するには編集コンテキストを使用  
        (このデータは個々のQnAペアレベルで追加されるため)
    - ファイル：FileDTOオブジェクトを使用
        - FileDTOにはファイル名とファイルに到達するためのパブリックURLが含まれる
    - URL：公開されているURLを表す文字列のリストを使用

#### **QnAMakerClientオブジェクトモデル**
* QnA Makerクライアントは下記を使用してAzureに対する認証を行うQnAMakerClientオブジェクト
    - 自分のキーが含まれている`Microsoft.Rest.ServiceClientCredentials`
* クライアントが作成されたら、ナレッジベースのプロパティを使用して、ナレッジベースを作成/管理/公開する


#### **ナレッジベースを作成するためのクライアントを認証**
1. APIキーを使用してQnAMakerClientオブジェクトをインスタンス化
1. リソースとともにそのオブジェクトを使用してエンドポイントを構築
1. エンドポイントとAPIキーを使用してQnAMakerClientを作成
```C#
var client = new QnAMakerClient(new ApiKeyServiceClientCredentials(authoringKey))
{ Endpoint = authoringURL };
```

#### **ナレッジベースの作成**
* 含まれるナレッジベースのプロパティ
    - `defaultAnswerUsedForExtraction`：回答が見つからない場合に返されるもの
    - `enableHierarchicalExtraction`：抽出されたQnAペア間のプロンプト関係を自動的に作成
    - `language`：リソースの最初のナレッジベースを作成するときに、Azure Serchインデックスで使用する言語を設定
1. CreateAsyncメソッドを呼び出す
1. 返された操作IDをMonitorOperationメソッドに渡す
1. 状態をポーリング
* コードの最後ではMonitorOperationの応答からナレッジベースIDを返している
```C#
private static async Task<string> CreateSampleKb(IQnAMakerClient client)
{
    var qna1 = new QnADTO
    {
        Answer = "Yes, You can use our [REST APIs](https://docs.microsoft.com/rest/api/cognitiveservices/qnamaker/knowledgebase) to manage your knowledge base.",
        Questions = new List<string> { "How do I manage my knowledgebase?" },
        Metadata = new List<MetadataDTO> {
            new MetadataDTO { Name = "Category", Value = "api" },
            new MetadataDTO { Name = "Language", Value = "REST" }
        },

    };

    var qna2 = new QnADTO
    {
        Answer = "Yes, You can use our [.NET SDK](https://www.nuget.org/packages/Microsoft.Azure.CognitiveServices.Knowledge.QnAMaker) with the [.NET Reference Docs](https://docs.microsoft.com/dotnet/api/microsoft.azure.cognitiveservices.knowledge.qnamaker?view=azure-dotnet) to manage your knowledge base.",
        Questions = new List<string> { "Can I program with C#?" },
        Metadata = new List<MetadataDTO> {
            new MetadataDTO { Name = "Category", Value = "api" },
            new MetadataDTO { Name = "Language", Value = ".NET" }
        }
    };

    var file1 = new FileDTO
    {
        FileName = "myfile.tsv",
        FileUri = "https://mydomain/myfile.tsv"

    };

    var createKbDto = new CreateKbDTO
    {
        Name = "QnA Maker .NET SDK Quickstart",
        QnaList = new List<QnADTO> { qna1, qna2 },
        //Files = new List<FileDTO> { file1 }

    };

    var createOp = await client.Knowledgebase.CreateAsync(createKbDto);
    createOp = await MonitorOperation(client, createOp);

    return createOp.ResourceLocation.Replace("/knowledgebases/", string.Empty);
}
```

<br>

* 参考
    - https://learn.microsoft.com/ja-jp/azure/ai-services/qnamaker/quickstarts/quickstart-sdk?tabs=v1%2Cversion-1&pivots=programming-language-csharp


## 次の試験対策のまとめ
* **AI-102試験対策のまとめ「Translator V3.0のベースURL」**

https://qiita.com/fsd-jume/items/305ee8d6bbe1d324474d

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/65aba5d5514e023fd66d