0Pricing
AI Prompt Engineering · Урок

Иерархическое обобщение

Постепенно сжимайте содержание: главы → разделы → резюме документа

«Иерархическое обобщение» — бесплатный урок AI Prompt Engineering на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Prompt Engineering, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Prompt Engineering содержит 4 уроков всего.

Что такое иерархическая суммаризация

Иерархическая суммаризация отражает структуру самого документа. Вместо того чтобы обрабатывать все фрагменты одинаково, она сжимает содержимое уровень за уровнем:

  • Страницы → сводки разделов
  • Разделы → сводки глав
  • Главы → сводка документа

Каждый уровень представляет собой сжатое представление нижележащего уровня. Так люди суммируют книги: читают главы, формируют мысленные сводки, а затем объединяют их.

Когда использовать иерархическую суммаризацию

Иерархическая суммаризация подходит для:

  • книг: более 200 страниц с четкой структурой глав
  • научных статей: аннотация, введение, методы, результаты, обсуждение
  • юридических договоров: разделов с определенными заголовками (определения, обязательства, прекращение действия)
  • технических отчетов: резюме для руководства → результаты → приложения

Для коротких статей это избыточный подход. Он особенно эффективен, когда документ имеет естественную древовидную структуру.

Древовидная структура документа

Представьте документ в виде дерева:

  • Корень: итоговая сводка
  • Узлы уровня 1: сводки глав
  • Узлы уровня 2: сводки разделов
  • Листья: исходный текст страницы или фрагмента

Суммаризация выполняется снизу вверх: листья → уровень 2 → уровень 1 → корень. Сводка каждого узла строится только на основе сводок его дочерних узлов.

from dataclasses import dataclass, field
from typing import List, Optional

@dataclass
class DocNode:
    title: str
    content: str = ''
    summary: str = ''
    children: List['DocNode'] = field(default_factory=list)

# Example: book with 3 chapters, each with 3 sections
book = DocNode(
    title='My Book',
    children=[
        DocNode('Chapter 1', children=[
            DocNode('Section 1.1', content='...raw text...'),
            DocNode('Section 1.2', content='...raw text...'),
        ]),
        DocNode('Chapter 2', children=[
            DocNode('Section 2.1', content='...raw text...'),
        ])
    ]
)

Суммаризация снизу вверх

Обходите дерево снизу вверх. Сводки листовых узлов создаются на основе их исходного содержимого. Внутренние узлы суммируются на основе сводок их дочерних узлов.

import openai
client = openai.OpenAI(api_key='sk-...')

def summarize_text(text, role='section'):
    resp = client.chat.completions.create(
        model='gpt-4o',
        messages=[
            {'role': 'system',
             'content': f'Summarize this {role} in 3-5 sentences.'},
            {'role': 'user', 'content': text}
        ]
    )
    return resp.choices[0].message.content

def summarize_tree(node, depth=0):
    role = ['document', 'chapter', 'section', 'page'][min(depth, 3)]
    if not node.children:
        node.summary = summarize_text(node.content, role)
    else:
        for child in node.children:
            summarize_tree(child, depth + 1)
        combined = '\n\n'.join(
            f'{c.title}:\n{c.summary}' for c in node.children
        )
        node.summary = summarize_text(combined, role)
    return node.summary

Постепенное сжатие

Постепенное сжатие означает, что каждый уровень уменьшает плотность информации. Полезное практическое правило:

  • Страница (2000 токенов) → сводка раздела (200 токенов) — сжатие в 10 раз
  • Сводка раздела (200 токенов) → сводка главы (100 токенов) — сжатие в 2 раза
  • Сводки глав (5 × 100 токенов) → документ (150 токенов) — сжатие в 3 раза

Итого: документ из 10 000 токенов сжимается примерно до 150 токенов с сохранением основной мысли. В запросе для каждого уровня указывайте необходимость сохранять коэффициент сжатия.

PAGE_PROMPT = 'Summarize this page in 2-3 sentences (under 80 words).'
SECTION_PROMPT = 'Given these page summaries, write a section summary in 3-4 sentences (under 120 words).'
CHAPTER_PROMPT = 'Given these section summaries, write a chapter summary in 4-5 sentences (under 150 words).'
DOC_PROMPT = 'Given these chapter summaries, write an executive summary of the entire document (under 200 words).'

Сохранение связности между уровнями

Риск иерархической суммаризации состоит в том, что сводки одного уровня могут противоречить друг другу или повторяться, а эти ошибки накапливаются на верхних уровнях. Стратегии сохранения связности:

  • Включайте заголовок родительского раздела в запрос, чтобы модель понимала контекст
  • Просите модель не повторять факты, уже изложенные в предыдущих сводках разделов
  • На заключительном этапе сведения явно просите модель устранить все противоречия
def summarize_sections_for_chapter(chapter_title, section_summaries):
    content = '\n\n'.join(
        f'Section: {s["title"]}\n{s["summary"]}'
        for s in section_summaries
    )
    prompt = (
        f'Chapter: {chapter_title}\n\n'
        'Below are summaries of each section. '
        'Write a unified chapter summary without repeating '
        'the same facts from multiple sections.\n\n' + content
    )
    resp = client.chat.completions.create(
        model='gpt-4o',
        messages=[{'role': 'user', 'content': prompt}]
    )
    return resp.choices[0].message.content

Иерархия научной статьи

