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
100
Pydantic(AI)とJSONの詳細解説
92ページにわたって、生成AI時代に必要なPydanticとJSONについて丁寧に解説しています。
MIKIO KUBO
May 18, 2025
Tweet
Share
More Decks by MIKIO KUBO
See All by MIKIO KUBO
Python型ヒント完全ガイド 初心者でも分かる、現代的で実践的な使い方
mickey_kubo
1
74
SQLModel 入門
mickey_kubo
0
16
Gemini CLI ハンズアウト
mickey_kubo
2
210
最適化ソリューションにおける モデリングツールAMPLの活用
mickey_kubo
0
31
YAML入門 - 歴史と基本的な使い方を学ぼう
mickey_kubo
0
61
Google Agent Development Kit (ADK) 入門 🚀
mickey_kubo
2
1k
Google ADK実用例:Travel Concierge徹底解説
mickey_kubo
0
410
最適化と機械学習による問題解決
mickey_kubo
0
140
Agentic AIとMCPを利用したサービス作成入門
mickey_kubo
0
260
Other Decks in Education
See All in Education
AIC 103 - Applications of Property Valuation: Essential Slides
rmccaic
0
210
(キラキラ)人事教育担当のつらみ~教育担当として知っておくポイント~
masakiokuda
0
100
小さなチャレンジが生んだチームの大きな変化 -私のふりかえり探求の原点
callas1900
0
530
『会社を知ってもらう』から『安心して活躍してもらう』までの プロセスとフロー
sasakendayo
0
230
2025.05.10 技術書とVoicyとわたし #RPALT
kaitou
1
210
プログラミング教育する大学、ZEN大学
sifue
1
530
SkimaTalk Tutorial for Students
skimatalk
0
1.8k
女子商アプリ開発の軌跡
asial_edu
0
400
社外コミュニティと「学び」を考える
alchemy1115
2
170
Gaps in Therapy in IBD - IBDInnovate 2025 CCF
higgi13425
0
490
SkimaTalk Teacher Guidelines Summary
skimatalk
0
790k
Open Source Summit Japan 2025のボランティアをしませんか
kujiraitakahiro
0
710
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
37
3.3k
Measuring & Analyzing Core Web Vitals
bluesmoon
7
490
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
124
52k
Why Our Code Smells
bkeepers
PRO
337
57k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
5.9k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
940
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
Automating Front-end Workflow
addyosmani
1370
200k
Facilitating Awesome Meetings
lara
54
6.4k
Site-Speed That Sticks
csswizardry
10
670
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