Skip to content
IRC-CodingIRC-Coding
Pydantic AIAIPythonType-SafetyLLMOpenAIAnthropicвалидация

Основы Pydantic AI 2.0: KI-приложения с Type-Safety

Введение в Pydantic AI 2.0: структурированные выходные данные, Type-Safety, валидация и интеграция с LLM.

S

schutzgeist

6 min read
Основы Pydantic AI 2.0: KI-приложения с Type-Safety

Основы Pydantic AI 2.0: приложения с искусственным интеллектом и контролем типов

Pydantic AI 2.0 представляет собой фреймворк для разработки приложений с искусственным интеллектом, обеспечивающий контроль типов и валидацию данных. Он позволяет получать структурированные результаты от больших языковых моделей (LLM) и без проблем интегрируется с моделями Pydantic.

Что такое Pydantic AI?

Pydantic AI — это библиотека Python, построенная на основе Pydantic и специально разработанная для работы с LLM. Она предоставляет:

  • Type-safe вывод AI: ответы от моделей автоматически конвертируются в модели Pydantic
  • Валидация: входные и выходные данные проверяются по схемам
  • Поддержка нескольких провайдеров: OpenAI, Anthropic, Groq, локальные модели (Ollama, vLLM)
  • Потоковая передача: реал-тайм потоковая передача структурированных данных
  • Tool-calling: встроенная поддержка вызова функций

Зачем использовать Pydantic AI?

Типичный пользователь

Pydantic AI идеально подходит для:

  • Python-разработчиков, которые уже используют Pydantic и ценят контроль типов
  • Backend-разработчиков, желающих интегрировать структурированный вывод моделей в свои API
  • Data Engineers, нуждающихся в извлечении и валидации данных с помощью AI
  • Разработчиков приложений с AI, требующих надежного валидированного вывода

Кто выигрывает от использования Pydantic AI?

  • Конечные пользователи: получают согласованные валидированные данные вместо неструктурированного текста
  • Разработчики: экономят время на валидации и обработке ошибок
  • Системы: интеграция проще, так как выходные данные уже имеют правильные типы
  • QA-команды: требуется меньше тестов, поскольку валидация происходит автоматически

Рассчитываем перед интеграцией проекта

Перед добавлением Pydantic AI в проект задайте себе следующие вопросы:

1. Нужны ли тебе структурированные выходные данные?

  • Да: Pydantic AI идеален, если требуются ответы от AI в конкретных форматах (JSON, объекты, enum)
  • Нет: Если нужен только свободный текст, Pydantic AI может быть излишним

2. Уже ли ты используешь Python и Pydantic?

  • Да: Pydantic AI органично интегрируется в существующую экосистему
  • Нет: Если Python не используется, Pydantic AI не подойдет (специфичен для Python)

3. Насколько важен контроль типов для проекта?

  • Критически важен: Pydantic AI обеспечивает валидацию на этапе компиляции и во время выполнения
  • ⚠️ Среднее значение: Pydantic AI помогает, но альтернативы вроде LangChain могут быть достаточными
  • Не важен: Если строгая типизация не требуется, подойдут более простые решения

4. Планируешь ли ты поддержку нескольких провайдеров?

  • Да: Pydantic AI делает простым переход между OpenAI, Anthropic, Groq и локальными моделями
  • Нет: Если используется только один провайдер, это не критерий выбора

5. Какова сложность твоей интеграции AI?

  • Простая или средняя: Pydantic AI идеален для структурированного вывода и tool-calling
  • ⚠️ Очень сложная: Для многоагентных систем LangChain или LangGraph могут быть лучше

Матрица принятия решения

ТребованиеPydantic AILangChainПрямой API
Структурированный вывод✅ Оптимально⚠️ Возможно❌ Ручной
Контроль типов✅ Встроенный⚠️ Ограниченный❌ Отсутствует
Простота✅ Высокая⚠️ Средняя⚠️ Средняя
Многоагентность⚠️ Ограниченная✅ Сильная❌ Нет
Независимость провайдера✅ Да✅ Да❌ Нет
Кривая обучения🟢 Низкая🟡 Средняя🟡 Средняя

Когда НЕ использовать Pydantic AI

  • Ты не используешь Python
  • Нужен только свободный текст без структуры
  • Требуется сложная оркестрация многоагентных систем (используй LangGraph)
  • Хочется минимизировать зависимости
  • Проект очень маленький и простой (прямого API достаточно)

Когда использовать Pydantic AI

  • Ты уже используешь Python и Pydantic
  • Нужны надежные валидированные выходные данные от AI
  • Контроль типов для тебя важен
  • Хочешь менять LLM-провайдеров
  • Разрабатываешь API с интеграцией AI
  • Нужен tool-calling с валидированными параметрами

Практический пример: компания с API на FastAPI и Langdock

