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
Pydantic(AI)とJSONの詳細解説
Search
MIKIO KUBO
May 18, 2025
Education
0
210
Pydantic(AI)とJSONの詳細解説
92ページにわたって、生成AI時代に必要なPydanticとJSONについて丁寧に解説しています。
MIKIO KUBO
May 18, 2025
Tweet
Share
More Decks by MIKIO KUBO
See All by MIKIO KUBO
AIを使って最新研究 について調べて発表しよ う!
mickey_kubo
4
23
モダンWeb認証入門
mickey_kubo
1
17
Google Gemini (Gem) の育成方法
mickey_kubo
2
120
最適化ソリューション開発を加速する 数理最適化モデリングツール AMPL 活用セミナー
mickey_kubo
2
22
AMPLとその他のPythonモデラーの違いと優越性
mickey_kubo
3
67
AIエージェントのためのツール設計論 --Anthropic式・評価駆動開発手法の徹底解説
mickey_kubo
1
48
機械学習と数理最適化の融合 (MOAI) による革新
mickey_kubo
1
380
なぜ今最適化か?Agentic AI 時代に最適化が必要な理由
mickey_kubo
1
71
Agentic AI Era におけるサプライチェーン最適化
mickey_kubo
0
69
Other Decks in Education
See All in Education
仏教の源流からの奈良県中南和_奈良まほろば館‗飛鳥・藤原DAO/asuka-fujiwara_Saraswati
tkimura12
0
140
(2025) L'origami, mieux que la règle et le compas
mansuy
0
150
相互コミュニケーションの難しさ
masakiokuda
0
260
附属科学技術高等学校の概要|Science Tokyo(東京科学大学)
sciencetokyo
PRO
0
1k
AI for Learning
fonylew
0
190
Entrepreneurship minor course at HSE 2025
karlov
0
100
Test-NUTMEG紹介スライド
mugiiicha
0
230
Padlet opetuksessa
matleenalaakso
4
14k
2025年度春学期 統計学 第13回 不確かな測定の不確かさを測る ー 不偏分散とt分布 (2025. 7. 3)
akiraasano
PRO
0
140
シリコンバレーでスタートアップを共同創業したファウンディングエンジニアとしての学び
tomoima525
1
1.2k
ARアプリを活用した防災まち歩きデータ作成ハンズオン
nro2daisuke
0
180
チーム開発における責任と感謝の話
ssk1991
0
330
Featured
See All Featured
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.7k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.2k
Side Projects
sachag
455
43k
What's in a price? How to price your products and services
michaelherold
246
12k
A designer walks into a library…
pauljervisheath
209
24k
GitHub's CSS Performance
jonrohan
1032
460k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.6k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
114
20k
Build your cross-platform service in a week with App Engine
jlugia
232
18k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.5k
Statistics for Hackers
jakevdp
799
220k
Agile that works and the tools we love
rasmusluckow
331
21k
Transcript
PydanticとJSON入門 Pythonでのデータ管理をもっと安全・便利に! PydanticとJSONの基礎から応用まで 1
目次 1. PydanticとJSONとは 2. JSONの基礎 3. PythonでのJSON操作 4. Pydanticの基本 5.
PydanticとJSONの連携 6. バリデーション・型安全性 7. 応用例・よくある質問 8. まとめ 2
1. PydanticとJSONとは 3
Pydanticとは? Pythonでデータの「型」や「値」をチェックするためのライブラリ 入力値の自動変換やバリデーションができる FastAPIなどのWebフレームワークでも利用されている 4
JSONとは? JavaScript Object Notationの略 データのやりとりや保存でよく使われる「テキスト形式」 人にも機械にも読みやすい 5
PydanticとJSONの関係 PydanticはJSONデータをPythonの「型付き」データに変換できる 逆に、PythonのデータをJSON形式で出力することも簡単 6
2. JSONの基礎 7
JSONの特徴 軽量なテキスト形式 構造化されたデータを表現できる ほぼ全てのプログラミング言語でサポート 8
JSONの基本構造 { "name": "Taro", "age": 20, "is_student": true } 9
JSONで使えるデータ型 文字列("abc") 数値(123, 4.56) 真偽値(true, false) null 配列(リスト) オブジェクト(辞書) 10
JSONの配列 { "fruits": ["apple", "banana", "orange"] } 11
JSONのオブジェクト { "person": { "name": "Hanako", "age": 18 } }
12
JSONの注意点 キーは必ずダブルクォート(")で囲む 末尾のカンマは禁止 コメントは書けない 13
3. PythonでのJSON操作 14
PythonでJSONを扱うには 標準ライブラリの json モジュールを使う 15
PythonでJSONを読み込む import json json_str = '{"name": "Taro", "age": 20}' data
= json.loads(json_str) print(data) # {'name': 'Taro', 'age': 20} 16
PythonでJSONを書き出す import json data = {'name': 'Taro', 'age': 20} json_str
= json.dumps(data) print(json_str) # {"name": "Taro", "age": 20} 17
ファイルからJSONを読み込む with open('data.json', 'r') as f: data = json.load(f) 18
ファイルにJSONを書き込む with open('data.json', 'w') as f: json.dump(data, f) 19
JSONとPythonの型の対応 JSON Python object dict array list string str number
int/float true/false True/False null None 20
JSONのインデント・整形 json_str = json.dumps(data, indent=2, ensure_ascii=False) print(json_str) 21
4. Pydanticの基本 22
Pydanticのインストール pip install pydantic 23
Pydanticの基本的な使い方 from pydantic import BaseModel class Person(BaseModel): name: str age:
int p = Person(name="Taro", age=20) print(p) 24
Pydanticモデルの特徴 属性に「型」を必ず指定する 型に合わない値は自動で変換・エラーになる バリデーション(値の検証)が自動で行われる 25
Pydanticで型変換 p = Person(name="Taro", age="20") # ageはintに自動変換される print(p.age) # 20
26
Pydanticでエラーになる例 p = Person(name="Taro", age="abc") # intに変換できずエラー 27
Pydanticモデルの属性 モデルの属性は「型ヒント」で指定 必須項目・オプション項目を区別できる 28
オプション項目の指定 from typing import Optional class Person(BaseModel): name: str age:
int email: Optional[str] = None 29
デフォルト値の指定 class Person(BaseModel): name: str age: int = 18 #
デフォルト値 30
モデルのネスト class Address(BaseModel): city: str zip: str class Person(BaseModel): name:
str address: Address 31
リストや辞書の型も指定できる from typing import List class Person(BaseModel): name: str hobbies:
List[str] 32
モデルのインスタンスを辞書に変換 p = Person(name="Taro", age=20) print(p.dict()) # {'name': 'Taro', 'age':
20} 33
モデルのインスタンスをJSONに変換 print(p.json()) # {"name": "Taro", "age": 20} 34
5. PydanticとJSONの連携 35
JSONからPydanticモデルを作成 json_str = '{"name": "Taro", "age": 20}' p = Person.parse_raw(json_str)
print(p) 36
Pythonの辞書からPydanticモデルを作成 data = {"name": "Taro", "age": 20} p = Person(**data)
37
PydanticモデルからJSON文字列へ json_str = p.json() print(json_str) 38
Pydanticモデルから辞書へ d = p.dict() print(d) 39
ファイルからJSONを読み込んでPydanticモデルに with open('person.json') as f: p = Person.parse_raw(f.read()) 40
モデルのネストとJSON class Address(BaseModel): city: str zip: str class Person(BaseModel): name:
str address: Address json_str = '{"name": "Taro", "address": {"city": "Tokyo", "zip": "100-0001"}}' p = Person.parse_raw(json_str) 41
リストを含むJSONとPydantic from typing import List class Group(BaseModel): members: List[Person] json_str
= '{"members": [{"name": "Taro", "age": 20}, {"name": "Hanako", "age": 18}]}' g = Group.parse_raw(json_str) 42
JSONのバリデーション 型が合わない場合は自動でエラー 必須項目がない場合もエラー 43
バリデーションエラーの例 try: p = Person(name="Taro") # ageがない except Exception as
e: print(e) 44
6. バリデーション・型安全性 45
バリデーションとは? 入力値が「正しいか」を自動でチェックする仕組み 型だけでなく値の範囲や形式もチェックできる 46
フィールドの制約 from pydantic import Field class Person(BaseModel): name: str age:
int = Field(..., ge=0, le=120) # 0以上120以下 47
文字列の長さ制限 class User(BaseModel): username: str = Field(..., min_length=3, max_length=20) 48
正規表現によるバリデーション class User(BaseModel): email: str = Field(..., regex=r'^[\w\.-]+@[\w\.-]+$') 49
カスタムバリデーション from pydantic import validator class Person(BaseModel): name: str age:
int @validator('age') def check_age(cls, v): if v < 0: raise ValueError('age must be positive') return v 50
Optional型とNone Optional[str] は「strまたはNone」を許容 デフォルト値がなければ必須項目 51
デフォルト値と必須項目 デフォルト値があると「省略可能」 Field(..., description="...") で説明を追加 52
モデルの説明・ドキュメント class Person(BaseModel): name: str = Field(..., description="名前") age: int
= Field(..., description="年齢") 53
例外処理とバリデーションエラー from pydantic import ValidationError try: p = Person(name="Taro", age=-1)
except ValidationError as e: print(e) 54
エラー内容の詳細表示 try: p = Person(name="Taro", age=-1) except ValidationError as e:
print(e.errors()) 55
モデルの再利用と継承 class Student(Person): school: str 56
モデルの入れ子と再利用 モデルを部品として組み合わせることで複雑なデータ構造も安全に管理 57
型安全性のメリット コードのバグを減らせる データの信頼性が高まる IDEの補完や型チェックが効く 58
7. 応用例・よくある質問 59
APIレスポンスのパース Web APIから返ってきたJSONをPydanticでパースすると安全 60
FastAPIとPydantic FastAPIではリクエストやレスポンスの型宣言にPydanticを利用 61
Pydanticでデータの変換 class Person(BaseModel): name: str age: int data = {"name":
"Taro", "age": "20"} p = Person(**data) # ageは自動でintに変換 62
Pydanticのエイリアス(別名) class User(BaseModel): user_name: str = Field(..., alias="userName") data =
{"userName": "taro"} u = User(**data) 63
モデルの部分更新(update) p = Person(name="Taro", age=20) p2 = p.copy(update={"age": 21}) 64
モデルの入れ子(ネスト)と再帰 class Tree(BaseModel): value: int children: List["Tree"] = [] Tree.update_forward_refs()
65
型ヒントのバリエーション List, Dict, Optional, Union, Literal, Enumなども使える 66
Enum型の利用 from enum import Enum class Color(Enum): RED = "red"
BLUE = "blue" class Item(BaseModel): color: Color 67
日付や時刻の型 from datetime import date, datetime class Event(BaseModel): start: datetime
end: date 68
デフォルトファクトリー from typing import List from pydantic import Field class
Group(BaseModel): members: List[str] = Field(default_factory=list) 69
入力値の正規化 Pydanticは自動で型変換や不要な空白の除去なども行う 70
モデルのシリアライズとデシリアライズ dict()やjson()で簡単に変換 parse_obj()やparse_raw()で逆変換 71
モデルのスキーマ出力 print(Person.schema_json(indent=2)) 72
よくあるエラーと対策 型が合わない → 入力値を確認 必須項目がない → デフォルト値やOptionalを使う 73
Pydantic v2の新機能 より高速なバリデーション 型ヒントの強化 新しいフィールド制約 74
Pydanticと他のバリデーションライブラリ marshmallow, dataclasses との違い Pydanticは型ヒントと親和性が高い 75
Pydanticの用途 API開発 設定ファイルの管理 データの前処理・後処理 76
JSONスキーマとの連携 PydanticモデルからJSONスキーマを自動生成できる 77
JSONのメリット・デメリット メリット 軽量 読みやすい 多言語対応 デメリット 型情報が弱い コメント不可 78
Pydanticのメリット・デメリット メリット 型安全 バリデーション自動化 コードがシンプル デメリット 学習コスト 柔軟すぎると複雑化 79
Pydanticを使うべき場面 外部データの受け取り 入力値の厳密なチェックが必要な時 型安全なコードが書きたい時 80
PydanticとJSONまとめ JSONはデータ交換の標準 PydanticはPythonでの型安全・バリデーションの標準 両者を組み合わせることで安全・便利なデータ管理が可能 81
PydanticAIとは? PydanticAIはPydanticチームが開発した、生成AIアプリケーション構築のためのPythonエージェントフレームワーク 型安全性・データ検証の仕組みを基盤とし、信頼性の高いAIアプリケーションを効率的に作成できる FastAPIのような直感的な設計で、AI機能の統合が容易 82
PydanticAIの主な特徴 型安全な構造化レスポンス LLM(大規模言語モデル)の出力をPydanticモデルでバリデーションし、信頼性の高いデータとして受け取れる モデル非依存設計 OpenAI、Gemini、Groqなど複数のAIモデルに対応。今後も拡張予定 関数呼び出し(Function Calling) LLMからPython関数(ツール)を呼び出し、RAGやエージェント的な動作を簡単に実装できる ストリーミングレスポンス対応 リアルタイム性の高いアプリケーション構築が可能
型安全な依存性注入 テストや評価駆動開発もサポート 83
PydanticAIの活用シーン チャットボットや対話型アプリケーション データ収集・レポート生成・スケジュール管理などのタスク自動化 ライブチャットやフィードバックシステムなど、リアルタイム性が求められるシステム LLMの出力を厳密にバリデーションしたい業務システム 84
PydanticAIの基本構造 エージェント:AIの振る舞い・プロンプト・ツール・依存関係・型(スキーマ)をまとめたコンテナ ツール(関数):LLMから呼び出せるPython関数。デコレータで簡単に定義 型安全なレスポンス:Pydanticモデルで出力を厳密に検証 85
PydanticAIの簡単な使い方 from pydantic_ai import Agent agent = Agent( 'openai:gpt-4o-mini', system_prompt='あなたは大阪のおばちゃんです。ユーザと大阪弁で楽しく会話します。'
) result = agent.run_sync('競馬の楽しさを5つリストアップして') print(result.data) モデル・プロンプトを指定してエージェントを作成 run_sync や run でLLMに問い合わせ、結果を取得 86
Function Calling(ツール呼び出し)の例 agent = Agent( "openai:gpt-4o-mini", system_prompt="サイコロゲームをします。" ) @agent.tool_plain def
roll_die() -> str: return str(random.randint(1, 6)) @agent.tool def get_player_name(ctx: RunContext[str]) -> str: return ctx.deps async def main(): result = await agent.run("私の予想は「4」です", deps="たかし") print(result.data) print(result.all_messages()) @agent.tool_plain や @agent.tool で関数をツールとして登録 LLMが必要に応じてこれらの関数を呼び出せる 87
複数モデル・ストリーミング対応 OpenAI、Gemini、Groqなど複数モデルをプラグイン感覚で切り替え可能 ストリーミングレスポンスにより、大量データやリアルタイム応答も簡単に実現 88
型安全なエージェント開発のメリット LLMの出力をPydanticモデルでバリデーションすることで、予期しないデータやエラーを減らせる 型安全な依存性注入により、テストや再利用がしやすい Pythonの標準的な開発スタイルと親和性が高い 89
PydanticAIの位置づけ PydanticAIは「Pydanticによる型安全性」と「生成AIの柔軟さ」を両立 LLMアプリケーションの開発・運用を大幅に効率化 PythonでAIを活用したい全ての開発者におすすめ 90
本日のまとめ JSONはデータ交換の基本 Pythonではjsonモジュールで簡単に扱える Pydanticを使うと型安全・バリデーションが自動化 PydanticとJSONの連携はとても簡単 PydanticAIでAIアプリ開発をもっと安全・簡単に! 91
ご清聴ありがとうございました! 質問があればどうぞ! ぜひPydantic(AI)とJSONを使ってみましょう 92