🐍

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など複数対応)
  • 同期/非同期両対応
  • 高い拡張性(プロンプトテンプレート・独自ツール組み込みなど)

セットアップ

まずはライブラリをインストールします。

bash
pip install pydantic
pip install pydantic-ai

今回はOpenAIを使うので、事前にOpenAI APIキーの取得と.envファイルの設定を行いました。

.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についての説明を一切していないことです。
にもかかわらず、こちらの期待通りの形式を出力してくれました。

もちろん、システムプロンプトで明確に指示をすることでより堅実な形式を目指すこともできます。

参考文献

https://zenn.dev/gdtypk/articles/pydantic-merit-and-thoughts
https://qiita.com/Tadataka_Takahashi/items/8b28f49d67d7e1d65d11
https://zenn.dev/sunwood_ai_labs/articles/pydantic-ai-tutorial-1-intro-google-colab
https://qiita.com/atsukish/items/a1613c77cecd41980467

Discussion