Databricks Agent Bricks で SharePoint Online 上のドキュメントをナレッジソースにして Q&A チャットボットを作成する

## はじめに

以下の記事で SharePoint Online のファイルを連携したあとのユースケースの一つとして Agent Bricks を使用して Q&A チャットボットを作成してみます。

https://qiita.com/ryoma-nagata/items/d112b91ae317de4e8f02 


## Agent Bricks とは

> Agent Bricksは、一般的なAIユースケース向けに、ドメイン固有の高品質なAIエージェントシステムを構築および最適化するためのシンプルなノーコードアプローチを提供します。Agent Bricksは、AIエージェントシステムの実装を効率化し、ユーザーが問題、データ、メトリクスに集中できるようにします。

出典：https://learn.microsoft.com/en-us/azure/databricks/generative-ai/agent-bricks/

## セットアップ

機能の有効化を行います。前提条件がまだ色々あるので、注意です。今回の記事では westus 環境を使っています。

>サーバーレスでサポートされるワークスペースには、次のものが含まれます。
>- ワークスペースで Unity Catalog が有効になっている。
>    - パートナーが提供する AI 支援機能がワークスペースで有効になっています。
>    - サポートされているリージョンのいずれかのワークスペース: または .eastuswestus
>    - Mosaic AI モデルサービングへのアクセス。
>     - スキーマを使用した Unity Catalog の基盤モデルへのアクセス。system.ai
>     - 予算が 0 以外のサーバーレス予算ポリシーへのアクセス。
> - 入力データを使用する準備ができている必要があります。次のいずれかを選択できます。 
>     - Unity Catalog のボリュームまたはボリューム ディレクトリ内のファイル。サポートされているファイルタイプは、txt、pdf、md、ppt/pptx、doc/docx です。
>      - ベクトル検索インデックス。
出典：https://learn.microsoft.com/en-us/azure/databricks/generative-ai/agent-bricks/knowledge-assistant#requirements

![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F281819%2F2399f463-ccd0-423f-9b9f-5f47cebf160e.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=5874ad247367f7148605c6ccc99a57ce)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/9a2922ab-4a9a-42f2-860b-9910836feb9e.png)



ソースは web 上で公開されている [Delta Lake: The Definitive Guide](https://delta.io/pdfs/dldg_databricks.pdf)　を使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/424898b0-5f48-47a3-8e2f-eb8853bb6b7c.png)
出典：https://delta.io/

SharePoint に配置して、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/72dd14c0-efa5-4f9c-b574-ffa585507fbb.png)

[前記事のパイプライン](https://qiita.com/ryoma-nagata/items/d112b91ae317de4e8f02)でファイルが連携されていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/7ccbfd76-9414-4ddf-8eb9-4d5aeb2ab996.png)

## 1. ナレッジソースを配置する

チャットボットが参照するナレッジを Volume に配置します。Lakeflow Connect の SharePoint 取込はバイナリ文字列となっているので、これを AI 処理のためのファイルとして書き出します
1. Volume を作成しておきます。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/18c5cbdc-8f84-460b-8ee8-25d3f218d751.png)


