Azure OpenAI on your data で ChatGPT をカスタマイズする

### はじめに

OpenAI の ChatGPT や GPT-4 などの大規模言語モデル (LLM) に対して、社内のナレッジなど独自のデータを含めるようにカスタマイズする手法がいくつかありますが、大別すると下記 2 種類があると思います。

1. プロンプトに関連性の高いデータを含める ​
2. モデルをナレッジを含む形に Fine-tuning する

簡単に試せるのは前者 1. の方式と思います。
LangChain や LlamaIndex など大規模言語モデルを扱うライブラリでは、この方式を簡単に実装できるような機能が提供されています。

### Azure OpenAI on your data

Azure にはテキストファイルや画像ファイルを取り込んで検索する Cognitive Search という検索サービスがありますが、これを利用して ChatGPT や GPT-4 といった LLM に独自のデータを追加できるサービスが「Azure OpenAI on your data」です。
2023/6/20 時点では、パブリック プレビュー段階の提供となっています。  
本サービスでは、まず Cognitive Search によってユーザーの入力や会話履歴から関連するデータが特定され、このデータの情報をプロンプトに追加して LLM から回答を得るようになっています。  
詳細は下記を参照ください。

https://learn.microsoft.com/en-us/azure/cognitive-services/openai/concepts/use-your-data

#### サポートされているファイル種別

下記のようなファイルがサポートされています。

- .txt
- .md
- .html
- Microsoft Word 文書
- Microsoft PowerPoint 文書
- PDF

#### ChatGPT プレイグラウンドからの利用

Azure OpenAI Studio の ChatGPT プレイグラウンドから簡単に試すことができます。  
下記リソースが必要となります。

- Azure OpenAI (利用にはサブスクリプション毎に申請が必要です)
- Cognitive Search
- ストレージアカウント (Blob Storage)

Azure OpenAI Studio の ChatGPT プレイグラウンド (チャット) を開くと、「Add your data (preview)」タブが追加されています。  
このタブを選択し、「Add a data source」ボタンを押します。　
![スクリーンショット 2023-06-20 105142.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104149/36901341-3cb6-10d0-0a5f-8c7d9274b75d.png)

まずデータソースを選択します。データソースとしては、「Azure Cognitive Search」、「Azure Blob Storage」、「Upload files」が選択できますが、ここでは「Upload files」を選択してローカルからファイルをアップロードします。

データソースのファイルには[過去の記事](https://qiita.com/fsdg-honda/items/98131eb3d24af49235fb)で使用した架空のオフィスに関する FAQ を記載した Microsoft Word 文書を指定します。

ファイルのアップロード先となるストレージアカウント、検索インデックスの作成先となる Cognitive Search、インデックス名を入力し、アカウント使用の同意チェックボックスをチェックして「次へ」ボタンを押します。
![スクリーンショット 2023-06-20 135116.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104149/7e8293ad-25c6-3a8a-dc1a-3dae559d037b.png)
ファイルのアップロード画面が表示されます。ファイルのサイズ上限は 16MB となっています。 
ドラッグ＆ドロップ、または「ファイルを参照する」ボタンから対象ファイルを選択し、「Upload files」でアップロードを実行後、「次へ」ボタンを押します。
![スクリーンショット 2023-06-20 134618.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104149/c674bbd0-a541-1b7b-f8c7-46e06a7604b4.png)
「保存して閉じる」ボタンを押すと、データソースが追加されます。  
![スクリーンショット 2023-06-20 135258.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104149/f25bdb69-1203-8319-7420-5dcfcab541cf.png)
「Limit responses to your data」というチェックボックスがありますが、これは提供したデータのみを利用して回答することを推奨する設定のようです。デフォルトでチェックされており、このまま利用してみます。

通常の ChatGPT プレイグラウンド利用と同様、システムメッセージが設定できます。Microsoft のドキュメントでは、下記のような例が記載されています。

```
You are an AI assistant that helps people find information.
You retrieve Japanese documents, and you should read them carefully in Japanese and answer in Japanese.
```

チャットセッションでアップロードしたファイルに関連する質問を送信してみます。  
ファイルの冒頭に下記のような質問と回答がありますので、この質問をそのまま送信してみます。

```
質問: オフィスの入退室はどうすればいいですか。
回答: ドアの横にある装置にセキュリティカードをかざしてください。音が鳴り、ロックが解除されます。入室時、退出時ともに忘れずかざしてください。
```

下図のような回答が返ってきました。引用元も確認することができます。ただ、回答がそのまま返されているのではなく、情報に過不足があります。
![スクリーンショット 2023-06-20 123301.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104149/bb1ca407-003e-49a1-808b-042f558f6d03.png)

試しに「Limit responses to your data」のチェックを外してみます。回答内容が代わり、一般的な注意事項も追加されたように思います。
![スクリーンショット 2023-06-20 123608.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104149/61968a7c-9444-7ea2-4131-13d7e6ec3661.png)


#### ここまでのまとめ

今回は ChatGPT プレイグラウンドからの利用のみですが、Azure Cognitive Search と連携して独自データを追加する形で LLM から回答を得られることが確認できました。  
今回の試行では、提供データである FAQ の回答がそのまま返却されず、FAQ 作成者の意図通りではない動作になっている点もあるように思いますが、システムメッセージをカスタマイズし、回答に引用元のリンクを含めるようにすれば、要点は LLM が簡潔に回答し、詳細はリンクから確認できる、という形式にできるのではないかと思います。  

なお、下記を参照して REST API からの利用についても動作確認してみましたが、「Backend returned unexpected response. Please contact Microsoft for help.」といった内容の HTTP 500 応答が返る結果となったため、Microsoft に報告を行いました。  
こちらも動作確認できれば記事にまとめたいと思います。

https://learn.microsoft.com/en-us/azure/cognitive-services/openai/reference#completions-extensions

※2023/6/23 追記: 上記問題は解消できました。[こちらの記事](https://qiita.com/fsdg-honda/items/5807c2850b8c22b348ee)を参照ください。