Azure OpenAIのデータ ソース機能を検証した（APIバージョン. 2024-02-01）

# はじめに
* これまでRAG機能の実現には、個別にオーケストレーション機能により、OpenAIと検索データベースをそれぞれ制御する必要があった
* Azure OpenAIのAPIに、データソース機能として、OpenAI自体が検索データベースを参照し、回答を返してくれる機能が実装されたため、使い物になるのか検証したので、結果を共有したい

# やりたいこと
* PCから直接OpenAIのAPIを叩き、Azure AI Searchからの回答をもとに期待される回答が生成されるか検証する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/af8438a6-d578-c727-bf77-5aba308a9346.png)


# 結論
* gpt-3.5-turboは現状使い物にならない
    * データソースとして正しい回答がヒットしているのに、「ドメイン外」などとして回答されない
* gpt-4は期待通りの生成結果となる。ただしレスポンスが遅い
* これらより、現時点では、自前でオーケストレーション機能を実装し、（OpenAIにデータソースを自動で参照させるのではなく）明示的にプロンプトからデータソースを与えた方がよいと思われる

# 検証内容
## 検索の元とするダミーデータ

* カフェを想定したダミーのFAQを15件用意した。（ChatGPTに作らせた）
* 5件のみ参考に表示する

| 質問 | 回答 |
| --- | --- |
| 営業時間は？ | 店舗によって異なりますが、多くの店舗は7:00から22:00まで営業しています。最寄りの店舗の詳細は、Webサイトの店舗検索ページをご覧ください。 |
| 年中無休ですか？ | はい、多くの店舗が年中無休で営業しています。ただし、店舗によっては休業日が設けられている場合もありますので、事前にご確認ください。 |
| アレルギーを持っています。メニューの中で何が食べられますか？ | アレルギー情報を各メニューに記載しております。詳細はメニュー表をご参照いただくか、スタッフまでお問い合わせください。個別の対応も可能な限り承ります。 |
| ペットを連れて行っても大丈夫ですか？ | ペット同伴可能な店舗もございますが、条件がある場合が多いです。事前に最寄りの店舗にご確認ください。 |
| 子供連れでも大丈夫ですか？ | はい、ファミリーでのご来店も大歓迎です。キッズメニューや子供用の椅子をご用意している店舗もあります。 |


## Azure AI Searchにデータを投入する
* 質問と回答を、title, contentフィールドに格納する
* 表示されていないが、contentについてはベクター化したデータも格納しており、contentVectorフィールドが存在している
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/463fd40a-b55c-05a1-0bef-67c38b7ca3a9.png)

## OpenAIから叩く
* OpenAI APIバージョン 2024-02-01を利用する
* 以下の宛先、およびBODYを使う
```
POST https://<YourEndpoint>.openai.azure.com/openai/deployments/<YourDeploymentID>/chat/completions?api-version=2024-02-01
``` 

* Azure AI SearchのURLとAPI Admin Keyは、適宜修正すること
```
{
    "messages": [
        {
            "role": "user",
            "content": "ペット連れて行っても大丈夫？"
        }
    ],
    "data_sources": [
        {
            "type": "azure_search",
            "parameters": {
                "endpoint": "https://xxxxxxxxxxxxxxxxxxx.search.windows.net",
                "index_name": "cafe-faqindex",
                "authentication": {
                    "type": "api_key",
                    "key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
                },
                "query_type": "vector",
                "top_n_documents": 3,
                "role_information": "According to the retrieved data, answer in Japanese",
                "embedding_dependency": {
                    "type": "deployment_name",
                    "deployment_name": "text-embedding-ada-002"
                },
                "fields_mapping": {
                    "content_fields": [
                        "title","content"
                    ]
                }
            }
        }
    ],
    "temperature": 0.2,
    "top_p": 0.95,
    "max_tokens": 400,
    "stop": null,
    "stream": false
}
```

### Bodyを作るうえでのポイント
* role_information で、「日本語で回答して」と入れておかないと、英語で返ってきてしまうので注意
    * またrole_informationは、100トークン以内という仕様なので、あまり長い指示は入れられない
* fields_mapping>content_fieldsに、"title","content"を入れることで、OpenAIに対し、`title\ncontent`としてデータが渡される
    * "content","title"と記述すると、`content\ntitle`のように逆に渡される

# 検証結果
* 各モデルについて、10回同じ質問を投げる
* 質問文：「ペット連れて行っても大丈夫？」
* gpt-3.5-turbo(1106)については、1回もまともに回答を生成してくれなかった
* 下記に回答例なども示すが、AI Searchからは期待通りの検索結果がOpenAIに渡されているにも関わらず、なぜか回答が生成されない結果となった
* gpt-4についてはすべて期待通りの回答が生成された
* (追記) gpt-3.5-turbo 0125を追記した

| gpt-3.5(1106) | gpt-4(1106-preview) | gpt-3.5(0125) |
| --- | --- | --- |
| 0/10 | 10/10| 0/10 |

### gpt-3.5の回答例
* AI Searchは期待するQ&Aがヒットしているが、正しく回答が生成されないことがわかる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/856ec9b1-3c7a-645a-abce-e2da609f5c12.png)

#### 参考：質問文から「？」を取ったら期待の回答を得られた
* OpenAIの名誉のために、完全にダメではないケースも共有しておく
* ただ、この質問文で10回リクエストしたところ、以下のように期待通りの回答が得られたのは2回のみで、8回はダメだった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/9398b07d-f327-559d-2fc4-702b03099721.png)

### gpt-4の回答例
* 期待通り、ペット連れに関するQ&Aのみを参照（[doc1]と表記）し、回答が生成されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/07abb643-17b9-579e-be6c-fef6d6acd833.png)

# まとめ
* データソース機能は非常に強力な機能であり、これが実用化できればかなりのメリットが期待できるが、現時点ではまだ使いづらい印象となる
* 引き続きこの改善はウォッチしていきたいと思う