Structured extractor
Generic шаблон для извлечения структурированных данных через with_structured_output(YourSchema).
Принципы которые работают
- Pydantic-схема описывает что хотим — не нужно повторять в промпте поля, модель видит schema
- System prompt — про роль и принципы: "Ты экстрактор Х из Y. Не выдумывай. Если поле не найдено — оставляй null"
- User prompt — данные
- Field descriptions в Pydantic — критичны: LLM их видит и понимает что класть
Шаблон system prompt
Ты экстрактор {entity_type} из {source_type}. Правила: - Извлекай ТОЛЬКО то что явно присутствует в тексте - Если поле не найдено — оставляй null (не выдумывай) - Если в тексте есть противоречие — выбирай самое позднее упоминание - Не нормализуй и не "улучшай" данные — отдавай как есть Возвращай результат строго по схеме.
Шаблон Pydantic schema
from pydantic import BaseModel, Field from typing import Optional class ExtractedItem(BaseModel): """Что-то конкретное что извлекаем.""" id: Optional[str] = Field( None, description="ID если упомянут в формате FOO-123 или подобном; null если нет" ) title: str = Field( description="Заголовок / название как он есть в тексте" ) confidence: float = Field( ge=0, le=1, description="Насколько уверен в извлечении: 0=не уверен, 1=явно сказано" )
Шаблон LangChain / LangGraph использования
from langchain_anthropic import ChatAnthropic # или другой через LiteLLM llm = ChatAnthropic(model="claude-sonnet-4-6") structured_llm = llm.with_structured_output(ExtractedItem) result = structured_llm.invoke([ ("system", system_prompt), ("user", text_to_extract_from) ]) # result — instance of ExtractedItem
Что часто работает плохо
- Слишком много полей в одной схеме (>10) — модель путается. Разбей на несколько экстракторов
- Vague descriptions полей — "ID этого" vs "ID в формате PROJ-123, например JIRA-456"
- Нет examples в description — добавь 1-2 для tricky полей
- Опциональные nested-структуры без типов — Pydantic нужен strict typing
Связано
Metadata
- title
- Structured extractor — generic паттерн
- model
- any-with-tool-calling
- task
- extract structured data from unstructured text
- tags
- ['prompt', 'structured-output', 'generic']
- created
- 2026-06-30
- note
- Это паттерн, не конкретный промпт. Подставлять под задачу.