
はじめに
先日、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 までも行ってくれる便利なものです。
とはいえ、実装はそんなに難しいものではありません。
そこで、今回は Typia で OpenAI Structured Output を使えるようにしてみました。
Typia とは
以下の記事をご覧ください! /blog/2024-06-12-zenn-c4775a3a5f3c11-ja
Typia で OpenAI Structured Output を使う
今回、zod helper と同じような関数を実装したライブラリを作成しました。
https://github.com/ryoppippi/typiautil
現在のところ、 zodResponseFormat 、 zodFunction 相当の関数は実装してあります。
サンプルコード
以前の記事で紹介したコードを修正する形で試してみます。
/blog/2024-07-18-zenn-ce3631be2e2310-ja
Typia は標準で型情報から JSON Schema を生成する機能を持っているため、 これを利用しています。 Typia は型情報に付与した JSDoc を description として使用できるので、直感的に JSON Schema を定義できて良いですね。
もちろん、長さや詳細な型情報(int, string, boolean, 最大値/最小値、など)も Typia の tag を使って指定できます。
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 が返ってきます。
いい感じですね!
Note
本記事とは関係のない余談ですが、作者が OpenAI に特化した Schema Library を作っています(内部で Typia を使用している)。 https://github.com/wrtnio/openai-function-schema/
まとめ
- OpenAI Structured Output を使ってみた
Typiaで OpenAI Structured Output を使うためのライブラリを作成したTypiaは型情報から JSON Schema を生成する機能を持っているため、直感的に JSON Schema を定義できて良い