@ryoppippi

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

8 Aug 2024 ・ 4 min read


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 とは

以下の​記事を​ご覧ください! /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

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, 最大値/最小値、​など​)も​ 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 が​返ってきます。

https://github.com/ryoppippi/openai-with-typia/blob/c2596ed7b9def86b3d56f1cec2ac5099bac282ed/result.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 を​定義できて​良い
comment on bluesky / twitter
CC BY-NC-SA 4.0 2022-PRESENT © ryoppippi