Slide 1

Slide 1 text

PydanticとJSON入門 Pythonでのデータ管理をもっと安全・便利に! PydanticとJSONの基礎から応用まで 1

Slide 2

Slide 2 text

目次 1. PydanticとJSONとは 2. JSONの基礎 3. PythonでのJSON操作 4. Pydanticの基本 5. PydanticとJSONの連携 6. バリデーション・型安全性 7. 応用例・よくある質問 8. まとめ 2

Slide 3

Slide 3 text

1. PydanticとJSONとは 3

Slide 4

Slide 4 text

Pydanticとは? Pythonでデータの「型」や「値」をチェックするためのライブラリ 入力値の自動変換やバリデーションができる FastAPIなどのWebフレームワークでも利用されている 4

Slide 5

Slide 5 text

JSONとは? JavaScript Object Notationの略 データのやりとりや保存でよく使われる「テキスト形式」 人にも機械にも読みやすい 5

Slide 6

Slide 6 text

PydanticとJSONの関係 PydanticはJSONデータをPythonの「型付き」データに変換できる 逆に、PythonのデータをJSON形式で出力することも簡単 6

Slide 7

Slide 7 text

2. JSONの基礎 7

Slide 8

Slide 8 text

JSONの特徴 軽量なテキスト形式 構造化されたデータを表現できる ほぼ全てのプログラミング言語でサポート 8

Slide 9

Slide 9 text

JSONの基本構造 { "name": "Taro", "age": 20, "is_student": true } 9

Slide 10

Slide 10 text

JSONで使えるデータ型 文字列("abc") 数値(123, 4.56) 真偽値(true, false) null 配列(リスト) オブジェクト(辞書) 10

Slide 11

Slide 11 text

JSONの配列 { "fruits": ["apple", "banana", "orange"] } 11

Slide 12

Slide 12 text

JSONのオブジェクト { "person": { "name": "Hanako", "age": 18 } } 12

Slide 13

Slide 13 text

