Skip to content
IRC-Coding IRC-Coding
Pydantic AI KI Python Type-Safety LLM OpenAI Anthropic Validierung

Pydantic AI 2.0 Grundlagen: KI-Anwendungen mit Type-Safety

Einführung in Pydantic AI 2.0: Strukturierte KI-Ausgaben, Type-Safety, Validierung und Integration mit LLMs wie OpenAI, Anthropic und lokalen Modellen.

S

schutzgeist

6 min read
Pydantic AI 2.0 Grundlagen: KI-Anwendungen mit Type-Safety

Pydantic AI 2.0 Grundlagen: KI-Anwendungen mit Type-Safety

Pydantic AI 2.0 ist ein Framework für die Entwicklung von KI-Anwendungen mit Type-Safety und Validierung. Es ermöglicht strukturierte Ausgaben von Large Language Models (LLMs) und integriert sich nahtlos mit Pydantic-Modellen.

Was ist Pydantic AI?

Pydantic AI ist eine Python-Bibliothek, die auf Pydantic aufbaut und speziell für die Arbeit mit LLMs entwickelt wurde. Sie bietet:

  • Type-Safe KI-Ausgaben: KI-Antworten werden automatisch in Pydantic-Modelle konvertiert
  • Validierung: Eingaben und Ausgaben werden gegen Schemas validiert
  • Multi-Provider Support: OpenAI, Anthropic, Groq, lokale Modelle (Ollama, vLLM)
  • Streaming: Echtzeit-Streaming von strukturierten Daten
  • Tool-Calling: Integrierte Unterstützung für Function Calling

Warum Pydantic AI nutzen?

Typischer Nutzer

Pydantic AI ist ideal für folgende Zielgruppen:

  • Python-Entwickler, die bereits Pydantic nutzen und Type-Safety schätzen
  • Backend-Entwickler, die strukturierte KI-Ausgaben in APIs integrieren wollen
  • Data Engineers, die KI-gestützte Datenextraktion und -validierung benötigen
  • Entwickler von KI-Anwendungen, die zuverlässige, validierte Ausgaben benötigen

Typischer Nutznießer

Wer profitiert von Pydantic AI in einem Projekt?

  • Endbenutzer: Erhalten konsistente, validierte Daten statt unstrukturierter Text-Antworten
  • Entwickler: Sparen Zeit bei der Validierung und Fehlerbehandlung
  • Systeme: Integration ist einfacher, da Ausgaben bereits typisiert sind
  • QA-Teams: Weniger Tests nötig, da Validierung automatisch erfolgt

Projektüberlegungen: Wann Pydantic AI nutzen?

Bevor du Pydantic AI in dein Projekt integrierst, stelle dir folgende Fragen:

1. Benötigst du strukturierte Ausgaben?

  • Ja: Pydantic AI ist perfekt für dich, wenn du KI-Antworten in spezifischen Formaten brauchst (JSON, Objekte, Enums)
  • Nein: Wenn du nur freien Text brauchst, ist Pydantic AI möglicherweise overkill

2. Nutzt du bereits Python und Pydantic?

  • Ja: Pydantic AI integriert sich nahtlos in dein bestehendes Ökosystem
  • Nein: Wenn du nicht Python nutzt, ist Pydantic AI nicht geeignet (Python-spezifisch)

3. Wie wichtig ist Type-Safety für dein Projekt?

  • Sehr wichtig: Pydantic AI bietet compile-time und runtime Validierung
  • ⚠️ Mittelig: Pydantic AI kann helfen, aber Alternativen wie LangChain könnten ausreichend sein
  • Unwichtig: Wenn du keine strikte Typisierung brauchst, sind einfachere Alternativen besser

4. Planst du Multi-Provider Support?

  • Ja: Pydantic AI macht es einfach, zwischen OpenAI, Anthropic, Groq und lokalen Modellen zu wechseln
  • Nein: Wenn du nur einen Provider nutzt, ist dies kein Entscheidungskriterium

5. Wie komplex ist deine KI-Integration?

  • Einfach bis mittel: Pydantic AI ist ideal für strukturierte Ausgaben und Tool-Calling
  • ⚠️ Sehr komplex: Für komplexe Multi-Agent-Systeme könnte LangChain oder LangGraph besser geeignet sein

Entscheidungsmatrix

AnforderungPydantic AILangChainDirekte API
Strukturierte Ausgaben✅ Optimal⚠️ Möglich❌ Manuell
Type-Safety✅ Native⚠️ Eingeschränkt❌ Keine
Einfachheit✅ Hoch⚠️ Mittel⚠️ Mittel
Multi-Agent⚠️ Eingeschränkt✅ Stark❌ Nein
Provider-Agnostisch✅ Ja✅ Ja❌ Nein
Lernkurve🟢 Niedrig🟡 Mittel🟡 Mittel

Wann Pydantic AI NICHT nutzen solltest

  • Du nutzt nicht Python
  • Du brauchst nur freien Text ohne Struktur
  • Du benötigst komplexe Multi-Agent-Orchestrierung (nutze LangGraph)
  • Du willst minimale Abhängigkeiten
  • Dein Projekt ist sehr klein und einfach (direkte API reicht)