1. ノートブックで対象のフォルダの pdf のレコードのみを抽出
    ```python:pyspark
    
    df = spark.sql("""
        WITH base AS (
            SELECT 
                file_id,
                file_metadata.name,
                source_metadata.drive_id,
                source_metadata.file_folder_path,
                content,
                REPLACE(
                    source_metadata.file_folder_path,
                    CONCAT('/drives/', source_metadata.drive_id, '/root:/')
                ) AS path
            FROM bronze_prod.sharepoint.documents
            WHERE source_metadata.mime_type = 'application/pdf'
        )
        SELECT 
            name AS file_name,
            content 
        FROM base 
        WHERE path LIKE 'databricks_knowledge%'
    """)
    df.printSchema()
    
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/273f318a-18f4-40e6-8cf9-1bddb93ca60a.png)

2. [ダウンストリームRAGの使用例](https://learn.microsoft.com/en-us/azure/databricks/ingestion/lakeflow-connect/sharepoint-rag)を参考にして Volume に配置します。

    ```python:pyspark
    
    from pyspark.sql.functions import udf, struct
    
    # copy to volume_path and get file path
    def copy_to_disk(blob, filename) -> str:
        volume_path = "/Volumes/bronze_prod/sharepoint/databricks_knowledge_sources/"
        fname = volume_path + filename
        with open(fname, "wb") as f:
            f.write(blob.inline_content)
        return fname
    
    read_blob_as_file = udf(copy_to_disk)
    
    # Chain your UDF with the file access UDF for the file path.
    
    df = df.withColumn("text_content", read_blob_as_file("content", "file_name")).collect()
    
    
    
    ```

3. 処理が完了すると、ファイルが Volume に配置されます。
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/5a242de7-5f6f-4edf-8657-31877bd02026.png)
    
    
    :::note info
    
    ナレッジソースとして直接 Agent Bricks のソースにするためにファイルに書き出していますが、Vector Index 化する際には一時的でもよく、永続的なファイル化は必須ではないかと思います。
    
    >Unity Catalog ファイルまたはベクター検索インデックスのいずれかを提供することを選択できます。
    >UC ファイルの場合、txt、pdf、md、ppt/pptx、doc/docx のファイル タイプがサポートされています。Databricks では、32 MB 未満のファイルを使用することをお勧めします。
    
    出典：https://learn.microsoft.com/en-us/azure/databricks/generative-ai/agent-bricks/knowledge-assistant#step-1-configure-your-agent
    
    :::

## 2. Agent を構築する

[Agent Bricks: Knowledge Assistantを使用して、ドキュメント上に高品質のチャットボットを作成します](https://learn.microsoft.com/en-us/azure/databricks/generative-ai/agent-bricks/knowledge-assistant)　に従って進めていきます。

1. 左部のメニューから Agent を選択し、ナレッジアシスタントを選択します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/4acf28e0-57b7-461e-b7bc-83b980f0aa32.png)

2. 名前と役割を設定
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/ea7fbca5-4ec8-405c-b9fb-309ddab87ab2.png)

3. Vector Store などを保存する対象のスキーマと、ナレッジソースとなる Volume パスを選択します。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/442a8e75-270d-4de7-be66-3adc4c7cc7bc.png)

4. 最後に回答に関してのガイドラインを定めます。
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/35342fc6-cdcc-43d6-9e4e-98890c9c01f5.png)

最低限の設定としては以上です！

Agent の作成が開始すると、ナレッジソースなどの処理が開始されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/d8825c0e-1e05-458f-ad94-3a122bb5d6c7.png)

完了後の画面は以下。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/1f3b6f2a-b4df-47e0-a1e9-763a6b603083.png)


## 3. Agent に質問する

1. Playgound にアクセスして、質問を投げてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/7fa00e5c-07ee-4c2b-9b85-178253934588.png)
2. 少し待機すると Agent の回答が得られます。出典もしっかり載っています。
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/d8492430-b43e-4c6d-8a92-e542e32e256d.png)

    表示された回答については [AI 審査](https://learn.microsoft.com/en-us/azure/databricks/mlflow3/genai/eval-monitor/concepts/judges/)が入ります。
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/ec3925b6-db38-4ec1-8a25-503c4370dd37.png)
    
    出典が得られなかったり、エージェントに関係ない質問をするとここでインジケータが表示されます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/bdc99503-6407-4932-8b3a-998c6900c23b.png)

    また、質問内容の提案をもらうことも可能です。
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a01f9683-b9e6-4834-bc9d-97cc94eac41f.png)

## 4. Agent の品質を向上させる
Agent の回答について、専門家によるフィードバックを得ることで品質を改善していくことが可能です。
    
1. 品質向上のセクションでレビューの必要な質問を追加します。
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/31db0667-159a-4f3d-9121-751677247c53.png)
    
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/5b003b45-2be1-4f25-8d30-9f0e92ff0c03.png)

1. ラベルつけセッションを開きます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/f30d2929-dffb-4145-86fc-700e6382b23b.png)


1. レビュー画面で、Agent による回答を確認し、この質問に対する回答時の注意事項とフィードバックを記入します。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/7c4e8aa3-9c5b-4652-9617-35839486bfdd.png)
        
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/bb191a78-7267-4773-8487-da0cae93da97.png)

1. フィードバックを統合して、 Agent に反映します。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/de640263-40a2-451c-b7fe-fbe1f688582f.png)

1. ちょっとわかりにくいですが、回答にストリーミングワークロードの記述が反映されました。
        
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/23fa0a0f-b8dc-47c3-9760-4bb194f98c56.png)

## 所感

Agent Bricks は簡単に Gen AI アプリを構築し、改善サイクルを開始できる仕組みが組み込まれていることがわかりました。

今回は1ファイルだったため、ナレッジソースの処理時間がファイルの量に応じてどれくらい変わっていくのかというのは要検証となるかなと思います。