Visitez notre guide de résumé pour voir un exemple d’implémentation de résumé juridique utilisant Claude.

Avant de construire avec Claude

Décider si utiliser Claude pour le résumé juridique

Voici quelques indicateurs clés qui suggèrent que vous devriez employer un LLM comme Claude pour résumer des documents juridiques :

Déterminer les détails que vous souhaitez extraire dans le résumé

Il n’existe pas un seul résumé correct pour un document donné. Sans direction claire, il peut être difficile pour Claude de déterminer quels détails inclure. Pour obtenir des résultats optimaux, identifiez les informations spécifiques que vous souhaitez inclure dans le résumé.

Par exemple, lors du résumé d’un contrat de sous-location, vous pourriez souhaiter extraire les points clés suivants :

details_to_extract = [
    'Parties impliquées (sous-bailleur, sous-locataire et bailleur initial)',
    'Détails de la propriété (adresse, description et utilisation autorisée)',
    'Durée et loyer (date de début, date de fin, loyer mensuel et dépôt de garantie)',
    'Responsabilités (services publics, entretien et réparations)',
    'Consentement et notifications (consentement du propriétaire et exigences de notification)',
    'Dispositions spéciales (mobilier, stationnement et restrictions de sous-location)'
]

Établir des critères de succès

L’évaluation de la qualité des résumés est une tâche notoirement difficile. Contrairement à de nombreuses autres tâches de traitement du langage naturel, l’évaluation des résumés manque souvent de métriques objectives claires. Le processus peut être très subjectif, différents lecteurs accordant de l’importance à différents aspects d’un résumé. Voici les critères que vous pourriez souhaiter prendre en compte lors de l’évaluation des performances de Claude en matière de résumé juridique.

Consultez notre guide sur l’établissement de critères de succès pour plus d’informations.


Comment résumer des documents juridiques en utilisant Claude

Sélectionner le bon modèle Claude

La précision du modèle est extrêmement importante lors de la résumé de documents juridiques. Claude 3.5 Sonnet est un excellent choix pour des cas d’utilisation comme celui-ci où une haute précision est requise. Si la taille et la quantité de vos documents sont importantes au point que les coûts deviennent une préoccupation, vous pouvez également essayer d’utiliser un modèle plus petit comme Claude 3 Haiku.

Pour aider à estimer ces coûts, voici une comparaison du coût pour résumer 1 000 contrats de sous-location en utilisant à la fois Sonnet et Haiku :

  • Taille du contenu

    • Nombre de contrats : 1 000
    • Caractères par contrat : 300 000
    • Total des caractères : 300M
  • Tokens estimés

    • Tokens d’entrée : 86M (en supposant 1 token pour 3,5 caractères)
    • Tokens de sortie par résumé : 350
    • Total des tokens de sortie : 350 000
  • Coût estimé pour Claude 3.5 Sonnet

    • Coût des tokens d’entrée : 86 MTok * 3,00 /MTok=258/MTok = 258
    • Coût des tokens de sortie : 0,35 MTok * 15,00 /MTok=5,25/MTok = 5,25
    • Coût total : 258,00 +5,25+ 5,25 = 263,25 $
  • Coût estimé pour Claude 3 Haiku

    • Coût des tokens d’entrée : 86 MTok * 0,25 /MTok=21,50/MTok = 21,50
    • Coût des tokens de sortie : 0,35 MTok * 1,25 /MTok=0,44/MTok = 0,44
    • Coût total : 21,50 +0,44+ 0,44 = 21,96 $
Les coûts réels peuvent différer de ces estimations. Ces estimations sont basées sur l’exemple mis en évidence dans la section sur l’invite.

Transformer les documents dans un format que Claude peut traiter

Avant de commencer à résumer les documents, vous devez préparer vos données. Cela implique d’extraire le texte des PDF, de nettoyer le texte et de s’assurer qu’il est prêt à être traité par Claude.

Voici une démonstration de ce processus sur un exemple de 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])

    # Supprimer les espaces blancs supplémentaires
    text = re.sub(r'\s+', ' ', text) 

    # Supprimer les numéros de page
    text = re.sub(r'\n\s*\d+\s*\n', '\n', text) 

    return text


# Créer l'URL complète depuis le dépôt GitHub
url = "https://raw.githubusercontent.com/anthropics/anthropic-cookbook/main/skills/summarization/data/Sample Sublease Agreement.pdf"
url = url.replace(" ", "%20")

# Télécharger le fichier PDF en mémoire
response = requests.get(url)

# Charger le PDF depuis la mémoire
pdf_file = BytesIO(response.content)

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

Dans cet exemple, nous téléchargeons d’abord un PDF d’un exemple de contrat de sous-location utilisé dans le guide de résumé. Ce contrat provient d’un contrat de sous-location publiquement disponible sur le site web sec.gov.

Nous utilisons la bibliothèque pypdf pour extraire le contenu du PDF et le convertir en texte. Les données textuelles sont ensuite nettoyées en supprimant les espaces blancs supplémentaires et les numéros de page.

Construire une invite solide

