Visite nosso cookbook de sumarização para ver um exemplo de implementação de sumarização legal usando o Claude.

Antes de construir com o Claude

Aqui estão alguns indicadores-chave de que você deve empregar um LLM como o Claude para sumarizar documentos legais:

Determine os detalhes que você quer que a sumarização extraia

Não existe um único resumo correto para qualquer documento. Sem uma direção clara, pode ser difícil para o Claude determinar quais detalhes incluir. Para alcançar resultados ideais, identifique as informações específicas que você deseja incluir no resumo.

Por exemplo, ao resumir um contrato de sublocação, você pode querer extrair os seguintes pontos-chave:

details_to_extract = [
    'Partes envolvidas (sublocador, sublocatário e locador original)',
    'Detalhes do imóvel (endereço, descrição e uso permitido)', 
    'Prazo e aluguel (data de início, data de término, aluguel mensal e caução)',
    'Responsabilidades (utilidades, manutenção e reparos)',
    'Consentimento e notificações (consentimento do proprietário e requisitos de notificação)',
    'Disposições especiais (mobília, estacionamento e restrições de sublocação)'
]

Estabeleça critérios de sucesso

Avaliar a qualidade dos resumos é uma tarefa notoriamente desafiadora. Diferentemente de muitas outras tarefas de processamento de linguagem natural, a avaliação de resumos frequentemente carece de métricas objetivas claras. O processo pode ser altamente subjetivo, com diferentes leitores valorizando diferentes aspectos de um resumo. Aqui estão critérios que você pode considerar ao avaliar o desempenho do Claude na sumarização legal.

Veja nosso guia sobre estabelecimento de critérios de sucesso para mais informações.


Como sumarizar documentos legais usando o Claude

Selecione o modelo Claude correto

A precisão do modelo é extremamente importante ao resumir documentos legais. O Claude 3.5 Sonnet é uma excelente escolha para casos de uso como este onde alta precisão é necessária. Se o tamanho e a quantidade de seus documentos forem grandes a ponto de os custos começarem a se tornar uma preocupação, você também pode tentar usar um modelo menor como o Claude 3 Haiku.

Para ajudar a estimar esses custos, abaixo está uma comparação do custo para resumir 1.000 contratos de sublocação usando tanto o Sonnet quanto o Haiku:

  • Tamanho do conteúdo

    • Número de contratos: 1.000
    • Caracteres por contrato: 300.000
    • Total de caracteres: 300M
  • Tokens estimados

    • Tokens de entrada: 86M (assumindo 1 token por 3,5 caracteres)
    • Tokens de saída por resumo: 350
    • Total de tokens de saída: 350.000
  • Custo estimado do Claude 3.5 Sonnet

    • Custo de tokens de entrada: 86 MTok * 3,00/MTok=3,00/MTok = 258
    • Custo de tokens de saída: 0,35 MTok * 15,00/MTok=15,00/MTok = 5,25
    • Custo total: 258,00+258,00 + 5,25 = $263,25
  • Custo estimado do Claude 3 Haiku

    • Custo de tokens de entrada: 86 MTok * 0,25/MTok=0,25/MTok = 21,50
    • Custo de tokens de saída: 0,35 MTok * 1,25/MTok=1,25/MTok = 0,44
    • Custo total: 21,50+21,50 + 0,44 = $21,96
Os custos reais podem diferir dessas estimativas. Estas estimativas são baseadas no exemplo destacado na seção sobre prompting.

Transforme documentos em um formato que o Claude possa processar

Antes de começar a resumir documentos, você precisa preparar seus dados. Isso envolve extrair texto de PDFs, limpar o texto e garantir que ele esteja pronto para ser processado pelo Claude.

Aqui está uma demonstração deste processo em um PDF de exemplo:

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

    # Remove espaços em branco extras
    text = re.sub(r'\s+', ' ', text) 

    # Remove números de página
    text = re.sub(r'\n\s*\d+\s*\n', '\n', text) 

    return text


# Cria a URL completa do repositório GitHub
url = "https://raw.githubusercontent.com/anthropics/anthropic-cookbook/main/skills/summarization/data/Sample Sublease Agreement.pdf"
url = url.replace(" ", "%20")

# Baixa o arquivo PDF para a memória
response = requests.get(url)

# Carrega o PDF da memória
pdf_file = BytesIO(response.content)

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

Neste exemplo, primeiro baixamos um PDF de um contrato de sublocação de exemplo usado no cookbook de sumarização. Este contrato foi obtido de um contrato de sublocação publicamente disponível no site sec.gov.

Usamos a biblioteca pypdf para extrair o conteúdo do PDF e convertê-lo em texto. Os dados de texto são então limpos removendo espaços em branco extras e números de página.

Construa um prompt forte