Научные статьи имеют естественную иерархию: Аннотация → Введение → Методы → Результаты → Обсуждение → Заключение. Каждый раздел выполняет свою роль, поэтому используйте запросы, предназначенные для конкретных разделов:

SECTION_PROMPTS = {
    'abstract': 'Summarize the paper abstract: what problem, method, and result?',
    'introduction': 'Summarize the introduction: what gap does the paper address?',
    'methods': 'Summarize the methods: what approach was used?',
    'results': 'Summarize the results: what were the key findings and metrics?',
    'discussion': 'Summarize the discussion: what do the results mean?',
    'conclusion': 'Summarize the conclusion and future work.'
}

def summarize_paper(sections_dict):
    section_summaries = {}
    for section, text in sections_dict.items():
        prompt = SECTION_PROMPTS.get(section, 'Summarize this section.')
        section_summaries[section] = call_llm(prompt, text)
    return section_summaries

Иерархия юридического договора

Юридические договоры следуют иерархии пунктов: определения → обязательства → средства правовой защиты → прекращение действия → применимое право. При иерархической суммаризации необходимо сохранять:

  • Точные числовые значения (суммы платежей, сроки)
  • Наименования сторон (клиент, поставщик, лицензиар)
  • Условные формулировки (если только, за исключением случаев, когда, при условии, что)

Просите модель отмечать каждый пункт с числовым значением или условием, который она суммирует, чтобы он случайно не был пропущен.

LEGAL_PROMPT = '''Summarize this contract clause in plain English.
Preserve: all monetary amounts, dates, party names, and conditionals.
Flag any obligation with [OBLIGATION] and any amount with [AMOUNT].'''

def summarize_clause(clause_text):
    resp = client.chat.completions.create(
        model='gpt-4o',
        messages=[
            {'role': 'system', 'content': LEGAL_PROMPT},
            {'role': 'user', 'content': clause_text}
        ]
    )
    return resp.choices[0].message.content

Хранение иерархических сводок

Сохраняйте всё дерево сводок, а не только сводку корня. Это позволяет:

  • Переходить к деталям — по запросу показывать сводку главы, а затем сводку раздела
  • Выполнять поиск — сопоставлять запрос пользователя со сводками разделов, а не только со всем документом
  • Обновлять — при изменении одного раздела пересуммировать только соответствующую ветвь дерева
import json

def tree_to_dict(node):
    return {
        'title': node.title,
        'summary': node.summary,
        'children': [tree_to_dict(c) for c in node.children]
    }

def save_tree(node, path):
    with open(path, 'w') as f:
        json.dump(tree_to_dict(node), f, indent=2)
    print(f'Saved summary tree to {path}')

Инкрементальные обновления

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

Для книги из 10 глав, в которой была изменена глава 3: пересуммируйте разделы главы 3, затем главу 3, а затем книгу. Пересчитайте 3 узла вместо всех узлов.

def update_node(node, updated_child_title):
    # Re-summarize the changed child
    for child in node.children:
        if child.title == updated_child_title:
            summarize_tree(child)  # re-summarize from leaves
            break
    # Re-summarize current node from updated children
    combined = '\n\n'.join(
        f'{c.title}:\n{c.summary}' for c in node.children
    )
    node.summary = summarize_text(combined)
    return node.summary

Сравнение плоского и иерархического подходов

Плоская суммаризация MapReduce и иерархическая суммаризация:

  • Плоская: проще, игнорирует структуру документа, лучше подходит для однородных документов (новостных статей)
  • Иерархическая: учитывает структуру, позволяет переходить к деталям, обеспечивает лучшую связность структурированных документов

На практике объединяйте оба подхода: используйте плоский MapReduce внутри каждой главы (для множества страниц), а затем применяйте иерархический подход между главами. Это наиболее надежный подход для документов из реальной практики.

Проверка знаний

В каком направлении выполняется суммаризация по дереву документа при иерархической суммаризации?

Повторение: иерархическая суммаризация

Иерархическая суммаризация отражает структуру документа и обеспечивает более высокое качество результатов:

  • Представляйте документ в виде дерева: страницы → разделы → главы → документ
  • Суммируйте снизу вверх: сначала листья, в последнюю очередь корень
  • На каждом уровне применяйте постепенное сжатие, чтобы сохранять связность
  • Лучше всего подходит для книг, научных статей и юридических договоров с четкой иерархической структурой
  • Сохраняйте всё дерево, чтобы обеспечить поиск с переходом к деталям и инкрементальные обновления

Следующий урок: сохранение контекста между фрагментами с помощью перекрытия и накопительных сводок.

Часто задаваемые вопросы

Урок «Иерархическое обобщение» бесплатный?

Да — полный текст урока «Иерархическое обобщение» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Prompt Engineering, подпишись на CoddyKit PRO. Курс AI Prompt Engineering содержит 4 уроков всего.

Чему я научусь в уроке «Иерархическое обобщение»?

Постепенно сжимайте содержание: главы → разделы → резюме документа Ты практикуешь AI Prompt Engineering с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать AI Prompt Engineering?

Предыдущий опыт не требуется. AI Prompt Engineering на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Иерархическое обобщение»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке AI Prompt Engineering?

Да. Каждый урок AI Prompt Engineering включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Стратегии разбиения длинных текстов
  2. Шаблон обобщения Map-Reduce
  3. Иерархическое обобщение
  4. Сохранение контекста между блоками
← Назад к AI Prompt Engineering