CrewAI 構造化出力:Pydantic でデータのブレを止める
2 min read
同じ Task なのに、今回は markdown、次回は散文で返ってくる。よくある悩みです。
解決はシンプルで、Pydantic で出力形式を定義することです。
なぜ構造化出力が必要か
- 後続 Task が固定フィールドを読める
- 文字列パースの壊れやすさを避けられる
- 失敗を早期検知できる(フィールド不一致で即エラー)
API 契約と同じで、契約があるほど連携は安定します。
出力モデルを作る
from pydantic import BaseModel, Field
class Finding(BaseModel):
title: str = Field(description="Finding title")
summary: str = Field(description="Brief explanation")
source: str = Field(description="Reference URL")
class ResearchReport(BaseModel):
topic: str = Field(description="Topic name")
findings: list[Finding] = Field(description="Key findings list")
conclusion: str = Field(description="Final conclusion")Task で output_pydantic を使う
from crewai import Task
research_task = Task(
description="Research AI observability tools in 2026.",
expected_output="Structured research result.",
output_pydantic=ResearchReport,
)実行後は、文章推測ではなく安定したフィールドアクセスができます。
併用のコツ
expected_outputで品質要件は引き続き明示- フィールドの意味を明確化(
summaryの長さ、source形式) - 後続タスクは文体ではなくフィールドに依存
初心者の誤解
- Pydantic があれば
expected_output不要だと思う - フィールドが少なすぎて情報不足になる
- フィールドを細かくしすぎて未入力が増える
⚠️ まずは 3〜5 個の重要フィールドから始めるのがおすすめです。
次へ
単一 Crew の出力を安定化できたので、次は複数 Crew の協調に進みます。
👉 Flow 入門