🔖
PydanticAIが有能すぎて今までが何だったんだ感
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の実装を書きたいと思います。
Discussion