Visita il nostro manuale di sintesi per vedere un esempio di implementazione di sintesi legale utilizzando Claude.

Prima di costruire con Claude

Decidi se utilizzare Claude per la sintesi legale

Ecco alcuni indicatori chiave che suggeriscono di utilizzare un LLM come Claude per riassumere documenti legali:

Determina i dettagli che vuoi che la sintesi estragga

Non esiste un unico riassunto corretto per qualsiasi documento. Senza una chiara direzione, può essere difficile per Claude determinare quali dettagli includere. Per ottenere risultati ottimali, identifica le informazioni specifiche che vuoi includere nel riassunto.

Per esempio, quando riassumi un contratto di sublocazione, potresti voler estrarre i seguenti punti chiave:

details_to_extract = [
    'Parti coinvolte (sublocatore, subconduttore e locatore originale)',
    'Dettagli della proprietà (indirizzo, descrizione e uso consentito)',
    'Durata e canone (data di inizio, data di fine, canone mensile e deposito cauzionale)',
    'Responsabilità (utenze, manutenzione e riparazioni)',
    'Consenso e comunicazioni (consenso del proprietario e requisiti di notifica)',
    'Disposizioni speciali (mobili, parcheggio e restrizioni alla sublocazione)'
]

Stabilisci i criteri di successo

Valutare la qualità dei riassunti è un compito notoriamente difficile. A differenza di molti altri compiti di elaborazione del linguaggio naturale, la valutazione dei riassunti spesso manca di metriche chiare e oggettive. Il processo può essere altamente soggettivo, con diversi lettori che valorizzano diversi aspetti di un riassunto. Ecco i criteri che potresti voler considerare quando valuti quanto bene Claude esegue la sintesi legale.

Consulta la nostra guida su stabilire i criteri di successo per maggiori informazioni.


Come riassumere documenti legali usando Claude

Seleziona il modello Claude appropriato

La precisione del modello è estremamente importante quando si riassumono documenti legali. Claude 3.5 Sonnet è un’eccellente scelta per casi d’uso come questo dove è richiesta un’alta precisione. Se la dimensione e la quantità dei tuoi documenti è grande al punto che i costi iniziano a diventare una preoccupazione, puoi anche provare a usare un modello più piccolo come Claude 3 Haiku.

Per aiutare a stimare questi costi, di seguito è riportato un confronto del costo per riassumere 1.000 contratti di sublocazione usando sia Sonnet che Haiku:

  • Dimensione del contenuto

    • Numero di contratti: 1.000
    • Caratteri per contratto: 300.000
    • Totale caratteri: 300M
  • Token stimati

    • Token di input: 86M (assumendo 1 token ogni 3,5 caratteri)
    • Token di output per riassunto: 350
    • Totale token di output: 350.000
  • Costo stimato Claude 3.7 Sonnet

    • Costo token di input: 86 MTok * 3.00/MTok=3.00/MTok = 258
    • Costo token di output: 0.35 MTok * 15.00/MTok=15.00/MTok = 5.25
    • Costo totale: 258.00+258.00 + 5.25 = $263.25
  • Costo stimato Claude 3 Haiku

    • Costo token di input: 86 MTok * 0.25/MTok=0.25/MTok = 21.50
    • Costo token di output: 0.35 MTok * 1.25/MTok=1.25/MTok = 0.44
    • Costo totale: 21.50+21.50 + 0.44 = $21.96
I costi effettivi potrebbero differire da queste stime. Queste stime sono basate sull’esempio evidenziato nella sezione sul prompting.

Trasforma i documenti in un formato che Claude può elaborare

Prima di iniziare a riassumere i documenti, devi preparare i tuoi dati. Questo comporta l’estrazione del testo dai PDF, la pulizia del testo e assicurarsi che sia pronto per essere elaborato da Claude.

Ecco una dimostrazione di questo processo su un PDF di esempio:

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])

    # Rimuove spazi bianchi extra
    text = re.sub(r'\s+', ' ', text) 

    # Rimuove numeri di pagina
    text = re.sub(r'\n\s*\d+\s*\n', '\n', text) 

    return text


# Crea l'URL completo dal repository GitHub
url = "https://raw.githubusercontent.com/anthropics/anthropic-cookbook/main/skills/summarization/data/Sample Sublease Agreement.pdf"
url = url.replace(" ", "%20")

# Scarica il file PDF in memoria
response = requests.get(url)

# Carica il PDF dalla memoria
pdf_file = BytesIO(response.content)

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

In questo esempio, prima scarichiamo un PDF di un contratto di sublocazione di esempio utilizzato nel manuale di sintesi. Questo contratto è stato preso da un contratto di sublocazione pubblicamente disponibile dal sito web sec.gov.

Usiamo la libreria pypdf per estrarre i contenuti del PDF e convertirli in testo. I dati di testo vengono poi puliti rimuovendo spazi bianchi extra e numeri di pagina.

Costruire un prompt efficace

Claude può adattarsi a vari stili di sintesi. Puoi modificare i dettagli del prompt per guidare Claude ad essere più o meno verboso, includere più o meno terminologia tecnica, o fornire un riassunto del contesto di livello più alto o più basso.

