Kunjungi panduan peringkasan kami untuk melihat contoh implementasi peringkasan dokumen hukum menggunakan Claude.

Sebelum membangun dengan Claude

Tentukan apakah menggunakan Claude untuk peringkasan dokumen hukum

Berikut adalah beberapa indikator kunci bahwa Anda sebaiknya menggunakan LLM seperti Claude untuk meringkas dokumen hukum:

Tentukan detail yang ingin Anda ekstrak dari peringkasan

Tidak ada ringkasan tunggal yang benar untuk setiap dokumen. Tanpa arahan yang jelas, Claude mungkin kesulitan menentukan detail mana yang harus disertakan. Untuk mencapai hasil optimal, identifikasi informasi spesifik yang ingin Anda sertakan dalam ringkasan.

Misalnya, saat meringkas perjanjian sewa-menyewa, Anda mungkin ingin mengekstrak poin-poin kunci berikut:

details_to_extract = [
    'Pihak yang terlibat (pemberi sewa, penyewa, dan pemberi sewa asli)',
    'Detail properti (alamat, deskripsi, dan penggunaan yang diizinkan)', 
    'Jangka waktu dan sewa (tanggal mulai, tanggal berakhir, sewa bulanan, dan uang jaminan)',
    'Tanggung jawab (utilitas, pemeliharaan, dan perbaikan)',
    'Persetujuan dan pemberitahuan (persetujuan pemilik, dan persyaratan pemberitahuan)',
    'Ketentuan khusus (furnitur, parkir, dan pembatasan penyewaan kembali)'
]

Tetapkan kriteria keberhasilan

Mengevaluasi kualitas ringkasan adalah tugas yang terkenal menantang. Tidak seperti banyak tugas pemrosesan bahasa alami lainnya, evaluasi ringkasan sering kali tidak memiliki metrik objektif yang jelas. Prosesnya bisa sangat subjektif, dengan pembaca yang berbeda menghargai aspek yang berbeda dari sebuah ringkasan. Berikut adalah kriteria yang mungkin ingin Anda pertimbangkan saat menilai seberapa baik Claude melakukan peringkasan hukum.

Lihat panduan kami tentang menetapkan kriteria keberhasilan untuk informasi lebih lanjut.


Cara meringkas dokumen hukum menggunakan Claude

Pilih model Claude yang tepat

Akurasi model sangat penting saat meringkas dokumen hukum. Claude 3.5 Sonnet adalah pilihan yang sangat baik untuk kasus penggunaan seperti ini di mana akurasi tinggi diperlukan. Jika ukuran dan kuantitas dokumen Anda besar sehingga biaya mulai menjadi perhatian, Anda juga dapat mencoba menggunakan model yang lebih kecil seperti Claude 3 Haiku.

Untuk membantu memperkirakan biaya ini, di bawah ini adalah perbandingan biaya untuk meringkas 1.000 perjanjian sewa-menyewa menggunakan Sonnet dan Haiku:

  • Ukuran konten

    • Jumlah perjanjian: 1.000
    • Karakter per perjanjian: 300.000
    • Total karakter: 300M
  • Perkiraan token

    • Token input: 86M (dengan asumsi 1 token per 3,5 karakter)
    • Token output per ringkasan: 350
    • Total token output: 350.000
  • Perkiraan biaya Claude 3.7 Sonnet

    • Biaya token input: 86 MTok * 3,00/MTok=3,00/MTok = 258
    • Biaya token output: 0,35 MTok * 15,00/MTok=15,00/MTok = 5,25
    • Total biaya: 258,00+258,00 + 5,25 = $263,25
  • Perkiraan biaya Claude 3 Haiku

    • Biaya token input: 86 MTok * 0,25/MTok=0,25/MTok = 21,50
    • Biaya token output: 0,35 MTok * 1,25/MTok=1,25/MTok = 0,44
    • Total biaya: 21,50+21,50 + 0,44 = $21,96
Biaya aktual mungkin berbeda dari perkiraan ini. Perkiraan ini didasarkan pada contoh yang disorot dalam bagian tentang prompting.

Ubah dokumen menjadi format yang dapat diproses Claude

Sebelum Anda mulai meringkas dokumen, Anda perlu menyiapkan data Anda. Ini melibatkan ekstraksi teks dari PDF, membersihkan teks, dan memastikan teks siap untuk diproses oleh Claude.

Berikut adalah demonstrasi proses ini pada contoh pdf:

from io import BytesIO
import re

import pypdf
import requests

