Иерархическое обобщение
Постепенно сжимайте содержание: главы → разделы → резюме документа
«Иерархическое обобщение» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Стратегии разбиения длинных текстов
- Шаблон обобщения Map-Reduce
- Иерархическое обобщение
- Сохранение контекста между блоками