O Claude pode se adaptar a vários estilos de sumarização. Você pode alterar os detalhes do prompt para guiar o Claude a ser mais ou menos verboso, incluir mais ou menos terminologia técnica, ou fornecer um resumo de nível mais alto ou mais baixo do contexto em questão.

Aqui está um exemplo de como criar um prompt que garante que os resumos gerados sigam uma estrutura consistente ao analisar contratos de sublocação:

import anthropic

# Inicializa o cliente Anthropic
client = anthropic.Anthropic()

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

    # Formata os detalhes a serem extraídos para serem colocados dentro do contexto do prompt
    details_to_extract_str = '\n'.join(details_to_extract)
    
    # Solicita ao modelo para resumir o contrato de sublocação
    prompt = f"""Resuma o seguinte contrato de sublocação. Concentre-se nestes aspectos principais:

    {details_to_extract_str}

    Forneça o resumo em tópicos aninhados dentro do cabeçalho XML para cada seção. Por exemplo:

    <partes envolvidas>
    - Sublocador: [Nome]
    // Adicione mais detalhes conforme necessário
    </partes envolvidas>
    
    Se alguma informação não estiver explicitamente declarada no documento, anote como "Não especificado". Não faça preâmbulo.

    Texto do contrato de sublocação:
    {text}
    """

    response = client.messages.create(
        model=model,
        max_tokens=max_tokens,
        system="Você é um analista jurídico especializado em direito imobiliário, conhecido por resumos altamente precisos e detalhados de contratos de sublocação.",
        messages=[
            {"role": "user", "content": prompt},
            {"role": "assistant", "content": "Aqui está o resumo do contrato de sublocação: <summary>"}
        ],
        stop_sequences=["</summary>"]
    )

    return response.content[0].text

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

Este código implementa uma função summarize_document que usa o Claude para resumir o conteúdo de um contrato de sublocação. A função aceita uma string de texto e uma lista de detalhes a serem extraídos como entradas. Neste exemplo, chamamos a função com as variáveis document_text e details_to_extract que foram definidas nos trechos de código anteriores.

Dentro da função, um prompt é gerado para o Claude, incluindo o documento a ser resumido, os detalhes a serem extraídos e instruções específicas para resumir o documento. O prompt instrui o Claude a responder com um resumo de cada detalhe a ser extraído aninhado dentro de cabeçalhos XML.

Como decidimos produzir cada seção do resumo dentro de tags, cada seção pode ser facilmente analisada como uma etapa de pós-processamento. Essa abordagem permite resumos estruturados que podem ser adaptados para seu caso de uso, de modo que cada resumo siga o mesmo padrão.

Avalie seu prompt

O prompting frequentemente requer testes e otimização para estar pronto para produção. Para determinar a prontidão de sua solução, avalie a qualidade de seus resumos usando um processo sistemático combinando métodos quantitativos e qualitativos. Criar uma forte avaliação empírica baseada em seus critérios de sucesso definidos permitirá que você otimize seus prompts. Aqui estão algumas métricas que você pode desejar incluir em sua avaliação empírica:

Implante seu prompt

Aqui estão algumas considerações adicionais para ter em mente ao implantar sua solução em produção.

  1. Garanta ausência de responsabilidade: Entenda as implicações legais de erros nos resumos, que poderiam levar a responsabilidade legal para sua organização ou clientes. Forneça avisos legais ou notificações esclarecendo que os resumos são gerados por IA e devem ser revisados por profissionais jurídicos.

  2. Lide com diversos tipos de documentos: Neste guia, discutimos como extrair texto de PDFs. No mundo real, os documentos podem vir em uma variedade de formatos (PDFs, documentos Word, arquivos de texto, etc.). Garanta que seu pipeline de extração de dados possa converter todos os formatos de arquivo que você espera receber.

  3. Paralelize chamadas de API ao Claude: Documentos longos com um grande número de tokens podem exigir até um minuto para o Claude gerar um resumo. Para grandes coleções de documentos, você pode querer enviar chamadas de API ao Claude em paralelo para que os resumos possam ser concluídos em um prazo razoável. Consulte os limites de taxa da Anthropic para determinar a quantidade máxima de chamadas de API que podem ser realizadas em paralelo.


Melhore o desempenho

Em cenários complexos, pode ser útil considerar estratégias adicionais para melhorar o desempenho além das técnicas padrão de engenharia de prompt. Aqui estão algumas estratégias avançadas:

Realize meta-sumarização para resumir documentos longos

A sumarização legal frequentemente envolve lidar com documentos longos ou muitos documentos relacionados de uma vez, de modo que você ultrapasse a janela de contexto do Claude. Você pode usar um método de chunking conhecido como meta-sumarização para lidar com este caso de uso. Esta técnica envolve dividir documentos em pedaços menores e gerenciáveis e então processar cada pedaço separadamente. Você pode então combinar os resumos de cada pedaço para criar um meta-resumo do documento inteiro.

Aqui está um exemplo de como realizar meta-sumarização:

