UiPathドキュメントポータルの内容をチャットで問い合わせるシステムを作る

# はじめに
皆さん、こんにちは！私はUiPath Japanで主にインフラ領域を担当していますhidechaと申します。普段はUiPath Orchestratorを中心としたサーバーサイドの技術支援をしております。

本記事は [UiPath (produced with UiPath Friends) Advent Calendar 2023](https://qiita.com/advent-calendar/2023/uipath) の第9日目です。

https://qiita.com/advent-calendar/2023/uipath

今回は最近流行りの生成系AIを使ってUiPathドキュメントポータルの内容にチャットで問い合わせするシステムをAzure環境にデプロイしてみましたので、その手順と結果について紹介したいと思います。なるべくノーコードでUiPath製品を活用する構成になっています。

最初にお断りしておきますと、生成系AIは非常に進歩が早い分野ですのでここに書かれているAzure関連のサービス内容はすぐに古くなってしまう可能性が高いです。関連するリンクを記載していますので最新情報はそれぞれのWebサイトをご参照ください。

# 独自データ有無による回答精度の違い
- まず本家の [ChatGPT](https://chat.openai.com/) でUiPath Studioのソフトウェア要件について質問をしてみます。
  - **問い**: 「UiPath Studioのソフトウェア要件について教えて」
  - **独自データ無しの回答**:
> UiPath Studioのソフトウェア要件は、UiPathの公式ウェブサイトから入手できる情報が最も正確です。
> ただし、一般的な要件は以下の通りです。なお、これらの情報は2022年1月の時点のものであり、
> 最新の情報はUiPathの公式ウェブサイトで確認してください。
> 
> UiPath Studioの最低要件:
> 
> オペレーティング システム: Windows 7 SP1以上（64ビット版）
> .NET Framework: 4.7.2以上
> RAM: 4 GB以上
> ディスク スペース: 2 GB以上
> ディスプレイ解像度: 1366 x 768以上
> ブラウザ: Internet Explorer 11以上
> UiPath Studioの推奨要件:
> 
> オペレーティング システム: Windows 10（64ビット版）
> RAM: 8 GB以上
> ディスク スペース: 4 GB以上
> ディスプレイ解像度: 1920 x 1080以上
> ブラウザ: 最新版のGoogle ChromeやMozilla Firefox
> UiPathのソフトウェア要件は製品のバージョンによっても異なる可能性があるため、
> 具体的なバージョンについての情報も確認してください。
> UiPathの公式ウェブサイトのドキュメンテーションやサポートページには最新の情報が提供されています。

- OS要件として既にサポート終了のWindows 7が含まれていたり、現在はサポート範囲内のWindows 11が含まれていなかったりと UiPathドキュメントポータルの [システム要件](https://docs.uipath.com/ja/studio/standalone/2023.10/user-guide/hardware-and-software-requirements) の記載と比較すると内容にかなり乖離があることが分かります。

- 手順は追って説明しますがUiPathドキュメントポータルの内容を独自データとして追加した場合、次のように同じ質問でもより精度の高い回答を得ることができます。
  - **問い**: 「UiPath Studioのソフトウェア要件について教えて」
  - **独自データ有りの回答**:
> UiPath Studioのハードウェアおよびソフトウェアの要件は以下の通りです。
> 
> ハードウェア要件:
> - CPUコア: 最小2 × 1.8 GHz 64-bit (x64)、推奨4 × 2.4GHz 64-bit (x64)
> - RAM: 最小4 GB、推奨8 GB
> - ディスク領域: 新しいサイレントインストール用に3.4 GB。UIベースのインストールには1 GBの追加領域が必要です。自動更新用に3.4~3.8 GB (更新元のバージョンにより異なります)。UIベースの更新には1 GBの追加領域が必要です。
> 
> ソフトウェア要件:
> - オペレーティングシステム: Windows 10, Windows 10 N, Windows 11, Windows Server 2016
> - その他の必要ソフトウェア: Microsoft Visual Studio 2015, 2017, 2019, 2022用 Visual C++再頒布可能パッケージ、x64バージョン (Gitソース管理に必須)

# Azure OpenAI Serviceの利用
- 今回独自データを追加したチャットシステムの構築にはAzure OpenAI Serviceを利用します。本家のChatGPT(OpenAI)とどこが違うの？と思われる方も多いでしょう。主な違いとして次のようなものがあります。

|比較項目|ChatGPT|Azure OpenAI Service|
|---|---|---|
|学習データとしての再利用|SaaSでは利用する可能性あり (API連携では利用せず)|[利用しない](https://learn.microsoft.com/en-us/legal/cognitive-services/openai/data-privacy)|
|接続方式|インターネット接続のみ|インターネット接続に加えて閉域網(VNET)接続も可能|
|利用可能なモデル|最新モデルが利用可能|やや遅れて最新モデルが利用可能|
|価格|[OpenAIの価格体系](https://openai.com/pricing)|[Azure OpenAI Serviceの価格体系](https://azure.microsoft.com/ja-jp/pricing/details/cognitive-services/openai-service/)|
|SLA|定義なし|99.9% (サービス提供に関するSLAのみ。API応答時間のSLAは定義なし)|
|サポート|コミュニティサポートのみ|[Azure AIサポートオプション](https://learn.microsoft.com/ja-jp/azure/ai-services/cognitive-services-support-options)に準ずる|

- このように最新機能を個人的に試すのであれば本家のChatGPTでも良いのですが、企業向けのシステムとして利用するにはセキュリティやサポートの観点からもAzure OpenAI Serviceを使った方が良いと思われます。

# 独自データ追加の必要性
- 次にChatGPTに代表されるLLMは学習データやリリース時期によって一般的に次の短所があります。
  - 最新情報を知らない (カットオフ)
    - GPT3.5は2021年9月、GPT4は2022年1月、最近発表されたGPT4-Turboでも2023年4月までの出来事しか知りません。
  - 特定領域の情報は精度が低い
    - 一般的なLLMの学習データにはWikipediaなどに代表される一般公開データが使用されます。当然のことながら社内文書や特定領域に特化した情報は知らない、もしくは理解が浅いという短所があります。
- これらの短所を補うため外部ソースの独自データを与えることによってLLMの精度と信頼性を向上させる方法が考案され、これが **RAG(Retrieval Augmented Generation)** と呼ばれる手法になります。
    - RAGを実装するためにはさまざまな方法があり、現時点で主流となっているのは [LangChain](https://www.langchain.com/) や [LlamaIndex](https://www.llamaindex.ai/) などのライブラリを使用して独自の補強データをロードする方法です。これらのライブラリを使用するためには主にPythonやJavaScriptなどのコーディングスキルとライブラリ自身の知識が必要となります。
    - 一方ノーコードでRAGを実装するための方法もいくつかありますが、今回はMicrosoft社が公開している [Azure環境で動作するサンプルアプリケーション](https://github.com/Azure-Samples/azure-search-openai-demo/) を利用したいと思います。データソースとしてUiPathドキュメントポータルにWebアクセスしてPDFに変換して保存するワークフローを実行して独自データとして追加します。
    ![Workflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/16f87d13-f1ff-2212-a307-a9e01f9e549b.png)
        - やや内容が古いですが、サンプルアプリケーションの説明を日本語されたものが [こちら](https://qiita.com/nohanaga/items/bbc0c1fba1ec53deeeed) でも紹介されていますので必要に応じてご参照ください。
        - ただしこちらのサンプルアプリケーションでは独自データの追加方法などにおいて、やや柔軟性にかける部分がありますのでフルでカスタマイズするにはLangChainなどのライブラリを利用した方が良いでしょう。
- ちなみに他の方法として学習データを利用して言語モデル自体をトレーニングしてカスタマイズする [Fine-tuning](https://learn.microsoft.com/ja-jp/azure/ai-services/openai/how-to/fine-tuning?tabs=turbo&pivots=programming-language-studio) という方法もありますが、専門的知識と大量のトレーニングデータが必要となるため、あくまでも最終手段として考えておいた方が良いと思います。

# 独自データの準備
- Azure OpenAI Serviceに独自データを追加するにはAzure AI Search (旧 Cognitive Search)という検索システムでインデックスを作成しますが、まず元になるデータファイルを準備します。LangChainでは参照するWebサイトを直接指定できますが、Azure AI Searchでは現時点ではできないようなので予めWebサイトの内容をPDFなどにファイルに変換してローカルディレクトリに保管しておきます。今回はUiPathドキュメントポータルの [Studioガイド 2023.10](https://docs.uipath.com/ja/studio/standalone/2023.10) を利用します。
- これを実現するためにはUiPath Studioで自動化ワークフローを作成するのが良いでしょう。筆者はワークフロー作成については素人なので生成したものを掲載するのは自粛させてください。処理内容としては次のようなものになります。
    1. データを収集するWebサイトの一覧を作る (ドキュメントポータルのメニューを展開してリンクを取ってきます)
    2. 各Webサイトにブラウザーでアクセスする
        ![DocsMenu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/d37f24bd-d68d-752d-1296-442e7f2855c0.png)
    3. Webサイトの内容をブラウザーの印刷機能でPDFに変換してローカルに保存する
    4. 1の一覧を元に2と3を繰り返す

# Azureサンプルアプリのデプロイ

## 前提条件ソフトウェアのインストール
- 独自データが準備できましたらAzure環境に [サンプルアプリケーション](https://github.com/Azure-Samples/azure-search-openai-demo/) をデプロイしてみましょう。このためにはAzureアカウントはもちろんのこと、作業端末に次の前提条件となるソフトウェアをあらかじめインストールしておく必要があります。
    - [Azure Developer CLI](https://aka.ms/azure-dev/install)
    - [Python 3.9, 3.10 または 3.11](https://www.python.org/downloads/)
    - [Node.js 14以降](https://nodejs.org/en/download/)
    - [Git](https://git-scm.com/downloads)
    - [PowerShell 7以降](https://github.com/powershell/powershell)
- やや内容が古いですが、サンプルアプリケーションの説明を日本語されたものが [こちら](https://qiita.com/nohanaga/items/bbc0c1fba1ec53deeeed) でも紹介されていますので必要に応じてご参照ください。

## デプロイ手順
- 前提条件のソフトウェアがインストールできましたらGit Bashを起動し、次のコマンドを順次実行します。
    1. まずAzureにログインします。テナントIDはAzureポータルのMicrosoft Entra ID (旧 Azure AD) の [概要ページ](https://portal.azure.com/#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/~/Overview) で確認してください。
        ```Bash
        azd auth login --tenant-id <your-tenantId>
        ```
    2. 作業ディレクトリは `C:\Azure` (Bashでは `/c/Azure`) としています。下記コマンドでGitHubよりソースをダウンロードできます。
        ```Bash
        cd /c/Azure/
        azd init -t azure-search-openai-demo
        ```
        ![Deploy01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/32a10ad7-2e2c-4bee-cd82-0967b2a4900f.png)
    
    3. プロンプトで `environment name` を指定します。ここでの文字列はリソースグループ名などに使用されます。
        ![Deploy02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/fcf49261-b125-6407-ef78-66534fad35d0.png)
    
    4. 日本語検索の精度を上げるためにインデックスのアナライザーを日本語に変更します。
        ```Bash
        azd env set AZURE_SEARCH_ANALYZER_NAME ja.lucene
        ```
    5. 前のステップで作成したPDFファイルを `C:\Azure\data` に配置します。サンプルとして既に配置されているPDFファイルは不要ですので削除します。
        ![Deploy03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/b411a497-5ab0-0e34-6c0d-466f3e980749.png)
    
    6. 【任意】サンプルアプリケーションでは既定値で言語モデルとして `gpt-3.5-turbo (0613)` が使用されますが、 `gpt-4 (1106-preview)` など他のモデル・バージョンを使用するには `infra\main.bicep` の下記箇所を修正します。既定値を使用する場合はこの手順をスキップします。
        ```diff:main.bicep
        - param chatGptModelName string = (openAiHost == 'azure') ? 'gpt-35-turbo' : 'gpt-3.5-turbo'
        - param chatGptModelVersion string = '0613'
        + param chatGptModelName string = 'gpt-4'
        + param chatGptModelVersion string = '1106-preview'
        ```
    
    7. デプロイを実行します。
        ```Bash
        azd up
        ```
    8. プロンプトでAzureサブスクリプションとリージョン(ロケーション)を指定するとデプロイが開始します。
        ![Deploy04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/cbf7da7f-4ddb-818d-e208-77d614c2de7e.png)

    9. エラーが発生しなければ1時間ほどで `SUCCESS: Your application was provisioned and deployed to Azure in ...` というメッセージでデプロイが完了します。表示されるEndpointをメモします。
        ![Deploy05b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/023d7b8e-9fdb-bf2b-e84c-47340d9c87b9.png)
    10. Azureポータルでリソースグループ `rg-<指定したenvironment name>` 配下にリソースが作成されていることを確認します。
        ![Deploy06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/5d458b67-9685-831b-9971-2f32a75c0084.png)
    11. ブラウザーで先ほどメモしたEndpointにアクセスします。
        ![Deploy07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/a93d8c44-5151-94c7-5fa9-5748a7ef85bc.png)

# Studioに関する質問をしてみる
- チャット画面が表示されましたら独自データを加味した回答が得られるか質問してみましょう！
    - 「UiPath Studioのソフトウェア要件を教えて」
        ![Chat01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/8d71af99-021e-f615-cf85-1ae3de6b91eb.png)
    - 「コード化されたオートメーションについて教えて」
        ![Chat02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/98d44827-e00c-44a4-4fae-d3cb0610bbc8.png)
    - 「ワークフローアナライザーで事前定義されているルールについて詳しく教えて」
        ![Chat03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/84e67cfa-f8e3-77b5-9b22-4ad7d0fce5dd.png)
- Citations(引用)のリンクをクリックすることにより出典となる独自データのPDFファイルを表示することもできます。
    ![Citation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/18a2f7ea-c541-d5a0-9627-ba50004b428f.png)

# 今後に向けて
- 今回はUiPathドキュメントポータルのデータを使用しましたが、応用として様々なデータソースからの文書をアップロードすることによって、それらの内容について問い合わせできるようになります。Studioワークフローによって自動的に最新データを収集して登録する方法をぜひ実践してみてください。
- より多くのユーザーに利用してもらうには多様なフロントエンドの実装も必要となります。[Azure Bot Service](https://azure.microsoft.com/ja-jp/products/ai-services/ai-bot-service) を利用するとTeamsやSlackとの連携も容易に実装できます。
- チャット画面にインターネット経由ではなくVNETから接続するにはフロントエンドを提供しているAzure App Serviceにプライベート接続を設定します。またAzure OpenAI ServiceやAI Service内部でもプライベート接続を設定することができます。詳細はAzureドキュメントをご参照ください。
    - [App Service アプリにプライベート エンドポイントを使用する](https://learn.microsoft.com/ja-jp/azure/app-service/networking/private-endpoint)
    - [Azure AI Search への安全な接続を行うためのプライベート エンドポイントを作成する](https://learn.microsoft.com/ja-jp/azure/search/service-create-private-endpoint
)
- Azure AI Searchと連携する方法としてAzure OpenAI Service の [Add your data機能](https://learn.microsoft.com/ja-jp/azure/ai-services/openai/use-your-data-quickstart) というものもあります。現時点ではまだプレビュー段階ですが、手軽にRAGを検証することができます。

# おわりに
自然言語で質問できるようになるとキーワード検索と比較して容易に必要な情報にアクセスできるようになります。今後も検索精度向上に向けたチューニング方法などを模索してゆきたいと思います。最後までお読みいただき有難うございました！

🎄 それでは皆さま、良いクリスマスと良いお年をお迎えください！ 🎍