Structured Outputsって凄いらしい
概要
昨今話題のOpenAIのStructured Outputsについて、備忘録としてまとめる
何が凄い?
モデルがJSON Schema(JSON形式のルール)に従った出力をより信頼性高く生成できるらしい
よく見るグラフはこちら!
モデルの性能UPに伴い、単純なプロンプト指定だけでもかなり信頼性高く出力されるが、Structured Outputsを使用するとほぼ100%で指定したJSON Schemaで出力される(たまにrefusalされるらしい。見たことない)
利用方法
私が説明するより公式ドキュメントや野良記事を参考ください!どれも同じ(公式ドキュメントの転用)
- https://platform.openai.com/docs/guides/structured-outputs
- https://zenn.dev/chips0711/articles/ab49bde721375e
仕組み
2つのアプローチを採用している(ぽい)
- モデル訓練によるアプローチ
- 最新モデル「gpt-4o-2024-08-06」を訓練し、複雑なJSON Schemaを理解して、それに合った出力を生成。このモデルのパフォーマンスは高く、ベンチマークでは93%の成功率を記録。しかし、生成AIは本質的に非決定的(ランダム性がある)なため、完全な信頼性(100%)には達成できず。。。
- 制約アプローチ(特に重要)
- SON Schemaに完全に合った出力を生成するため、モデルの出力に「制約」を加える工学的な方法を導入し、信頼性を限りなく100%に引き上げた
仕組み詳細
制約を加えるとは何ぞや?
- 制約付きサンプリング(またはデコード)」と呼ばれる技術に基づく。通常、AIモデルが次の単語(トークン)を生成するときは、辞書の中からどの単語でも自由に選択する。この自由度がミスの原因となり、例えば、JSONでは不適切な場所で {(波括弧)を選んでしまうことがある。そこで、モデルが選択できるトークンを「現在のJSON Schemaに基づいて有効なもののみに制限」する。これにより、不適切なトークンを選ぶ可能性をゼロにします
- 具体例として、出力の最初では { や {" といったトークンが有効。しかし、すでに {"val と出力された後では、{ は無効になる。このように「動的制約付きデコード」を採用し、各トークン生成のたびに「次に有効なトークン」を判断する。
その他
- プロンプトに出力形式を指定する必要はあるか?
- 必要なし(と思われる)
- 公式ドキュメントのサンプルスクリプトを見ると、プロンプト内では厳格に指定していない
- ただ、フューショットで出力構造例を与えることはしたほうが良いかも(私はする)
- 必要なし(と思われる)
- JSON Schemaのdescriptionについて意味あるか?
- 意味なし(と思われる)
- ここの内容は出力に影響は与えない
- 同様に、JSONのキー名も影響を与えない
- 意味なし(と思われる)