def get_llm_text(pdf_file):
    reader = pypdf.PdfReader(pdf_file)
    text = "\n".join([page.extract_text() for page in reader.pages])

    # Hapus spasi berlebih
    text = re.sub(r'\s+', ' ', text) 

    # Hapus nomor halaman
    text = re.sub(r'\n\s*\d+\s*\n', '\n', text) 

    return text


# Buat URL lengkap dari repositori GitHub
url = "https://raw.githubusercontent.com/anthropics/anthropic-cookbook/main/skills/summarization/data/Sample Sublease Agreement.pdf"
url = url.replace(" ", "%20")

# Unduh file PDF ke memori
response = requests.get(url)

# Muat PDF dari memori
pdf_file = BytesIO(response.content)

document_text = get_llm_text(pdf_file) 
print(document_text[:50000]) 

Dalam contoh ini, pertama-tama kita mengunduh pdf dari contoh perjanjian sewa-menyewa yang digunakan dalam panduan peringkasan. Perjanjian ini bersumber dari perjanjian sewa-menyewa yang tersedia untuk publik dari situs web sec.gov.

Kita menggunakan library pypdf untuk mengekstrak isi pdf dan mengubahnya menjadi teks. Data teks kemudian dibersihkan dengan menghapus spasi berlebih dan nomor halaman.

Bangun prompt yang kuat

Claude dapat beradaptasi dengan berbagai gaya peringkasan. Anda dapat mengubah detail prompt untuk mengarahkan Claude agar lebih atau kurang bertele-tele, menyertakan lebih banyak atau sedikit terminologi teknis, atau memberikan ringkasan konteks pada tingkat yang lebih tinggi atau lebih rendah.

Berikut adalah contoh cara membuat prompt yang memastikan ringkasan yang dihasilkan mengikuti struktur yang konsisten saat menganalisis perjanjian sewa-menyewa:

import anthropic

# Inisialisasi klien Anthropic
client = anthropic.Anthropic()

def summarize_document(text, details_to_extract, model="claude-3-7-sonnet-20250219", max_tokens=1000):

    # Format detail yang akan diekstrak untuk ditempatkan dalam konteks prompt
    details_to_extract_str = '\n'.join(details_to_extract)
    
    # Prompt model untuk meringkas perjanjian sewa-menyewa
    prompt = f"""Ringkas perjanjian sewa-menyewa berikut. Fokus pada aspek-aspek kunci ini:

    {details_to_extract_str}

    Berikan ringkasan dalam poin-poin yang tersarang dalam header XML untuk setiap bagian. Contoh:

    <pihak yang terlibat>
    - Pemberi sewa: [Nama]
    // Tambahkan detail lain sesuai kebutuhan
    </pihak yang terlibat>
    
    Jika ada informasi yang tidak dinyatakan secara eksplisit dalam dokumen, catat sebagai "Tidak ditentukan". Jangan memberi pembukaan.

    Teks perjanjian sewa-menyewa:
    {text}
    """

    response = client.messages.create(
        model=model,
        max_tokens=max_tokens,
        system="Anda adalah analis hukum yang mengkhususkan diri dalam hukum real estat, dikenal karena ringkasan yang sangat akurat dan detail tentang perjanjian sewa-menyewa.",
        messages=[
            {"role": "user", "content": prompt},
            {"role": "assistant", "content": "Berikut adalah ringkasan perjanjian sewa-menyewa: <summary>"}
        ],
        stop_sequences=["</summary>"]
    )

    return response.content[0].text

sublease_summary = summarize_document(document_text, details_to_extract)
print(sublease_summary)

Kode ini mengimplementasikan fungsi summarize_document yang menggunakan Claude untuk meringkas isi perjanjian sewa-menyewa. Fungsi ini menerima string teks dan daftar detail yang akan diekstrak sebagai input. Dalam contoh ini, kita memanggil fungsi dengan variabel document_text dan details_to_extract yang telah didefinisikan dalam cuplikan kode sebelumnya.

Di dalam fungsi, prompt dibuat untuk Claude, termasuk dokumen yang akan diringkas, detail yang akan diekstrak, dan instruksi spesifik untuk meringkas dokumen. Prompt menginstruksikan Claude untuk merespons dengan ringkasan setiap detail yang akan diekstrak yang tersarang dalam header XML.

Karena kita memutuskan untuk mengeluarkan setiap bagian ringkasan dalam tag, setiap bagian dapat dengan mudah diuraikan sebagai langkah pasca-pemrosesan. Pendekatan ini memungkinkan ringkasan terstruktur yang dapat disesuaikan dengan kasus penggunaan Anda, sehingga setiap ringkasan mengikuti pola yang sama.

Evaluasi prompt Anda