JSONの注意点 キーは必ずダブルクォート(")で囲む 末尾のカンマは禁止 コメントは書けない 13

Slide 14

Slide 14 text

3. PythonでのJSON操作 14

Slide 15

Slide 15 text

PythonでJSONを扱うには 標準ライブラリの json モジュールを使う 15

Slide 16

Slide 16 text

PythonでJSONを読み込む import json json_str = '{"name": "Taro", "age": 20}' data = json.loads(json_str) print(data) # {'name': 'Taro', 'age': 20} 16

Slide 17

Slide 17 text

PythonでJSONを書き出す import json data = {'name': 'Taro', 'age': 20} json_str = json.dumps(data) print(json_str) # {"name": "Taro", "age": 20} 17

Slide 18

Slide 18 text

ファイルからJSONを読み込む with open('data.json', 'r') as f: data = json.load(f) 18

Slide 19

Slide 19 text

ファイルにJSONを書き込む with open('data.json', 'w') as f: json.dump(data, f) 19

Slide 20

Slide 20 text

JSONとPythonの型の対応 JSON Python object dict array list string str number int/float true/false True/False null None 20

Slide 21

Slide 21 text

JSONのインデント・整形 json_str = json.dumps(data, indent=2, ensure_ascii=False) print(json_str) 21

Slide 22

Slide 22 text

4. Pydanticの基本 22

Slide 23

Slide 23 text

Pydanticのインストール pip install pydantic 23

Slide 24

Slide 24 text

Pydanticの基本的な使い方 from pydantic import BaseModel class Person(BaseModel): name: str age: int p = Person(name="Taro", age=20) print(p) 24

Slide 25

Slide 25 text

Pydanticモデルの特徴 属性に「型」を必ず指定する 型に合わない値は自動で変換・エラーになる バリデーション(値の検証)が自動で行われる 25

Slide 26

Slide 26 text

Pydanticで型変換 p = Person(name="Taro", age="20") # ageはintに自動変換される print(p.age) # 20 26

Slide 27

Slide 27 text

Pydanticでエラーになる例 p = Person(name="Taro", age="abc") # intに変換できずエラー 27

Slide 28

Slide 28 text

Pydanticモデルの属性 モデルの属性は「型ヒント」で指定 必須項目・オプション項目を区別できる 28

Slide 29

Slide 29 text

オプション項目の指定 from typing import Optional class Person(BaseModel): name: str age: int email: Optional[str] = None 29

Slide 30

Slide 30 text

デフォルト値の指定 class Person(BaseModel): name: str age: int = 18 # デフォルト値 30

Slide 31

Slide 31 text

モデルのネスト class Address(BaseModel): city: str zip: str class Person(BaseModel): name: str address: Address 31

Slide 32

Slide 32 text

リストや辞書の型も指定できる from typing import List class Person(BaseModel): name: str hobbies: List[str] 32

Slide 33

Slide 33 text

モデルのインスタンスを辞書に変換 p = Person(name="Taro", age=20) print(p.dict()) # {'name': 'Taro', 'age': 20} 33

Slide 34

Slide 34 text

モデルのインスタンスをJSONに変換 print(p.json()) # {"name": "Taro", "age": 20} 34

Slide 35

Slide 35 text

5. PydanticとJSONの連携 35

Slide 36

Slide 36 text

JSONからPydanticモデルを作成 json_str = '{"name": "Taro", "age": 20}' p = Person.parse_raw(json_str) print(p) 36

Slide 37

Slide 37 text

Pythonの辞書からPydanticモデルを作成 data = {"name": "Taro", "age": 20} p = Person(**data) 37

Slide 38

Slide 38 text

PydanticモデルからJSON文字列へ json_str = p.json() print(json_str) 38

Slide 39

Slide 39 text

Pydanticモデルから辞書へ d = p.dict() print(d) 39

Slide 40

Slide 40 text

ファイルからJSONを読み込んでPydanticモデルに with open('person.json') as f: p = Person.parse_raw(f.read()) 40

Slide 41

Slide 41 text

モデルのネストと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

Slide 42

Slide 42 text

リストを含む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

Slide 43

Slide 43 text

JSONのバリデーション 型が合わない場合は自動でエラー 必須項目がない場合もエラー 43

Slide 44

Slide 44 text

バリデーションエラーの例 try: p = Person(name="Taro") # ageがない except Exception as e: print(e) 44

Slide 45

Slide 45 text

6. バリデーション・型安全性 45

Slide 46

Slide 46 text

バリデーションとは? 入力値が「正しいか」を自動でチェックする仕組み 型だけでなく値の範囲や形式もチェックできる 46

Slide 47

Slide 47 text

フィールドの制約 from pydantic import Field class Person(BaseModel): name: str age: int = Field(..., ge=0, le=120) # 0以上120以下 47

Slide 48

Slide 48 text

文字列の長さ制限 class User(BaseModel): username: str = Field(..., min_length=3, max_length=20) 48

Slide 49

Slide 49 text

正規表現によるバリデーション class User(BaseModel): email: str = Field(..., regex=r'^[\w\.-]+@[\w\.-]+$') 49

Slide 50

Slide 50 text

カスタムバリデーション 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

Slide 51

Slide 51 text

Optional型とNone Optional[str] は「strまたはNone」を許容 デフォルト値がなければ必須項目 51

Slide 52

Slide 52 text

デフォルト値と必須項目 デフォルト値があると「省略可能」 Field(..., description="...") で説明を追加 52

Slide 53

Slide 53 text

モデルの説明・ドキュメント class Person(BaseModel): name: str = Field(..., description="名前") age: int = Field(..., description="年齢") 53

Slide 54

Slide 54 text

例外処理とバリデーションエラー from pydantic import ValidationError try: p = Person(name="Taro", age=-1) except ValidationError as e: print(e) 54

Slide 55

Slide 55 text

エラー内容の詳細表示 try: p = Person(name="Taro", age=-1) except ValidationError as e: print(e.errors()) 55

Slide 56

Slide 56 text

モデルの再利用と継承 class Student(Person): school: str 56

Slide 57

Slide 57 text

モデルの入れ子と再利用 モデルを部品として組み合わせることで複雑なデータ構造も安全に管理 57

Slide 58

Slide 58 text

型安全性のメリット コードのバグを減らせる データの信頼性が高まる IDEの補完や型チェックが効く 58

Slide 59

Slide 59 text

7. 応用例・よくある質問 59

Slide 60

Slide 60 text

APIレスポンスのパース Web APIから返ってきたJSONをPydanticでパースすると安全 60

Slide 61

Slide 61 text

FastAPIとPydantic FastAPIではリクエストやレスポンスの型宣言にPydanticを利用 61

Slide 62

Slide 62 text

Pydanticでデータの変換 class Person(BaseModel): name: str age: int data = {"name": "Taro", "age": "20"} p = Person(**data) # ageは自動でintに変換 62

Slide 63

Slide 63 text

Pydanticのエイリアス(別名) class User(BaseModel): user_name: str = Field(..., alias="userName") data = {"userName": "taro"} u = User(**data) 63

Slide 64

Slide 64 text

モデルの部分更新(update) p = Person(name="Taro", age=20) p2 = p.copy(update={"age": 21}) 64

Slide 65

Slide 65 text

モデルの入れ子(ネスト)と再帰 class Tree(BaseModel): value: int children: List["Tree"] = [] Tree.update_forward_refs() 65

Slide 66

Slide 66 text

型ヒントのバリエーション List, Dict, Optional, Union, Literal, Enumなども使える 66

Slide 67

Slide 67 text

Enum型の利用 from enum import Enum class Color(Enum): RED = "red" BLUE = "blue" class Item(BaseModel): color: Color 67

Slide 68

Slide 68 text

日付や時刻の型 from datetime import date, datetime class Event(BaseModel): start: datetime end: date 68

Slide 69

Slide 69 text

デフォルトファクトリー from typing import List from pydantic import Field class Group(BaseModel): members: List[str] = Field(default_factory=list) 69

Slide 70

Slide 70 text

入力値の正規化 Pydanticは自動で型変換や不要な空白の除去なども行う 70

Slide 71

Slide 71 text

モデルのシリアライズとデシリアライズ dict()やjson()で簡単に変換 parse_obj()やparse_raw()で逆変換 71

Slide 72

Slide 72 text

モデルのスキーマ出力 print(Person.schema_json(indent=2)) 72

Slide 73

Slide 73 text

よくあるエラーと対策 型が合わない → 入力値を確認 必須項目がない → デフォルト値やOptionalを使う 73

Slide 74

Slide 74 text

Pydantic v2の新機能 より高速なバリデーション 型ヒントの強化 新しいフィールド制約 74

Slide 75

Slide 75 text

Pydanticと他のバリデーションライブラリ marshmallow, dataclasses との違い Pydanticは型ヒントと親和性が高い 75

Slide 76

Slide 76 text

Pydanticの用途 API開発 設定ファイルの管理 データの前処理・後処理 76

Slide 77

Slide 77 text

JSONスキーマとの連携 PydanticモデルからJSONスキーマを自動生成できる 77

Slide 78

Slide 78 text

JSONのメリット・デメリット メリット 軽量 読みやすい 多言語対応 デメリット 型情報が弱い コメント不可 78

Slide 79

Slide 79 text

Pydanticのメリット・デメリット メリット 型安全 バリデーション自動化 コードがシンプル デメリット 学習コスト 柔軟すぎると複雑化 79

Slide 80

Slide 80 text

Pydanticを使うべき場面 外部データの受け取り 入力値の厳密なチェックが必要な時 型安全なコードが書きたい時 80

Slide 81

Slide 81 text

PydanticとJSONまとめ JSONはデータ交換の標準 PydanticはPythonでの型安全・バリデーションの標準 両者を組み合わせることで安全・便利なデータ管理が可能 81

Slide 82

Slide 82 text

PydanticAIとは? PydanticAIはPydanticチームが開発した、生成AIアプリケーション構築のためのPythonエージェントフレームワーク 型安全性・データ検証の仕組みを基盤とし、信頼性の高いAIアプリケーションを効率的に作成できる FastAPIのような直感的な設計で、AI機能の統合が容易 82

Slide 83

Slide 83 text

PydanticAIの主な特徴 型安全な構造化レスポンス LLM(大規模言語モデル)の出力をPydanticモデルでバリデーションし、信頼性の高いデータとして受け取れる モデル非依存設計 OpenAI、Gemini、Groqなど複数のAIモデルに対応。今後も拡張予定 関数呼び出し(Function Calling) LLMからPython関数(ツール)を呼び出し、RAGやエージェント的な動作を簡単に実装できる ストリーミングレスポンス対応 リアルタイム性の高いアプリケーション構築が可能 型安全な依存性注入 テストや評価駆動開発もサポート 83

Slide 84

Slide 84 text

PydanticAIの活用シーン チャットボットや対話型アプリケーション データ収集・レポート生成・スケジュール管理などのタスク自動化 ライブチャットやフィードバックシステムなど、リアルタイム性が求められるシステム LLMの出力を厳密にバリデーションしたい業務システム 84

Slide 85

Slide 85 text

PydanticAIの基本構造 エージェント:AIの振る舞い・プロンプト・ツール・依存関係・型(スキーマ)をまとめたコンテナ ツール(関数):LLMから呼び出せるPython関数。デコレータで簡単に定義 型安全なレスポンス:Pydanticモデルで出力を厳密に検証 85

Slide 86

Slide 86 text

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

Slide 87

Slide 87 text

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

Slide 88

Slide 88 text

複数モデル・ストリーミング対応 OpenAI、Gemini、Groqなど複数モデルをプラグイン感覚で切り替え可能 ストリーミングレスポンスにより、大量データやリアルタイム応答も簡単に実現 88

Slide 89

Slide 89 text

型安全なエージェント開発のメリット LLMの出力をPydanticモデルでバリデーションすることで、予期しないデータやエラーを減らせる 型安全な依存性注入により、テストや再利用がしやすい Pythonの標準的な開発スタイルと親和性が高い 89

Slide 90

Slide 90 text

PydanticAIの位置づけ PydanticAIは「Pydanticによる型安全性」と「生成AIの柔軟さ」を両立 LLMアプリケーションの開発・運用を大幅に効率化 PythonでAIを活用したい全ての開発者におすすめ 90

Slide 91

Slide 91 text

本日のまとめ JSONはデータ交換の基本 Pythonではjsonモジュールで簡単に扱える Pydanticを使うと型安全・バリデーションが自動化 PydanticとJSONの連携はとても簡単 PydanticAIでAIアプリ開発をもっと安全・簡単に! 91

Slide 92

Slide 92 text

ご清聴ありがとうございました! 質問があればどうぞ! ぜひPydantic(AI)とJSONを使ってみましょう 92