Ecco un esempio di come creare un prompt che assicuri che i riassunti generati seguano una struttura coerente quando si analizzano i contratti di sublocazione:

import anthropic

# Inizializza il client Anthropic
client = anthropic.Anthropic()

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

    # Formatta i dettagli da estrarre da inserire nel contesto del prompt
    details_to_extract_str = '\n'.join(details_to_extract)
    
    # Chiede al modello di riassumere il contratto di sublocazione
    prompt = f"""Riassumi il seguente contratto di sublocazione. Concentrati su questi aspetti chiave:

    {details_to_extract_str}

    Fornisci il riassunto in punti elenco annidati all'interno dell'intestazione XML per ogni sezione. Per esempio:

    <parti coinvolte>
    - Sublocatore: [Nome]
    // Aggiungi più dettagli secondo necessità
    </parti coinvolte>
    
    Se alcune informazioni non sono esplicitamente indicate nel documento, segnalale come "Non specificato". Non fare preamboli.

    Testo del contratto di sublocazione:
    {text}
    """

    response = client.messages.create(
        model=model,
        max_tokens=max_tokens,
        system="Sei un analista legale specializzato in diritto immobiliare, noto per riassunti altamente accurati e dettagliati dei contratti di sublocazione.",
        messages=[
            {"role": "user", "content": prompt},
            {"role": "assistant", "content": "Ecco il riassunto del contratto di sublocazione: <summary>"}
        ],
        stop_sequences=["</summary>"]
    )

    return response.content[0].text

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

Questo codice implementa una funzione summarize_document che usa Claude per riassumere i contenuti di un contratto di sublocazione. La funzione accetta una stringa di testo e una lista di dettagli da estrarre come input. In questo esempio, chiamiamo la funzione con le variabili document_text e details_to_extract che sono state definite negli snippet di codice precedenti.

All’interno della funzione, viene generato un prompt per Claude, includendo il documento da riassumere, i dettagli da estrarre e istruzioni specifiche per riassumere il documento. Il prompt istruisce Claude a rispondere con un riassunto di ogni dettaglio da estrarre annidato all’interno di intestazioni XML.

Poiché abbiamo deciso di produrre ogni sezione del riassunto all’interno di tag, ogni sezione può essere facilmente analizzata come fase di post-elaborazione. Questo approccio permette riassunti strutturati che possono essere adattati al tuo caso d’uso, in modo che ogni riassunto segua lo stesso schema.

Valuta il tuo prompt

Il prompting spesso richiede test e ottimizzazione per essere pronto per la produzione. Per determinare la prontezza della tua soluzione, valuta la qualità dei tuoi riassunti usando un processo sistematico che combina metodi quantitativi e qualitativi. Creare una forte valutazione empirica basata sui tuoi criteri di successo definiti ti permetterà di ottimizzare i tuoi prompt. Ecco alcune metriche che potresti voler includere nella tua valutazione empirica:

Distribuisci il tuo prompt

Ecco alcune considerazioni aggiuntive da tenere a mente mentre distribuisci la tua soluzione in produzione.

  1. Assicura l’assenza di responsabilità: Comprendi le implicazioni legali degli errori nei riassunti, che potrebbero portare a responsabilità legali per la tua organizzazione o i clienti. Fornisci disclaimer o avvisi legali che chiariscano che i riassunti sono generati dall’IA e dovrebbero essere rivisti da professionisti legali.

  2. Gestisci diversi tipi di documenti: In questa guida, abbiamo discusso come estrarre testo dai PDF. Nel mondo reale, i documenti potrebbero arrivare in una varietà di formati (PDF, documenti Word, file di testo, ecc.). Assicurati che la tua pipeline di estrazione dati possa convertire tutti i formati di file che ti aspetti di ricevere.

  3. Parallelizza le chiamate API a Claude: Documenti lunghi con un gran numero di token potrebbero richiedere fino a un minuto perché Claude generi un riassunto. Per grandi collezioni di documenti, potresti voler inviare chiamate API a Claude in parallelo in modo che i riassunti possano essere completati in un tempo ragionevole. Fai riferimento ai limiti di velocità di Anthropic per determinare il numero massimo di chiamate API che possono essere eseguite in parallelo.


Migliora le prestazioni

In scenari complessi, potrebbe essere utile considerare strategie aggiuntive per migliorare le prestazioni oltre le tecniche standard di ingegneria dei prompt. Ecco alcune strategie avanzate:

Esegui meta-sintesi per riassumere documenti lunghi

La sintesi legale spesso comporta la gestione di documenti lunghi o molti documenti correlati contemporaneamente, tanto da superare la finestra di contesto di Claude. Puoi usare un metodo di suddivisione noto come meta-sintesi per gestire questo caso d’uso. Questa tecnica comporta la suddivisione dei documenti in parti più piccole e gestibili e poi l’elaborazione di ogni parte separatamente. Puoi quindi combinare i riassunti di ogni parte per creare una meta-sintesi dell’intero documento.