Prompting sering memerlukan pengujian dan optimasi agar siap untuk produksi. Untuk menentukan kesiapan solusi Anda, evaluasi kualitas ringkasan Anda menggunakan proses sistematis yang menggabungkan metode kuantitatif dan kualitatif. Membuat evaluasi empiris yang kuat berdasarkan kriteria keberhasilan yang telah Anda tetapkan akan memungkinkan Anda mengoptimalkan prompt Anda. Berikut adalah beberapa metrik yang mungkin ingin Anda sertakan dalam evaluasi empiris Anda:

Terapkan prompt Anda

Berikut adalah beberapa pertimbangan tambahan yang perlu diingat saat Anda menerapkan solusi Anda ke produksi.

  1. Pastikan tidak ada kewajiban hukum: Pahami implikasi hukum dari kesalahan dalam ringkasan, yang dapat menyebabkan kewajiban hukum bagi organisasi atau klien Anda. Berikan disclaimer atau pemberitahuan hukum yang menjelaskan bahwa ringkasan dihasilkan oleh AI dan harus ditinjau oleh profesional hukum.

  2. Tangani berbagai jenis dokumen: Dalam panduan ini, kita telah membahas cara mengekstrak teks dari PDF. Dalam dunia nyata, dokumen mungkin datang dalam berbagai format (PDF, dokumen Word, file teks, dll.). Pastikan pipeline ekstraksi data Anda dapat mengkonversi semua format file yang Anda harapkan untuk diterima.

  3. Paralelkan panggilan API ke Claude: Dokumen panjang dengan jumlah token yang besar mungkin memerlukan waktu hingga satu menit agar Claude menghasilkan ringkasan. Untuk koleksi dokumen besar, Anda mungkin ingin mengirim panggilan API ke Claude secara paralel sehingga ringkasan dapat diselesaikan dalam waktu yang wajar. Lihat batas rate Anthropic untuk menentukan jumlah maksimum panggilan API yang dapat dilakukan secara paralel.


Tingkatkan kinerja

Dalam skenario yang kompleks, mungkin membantu untuk mempertimbangkan strategi tambahan untuk meningkatkan kinerja di luar teknik prompt engineering standar. Berikut adalah beberapa strategi lanjutan:

Lakukan meta-peringkasan untuk meringkas dokumen panjang

Peringkasan hukum sering melibatkan penanganan dokumen panjang atau banyak dokumen terkait sekaligus, sehingga Anda melampaui jendela konteks Claude. Anda dapat menggunakan metode chunking yang dikenal sebagai meta-peringkasan untuk menangani kasus penggunaan ini. Teknik ini melibatkan pemecahan dokumen menjadi potongan-potongan yang lebih kecil dan dapat dikelola dan kemudian memproses setiap potongan secara terpisah. Anda kemudian dapat menggabungkan ringkasan dari setiap potongan untuk membuat meta-ringkasan dari seluruh dokumen.

Berikut adalah contoh cara melakukan meta-peringkasan:

import anthropic

# Inisialisasi klien Anthropic
client = anthropic.Anthropic()

def chunk_text(text, chunk_size=20000):
    return [text[i:i+chunk_size] for i in range(0, len(text), chunk_size)]

def summarize_long_document(text, details_to_extract, model="claude-3-7-sonnet-20250219", max_tokens=1000):

    # Format detail yang akan diekstrak untuk ditempatkan dalam konteks prompt
    details_to_extract_str = '\n'.join(details_to_extract)

    # Iterasi melalui potongan dan ringkas masing-masing
    chunk_summaries = [summarize_document(chunk, details_to_extract, model=model, max_tokens=max_tokens) for chunk in chunk_text(text)]
    
    final_summary_prompt = f"""
    
    Anda sedang melihat ringkasan potongan dari beberapa dokumen yang semuanya terkait. 
    Gabungkan ringkasan berikut dari dokumen dari berbagai sumber yang benar menjadi ringkasan keseluruhan yang koheren:

    <chunked_summaries>
    {"".join(chunk_summaries)}
    </chunked_summaries>

    Fokus pada aspek-aspek kunci ini:
    {details_to_extract_str})

    Berikan ringkasan dalam poin-poin yang tersarang dalam header XML untuk setiap bagian. Contoh:

    <pihak yang terlibat>
    - Pemberi sewa: [Nama]
    // Tambahkan detail lain sesuai kebutuhan
    </pihak yang terlibat>
    
    Jika ada informasi yang tidak dinyatakan secara eksplisit dalam dokumen, catat sebagai "Tidak ditentukan". Jangan memberi pembukaan.
    """

    response = client.messages.create(
        model=model,
        max_tokens=max_tokens,
        system="Anda adalah ahli hukum yang meringkas catatan pada satu dokumen.",
        messages=[
            {"role": "user",  "content": final_summary_prompt},
            {"role": "assistant", "content": "Berikut adalah ringkasan perjanjian sewa-menyewa: <summary>"}

        ],
        stop_sequences=["</summary>"]
    )
    
    return response.content[0].text

