0Pricing
AI Prompt Engineering · บทเรียน

การสรุปแบบลำดับชั้น

การบีบอัดแบบค่อยเป็นค่อยไป: บท → ส่วน → สรุปเอกสาร

การสรุปแบบลำดับชั้น เป็นบทเรียน AI Prompt Engineering ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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

เปรียบเทียบแบบราบกับแบบลำดับชั้น

แมป-รีดิวซ์แบบราบเทียบกับการสรุปแบบลำดับชั้น:

  • แบบราบ: เรียบง่ายกว่า ไม่สนใจโครงสร้างเอกสาร และเหมาะกว่าสำหรับเอกสารที่มีรูปแบบสม่ำเสมอ (บทความข่าว)
  • แบบลำดับชั้น: เคารพโครงสร้าง ช่วยให้เจาะลึกได้ และให้ความต่อเนื่องที่ดีกว่าสำหรับเอกสารที่มีโครงสร้าง

ในทางปฏิบัติ ให้ใช้ทั้งสองแบบร่วมกัน: ใช้แมป-รีดิวซ์แบบราบภายในแต่ละบท (ซึ่งมีหลายหน้า) แล้วใช้การสรุปแบบลำดับชั้นระหว่างบท วิธีนี้เป็นแนวทางที่มีความทนทานที่สุดสำหรับเอกสารในโลกจริง

ตรวจสอบความรู้

ในการสรุปแบบลำดับชั้น กระบวนการสรุปดำเนินผ่านต้นไม้เอกสารในทิศทางใด?

สรุป: การสรุปแบบลำดับชั้น

การสรุปแบบลำดับชั้นเลียนแบบโครงสร้างเอกสารเพื่อให้ได้ผลลัพธ์ที่ดีกว่า:

  • จำลองเอกสารเป็นต้นไม้: หน้า → ส่วน → บท → เอกสาร
  • สรุปจากล่างขึ้นบน: เริ่มจากโหนดใบและจบที่ราก
  • แต่ละระดับใช้การบีบอัดแบบก้าวหน้าเพื่อรักษาความต่อเนื่อง
  • เหมาะที่สุดสำหรับหนังสือ บทความวิจัย และสัญญาทางกฎหมายที่มีโครงสร้างลำดับชั้นชัดเจน
  • จัดเก็บต้นไม้ทั้งหมดเพื่อให้รองรับการดึงข้อมูลแบบเจาะลึกและการอัปเดตแบบเพิ่มทีละส่วน

บทเรียนถัดไป: การรักษาบริบทข้ามชิ้นข้อความด้วยการซ้อนทับและบทสรุปสะสม

คำถามที่พบบ่อย

บทเรียน “การสรุปแบบลำดับชั้น” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การสรุปแบบลำดับชั้น” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Prompt Engineering ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Prompt Engineering มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การสรุปแบบลำดับชั้น”

การบีบอัดแบบค่อยเป็นค่อยไป: บท → ส่วน → สรุปเอกสาร คุณปฏิบัติ AI Prompt Engineering ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 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