Предположим, в компании используется FastAPI с Langdock для создания GDPR-совместимой среды. Чат работает, чатботы работают. Почему стоит рассмотреть Pydantic AI?

Ответ: вероятно, нет необходимости в текущей ситуации.

Если чатбот просто возвращает свободный текст без структурированных данных, Pydantic AI не понадобится. Langdock и FastAPI уже обеспечивают GDPR-совместимость и функциональность чата.

Когда Pydantic AI все же может потребоваться:

Представим небольшое расширение сценария:

# Сейчас: только свободный текст
response = "Привет! Я могу помочь."

# С Pydantic AI: структурированный вывод
from pydantic import BaseModel
from pydantic_ai import Agent

class SupportTicket(BaseModel):
    kategorie: str  # например "технический", "биллинг", "hr"
    prioritaet: str  # например "высокая", "средняя", "низкая"
    beschreibung: str
    assigned_to: str | None = None

# AI анализирует запрос и возвращает структурированные данные
ticket = agent.run_sync(
    "Мой компьютер не запускается, нужна срочная помощь!",
    result_type=SupportTicket
)
# SupportTicket(kategorie='технический', prioritaet='высокая', beschreibung='Мой компьютер не запускается...', assigned_to=None)

Конкретный пример для компании:

  • Без Pydantic AI: чатбот возвращает текст → нужно парсить текст, чтобы определить категории
  • С Pydantic AI: чатбот сразу возвращает объект SupportTicket → можно напрямую сохранить в базу данных без парсинга

Итоговый вывод для этого сценария:

  • Если нужны только чаты: Pydantic AI не требуется
  • Если нужно извлекать структурированные данные из чатов (тикеты, формы, отчеты): Pydantic AI очень полезен

Ключевая идея:

Чатботу не нужен Pydantic AI. AI-агенту обычно нужен. Типичные случаи использования: ассистенты для кода, агенты исследования, автоматизация, рабочие процессы с несколькими инструментами или приложения, требующие типизированного валидированного вывода.

Установка

pip install pydantic-ai

Для конкретных провайдеров:

pip install pydantic-ai[openai]  # OpenAI
pip install pydantic-ai[anthropic]  # Anthropic
pip install pydantic-ai[openai,anthropic]  # Оба

Основы: структурированный вывод

Простой пример

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(
    'Создай профиль пользователя для разработчика',
    result_type=UserResponse
)

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

С системным промптом

from pydantic_ai import Agent, SystemPrompt

agent = Agent(
    'openai:gpt-4o',
    system_prompt=SystemPrompt('Ты полезный ассистент для разработчиков.')
)

result = agent.run_sync(
    'Создай профиль для Python-разработчика',
    result_type=UserResponse
)

Сложные модели

Вложенные структуры

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

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

Поддержка нескольких провайдеров

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!')

Локальные модели с 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!')

Вызов инструментов

Простой инструмент

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?')

С использованием моделей Pydantic

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)])

Потоковая передача данных

Потоковая передача текста

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

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

Структурированная потоковая передача

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

Обработка ошибок

Ошибки валидации

from pydantic import ValidationError

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

Логика повторных попыток

from pydantic_ai import Agent, RetryPolicy

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

Best Practices

1. Определяйте четкие модели

# ✅ Хорошо
class UserProfile(BaseModel):
    name: str
    email: str
    age: int

# ❌ Плохо
class Response(BaseModel):
    data: dict  # Keine Type-Safety

2. Используйте системные подсказки

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

3. Используйте валидацию

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. Оптимизация затрат

# Более компактные модели для простых задач
agent_simple = Agent('openai:gpt-4o-mini')

# Более мощные модели для сложных задач
agent_complex = Agent('openai:gpt-4o')

Интеграция с существующими проектами

Интеграция с FastAPI

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())

Типичные ошибки

1. Отсутствующие API-ключи

import os
from pydantic_ai import Agent

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

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

2. Некорректные названия моделей

# ✅ Правильно
agent = Agent('openai:gpt-4o')

# ❌ Неправильно
agent = Agent('openai:gpt-5')  # Modell existiert nicht

3. Отсутствующие аннотации типов

# ✅ С аннотациями типов
def get_weather(location: str) -> str:
    return f'Wetter in {location}'

# ❌ Без аннотаций типов
def get_weather(location):
    return f'Wetter in {location}'

Pydantic AI и альтернативы

ФункцияPydantic AILangChainLlamaIndex
Type-Safety✅ Встроенная⚠️ Ограниченная⚠️ Ограниченная
Интеграция Pydantic✅ Полная⚠️ Частичная⚠️ Частичная
Поддержка нескольких провайдеров✅ Простая✅ Да✅ Да
Потоковая передача✅ Да✅ Да✅ Да
Вызов инструментов✅ Встроенный✅ Да✅ Да
Кривая обучения🟢 Низкая🟡 Средняя🟡 Средняя

Ресурсы

Назад к блогу
Share:

Похожие статьи