🔖

PydanticAIが有能すぎて今までが何だったんだ感

2025/01/18に公開

TL;DR

ちまたで噂のPydantic AI[1] を触ってみました。
Langchainとpydanticで無理無理やってたのが何だったんだ感がパない・・・

  • 出力型がほぼ完璧に定義できる --> 型ミスがないしデバッグも楽。
  • Agentの下にtoolをくっつけるだけでツール実装可能。
  • Agent <-> tool 間でのデータのやりとりをミスしない。

というわけで、追々RAGやSQLとのtool連携もやっていく予定ですが、今回の記事では、Agentと構造化出力に絞って実装します。

コード

import nest_asyncio
import pandas as pd
import streamlit as st
from dotenv import load_dotenv
from pydantic import BaseModel, Field
from pydantic_ai import Agent

nest_asyncio.apply()
load_dotenv()

# Pydanticのエージェントを作成
# 環境変数にOPENAI_API_KEYは設定済み
pd_agent = Agent(
    "openai:gpt-4o-mini",  # モデルの指定
    system_prompt="You are an AI assistant helping a user with general questions.",
)


# レスポンスの型を定義
class Structured_Out(BaseModel):  # レスポンスの型を定義
    response: str
    reason: str


# streamlitのUI作成
st.title("Pydanticを使ったAIエージェントの作成")

prompts = st.text_area("プロンプト入力欄", "ここに入力してください")

button1, button2 = st.columns(2)
if button1.button("チャット"):
    st.write("チャットボタンがクリックされました")
    result = pd_agent.run_sync(prompts, result_type=Structured_Out)
    result_dict = result.data.model_dump()  # レスポンスを辞書型に変換
    st.json(result_dict)  # レスポンスをJSON形式で表示
    df = pd.DataFrame([result_dict])  # データフレームに変換
    # データフレームを表として表示
    st.table(df)

とりあえず上記をstreamlitで動かしてみると、こんな感じになります。

ポイント

  • Agentの引数がシンプルで楽。
  • 出力が~.dataで取り出せて楽。(直感的にわかりやすい)
  • 出力型をBaseModelなどで定義できるので、型ミスがないしデバッグも楽。
  • ~.data.model_dump()で出力を簡単にdictに変換できて楽。
  • dictだからpandasのDataFrameに変換したり、あとで.jsonに保存するのも楽。
    • (この記事ではないですが) toolへの変数の受け渡しも楽。

というわけで、「楽」しか言ってないですが、本当に楽でした。
GPT-4oがStructured Outputを出したときも衝撃でしたが、
記法が独特で、ちょっと対応しにくかったんですよね。
次の記事ではtoolの実装を書きたいと思います。

リンク

脚注
  1. Pydantic AI ↩︎

Discussion