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 形式)
  • 後続タスクは文体ではなくフィールドに依存

初心者の誤解

  1. Pydantic があれば expected_output 不要だと思う
  2. フィールドが少なすぎて情報不足になる
  3. フィールドを細かくしすぎて未入力が増える

⚠️ まずは 3〜5 個の重要フィールドから始めるのがおすすめです。

次へ

単一 Crew の出力を安定化できたので、次は複数 Crew の協調に進みます。
👉 Flow 入門