Azure OpenAI Service に gpt-35-turbo-instruct モデルが追加

Microsoft は 17 日、来年[廃止予定](https://learn.microsoft.com/azure/ai-services/openai/concepts/legacy-models#gpt-35)の `text-davinci-003` などの Completions 系モデルの後継となる `gpt-35-turbo-instruct` を追加しました。まずは米国東部、スウェーデン中部リージョンで利用可能となっており、最大トークンは 4,097 となります。

`gpt-35-turbo-instruct(0914)` モデルは **Completions API 専用**となっており、Chat Completions API では使用できません。

当初 Azure Cognitive Search を用いた RAG アーキテクチャにおいて、ユーザーの質問文から検索クエリーを生成するフェーズで `text-davinci-003` を用いていましたが、これが廃止予定となったことで、一時的に Chat Completions API 経由で `gpt-35-turbo` を用いて生成していました。

https://qiita.com/nohanaga/items/db5de65963c0abd8ecfb

ぶっちゃけ `gpt-35-turbo` の Few-shot でうまくいってたんですが、今回 `gpt-35-turbo-instruct(0914)` がその代替となるのか感触を見てみたいと思います。

# 使用するプロンプトと条件
```yml
このアシスタントは、ユーザーの会話や新しい質問に基づいて質問文を検索クエリに変換して Search query: を補完します。
検索クエリは必ずスペースで区切ってください。
最低でも5つの同義語を生成して、synonym: を補完します。必ず Search query: と違うワードを使ってください。

Example:###
Question:徳川家康ってなにした人  
Search query: 徳川家康 人物 歴史
synonym: 竹千代 将軍 武将 説明

Question:徳川家康の武功を教えてください
Search query: 徳川家康 人物 武功 
synonym: 竹千代 業績 成果 武勲

Question:源範頼の墓所はどこにありますか？
Search query: 源範頼 墓所 場所
synonym: 蒲殿 墓 どこ 
###
```

`max_tokens`: 100
`temperature`: 0


# Completions API
使用するプロンプトに、以下の質問を付加して Completions API に送信します。

## `text-davinci-003`
> Question: 源義経が活躍した有名な戦いって何？

```yml
Search query: 源義経 戦い 活躍
synonym: 義経 名戦 勝利 栄光
```

> Question: 源実朝の趣味とは？
```yml
Search query: 源実朝 趣味 嗜好
synonym: 蒲殿 好み 嗜む 遊び
```
同義語にミスあり。

## `gpt-35-turbo-instruct(0914)`
> Question: 源義経が活躍した有名な戦いって何？

```yml
Search query: 源義経 戦い 歴史
synonym: 源平合戦 闘い 著名な
```

5 つ生成してくれないケースあり。

> Question: 源実朝の趣味とは？

```yml
Search query: 源実朝 趣味
synonym: 源仲宗根 嗜好 好み 趣向 趣味嗜好
```

同義語生成が一部怪しい・・・


# Chat Completions API
使用するプロンプトを `system` ロールに追加して、`user` ロールで質問を送信します。

## `gpt-35-turbo(0301)`
> 源義経が活躍した有名な戦いって何？
```yml
Search query: 源義経 戦い 有名
synonym: 義経 兄弟 闘い 著名 戦闘

源義経が活躍した有名な戦いとしては、壇ノ浦の戦いが挙げられます。
```
クエリー以外も生成してしまった。


> 源実朝の趣味とは？
```yml
Search query: 源実朝 趣味
synonym: 実朝 嗜好 好み 趣向 趣味嗜好
```

# `gpt-35-turbo(0613)` 
> 源義経が活躍した有名な戦いって何？
```yml
Search query: 源義経 戦い 歴史
synonym: 源義経 戦闘 著名な 戦争 有名な
```

> 源実朝の趣味とは？
```yml
Search query: 源実朝 趣味
synonym: 源実朝 嗜好 好み 趣向 趣味嗜好
```

`0613` バージョンは System メッセージにちゃんと従って 5 つの同義語を頑張って生成してます。

# 感触
さくっと数パターンしか試してないのでなんとも言えませんが、`gpt-35-turbo(0613)` がよく従う印象です。プロンプトの書き方や出力の構造化の仕方、パラメーターによっても変わってきますので、ちゃんとテストデータを用意して `gpt-35-turbo-instruct(0914)` と `gpt-35-turbo(0613)` で比較検証したほうがいいかなと思います。こーいう時の [Prompt flow](https://qiita.com/nohanaga/items/7c8b797f20ab8a3d5c92#prompt-variants-%E3%81%A7%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E6%AF%94%E8%BC%83%E3%82%92%E5%AE%9F%E6%96%BD) ですね。

# Prompt flow による評価
Prompt flow で Completions API の Variant を作って 2 つのモデルを評価します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/4408ac3c-3f24-69ad-88bd-8bc615a2808f.png)

Variant_0 が `gpt-35-turbo-instruct`、Variant_1 が `text-davinci-003` という感じで同じ入力データを使って評価します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674344/348de3a1-157b-a517-59c2-4c1b8f1c4eb7.png)

「バッチ実行」機能を使えば、Azure Machine Learning 上のテストデータアセットを使った自動評価もできますし、CSV、TSV、JSONL、PARQUET ファイルをアップロードして評価も可能です。定量評価のための様々な[メトリクス](https://qiita.com/nohanaga/items/b68bf5a65142c5af7969)も用意されています。

# 今後の使い道
RAG アーキテクチャにおける検索ワード生成アプローチはベクトル検索に完全に置き換わるというわけではありません。Microsoft が[公表](https://techcommunity.microsoft.com/t5/azure-ai-services-blog/azure-cognitive-search-outperforming-vector-search-with-hybrid/ba-p/3929167)した RAG システムの定量評価結果では、ベクトル検索と検索キーワード生成による全文検索単体よりも**ハイブリッド検索**および**セマンティックハイブリッド検索**の精度が高いという結果になっており、今後も組み合わせ技でのアプローチが有効です。

https://qiita.com/nohanaga/items/95a4780757e89b29e93e