Claude peut s’adapter à différents styles de résumé. Vous pouvez modifier les détails de l’invite pour guider Claude à être plus ou moins verbeux, inclure plus ou moins de terminologie technique, ou fournir un résumé de plus haut ou plus bas niveau du contexte en question.

Voici un exemple de création d’une invite qui garantit que les résumés générés suivent une structure cohérente lors de l’analyse des contrats de sous-location :

import anthropic

# Initialiser le client Anthropic
client = anthropic.Anthropic()

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

    # Formater les détails à extraire pour les placer dans le contexte de l'invite
    details_to_extract_str = '\n'.join(details_to_extract)
    
    # Inviter le modèle à résumer le contrat de sous-location
    prompt = f"""Résumez le contrat de sous-location suivant. Concentrez-vous sur ces aspects clés :

    {details_to_extract_str}

    Fournissez le résumé en points imbriqués dans l'en-tête XML pour chaque section. Par exemple :

    <parties impliquées>
    - Sous-bailleur : [Nom]
    // Ajouter plus de détails si nécessaire
    </parties impliquées>
    
    Si certaines informations ne sont pas explicitement indiquées dans le document, notez-les comme "Non spécifié". Ne faites pas de préambule.

    Texte du contrat de sous-location :
    {text}
    """

    response = client.messages.create(
        model=model,
        max_tokens=max_tokens,
        system="Vous êtes un analyste juridique spécialisé en droit immobilier, connu pour des résumés très précis et détaillés des contrats de sous-location.",
        messages=[
            {"role": "user", "content": prompt},
            {"role": "assistant", "content": "Voici le résumé du contrat de sous-location : <summary>"}
        ],
        stop_sequences=["</summary>"]
    )

    return response.content[0].text

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

Ce code implémente une fonction summarize_document qui utilise Claude pour résumer le contenu d’un contrat de sous-location. La fonction accepte une chaîne de texte et une liste de détails à extraire comme entrées. Dans cet exemple, nous appelons la fonction avec les variables document_text et details_to_extract qui ont été définies dans les extraits de code précédents.

Dans la fonction, une invite est générée pour Claude, incluant le document à résumer, les détails à extraire et des instructions spécifiques pour résumer le document. L’invite demande à Claude de répondre avec un résumé de chaque détail à extraire imbriqué dans des en-têtes XML.

Comme nous avons décidé de sortir chaque section du résumé dans des balises, chaque section peut facilement être analysée comme une étape de post-traitement. Cette approche permet des résumés structurés qui peuvent être adaptés à votre cas d’utilisation, de sorte que chaque résumé suive le même modèle.

Évaluer votre invite

L’invitation nécessite souvent des tests et une optimisation pour être prête pour la production. Pour déterminer si votre solution est prête, évaluez la qualité de vos résumés en utilisant un processus systématique combinant des méthodes quantitatives et qualitatives. La création d’une évaluation empirique solide basée sur vos critères de succès définis vous permettra d’optimiser vos invites. Voici quelques métriques que vous pourriez souhaiter inclure dans votre évaluation empirique :

Déployer votre invite

Voici quelques considérations supplémentaires à garder à l’esprit lorsque vous déployez votre solution en production.

  1. Assurer l’absence de responsabilité : Comprendre les implications juridiques des erreurs dans les résumés, qui pourraient entraîner une responsabilité juridique pour votre organisation ou vos clients. Fournir des avertissements ou des avis juridiques précisant que les résumés sont générés par l’IA et doivent être examinés par des professionnels du droit.

  2. Gérer divers types de documents : Dans ce guide, nous avons discuté de la façon d’extraire du texte des PDF. Dans le monde réel, les documents peuvent se présenter sous différents formats (PDF, documents Word, fichiers texte, etc.). Assurez-vous que votre pipeline d’extraction de données peut convertir tous les formats de fichiers que vous vous attendez à recevoir.

  3. Paralléliser les appels API à Claude : Les documents longs avec un grand nombre de tokens peuvent nécessiter jusqu’à une minute pour que Claude génère un résumé. Pour les grandes collections de documents, vous voudrez peut-être envoyer des appels API à Claude en parallèle afin que les résumés puissent être complétés dans un délai raisonnable. Référez-vous aux limites de taux d’Anthropic pour déterminer le nombre maximum d’appels API qui peuvent être effectués en parallèle.


Améliorer les performances

Dans des scénarios complexes, il peut être utile d’envisager des stratégies supplémentaires pour améliorer les performances au-delà des techniques standard d’ingénierie des invites. Voici quelques stratégies avancées :

Effectuer une méta-résumé pour résumer les longs documents

Le résumé juridique implique souvent de traiter de longs documents ou plusieurs documents connexes à la fois, de sorte que vous dépassez la fenêtre de contexte de Claude. Vous pouvez utiliser une méthode de découpage connue sous le nom de méta-résumé pour gérer ce cas d’utilisation. Cette technique implique de décomposer les documents en morceaux plus petits et gérables, puis de traiter chaque morceau séparément. Vous pouvez ensuite combiner les résumés de chaque morceau pour créer un méta-résumé de l’ensemble du document.

