Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
【登壇資料】LLMのSDKに渡すためのJSON Schemaを Goのstructから良い感じ...
Search
エブリー
December 14, 2025
0
56
【登壇資料】LLMのSDKに渡すためのJSON Schemaを Goのstructから良い感じに生成したい
20251216 golang.tokyo #42
エブリー
December 14, 2025
Tweet
Share
More Decks by エブリー
See All by エブリー
エンジニア職向け会社紹介資料
everypr
0
81
【登壇資料】Goのエラー管理を振り返ってみる
everypr
0
64
【登壇資料】Goの内部実装に学ぶ、メソッド隠蔽とその活用
everypr
1
340
【登壇資料】仕様書駆動開発(cc-sdd)を実務API開発で試してみた
everypr
0
170
ビジネス職向け会社紹介資料
everypr
1
27k
デリッシュキッチン紹介資料
everypr
0
4.1k
【登壇資料】10年もののAPIサーバーにおけるCI/CDの改善の奮闘
everypr
0
33
【研修資料】データベース基礎
everypr
0
25
【研修資料】TerminalおよびGit/GitHub基礎・プログラム基礎
everypr
0
16
Featured
See All Featured
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
39
Code Review Best Practice
trishagee
74
19k
Building an army of robots
kneath
306
46k
Deep Space Network (abreviated)
tonyrice
0
30
Reality Check: Gamification 10 Years Later
codingconduct
0
2k
Thoughts on Productivity
jonyablonski
73
5k
Crafting Experiences
bethany
0
24
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
86
Designing for Timeless Needs
cassininazir
0
100
My Coaching Mixtape
mlcsv
0
15
Reflections from 52 weeks, 52 projects
jeffersonlam
355
21k
Transcript
LLMのSDKに渡すための JSON Schemaを Goのstructから良い感じに生成したい 2025/12/16 golang.tokyo #42 赤川 正朋
2 Copyright © 2015 every, Inc. All rights reserved. 自己紹介
名前:赤川 正朋 (X: まさとも @mathatomo57) 所属:株式会社エブリー 開発1部(2025.4~) 主な技術領域: Go、 AWS Go歴:1年ちょっと
3 エブリーのご紹介
4 Copyright © 2015 every, Inc. All rights reserved. サービス紹介
「だれでもおいしく簡単に 作れるレシピ」を毎日配信 するレシピ動画メディア 「子育てを通じて、人が、社 会が、ともに手をとりあう世 界を実現する」ファミリー向 け動画メディア 「熱狂を、仕掛ける。世の 中を、揺さぶる。」SNS・動 画のプロフェッショナル チーム デリッシュキッチンのア セットを活かした「簡単に 楽しく続けられる」をめざ す食事管理アプリ デリシュキッチンを初め日本最大級のメディアを運営。生活に寄り添ったサービスを提供しています。
5 タイトルの意味
6 Copyright © 2015 every, Inc. All rights reserved. Structured
Output • Structured Output: LLMのAPIの出力を指定した json形式で出力させる • GeminiやOpenAIのSDKでは、JSON Schemaを使って指定できる https://ai.google.dev/gemini-api/docs/structured-output?hl=ja&example=recipe
7 Copyright © 2015 every, Inc. All rights reserved. Structured
Output Goではレスポンスの jsonをunmarshallするために、同じ形の Goの構造体が必要
8 Copyright © 2015 every, Inc. All rights reserved. Structured
Output (ほぼ)同じ形のデータ型を 2つも定義したくない! Goの構造体から JSON Schemaを生成したい! 今日話すこと • 上記を実現するために調べた・考えたこと • 実際に作ってみる • 既存パッケージを活用する方法
9 JSON Schemaのキーワード
10 Copyright © 2015 every, Inc. All rights reserved. JSON
Schema • JSONの構造や型、制約を定義するための言語 • 各プロパティのことをキーワードという 例:オブジェクトと配列の基本的な書き方 ↓
11 Copyright © 2015 every, Inc. All rights reserved. JSON
Schema • キーワードにはいろいろな種類がある • Structured Outputの目的はLLMの出力を制限することなので、うまく活用していきたい
12 Copyright © 2015 every, Inc. All rights reserved. JSON
Schema バージョンによって、書き方が変わっているものも Draft4 Draft6以降
13 Copyright © 2015 every, Inc. All rights reserved. JSON
Schema 注意しなければいけないこと • 各SDKが、特定バージョンの JSON Schemaに完全に準拠しているとは限らない …😭 • 例えばGeminiでは、minLength / maxLength はサポートされていない https://github.com/googleapis/go-genai/blob/2a3297de/types.go
14 Copyright © 2015 every, Inc. All rights reserved. JSON
Schema • OpenAIも同様に、 minLength / maxLength はサポートされていなかったりする https://platform.openai.com/docs/guides/structured-outputs#supported-schemas
15 Copyright © 2015 every, Inc. All rights reserved. JSON
Schema OpenAIがサポートしているオプションはあとこれだけ、意外と少ない
16 reflectでJSON Schemaを作る
17 Copyright © 2015 every, Inc. All rights reserved. reflectでJSON
Schemaを作る • reflect: Goの標準パッケージの一つ • 実行時に型や値の情報を取得することができる • 以下のあたりを使えば、今回やりたいことができる reflect.TypeOf(v) → reflect.Type ├── Kind() → reflect.Kind (Ptr, Struct, Slice, Map, String...) ├── Elem() → 要素の reflect.Type ├── Key() → マップキーの reflect.Type ├── NumField() → フィールド数 (構造体のみ ) └── Field(i) → reflect.StructField ├── Name → フィールド名 ├── Type → フィールドの型 ├── Tag → reflect.StructTag │ └── Get("key") → タグ値 └── IsExported() → エクスポート判定
18 Copyright © 2015 every, Inc. All rights reserved. 方針
• 以下のキーワードに対応できるようにする ◦ type ◦ properties ◦ items ◦ OpenAIでサポートされているオプションたち • オプションの指定は struct tag `validate` で行う ◦ struct tagが長くなりすぎるのは好ましくないが、OpenAIに渡す用途に限定すればそこまで 肥大化しないため • バージョンは Draft6以降に対応 ◦ 調べた限りではOpenAIがサポートしているキーワードに大きな変更がないため ◦ $schemaはつけない(OpenAIに必要ないため)
19 Copyright © 2015 every, Inc. All rights reserved. reflectでJSON
Schemaを作る ざっくりつくってみたので、一部実装を紹介 https://github.com/masatomo57/jsonschema-go
20 Copyright © 2015 every, Inc. All rights reserved. reflectでJSON
Schemaを作る 以下のような関数を作った
21 Copyright © 2015 every, Inc. All rights reserved. reflectでJSON
Schemaを作る 構造体のフィールドごとに、 map[string]anyに再帰的に変換していく(一部省略)
22 Copyright © 2015 every, Inc. All rights reserved. reflectでJSON
Schemaを作る 基本型に対して、 “type”: “hogehoge” を対応させる
23 Copyright © 2015 every, Inc. All rights reserved. reflectでJSON
Schemaを作る structの変換の中身(一部省略) jsonタグとvalidateタグを取り出して、 schemaに追加していく
24 既存パッケージを使う
25 Copyright © 2015 every, Inc. All rights reserved. 既存パッケージを使う
• invopop/jsonschema • OpenAI SDKのExampleや、Genkitの内部実装で採用されている • 基本はstruct tagでオプション指定を行うが、以下のようにオプションで渡せるものも https://github.com/openai/openai-go/blob/main/examples/structured-outputs/main.go#L25-L35
26 Copyright © 2015 every, Inc. All rights reserved. 既存パッケージを使う
• google/jsonschema-go • modelcontextprotocol/go-sdkで採用されている • Structタグではなく、 Schema構造体のプロパティでキーワードを指定する(まだ v0なので変 わるかも) • 他にも、SchemaのValidation関数も使えるのが Good https://github.com/openai/openai-go/blob/main/examples/structured-outputs/main.go#L25-L35
27 Copyright © 2015 every, Inc. All rights reserved. 最後に
使うときは以下に注意 • reflectは実行時に型や値の情報を取得するため、コンパイラの最適化が効かない • オブジェクトも多量に使うので、 GC負荷が高い • 呼び出して初めて panicするかもしれない → init()とかで起動時に一度だけ呼び出して持っておくのが良さそう
28 Copyright © 2015 every, Inc. All rights reserved. まとめ
• LLMがサポートしている JSON Schemaのキーワード、バージョンは限定的 • バージョンごとのキーワードの使い方に気をつける • reflectで型の情報を struct tagも含め扱える • が、負荷に気をつける
29 Copyright © 2015 every, Inc. All rights reserved. every
- Recruit Info 🔍 エブリー 採用 🔍 エブリー テックブログ 🔍 エブリー オウンドメディア メディア / ブログ 開発部 公式 @every_engineerで技術的な発信を行っています。 エンジニアリングに関する発信やイベント情報などをお 知らせしますので、フォローお願いします! 『every.thing』では、エブリーではたらく人、サービス・ 事業、開催イベント、働き方まで、社内の出来事をぜん ぶお伝えしています。 『テックブログ』では、エブリーの開発の裏側や技術的 な挑戦、エンジニアの知見を発信しています。 採用HP エブリーでは働く仲間を大募集中です! 「中の人と話してみたい」「まずはざっくばらんにエブ リーのことを知りたい」「選考に進むか悩んでいる」など など、 まずは面談にて気軽にお話しましょう!!
None