Ecco un esempio di come eseguire la meta-sintesi:

import anthropic

# Inizializza il client 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):

    # Formatta i dettagli da estrarre da inserire nel contesto del prompt
    details_to_extract_str = '\n'.join(details_to_extract)

    # Itera sulle parti e riassumi ciascuna
    chunk_summaries = [summarize_document(chunk, details_to_extract, model=model, max_tokens=max_tokens) for chunk in chunk_text(text)]
    
    final_summary_prompt = f"""
    
    Stai esaminando i riassunti suddivisi di più documenti che sono tutti correlati.
    Combina i seguenti riassunti del documento da diverse fonti attendibili in un riassunto complessivo coerente:

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

    Concentrati su questi aspetti chiave:
    {details_to_extract_str})

    Fornisci il riassunto in punti elenco annidati all'interno dell'intestazione XML per ogni sezione. Per esempio:

    <parti coinvolte>
    - Sublocatore: [Nome]
    // Aggiungi più dettagli secondo necessità
    </parti coinvolte>
    
    Se alcune informazioni non sono esplicitamente indicate nel documento, segnalale come "Non specificato". Non fare preamboli.
    """

    response = client.messages.create(
        model=model,
        max_tokens=max_tokens,
        system="Sei un esperto legale che riassume note su un documento.",
        messages=[
            {"role": "user",  "content": final_summary_prompt},
            {"role": "assistant", "content": "Ecco il riassunto del contratto di sublocazione: <summary>"}

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

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

La funzione summarize_long_document si basa sulla precedente funzione summarize_document dividendo il documento in parti più piccole e riassumendo ogni parte individualmente.

Il codice ottiene questo applicando la funzione summarize_document a ogni parte di 20.000 caratteri all’interno del documento originale. I riassunti individuali vengono poi combinati, e viene creato un riassunto finale da questi riassunti parziali.

Nota che la funzione summarize_long_document non è strettamente necessaria per il nostro PDF di esempio, poiché l’intero documento rientra nella finestra di contesto di Claude. Tuttavia, diventa essenziale per documenti che superano la finestra di contesto di Claude o quando si riassumono più documenti correlati insieme. Indipendentemente da ciò, questa tecnica di meta-sintesi spesso cattura dettagli importanti aggiuntivi nel riassunto finale che erano stati persi nell’approccio precedente con singolo riassunto.

Usa documenti indicizzati per riassunto per esplorare una grande collezione di documenti

La ricerca in una collezione di documenti con un LLM di solito coinvolge la generazione aumentata dal recupero (RAG). Tuttavia, in scenari che coinvolgono documenti grandi o quando è cruciale il recupero preciso delle informazioni, un approccio RAG di base potrebbe essere insufficiente. I documenti indicizzati per riassunto sono un approccio RAG avanzato che fornisce un modo più efficiente di classificare i documenti per il recupero, usando meno contesto dei metodi RAG tradizionali. In questo approccio, prima usi Claude per generare un riassunto conciso per ogni documento nel tuo corpus, e poi usi Clade per classificare la rilevanza di ogni riassunto rispetto alla query posta. Per ulteriori dettagli su questo approccio, incluso un esempio basato su codice, controlla la sezione sui documenti indicizzati per riassunto nel manuale di sintesi.

Affina Claude per imparare dal tuo dataset

Un’altra tecnica avanzata per migliorare la capacità di Claude di generare riassunti è il fine-tuning. Il fine-tuning comporta l’addestramento di Claude su un dataset personalizzato che si allinea specificamente con le tue esigenze di sintesi legale, assicurando che Claude si adatti al tuo caso d’uso. Ecco una panoramica su come eseguire il fine-tuning:

  1. Identifica gli errori: Inizia raccogliendo istanze in cui i riassunti di Claude sono carenti - questo potrebbe includere la mancanza di dettagli legali critici, l’incomprensione del contesto o l’uso di terminologia legale inappropriata.

  2. Cura un dataset: Una volta identificati questi problemi, compila un dataset di questi esempi problematici. Questo dataset dovrebbe includere i documenti legali originali insieme ai tuoi riassunti corretti, assicurando che Claude impari il comportamento desiderato.

  3. Esegui il fine-tuning: Il fine-tuning comporta il riaddestramento del modello sul tuo dataset curato per regolare i suoi pesi e parametri. Questo riaddestramento aiuta Claude a comprendere meglio i requisiti specifici del tuo dominio legale, migliorando la sua capacità di riassumere documenti secondo i tuoi standard.

  4. Miglioramento iterativo: Il fine-tuning non è un processo una tantum. Mentre Claude continua a generare riassunti, puoi iterativamente aggiungere nuovi esempi in cui ha avuto prestazioni inferiori, raffinando ulteriormente le sue capacità. Nel tempo, questo ciclo continuo di feedback risulterà in un modello altamente specializzato per i tuoi compiti di sintesi legale.

Il fine-tuning è attualmente disponibile solo tramite Amazon Bedrock. Ulteriori dettagli sono disponibili nel blog di lancio AWS.