📝 LLM и AI

Pydantic v2: валидация данных в Python

P
Автор
PyLand Team
📅
Опубликовано
30.06.2026
⏱️
Время чтения
2 мин
👁️
Просмотров
329
🌿
Уровень
Средний

Pydantic — библиотека для проверки и преобразования данных через аннотации типов. Она часто используется в API и LLM-приложениях, когда внешний сервис возвращает JSON, а программе нужна предсказуемая структура.

Установка

python -m pip install "pydantic>=2,<3"

BaseModel — базовая модель

from pydantic import BaseModel

class TextAnalysis(BaseModel):
    sentiment: str
    score: float
    keywords: list[str]
    language: str

# Создание из словаря
data = {"sentiment": "positive", "score": 0.9, "keywords": ["python"], "language": "ru"}
result = TextAnalysis.model_validate(data)

print(result.sentiment)   # positive
print(result.score)       # 0.9
print(result.keywords)    # ['python']

model_validate() — парсинг из dict

import json

raw_json = '{"sentiment": "negative", "score": 0.2, "keywords": [], "language": "en"}'
data = json.loads(raw_json)
result = TextAnalysis.model_validate(data)

Если API уже вернул JSON-строку, промежуточный json.loads() не обязателен:

result = TextAnalysis.model_validate_json(raw_json)

Literal — только разрешённые значения

from typing import Literal

class StudyCard(BaseModel):
    topic: str
    level: Literal["beginner", "intermediate", "advanced"]
    summary: str
    key_points: list[str]
    practice_task: str

Любое другое значение level вызовет ValidationError.

model_json_schema() — схема для API

schema = StudyCard.model_json_schema()

Метод возвращает JSON Schema. Её можно передать API с поддержкой structured output, а полученный ответ затем проверить через StudyCard.model_validate_json(...).

ValidationError — невалидные данные

from pydantic import ValidationError

try:
    bad = TextAnalysis.model_validate({"sentiment": "ok"})  # нет score и keywords
except ValidationError as e:
    print(e.error_count())   # 3
    for err in e.errors():
        print(err["loc"], err["msg"])

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

class SentimentResult(BaseModel):
    label: str       # positive / negative / neutral
    confidence: float

class TextAnalysis(BaseModel):
    sentiment: SentimentResult
    keywords: list[str]
    language: str
    word_count: int

data = {
    "sentiment": {"label": "positive", "confidence": 0.87},
    "keywords": ["python", "api"],
    "language": "ru",
    "word_count": 150
}
result = TextAnalysis.model_validate(data)
print(result.sentiment.label)       # positive
print(result.sentiment.confidence)  # 0.87

Field() — ограничения и описания

from pydantic import BaseModel, Field

class TextAnalysis(BaseModel):
    sentiment: str = Field(description="positive / negative / neutral")
    score: float = Field(ge=0.0, le=1.0, description="Уверенность от 0 до 1")
    keywords: list[str] = Field(max_length=10, description="Ключевые слова")
    language: str = Field(pattern=r"^[a-z]{2}$", description="ISO 639-1 код языка")

model_dump() — обратно в dict

result = TextAnalysis.model_validate(data)
d = result.model_dump()        # dict
j = result.model_dump_json()   # JSON-строка

Зачем Pydantic в LLM-приложениях

Языковая модель обычно возвращает свободный текст. Чтобы получить структурированные данные, попроси API вернуть JSON по схеме и проверь результат через Pydantic:

raw = interaction.output_text
result = TextAnalysis.model_validate_json(raw)
# Теперь result — типизированный объект с проверенными полями

Pydantic подтверждает структуру и типы, но не истинность текста. Содержательную точность ответа всё равно должен оценивать человек.

Ваша реакция на статью

💬 Комментарии (0)

🔐 Войдите в систему, чтобы оставить комментарий
🚪 Войти
💭

Комментариев пока нет

Станьте первым, кто поделится мнением об этой статье!

🔗 Похожие

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

Продолжите изучение с этими материалами

📝

AI-агенты: ReAct loop и автономные действия

Чат-бот отвечает на вопросы. Агент — действует: вызывает инструменты, получает реальные данные и использует их...

📅 30.06.2026 👁️ 335
📝

asyncio в Python: асинхронное программирование

asyncio — стандартная библиотека Python для асинхронного кода. Позволяет выполнять несколько задач «одновременно» в одном...

📅 30.06.2026 👁️ 318
📝

Эмбеддинги: координаты текста в пространстве смыс…

Эмбеддинг — числовой вектор, представляющий текст. Похожие по смыслу тексты получают близкие векторы. Это основа...

📅 30.06.2026 👁️ 298