long_summary = summarize_long_document(document_text, details_to_extract)
print(long_summary)

Fungsi summarize_long_document dibangun berdasarkan fungsi summarize_document sebelumnya dengan memecah dokumen menjadi potongan-potongan yang lebih kecil dan meringkas setiap potongan secara individual.

Kode ini mencapai hal tersebut dengan menerapkan fungsi summarize_document ke setiap potongan 20.000 karakter dalam dokumen asli. Ringkasan individual kemudian digabungkan, dan ringkasan akhir dibuat dari ringkasan-ringkasan potongan ini.

Perhatikan bahwa fungsi summarize_long_document tidak benar-benar diperlukan untuk contoh pdf kita, karena seluruh dokumen masih dalam jendela konteks Claude. Namun, ini menjadi penting untuk dokumen yang melebihi jendela konteks Claude atau saat meringkas beberapa dokumen terkait bersama-sama. Terlepas dari itu, teknik meta-peringkasan ini sering menangkap detail penting tambahan dalam ringkasan akhir yang terlewatkan dalam pendekatan ringkasan tunggal sebelumnya.

Gunakan dokumen terindeks ringkasan untuk mengeksplorasi koleksi dokumen besar

Mencari koleksi dokumen dengan LLM biasanya melibatkan retrieval-augmented generation (RAG). Namun, dalam skenario yang melibatkan dokumen besar atau ketika pengambilan informasi yang tepat sangat penting, pendekatan RAG dasar mungkin tidak cukup. Dokumen terindeks ringkasan adalah pendekatan RAG lanjutan yang menyediakan cara yang lebih efisien untuk mengurutkan dokumen untuk pengambilan, menggunakan konteks yang lebih sedikit daripada metode RAG tradisional. Dalam pendekatan ini, Anda pertama-tama menggunakan Claude untuk menghasilkan ringkasan ringkas untuk setiap dokumen dalam korpus Anda, dan kemudian menggunakan Clade untuk mengurutkan relevansi setiap ringkasan dengan pertanyaan yang diajukan. Untuk detail lebih lanjut tentang pendekatan ini, termasuk contoh berbasis kode, lihat bagian dokumen terindeks ringkasan dalam panduan peringkasan.

Fine-tune Claude untuk belajar dari dataset Anda

Teknik lanjutan lainnya untuk meningkatkan kemampuan Claude dalam menghasilkan ringkasan adalah fine-tuning. Fine-tuning melibatkan pelatihan Claude pada dataset kustom yang secara khusus selaras dengan kebutuhan peringkasan hukum Anda, memastikan bahwa Claude beradaptasi dengan kasus penggunaan Anda. Berikut adalah gambaran umum tentang cara melakukan fine-tuning:

  1. Identifikasi kesalahan: Mulai dengan mengumpulkan contoh di mana ringkasan Claude kurang baik - ini bisa termasuk kehilangan detail hukum penting, salah memahami konteks, atau menggunakan terminologi hukum yang tidak tepat.

  2. Kurasi dataset: Setelah Anda mengidentifikasi masalah-masalah ini, susun dataset dari contoh-contoh bermasalah ini. Dataset ini harus mencakup dokumen hukum asli bersama dengan ringkasan yang telah Anda perbaiki, memastikan bahwa Claude mempelajari perilaku yang diinginkan.

  3. Lakukan fine-tuning: Fine-tuning melibatkan pelatihan ulang model pada dataset yang telah Anda kurasi untuk menyesuaikan bobot dan parameternya. Pelatihan ulang ini membantu Claude lebih memahami persyaratan spesifik domain hukum Anda, meningkatkan kemampuannya untuk meringkas dokumen sesuai dengan standar Anda.

  4. Perbaikan iteratif: Fine-tuning bukan proses satu kali. Saat Claude terus menghasilkan ringkasan, Anda dapat secara iteratif menambahkan contoh baru di mana kinerjanya kurang baik, lebih menyempurnakan kemampuannya. Seiring waktu, loop umpan balik yang berkelanjutan ini akan menghasilkan model yang sangat khusus untuk tugas peringkasan hukum Anda.

Fine-tuning saat ini hanya tersedia melalui Amazon Bedrock. Detail tambahan tersedia di blog peluncuran AWS.