UpPetto

This is a real course generated by UpPetto — unedited.

AI-generated · source-grounded review: written by two AI models, cross-checked by a third. Yours takes ~5 minutes.

Create my own course

Анализ и извлечение структурированных данных

Pareto core

Извлечение структурированных данных из текста

Одна из самых практичных задач для LLM — превращение неструктурированного текста в структурированные данные для интеграции с другими системами (CRM, базы данных, аналитические дашборды). Ключ к успеху — чёткое определение схемы вывода и валидация результатов.

Извлечение сущностей с гарантированным форматом

Для интеграции с базами данных или API критически важен предсказуемый формат вывода:

# Системный промпт для извлечения данных
system_prompt = """
Ты — система извлечения структурированных данных из текста.

ЗАДАЧА: извлечь информацию и вернуть ТОЛЬКО валидный JSON.

СХЕМА ВЫВОДА:
{
  "entities": [
    {
      "type": "person" | "organization" | "location" | "date",
      "value": "string",
      "confidence": 0.0-1.0
    }
  ],
  "sentiment": "positive" | "negative" | "neutral",
  "key_topics": ["string"],
  "summary": "string (max 100 chars)"
}

ПРАВИЛА:
- Если информация не найдена, возвращай пустой массив
- Confidence < 0.7 для неоднозначных случаев
- Строго следуй схеме, не добавляй поля
"""

# Валидация схемы
from jsonschema import validate, ValidationError

output_schema = {
    "type": "object",
    "required": ["entities", "sentiment", "key_topics", "summary"],
    "properties": {
        "entities": {
            "type": "array",
            "items": {
                "type": "object",
                "required": ["type", "value", "confidence"],
                "properties": {
                    "type": {"enum": ["person", "organization", "location", "date"]},
                    "value": {"type": "string"},
                    "confidence": {"type": "number", "minimum": 0, "maximum": 1}
                }
            }
        },
        "sentiment": {"enum": ["positive", "negative", "neutral"]},
        "key_topics": {"type": "array", "items": {"type": "string"}},
        "summary": {"type": "string", "maxLength": 100}
    }
}

def extract_structured_data(text):
    response = llm.generate(
        system=system_prompt,
        user=user_prompt.format(text=text),
        temperature=0.1  # Минимальная для детерминированности
    )

    try:
        data = json.loads(response)
        validate(instance=data, schema=output_schema)
        return {'success': True, 'data': data}
    except (json.JSONDecodeError, ValidationError) as e:
        # Retry с более строгим промптом
        return retry_with_correction(text, error=str(e))

Sentiment Analysis и категоризация

Анализ тональности и категоризация особенно полезны для обработки customer feedback:

# Многоуровневая категоризация отзывов
system_prompt = """
Ты — система анализа отзывов клиентов.

Проанализируй отзыв и верни JSON:

{
  "sentiment": {
    "overall": "positive" | "negative" | "neutral" | "mixed",
    "score": -1.0 to 1.0,
    "confidence": 0.0 to 1.0
  },
  "categories": [
    {
      "category": "product_quality" | "delivery" | "customer_service" | "price" | "other",
      "sentiment": "positive" | "negative" | "neutral",
      "mentions": ["цитата из текста"]
    }
  ],
  "priority": "high" | "medium" | "low",
  "requires_response": boolean,
  "suggested_action": "string или null"
}

ЛОГИКА PRIORITY:
- high: негативный отзыв + упоминание конкретной проблемы
- medium: смешанный отзыв или нейтральный с вопросами
- low: позитивный отзыв без запросов

REQUIRES_RESPONSE = true если:
- Есть вопрос
- Негативный sentiment
- Упоминание проблемы
"""

def analyze_feedback(feedback_text):
    response = llm.generate(
        system=system_prompt,
        user=f"Отзыв: {feedback_text}",
        temperature=0.2
    )

    analysis = json.loads(response)

    # Автоматическая маршрутизация
    if analysis['priority'] == 'high':
        notify_support_team(analysis)

    if analysis['requires_response']:
        draft_response = generate_response_draft(feedback_text, analysis)
        analysis['response_draft'] = draft_response

    return analysis

Суммаризация с сохранением ключевой информации

Для длинных документов важна не просто краткость, а сохранение критических деталей:

# Многоуровневая суммаризация
system_prompt = """
Ты — система суммаризации документов.

Создай три уровня summary:

{
  "executive_summary": "1-2 предложения, главная суть",
  "key_points": [
    "bullet point 1",
    "bullet point 2",
    ...
  ],
  "detailed_summary": "2-3 параграфа с важными деталями",
  "action_items": [
    {
      "action": "что нужно сделать",
      "priority": "high" | "medium" | "low",
      "deadline": "если указан в тексте или null"
    }
  ],
  "key_metrics": {
    "metric_name": "value"
  }
}

ПРАВИЛА:
- Executive summary: только главное решение/вывод
- Key points: 3-7 пунктов, конкретные факты
- Detailed summary: контекст и детали
- Action items: только явные задачи из текста
- Key metrics: только числовые данные
"""

def summarize_document(document, summary_type='all'):
    response = llm.generate(
        system=system_prompt,
        user=f"Документ:\n\n{document}",
        temperature=0.2
    )

    summary = json.loads(response)

    # Возврат нужного уровня детализации
    if summary_type == 'executive':
        return summary['executive_summary']
    elif summary_type == 'brief':
        return {
            'summary': summary['executive_summary'],
            'key_points': summary['key_points']
        }
    else:
        return summary

Обеспечение консистентности формата

Для надёжной интеграции используйте несколько уровней защиты:

1. Строгая схема в промпте:

# Включите JSON schema прямо в системный промпт
system_prompt = f"""
Верни ТОЛЬКО валидный JSON следующей структуры:

{json.dumps(output_schema, indent=2)}

Не добавляй пояснений, только JSON.
"""

2. Валидация и retry логика:

def extract_with_retry(text, max_retries=3):
    for attempt in range(max_retries):
        try:
            response = llm.generate(system=system_prompt, user=text, temperature=0.1)

            # Очистка от markdown форматирования
            cleaned = response.strip()
            if cleaned.startswith('```json'):
                cleaned = cleaned[7:]
            if cleaned.endswith('```'):
                cleaned = cleaned[:-3]

            data = json.loads(cleaned)
            validate(instance=data, schema=output_schema)

            return {'success': True, 'data': data}

        except Exception as e:
            if attempt == max_retries - 1:
                return {'success': False, 'error': str(e), 'raw_response': response}

            # Корректирующий промпт
            system_prompt_retry = system_prompt + f"\n\nПредыдущая попытка вызвала ошибку: {e}\nИсправь и верни корректный JSON."

3. Fallback стратегии:

def extract_with_fallback(text):
    # Попытка 1: полная схема
    result = extract_structured_data(text)

    if result['success']:
        return result

    # Попытка 2: упрощённая схема
    result = extract_simplified_data(text)

    if result['success']:
        return enrich_with_defaults(result['data'])

    # Fallback: базовое извлечение
    return {
        'success': True,
        'data': extract_basic_info(text),
        'warning': 'Used fallback extraction'
    }

Ключевые принципы

Для надёжного извлечения данных:

  1. Определяйте JSON schema явно — включайте её в системный промпт
  2. Используйте минимальную temperature (0.1-0.2) для детерминированности
  3. Валидируйте каждый ответ — не доверяйте формату вслепую
  4. Реализуйте retry логику — с корректирующими промптами при ошибках
  5. Создавайте fallback стратегии — для случаев, когда полное извлечение невозможно
  6. Тестируйте на edge cases — пустые поля, неоднозначные данные, нестандартные форматы
  7. Логируйте проблемные случаи — для последующей оптимизации промптов

Структурированное извлечение данных превращает LLM в надёжный компонент data pipeline, а не просто в инструмент для экспериментов.

AI-generated · source-grounded review

🛡 Fact-checked: 2 risky claims verified · 0 removed · confidence: high
[verified] Temperature 0.1-0.2 оптимальна для извлечения структурированных данных
Соответствует знаниям о параметрах для детерминированных задач
[verified] JSON schema валидация необходима для интеграции
Соответствует принципам структурированного вывода из knowledge base

A second opinion has not checked this lesson.

Key concepts: Извлечение данных Анализ текста Структурированный вывод Интеграция
Tell me more 🔒 Didn't understand — explain simply 🔒 Show examples 🔒 Sources 🔒

On your own course these buttons answer instantly, quizzes track what you've mastered, and lessons adapt to your gaps. Sign up free →

Check yourself

1. Какое значение temperature оптимально для извлечения структурированных данных с предсказуемым форматом?
2. Что необходимо для надёжной интеграции LLM с другими системами при извлечении данных?
3. Для какой задачи sentiment analysis наиболее полезен в бизнес-контексте?
Sign up free to check your answers