Wann Pydantic AI nutzen solltest

  • Du nutzt Python und Pydantic bereits
  • Du brauchst zuverlässige, validierte KI-Ausgaben
  • Type-Safety ist dir wichtig
  • Du willst zwischen LLM-Providern wechseln können
  • Du entwickelst APIs mit KI-Integration
  • Du willst Tool-Calling mit validierten Parametern

Praxisbeispiel: Unternehmen mit API zu Langdock

Innerhalb eines Unternehmens nutze ich FastAPI mit Langdock, um innerhalb des Unternehmens eine DSGVO-konforme Umgebung zu schaffen. Der Chat funktioniert, die Chatbots ebenfalls. Warum solltes ich Pydantic AI in Betracht ziehen?

Antwort: In den aktuellen Szenario wahrscheinlich nicht.

Wenn der Chatbot nur freien Text liefert und keine strukturierten Daten zurückgibt, ist Pydantic AI überflüssig. Langdock und FastAPI erledigen bereits die DSGVO-Konformität und die Chat-Funktionalität.

Wann Pydantic AI allerdings dennoch benötigt werden könnte:

Angenommen, wir erweitern das Szenario ein wenig:

# Aktuell: Nur freier Text
response = "Hallo! Ich kann dir helfen."

# Mit Pydantic AI: Strukturierte Ausgaben
from pydantic import BaseModel
from pydantic_ai import Agent

class SupportTicket(BaseModel):
    kategorie: str  # z.B. "technisch", "billing", "hr"
    prioritaet: str  # z.B. "hoch", "mittel", "niedrig"
    beschreibung: str
    assigned_to: str | None = None

# KI analysiert die Anfrage und gibt strukturierte Daten zurück
ticket = agent.run_sync(
    "Mein Rechner startet nicht mehr, ich brauche dringend Hilfe!",
    result_type=SupportTicket
)
# SupportTicket(kategorie='technisch', prioritaet='hoch', beschreibung='Mein Rechner startet nicht mehr...', assigned_to=None)

Konkretes Beispiel für das Unternehmen:

  • Ohne Pydantic AI: Chatbot gibt Text zurück → Du musst den Text parsen, um Kategorien zu erkennen
  • Mit Pydantic AI: Chatbot gibt direkt ein SupportTicket-Objekt zurück → Du kannst es direkt in deine Datenbank speichern, ohne Parsing

Fazit für das Szenario:

  • Wenn du nur Chats brauchst: Kein Pydantic AI nötig
  • Wenn du strukturierte Daten aus Chats extrahieren willst (Tickets, Formulare, Berichte): Pydantic AI sehr nützlich

Merksatz:

Ein Chatbot braucht kein Pydantic AI. Ein KI-Agent meistens schon. Typische Einsatzfälle sind Code-Assistenten, Recherche-Agenten, Automatisierungen, Workflows mit mehreren Tools oder Anwendungen, die typisierte und validierte Ausgaben benötigen.

Installation

pip install pydantic-ai

Für spezifische Provider:

pip install pydantic-ai[openai]  # OpenAI
pip install pydantic-ai[anthropic]  # Anthropic
pip install pydantic-ai[openai,anthropic]  # Beide

Grundlagen: Strukturierte Ausgaben

Einfaches Beispiel

from pydantic import BaseModel
from pydantic_ai import Agent

class UserResponse(BaseModel):
    name: str
    age: int
    email: str

agent = Agent('openai:gpt-4o')

result = agent.run_sync(
    'Erstelle ein Benutzerprofil für einen Entwickler',
    result_type=UserResponse
)

print(result.data)
# UserResponse(name='Max Mustermann', age=28, email='max@example.com')

Mit System-Prompt

from pydantic_ai import Agent, SystemPrompt

agent = Agent(
    'openai:gpt-4o',
    system_prompt=SystemPrompt('Du bist ein hilfreicher Assistent für Entwickler.')
)

result = agent.run_sync(
    'Erstelle ein Profil für einen Python-Entwickler',
    result_type=UserResponse
)

Komplexere Modelle

Verschachtelte Strukturen

from typing import List
from pydantic import BaseModel

class Skill(BaseModel):
    name: str
    years_experience: int
    level: str  # beginner, intermediate, advanced

class DeveloperProfile(BaseModel):
    name: str
    role: str
    skills: List[Skill]
    github_url: str | None = None
    available_for_hire: bool

agent = Agent('openai:gpt-4o')

result = agent.run_sync(
    'Erstelle ein detailliertes Profil für einen Senior Python-Entwickler',
    result_type=DeveloperProfile
)

Enum-Validierung

from enum import Enum
from pydantic import BaseModel

class SkillLevel(str, Enum):
    BEGINNER = 'beginner'
    INTERMEDIATE = 'intermediate'
    ADVANCED = 'advanced'
    EXPERT = 'expert'

