はじめに
- これまでRAG機能の実現には、個別にオーケストレーション機能により、OpenAIと検索データベースをそれぞれ制御する必要があった
- Azure OpenAIのAPIに、データソース機能として、OpenAI自体が検索データベースを参照し、回答を返してくれる機能が実装されたため、使い物になるのか検証したので、結果を共有したい
やりたいこと
結論
- gpt-3.5-turboは現状使い物にならない
- データソースとして正しい回答がヒットしているのに、「ドメイン外」などとして回答されない
- gpt-4は期待通りの生成結果となる。ただしレスポンスが遅い
- これらより、現時点では、自前でオーケストレーション機能を実装し、(OpenAIにデータソースを自動で参照させるのではなく)明示的にプロンプトからデータソースを与えた方がよいと思われる
検証内容
検索の元とするダミーデータ
- カフェを想定したダミーのFAQを15件用意した。(ChatGPTに作らせた)
- 5件のみ参考に表示する
質問 | 回答 |
---|---|
営業時間は? | 店舗によって異なりますが、多くの店舗は7:00から22:00まで営業しています。最寄りの店舗の詳細は、Webサイトの店舗検索ページをご覧ください。 |
年中無休ですか? | はい、多くの店舗が年中無休で営業しています。ただし、店舗によっては休業日が設けられている場合もありますので、事前にご確認ください。 |
アレルギーを持っています。メニューの中で何が食べられますか? | アレルギー情報を各メニューに記載しております。詳細はメニュー表をご参照いただくか、スタッフまでお問い合わせください。個別の対応も可能な限り承ります。 |
ペットを連れて行っても大丈夫ですか? | ペット同伴可能な店舗もございますが、条件がある場合が多いです。事前に最寄りの店舗にご確認ください。 |
子供連れでも大丈夫ですか? | はい、ファミリーでのご来店も大歓迎です。キッズメニューや子供用の椅子をご用意している店舗もあります。 |
Azure AI Searchにデータを投入する
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
のように逆に渡される
- "content","title"と記述すると、
検証結果
- 各モデルについて、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がヒットしているが、正しく回答が生成されないことがわかる
参考:質問文から「?」を取ったら期待の回答を得られた
gpt-4の回答例
まとめ
- データソース機能は非常に強力な機能であり、これが実用化できればかなりのメリットが期待できるが、現時点ではまだ使いづらい印象となる
- 引き続きこの改善はウォッチしていきたいと思う