Voici un exemple de la façon d’effectuer un méta-résumé :

import anthropic

# Initialiser le 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-5-sonnet-20241022", max_tokens=1000):

    # Formater les détails à extraire pour les placer dans le contexte de l'invite
    details_to_extract_str = '\n'.join(details_to_extract)

    # Itérer sur les morceaux et résumer chacun
    chunk_summaries = [summarize_document(chunk, details_to_extract, model=model, max_tokens=max_tokens) for chunk in chunk_text(text)]
    
    final_summary_prompt = f"""
    
    Vous examinez les résumés découpés de plusieurs documents qui sont tous liés.
    Combinez les résumés suivants du document provenant de différentes sources véridiques en un résumé global cohérent :

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

    Concentrez-vous sur ces aspects clés :
    {details_to_extract_str})

    Fournissez le résumé en points imbriqués dans l'en-tête XML pour chaque section. Par exemple :

    <parties impliquées>
    - Sous-bailleur : [Nom]
    // Ajouter plus de détails si nécessaire
    </parties impliquées>
    
    Si certaines informations ne sont pas explicitement indiquées dans le document, notez-les comme "Non spécifié". Ne faites pas de préambule.
    """

    response = client.messages.create(
        model=model,
        max_tokens=max_tokens,
        system="Vous êtes un expert juridique qui résume des notes sur un document.",
        messages=[
            {"role": "user",  "content": final_summary_prompt},
            {"role": "assistant", "content": "Voici le résumé du contrat de sous-location : <summary>"}

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

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

La fonction summarize_long_document s’appuie sur la fonction summarize_document précédente en divisant le document en plus petits morceaux et en résumant chaque morceau individuellement.

Le code réalise cela en appliquant la fonction summarize_document à chaque morceau de 20 000 caractères dans le document original. Les résumés individuels sont ensuite combinés, et un résumé final est créé à partir de ces résumés de morceaux.

Notez que la fonction summarize_long_document n’est pas strictement nécessaire pour notre exemple de PDF, car l’ensemble du document tient dans la fenêtre de contexte de Claude. Cependant, elle devient essentielle pour les documents dépassant la fenêtre de contexte de Claude ou lors du résumé de plusieurs documents connexes ensemble. Quoi qu’il en soit, cette technique de méta-résumé capture souvent des détails importants supplémentaires dans le résumé final qui ont été manqués dans l’approche de résumé unique précédente.

Utiliser des documents indexés par résumé pour explorer une grande collection de documents

La recherche dans une collection de documents avec un LLM implique généralement la génération augmentée par récupération (RAG). Cependant, dans les scénarios impliquant de grands documents ou lorsqu’une récupération précise de l’information est cruciale, une approche RAG de base peut être insuffisante. Les documents indexés par résumé constituent une approche RAG avancée qui fournit un moyen plus efficace de classer les documents pour la récupération, en utilisant moins de contexte que les méthodes RAG traditionnelles. Dans cette approche, vous utilisez d’abord Claude pour générer un résumé concis pour chaque document de votre corpus, puis utilisez Clade pour classer la pertinence de chaque résumé par rapport à la requête posée. Pour plus de détails sur cette approche, y compris un exemple basé sur le code, consultez la section sur les documents indexés par résumé dans le guide de résumé.

Affiner Claude pour apprendre de votre jeu de données

Une autre technique avancée pour améliorer la capacité de Claude à générer des résumés est l’affinement. L’affinement implique d’entraîner Claude sur un jeu de données personnalisé qui s’aligne spécifiquement avec vos besoins de résumé juridique, garantissant que Claude s’adapte à votre cas d’utilisation. Voici un aperçu de la façon d’effectuer l’affinement :

  1. Identifier les erreurs : Commencez par collecter les cas où les résumés de Claude sont insuffisants - cela pourrait inclure des détails juridiques critiques manquants, une mauvaise compréhension du contexte ou l’utilisation d’une terminologie juridique inappropriée.

  2. Organiser un jeu de données : Une fois que vous avez identifié ces problèmes, compilez un jeu de données de ces exemples problématiques. Ce jeu de données devrait inclure les documents juridiques originaux aux côtés de vos résumés corrigés, garantissant que Claude apprend le comportement souhaité.

  3. Effectuer l’affinement : L’affinement implique de réentraîner le modèle sur votre jeu de données organisé pour ajuster ses poids et paramètres. Ce réentraînement aide Claude à mieux comprendre les exigences spécifiques de votre domaine juridique, améliorant sa capacité à résumer les documents selon vos normes.

  4. Amélioration itérative : L’affinement n’est pas un processus unique. Au fur et à mesure que Claude continue de générer des résumés, vous pouvez ajouter de manière itérative de nouveaux exemples où il a sous-performé, affinant davantage ses capacités. Au fil du temps, cette boucle de rétroaction continue aboutira à un modèle hautement spécialisé pour vos tâches de résumé juridique.

L’affinement n’est actuellement disponible que via Amazon Bedrock. Des détails supplémentaires sont disponibles dans le blog de lancement AWS.