class Skill(BaseModel):
    name: str
    level: SkillLevel

Multi-Provider Support

OpenAI

from pydantic_ai import Agent

agent = Agent('openai:gpt-4o')
result = agent.run_sync('Hallo Welt!')

Anthropic

agent = Agent('anthropic:claude-3-5-sonnet-20241022')
result = agent.run_sync('Hallo Welt!')

Lokale Modelle (Ollama)

agent = Agent('ollama:llama3.2')
result = agent.run_sync('Hallo Welt!')

Groq

agent = Agent('groq:llama-3.1-70b-versatile')
result = agent.run_sync('Hallo Welt!')

Tool-Calling

Einfaches Tool

from pydantic_ai import Agent, Tool

def get_weather(location: str) -> str:
    """Holt das Wetter für einen Ort."""
    # In der Realität: API-Aufruf
    return f'In {location} sind es 22°C.'

agent = Agent('openai:gpt-4o', tools=[Tool(get_weather)])

result = agent.run_sync('Wie ist das Wetter in Berlin?')

Mit Pydantic-Modellen

from pydantic import BaseModel

class WeatherQuery(BaseModel):
    location: str
    unit: str = 'celsius'

def get_weather(query: WeatherQuery) -> str:
    return f'In {query.location} sind es 22°{query.unit}.'

agent = Agent('openai:gpt-4o', tools=[Tool(get_weather)])

Streaming

Text-Streaming

agent = Agent('openai:gpt-4o')

async for chunk in agent.run_stream('Erzähle mir eine Geschichte'):
    print(chunk.content, end='')

Strukturiertes Streaming

async for chunk in agent.run_stream(
    'Erstelle ein Benutzerprofil',
    result_type=UserResponse
):
    if chunk.content:
        print(chunk.content, end='')

Fehlerbehandlung

Validierungsfehler

from pydantic import ValidationError

try:
    result = agent.run_sync(
        'Erstelle ein Profil',
        result_type=UserResponse
    )
except ValidationError as e:
    print(f'Validierungsfehler: {e}')

Retry-Logik

from pydantic_ai import Agent, RetryPolicy

agent = Agent(
    'openai:gpt-4o',
    retry_policy=RetryPolicy(max_retries=3)
)

Best Practices

1. Klare Modelle definieren

# ✅ Gut
class UserProfile(BaseModel):
    name: str
    email: str
    age: int

# ❌ Schlecht
class Response(BaseModel):
    data: dict  # Keine Type-Safety

2. System-Prompts nutzen

agent = Agent(
    'openai:gpt-4o',
    system_prompt=SystemPrompt(
        'Du bist ein technischer Dokumentations-Assistent. '
        'Antworte präzise und strukturiert.'
    )
)

3. Validierung nutzen

from pydantic import field_validator

class UserProfile(BaseModel):
    email: str
    
    @field_validator('email')
    def validate_email(cls, v):
        if '@' not in v:
            raise ValueError('Ungültige E-Mail')
        return v

4. Kostenoptimierung

# Kleinere Modelle für einfache Aufgaben
agent_simple = Agent('openai:gpt-4o-mini')

# Größere Modelle für komplexe Aufgaben
agent_complex = Agent('openai:gpt-4o')

Integration mit bestehenden Projekten

FastAPI Integration

from fastapi import FastAPI
from pydantic_ai import Agent

app = FastAPI()
agent = Agent('openai:gpt-4o')

@app.post('/generate')
async def generate(prompt: str):
    result = await agent.run(prompt)
    return {'response': result.content}

Async/Await

import asyncio

async def main():
    agent = Agent('openai:gpt-4o')
    result = await agent.run('Hallo Welt!')
    print(result.content)

asyncio.run(main())

Häufige Fehler

1. Fehlende API-Keys

import os
from pydantic_ai import Agent

# API-Key setzen
os.environ['OPENAI_API_KEY'] = 'sk-...'

agent = Agent('openai:gpt-4o')

2. Ungültige Modelle

# ✅ Korrekt
agent = Agent('openai:gpt-4o')

# ❌ Falsch
agent = Agent('openai:gpt-5')  # Modell existiert nicht

3. Fehlende Typ-Hints

# ✅ Mit Typ-Hints
def get_weather(location: str) -> str:
    return f'Wetter in {location}'

# ❌ Ohne Typ-Hints
def get_weather(location):
    return f'Wetter in {location}'

Pydantic AI vs. Alternativen

FeaturePydantic AILangChainLlamaIndex
Type-Safety✅ Native⚠️ Eingeschränkt⚠️ Eingeschränkt
Pydantic-Integration✅ Vollständig⚠️ Partial⚠️ Partial
Multi-Provider✅ Einfach✅ Ja✅ Ja
Streaming✅ Ja✅ Ja✅ Ja
Tool-Calling✅ Native✅ Ja✅ Ja
Lernkurve🟢 Niedrig🟡 Mittel🟡 Mittel

Ressourcen

Zurück zum Blog
Share:

Ähnliche Beiträge