🗂

Typia で OpenAI Structured Outputを使ってみた!

2024/08/09に公開

0.png

はじめに

先日、OpenAI に Structured Output が登場しました。

https://openai.com/index/introducing-structured-outputs-in-the-api/
https://platform.openai.com/docs/guides/structured-outputs

Structured Output とは、以前から提供されていた JSON Mode の上位互換です。
Strucuted Output では、ユーザーが提供する JSON Schema に従って、OpenAI が生成した JSON を返してくれます(そのように設計されています)。
そのため、従来の JSON Mode より信頼性の高い結果を得ることができるとされています。

OpenAI は Zod に対応

OpenAI の公式の SDK では zod helper なるものが提供されています。
これは、zod schema を渡すと、内部で JSON Schema への変換を行い、リクエストを送信し、response の validation までも行ってくれる便利なものです。

https://github.com/openai/openai-node/blob/31e4afd6ca50e8e2560598296c099390c5956e31/src/helpers/zod.ts

とはいえ、実装はそんなに難しいものではありません。

そこで、今回は Typia で OpenAI Structured Output を使えるようにしてみました。

Typia とは

以下の記事をご覧ください!
https://zenn.dev/ryoppippi/articles/c4775a3a5f3c11

Typia で OpenAI Structured Output を使う

今回、zod helper と同じような関数を実装したライブラリを作成しました。

https://github.com/ryoppippi/typiautil

現在のところ、 zodResponseFormatzodFunction 相当の関数は実装してあります。

サンプルコード

以前の記事で紹介したコードを修正する形で試してみます。

https://zenn.dev/ryoppippi/articles/ce3631be2e2310

https://github.com/ryoppippi/openai-with-typia/blob/c2596ed7b9def86b3d56f1cec2ac5099bac282ed/src/index.ts#L27-L45

Typia は標準で型情報から JSON Schema を生成する機能を持っているため、 これを利用しています。
Typia は型情報に付与した JSDoc を description として使用できるので、直感的に JSON Schema を定義できて良いですね。
もちろん、長さや詳細な型情報(int, string, boolean, 最大値/最小値、など)も Typiatag を使って指定できます。

https://typia.io/docs/json/schema/

結果として、以下の型定義から:
https://github.com/ryoppippi/openai-with-typia/blob/c2596ed7b9def86b3d56f1cec2ac5099bac282ed/src/type.ts

以下の JSON Schema が生成されます:
https://github.com/ryoppippi/openai-with-typia/blob/c2596ed7b9def86b3d56f1cec2ac5099bac282ed/schema.json

これを実行すると、いい感じに構造化された JSON が返ってきます。

https://github.com/ryoppippi/openai-with-typia/blob/c2596ed7b9def86b3d56f1cec2ac5099bac282ed/result.json

いい感じですね!

まとめ

  • OpenAI Structured Output を使ってみた
  • Typia で OpenAI Structured Output を使うためのライブラリを作成した
  • Typia は型情報から JSON Schema を生成する機能を持っているため、直感的に JSON Schema を定義できて良い

Discussion