AzureOpenAI(チャット機能)を触ってみた

## AzureOpenAIを触ってみた所感や利用する上で調べたことをまとめていく。
まずはAzureOpenAIについての概要であるが、OpenAIのAIモデルをMicrosoft Azure上のセキュアな環境で利用できるというものでSaaSではなくAPIとして提供されている。
### 概要と利点
AzureOpenAIの利点としては、以下の点が挙げられる。
1. 学習データがトレーニングに利用されない。(OpenAIでも学習データがトレーニングに利用される可能性があるのはSaaS利用の場合であり、API連携の場合は利用されない)
1. Azureの仮想ネットワークによる保護がある。
1. 99.9%以上の稼働率が保証されている点などがあげられるだろう。

リージョンの縛りやリリースの多少のラグはあるが、高いセキュリティと高可用性はAzureOpenAIを選ぶ大きな理由になるだろう。

### 触ってみた
私はGPT-35-turboの0613バージョンをデプロイし、AzureAIStudioにて、デフォルトテンプレートを用い、チャットを行った。

何度か会話をしていると三回程の会話で、GPT-35-turboのトークン上限(4096)に達してしまった。
前回の会話から続く会話をしたい場合には、入力テキストに前回の入力テキストと出力テキストを含めなければならないため、このようになった。

ところで日本語はトークン数で不利なのだろうか。

調べたところ圧倒的に英語がトークンに関して有利であるが、特別日本語が不利というわけでもなかった。

以下「私は猫が好きです。」を各言語に翻訳しトークン数をTokenizerで算出、まとめたものである。
https://platform.openai.com/tokenizer

|日本語|英語|中国語|韓国語|フランス語|ドイツ語|イタリア語|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|10|4|9|13|6|5|8|

私は英語が堪能ではないし、フランス語やドイツ語などに関しては、聞いたところでその言語だと判別できる自信すらない。
だから日本語で文章を作り、翻訳機で英語等に翻訳したのち、英語で返答をもらい、日本語に再翻訳する方法が多くのステップを踏むことにはなるが、私の現段階のOpenAI利用の最良策になると思われる。
英語を勉強しなかった付けがここでも回ってくるとは。

さて、次は料理専用のAzureOpenAIを作るためのシステムメッセージを、英語にて作成してみた。

以下が作成したシステムメッセージである。
>You are an assistant regarding cooking.
Please respond only to questions about the dish.
If you are asked the name of a dish, please reply how to prepare it.
----
>あなたは料理に関するアシスタントです。料理に関する質問にのみお答えください。料理名を聞かれた場合は、調理方法をお答えください。

私が「ramen」とチャットしたところ以下の返答がきた。
>To prepare ramen, you will need the following ingredients:
Ramen noodles
Broth (such as chicken, pork, miso, or vegetable)
Protein of choice (such as sliced chicken, pork, beef, tofu, or shrimp)
Vegetables (such as sliced mushrooms, bok choy, spinach, corn, or green onions)
Seasonings (such as soy sauce, mirin, sesame oil, garlic, ginger, or chili paste)
Toppings (such as soft-boiled egg, nori seaweed, sesame seeds, or sliced chili peppers)
>Here is a basic method to prepare ramen:
Cook the ramen noodles according to the package instructions. Drain and set aside.
In a separate pot, heat the broth over medium heat until it simmers.
If using raw protein, cook it in a separate pan until fully cooked. If using pre-cooked protein, skip this step.
Add the cooked protein and vegetables to the simmering broth. Cook until the vegetables are tender.
Season the broth with your desired seasonings, adjusting the taste to your preference.
Divide the cooked ramen noodles into bowls.
Pour the hot broth, protein, and vegetables over the noodles.
Garnish with your choice of toppings.
Serve hot and enjoy your homemade ramen!
>Feel free to customize your ramen by adding or substituting ingredients based on your taste preferences.
------------------------------------------------------------------------------------------
>ラーメンを作るには、以下の材料が必要である：
ラーメン麺
スープ（鶏、豚、味噌、野菜など）
お好みのタンパク質（スライスした鶏肉、豚肉、牛肉、豆腐、エビなど）
野菜（スライスしたマッシュルーム、青梗菜、ほうれん草、コーン、ネギなど）
調味料（しょうゆ、みりん、ごま油、にんにく、しょうが、唐辛子など）
トッピング（ゆで卵、海苔、ゴマ、輪切り唐辛子など）
ラーメンの基本的な作り方を紹介しよう：
ラーメンを袋の表示通りに茹でる。水気を切っておく。
別の鍋にスープを入れ、中火で煮立つまで加熱する。
生のプロテインを使う場合は、別の鍋で完全に火が通るまで加熱する。調理済みのプロテインを使う場合は、このステップは省略する。
調理したタンパク質と野菜を煮立ったスープに加える。野菜が柔らかくなるまで煮る。
好みの調味料でスープを味付けし、好みの味に調整する。
茹でたラーメンを器に盛る。
熱いスープ、タンパク質、野菜を麺にかける。
お好みのトッピングを添える。
アツアツを召し上がれ！
お好みで具材を追加したり、代用したりして、自由にラーメンをカスタマイズしてください。

![スクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632609/046c3143-2bb1-89b5-0263-8e8899bbd2ec.png)

これでシステムメッセージ含め336トークンしか使用しないのだから驚きである。
以下は料理以外の質問を投げかけた場合である。

>Tell us about your ideal proposal.
---
>理想のプロポーズについて教えてください。

>As an AI assistant focused on cooking, I don't have personal preferences or experiences related to proposals. My purpose is to provide information and assistance regarding cooking and recipes. If you have any questions or need help with cooking-related topics, feel free to ask!
---
>料理に特化したAIアシスタントとして、私は提案に関する個人的な好みや経験を持っていません。私の目的は、料理やレシピに関する情報やサポートを提供することです。料理に関するご質問やお困りのことがありましたら、お気軽にお尋ねください！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632609/24ffdb00-6c06-e749-1e84-51daabf93690.png)


簡単に私好みのチャットボットを作成することができた。
より厳しい縛りや、回答テンプレートをシステムメッセージや会話例に含めることで、より自分好みにチューニングすることができる。

### 各種パラメータについて
ところで私はここまでずっと気になっていたことがある。
温度や上位P、ペナルティってなんだ？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632609/e8039159-a989-722a-dd42-a499f0d12869.png)
調べてみたところ温度、上位Pは以下のようなものだった。

>温度：返答に用いられる単語のランダム性を制御するパラメータ(温度を上げると幅が広がる)
上位P：返答候補の上位何%までを返答に使用するかを制御するパラメータ(上位Pを下げるとより可能性の高いトークンに絞り込まれ、上げると確立の高いものと低いものの両方から選択される)

つまり与えられたチャットに対してどのくらい固定の返答をさせるかを制御できるのであろう。
より自分の理想に近づくように変更する必要がある。

では頻度のペナルティとプレゼンスペナルティとは何だろう。
以下のようであった。

>頻度のペナルティ：同じ返答の回数に比例したペナルティを課す
プレゼンスペナルティ：同じ返答があれば一定のペナルティを課す

どちらも同じ行やテキストを返答に使用する可能性を減らしているようだ。

### 最後に
今回はAzureOpenAIのチャット機能に関して触ってみた所感と使用するに際して気になって調べたことをまとめた。
チャット機能はOpenAIの花形といえる機能であるが、まだまだ多くの機能があるため、今後触っていきたい。