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
5
Pydantic(AI)とJSONの詳細解説
92ページにわたって、生成AI時代に必要なPydanticとJSONについて丁寧に解説しています。
MIKIO KUBO
May 18, 2025
Tweet
Share
More Decks by MIKIO KUBO
See All by MIKIO KUBO
Linuxのよく使うコマンドを解説
mickey_kubo
0
7
初めての正規表現(regex)
mickey_kubo
1
8
Pythonパッケージ管理 [uv] 完全入門
mickey_kubo
0
4
Streamlit 総合解説 ~ PythonistaのためのWebアプリ開発 ~
mickey_kubo
1
530
AMPL詳細解説
mickey_kubo
1
31
Markdown言語入門
mickey_kubo
1
11
Githubをはじめよう 初心者向け完全ガイド
mickey_kubo
1
30
生成AI時代の必須教養であるマーメイドについて解説
mickey_kubo
1
14
新プロンプトエンジニアリング⼊⾨(⼤規模⾔語モデル(LLM)の可能性を最⼤限に引き出す技術)
mickey_kubo
2
79
Other Decks in Education
See All in Education
zupanijska natjecanja
petarradanovic2
0
400
女子商アプリ開発の軌跡
asial_edu
0
370
計算情報学研究室 (数理情報学第7研究室)紹介スライド (2025)
tomonatu8
0
300
演習問題
takenawa
0
140
Tangible, Embedded and Embodied Interaction - Lecture 7 - Next Generation User Interfaces (4018166FNR)
signer
PRO
0
1.6k
論文紹介のやり方 / How to review
kaityo256
PRO
15
81k
Data Representation - Lecture 3 - Information Visualisation (4019538FNR)
signer
PRO
1
2.3k
Multimodal Interaction - Lecture 3 - Next Generation User Interfaces (4018166FNR)
signer
PRO
0
1.5k
0219
cbtlibrary
0
100
ハワイアン航空 ステータスへの道 #HAairstudy
maroon1st
0
170
教員向け生成AI講座 ~基礎から応用まで~
luiyoshida
0
620
Info Session MSc Computer Science & MSc Applied Informatics
signer
PRO
0
170
Featured
See All Featured
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
137
33k
Become a Pro
speakerdeck
PRO
28
5.3k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
5
620
Optimizing for Happiness
mojombo
378
70k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
34
2.2k
Agile that works and the tools we love
rasmusluckow
329
21k
Git: the NoSQL Database
bkeepers
PRO
430
65k
Rebuilding a faster, lazier Slack
samanthasiow
81
9k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
30
2k
Visualization
eitanlees
146
16k
YesSQL, Process and Tooling at Scale
rocio
172
14k
Rails Girls Zürich Keynote
gr2m
94
13k
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