import anthropic

# Inicializa o cliente 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):

    # Formata os detalhes a serem extraídos para serem colocados dentro do contexto do prompt
    details_to_extract_str = '\n'.join(details_to_extract)

    # Itera sobre os pedaços e resume cada um
    chunk_summaries = [summarize_document(chunk, details_to_extract, model=model, max_tokens=max_tokens) for chunk in chunk_text(text)]
    
    final_summary_prompt = f"""
    
    Você está olhando para os resumos em pedaços de múltiplos documentos que estão todos relacionados. 
    Combine os seguintes resumos do documento de diferentes fontes verdadeiras em um resumo geral coerente:

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

    Concentre-se nestes aspectos principais:
    {details_to_extract_str})

    Forneça o resumo em tópicos aninhados dentro do cabeçalho XML para cada seção. Por exemplo:

    <partes envolvidas>
    - Sublocador: [Nome]
    // Adicione mais detalhes conforme necessário
    </partes envolvidas>
    
    Se alguma informação não estiver explicitamente declarada no documento, anote como "Não especificado". Não faça preâmbulo.
    """

    response = client.messages.create(
        model=model,
        max_tokens=max_tokens,
        system="Você é um especialista jurídico que resume notas sobre um documento.",
        messages=[
            {"role": "user",  "content": final_summary_prompt},
            {"role": "assistant", "content": "Aqui está o resumo do contrato de sublocação: <summary>"}

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

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

A função summarize_long_document se baseia na função anterior summarize_document dividindo o documento em pedaços menores e resumindo cada pedaço individualmente.

O código alcança isso aplicando a função summarize_document a cada pedaço de 20.000 caracteres dentro do documento original. Os resumos individuais são então combinados, e um resumo final é criado a partir desses resumos em pedaços.

Note que a função summarize_long_document não é estritamente necessária para nosso exemplo de PDF, já que o documento inteiro cabe dentro da janela de contexto do Claude. No entanto, ela se torna essencial para documentos que excedem a janela de contexto do Claude ou ao resumir múltiplos documentos relacionados juntos. Independentemente disso, esta técnica de meta-sumarização frequentemente captura detalhes importantes adicionais no resumo final que foram perdidos na abordagem anterior de resumo único.

Use documentos indexados por resumo para explorar uma grande coleção de documentos

Pesquisar uma coleção de documentos com um LLM geralmente envolve geração aumentada por recuperação (RAG). No entanto, em cenários envolvendo documentos grandes ou quando a recuperação precisa de informações é crucial, uma abordagem RAG básica pode ser insuficiente. Documentos indexados por resumo é uma abordagem RAG avançada que fornece uma maneira mais eficiente de classificar documentos para recuperação, usando menos contexto que os métodos RAG tradicionais. Nesta abordagem, você primeiro usa o Claude para gerar um resumo conciso para cada documento em seu corpus, e então usa o Clade para classificar a relevância de cada resumo para a consulta sendo feita. Para mais detalhes sobre esta abordagem, incluindo um exemplo baseado em código, confira a seção de documentos indexados por resumo no cookbook de sumarização.

Faça fine-tuning do Claude para aprender com seu conjunto de dados

Outra técnica avançada para melhorar a capacidade do Claude de gerar resumos é o fine-tuning. O fine-tuning envolve treinar o Claude em um conjunto de dados personalizado que se alinha especificamente com suas necessidades de sumarização legal, garantindo que o Claude se adapte ao seu caso de uso. Aqui está uma visão geral de como realizar o fine-tuning:

  1. Identifique erros: Comece coletando instâncias onde os resumos do Claude ficam aquém - isso pode incluir perder detalhes legais críticos, mal entender o contexto ou usar terminologia legal inadequada.

  2. Curadoria de um conjunto de dados: Uma vez que você identificou esses problemas, compile um conjunto de dados desses exemplos problemáticos. Este conjunto de dados deve incluir os documentos legais originais junto com seus resumos corrigidos, garantindo que o Claude aprenda o comportamento desejado.

  3. Realize o fine-tuning: O fine-tuning envolve retreinar o modelo em seu conjunto de dados curado para ajustar seus pesos e parâmetros. Este retreinamento ajuda o Claude a entender melhor os requisitos específicos de seu domínio legal, melhorando sua capacidade de resumir documentos de acordo com seus padrões.

  4. Melhoria iterativa: O fine-tuning não é um processo único. Conforme o Claude continua a gerar resumos, você pode iterativamente adicionar novos exemplos onde ele teve desempenho abaixo do esperado, refinando ainda mais suas capacidades. Ao longo do tempo, este ciclo contínuo de feedback resultará em um modelo que é altamente especializado para suas tarefas de sumarização legal.

O fine-tuning está atualmente disponível apenas via Amazon Bedrock. Detalhes adicionais estão disponíveis no blog de lançamento da AWS.

Was this page helpful?