pydantic-aiの使い方(初歩)
前提
本記事は、OpenAIのLLMモデルを使用したpydantic-aiのチュートリアルになります。
また、筆者はpython初心者です。記事の内容に間違った認識や情報があればご指摘いただけますと幸いです。
環境
- Windows: 11 Pro 24H2
- python: 3.12.7
- pydantic: 2.11.2
- pydantic-ai: 0.0.53
pydanticとは
Pythonのデータバリデーション&データモデル定義ライブラリです。
JSONや辞書などの入力データに対して型チェックや自動補完、エラーハンドリングを行うことができます。
特徴:
- 型ヒントに基づいたデータ検証
- デフォルト値やカスタムバリデーションの設定が可能
- データ変換や補完にも対応
pydantic-aiとは
pydantic-aiは、pydanticの型安全性を活かして、LLMと自然なやり取りができるAIエージェントを構築できるフレームワークです。
特徴:
- pydanticと連携した構造化出力
- LLMモデルの抽象化(OpenAI・Anthropicなど複数対応)
- 同期/非同期両対応
- 高い拡張性(プロンプトテンプレート・独自ツール組み込みなど)
セットアップ
まずはライブラリをインストールします。
pip install pydantic
pip install pydantic-ai
今回はOpenAIを使うので、事前にOpenAI APIキーの取得と.envファイルの設定を行いました。
OPENAI_API_KEY = xxxxxxx
使い方
シンプルな例
import os
import dotenv
from pydantic_ai import Agent
from pydantic_ai.models.openai import OpenAIModel
from pydantic_ai.providers.openai import OpenAIProvider
dotenv.load_dotenv()
openai_api_key = os.environ.get("OPENAI_API_KEY")
# モデルの初期化
model = OpenAIModel("gpt-4o", provider=OpenAIProvider(api_key=openai_api_key))
# エージェントの初期化
agent = Agent(
model,
system_prompt="""
あなたは日本人。
日本語で会話すること。
知らないことは知らないって言うこと。
""",
)
# エージェントに質問を投げる
if __name__ == "__main__":
result = agent.run_sync("フリクリとは?")
print(result.data)
Agent()
でAIエージェントが作成されます。
run_sync()
という関数を使って、AIエージェントにクエリを投げかけることができます。
「フリクリ」(FLCL)は、日本のアニメ作品で、GAINAXとProduction I.Gが制作したOVA(オリジナルビデオアニメーション)シリーズです。2000年から2001年にかけて全6話がリリースされました。この作品は、独特なアートスタイルと先鋭的なストーリー展開で多くのファンを獲得し、カルト的な人気を誇ります。
物語は、平凡な中学生の少年・ナオ太と、突然彼の生活に現れた謎の女性・ハルハラ・ハル子との不思議な出来事を中心に展開されます。ハル子によってナオ太の日常が大きく変わり、様々な奇妙な事件に巻き込まれていきます。アニメーションや音楽、脚本が評価されており、特に音楽はTHE PILLOWSというバンドが担当しました。これにより、「フリクリ」はアニメーションと音楽の融合としても印象深い作品となっています。
出力の形式を定義する
pydantic-aiの強力な特徴の一つとして、「構造化された応答」をLLMから直接受け取ることができます。
import os
import dotenv
from pydantic import BaseModel
from pydantic_ai import Agent
from pydantic_ai.models.openai import OpenAIModel
from pydantic_ai.providers.openai import OpenAIProvider
dotenv.load_dotenv()
openai_api_key = os.environ.get("OPENAI_API_KEY")
# データモデルの定義
class ResponseData(BaseModel):
response: str
emotion: str
emoji: str
# モデルの初期化
model = OpenAIModel("gpt-4o", provider=OpenAIProvider(api_key=openai_api_key))
# エージェントの初期化
agent = Agent(
model,
system_prompt="""
あなたは日本人。
日本語で会話すること。
知らないことは知らないって言うこと。
""",
)
# エージェントに質問を投げる
if __name__ == "__main__":
result = agent.run_sync("今夜はパーティです", result_type=ResponseData)
result_dict = result.data.model_dump()
print(f"response: {result_dict["response"]}")
print(f"emotion: {result_dict["emotion"]}")
print(f"emoji: {result_dict["emoji"]}")
BaseModel
を使って、ResponseData
というモデルを定義しました。
class ResponseData(BaseModel):
response: str
emotion: str
emoji: str
なんとなく、
response
: 質問に対する回答
emotion
: AIエージェントの感情
emoji
: なんか適当な絵文字
みたいな想定です。
run_sync()
にresult_type
という引数があります。
作成したResponseData
を渡すことで、エージェントからの返答を自動的にその形式に変換してくれます。
出力結果は以下のようになりました。
response: パーティを楽しんでください!素晴らしい夜になりますように!
emotion: 嬉しい
emoji: 🎉
ここで注目したいのが、AIエージェントにはResponseData
についての説明を一切していないことです。
にもかかわらず、こちらの期待通りの形式を出力してくれました。
もちろん、システムプロンプトで明確に指示をすることでより堅実な形式を目指すこともできます。
参考文献
Discussion