$30 off During Our Annual Pro Sale. View Details »
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
43
【登壇資料】LLMのSDKに渡すためのJSON Schemaを Goのstructから良い感じに生成したい
20251216 golang.tokyo #42
エブリー
December 14, 2025
Tweet
Share
More Decks by エブリー
See All by エブリー
エンジニア職向け会社紹介資料
everypr
0
24
【登壇資料】Goのエラー管理を振り返ってみる
everypr
0
47
【登壇資料】Goの内部実装に学ぶ、メソッド隠蔽とその活用
everypr
1
300
【登壇資料】仕様書駆動開発(cc-sdd)を実務API開発で試してみた
everypr
0
130
ビジネス職向け会社紹介資料
everypr
1
27k
デリッシュキッチン紹介資料
everypr
0
3.2k
【登壇資料】10年もののAPIサーバーにおけるCI/CDの改善の奮闘
everypr
0
30
【研修資料】データベース基礎
everypr
0
20
【研修資料】TerminalおよびGit/GitHub基礎・プログラム基礎
everypr
0
14
Featured
See All Featured
Raft: Consensus for Rubyists
vanstee
141
7.2k
Docker and Python
trallard
47
3.7k
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
196
70k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.3k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Optimising Largest Contentful Paint
csswizardry
37
3.5k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Site-Speed That Sticks
csswizardry
13
1k
Embracing the Ebb and Flow
colly
88
4.9k
It's Worth the Effort
3n
187
29k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
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