Visite nuestro libro de recetas de resúmenes para ver un ejemplo de implementación de resumen legal usando Claude.

Antes de construir con Claude

Decida si usar Claude para resúmenes legales

Aquí hay algunos indicadores clave de que debería emplear un LLM como Claude para resumir documentos legales:

Determine los detalles que desea que extraiga el resumen

No existe un único resumen correcto para cualquier documento dado. Sin una dirección clara, puede ser difícil para Claude determinar qué detalles incluir. Para lograr resultados óptimos, identifique la información específica que desea incluir en el resumen.

Por ejemplo, al resumir un acuerdo de subarrendamiento, podría desear extraer los siguientes puntos clave:

details_to_extract = [
    'Partes involucradas (subarrendador, subarrendatario y arrendador original)',
    'Detalles de la propiedad (dirección, descripción y uso permitido)',
    'Plazo y renta (fecha de inicio, fecha de finalización, renta mensual y depósito de garantía)',
    'Responsabilidades (servicios públicos, mantenimiento y reparaciones)',
    'Consentimiento y notificaciones (consentimiento del propietario y requisitos de notificación)',
    'Disposiciones especiales (mobiliario, estacionamiento y restricciones de subarrendamiento)'
]

Establecer criterios de éxito

Evaluar la calidad de los resúmenes es una tarea notoriamente desafiante. A diferencia de muchas otras tareas de procesamiento del lenguaje natural, la evaluación de resúmenes a menudo carece de métricas objetivas claras. El proceso puede ser altamente subjetivo, con diferentes lectores valorando diferentes aspectos de un resumen. Aquí hay criterios que puede considerar al evaluar qué tan bien Claude realiza los resúmenes legales.

Consulte nuestra guía sobre establecer criterios de éxito para más información.


Cómo resumir documentos legales usando Claude

Seleccione el modelo Claude correcto

La precisión del modelo es extremadamente importante al resumir documentos legales. Claude 3.5 Sonnet es una excelente opción para casos de uso como este donde se requiere alta precisión. Si el tamaño y la cantidad de sus documentos es grande, de modo que los costos comienzan a ser una preocupación, también puede intentar usar un modelo más pequeño como Claude 3 Haiku.

Para ayudar a estimar estos costos, a continuación se muestra una comparación del costo de resumir 1,000 acuerdos de subarrendamiento usando tanto Sonnet como Haiku:

  • Tamaño del contenido

    • Número de acuerdos: 1,000
    • Caracteres por acuerdo: 300,000
    • Total de caracteres: 300M
  • Tokens estimados

    • Tokens de entrada: 86M (asumiendo 1 token por 3.5 caracteres)
    • Tokens de salida por resumen: 350
    • Total de tokens de salida: 350,000
  • Costo estimado de Claude 3.5 Sonnet

    • Costo de tokens de entrada: 86 MTok * 3.00/MTok=3.00/MTok = 258
    • Costo de tokens de salida: 0.35 MTok * 15.00/MTok=15.00/MTok = 5.25
    • Costo total: 258.00+258.00 + 5.25 = $263.25
  • Costo estimado de Claude 3 Haiku

    • Costo de tokens de entrada: 86 MTok * 0.25/MTok=0.25/MTok = 21.50
    • Costo de tokens de salida: 0.35 MTok * 1.25/MTok=1.25/MTok = 0.44
    • Costo total: 21.50+21.50 + 0.44 = $21.96
Los costos reales pueden diferir de estas estimaciones. Estas estimaciones se basan en el ejemplo destacado en la sección sobre prompting.

Transformar documentos en un formato que Claude pueda procesar

Antes de comenzar a resumir documentos, necesita preparar sus datos. Esto implica extraer texto de PDFs, limpiar el texto y asegurarse de que esté listo para ser procesado por Claude.

Aquí hay una demostración de este proceso en un PDF de muestra:

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

    # Eliminar espacios en blanco extra
    text = re.sub(r'\s+', ' ', text) 

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

    return text


# Crear la URL completa desde el repositorio de GitHub
url = "https://raw.githubusercontent.com/anthropics/anthropic-cookbook/main/skills/summarization/data/Sample Sublease Agreement.pdf"
url = url.replace(" ", "%20")

# Descargar el archivo PDF en memoria
response = requests.get(url)

# Cargar el PDF desde memoria
pdf_file = BytesIO(response.content)

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

En este ejemplo, primero descargamos un PDF de un acuerdo de subarrendamiento de muestra utilizado en el libro de recetas de resúmenes. Este acuerdo se obtuvo de un acuerdo de subarrendamiento disponible públicamente del sitio web sec.gov.

Usamos la biblioteca pypdf para extraer el contenido del PDF y convertirlo a texto. Luego se limpia el texto eliminando espacios en blanco extra y números de página.

Construir un prompt sólido

Claude puede adaptarse a varios estilos de resumen. Puede cambiar los detalles del prompt para guiar a Claude a ser más o menos detallado, incluir más o menos terminología técnica, o proporcionar un resumen de nivel más alto o más bajo del contexto en cuestión.

Aquí hay un ejemplo de cómo crear un prompt que asegure que los resúmenes generados sigan una estructura consistente al analizar acuerdos de subarrendamiento:

import anthropic

# Inicializar el cliente de Anthropic
client = anthropic.Anthropic()

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

    # Formatear los detalles a extraer para colocarlos dentro del contexto del prompt
    details_to_extract_str = '\n'.join(details_to_extract)
    
    # Indicar al modelo que resuma el acuerdo de subarrendamiento
    prompt = f"""Resuma el siguiente acuerdo de subarrendamiento. Concéntrese en estos aspectos clave:

    {details_to_extract_str}

    Proporcione el resumen en viñetas anidadas dentro del encabezado XML para cada sección. Por ejemplo:

    <partes involucradas>
    - Subarrendador: [Nombre]
    // Agregar más detalles según sea necesario
    </partes involucradas>
    
    Si alguna información no está explícitamente indicada en el documento, anótela como "No especificado". No haga preámbulos.

    Texto del acuerdo de subarrendamiento:
    {text}
    """

    response = client.messages.create(
        model=model,
        max_tokens=max_tokens,
        system="Usted es un analista legal especializado en derecho inmobiliario, conocido por resúmenes altamente precisos y detallados de acuerdos de subarrendamiento.",
        messages=[
            {"role": "user", "content": prompt},
            {"role": "assistant", "content": "Aquí está el resumen del acuerdo de subarrendamiento: <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 una función summarize_document que usa Claude para resumir el contenido de un acuerdo de subarrendamiento. La función acepta una cadena de texto y una lista de detalles a extraer como entradas. En este ejemplo, llamamos a la función con las variables document_text y details_to_extract que se definieron en los fragmentos de código anteriores.

Dentro de la función, se genera un prompt para Claude, incluyendo el documento a resumir, los detalles a extraer e instrucciones específicas para resumir el documento. El prompt instruye a Claude a responder con un resumen de cada detalle a extraer anidado dentro de encabezados XML.

Debido a que decidimos generar cada sección del resumen dentro de etiquetas, cada sección puede ser fácilmente analizada como un paso de post-procesamiento. Este enfoque permite resúmenes estructurados que se pueden adaptar a su caso de uso, de modo que cada resumen siga el mismo patrón.

Evaluar su prompt

El prompting a menudo requiere pruebas y optimización para estar listo para producción. Para determinar la preparación de su solución, evalúe la calidad de sus resúmenes utilizando un proceso sistemático que combine métodos cuantitativos y cualitativos. Crear una evaluación empírica sólida basada en sus criterios de éxito definidos le permitirá optimizar sus prompts. Aquí hay algunas métricas que puede desear incluir dentro de su evaluación empírica:

Implementar su prompt

Aquí hay algunas consideraciones adicionales a tener en cuenta al implementar su solución en producción.

  1. Asegurar que no haya responsabilidad legal: Comprenda las implicaciones legales de los errores en los resúmenes, que podrían llevar a responsabilidad legal para su organización o clientes. Proporcione descargos de responsabilidad o avisos legales aclarando que los resúmenes son generados por IA y deben ser revisados por profesionales legales.

  2. Manejar diversos tipos de documentos: En esta guía, hemos discutido cómo extraer texto de PDFs. En el mundo real, los documentos pueden venir en una variedad de formatos (PDFs, documentos Word, archivos de texto, etc.). Asegúrese de que su pipeline de extracción de datos pueda convertir todos los formatos de archivo que espera recibir.

  3. Paralelizar llamadas API a Claude: Los documentos largos con un gran número de tokens pueden requerir hasta un minuto para que Claude genere un resumen. Para grandes colecciones de documentos, es posible que desee enviar llamadas API a Claude en paralelo para que los resúmenes se puedan completar en un tiempo razonable. Consulte los límites de tasa de Anthropic para determinar la cantidad máxima de llamadas API que se pueden realizar en paralelo.


Mejorar el rendimiento

En escenarios complejos, puede ser útil considerar estrategias adicionales para mejorar el rendimiento más allá de las técnicas estándar de ingeniería de prompts. Aquí hay algunas estrategias avanzadas:

Realizar meta-resumen para resumir documentos largos

El resumen legal a menudo implica manejar documentos largos o muchos documentos relacionados a la vez, de modo que supera la ventana de contexto de Claude. Puede usar un método de fragmentación conocido como meta-resumen para manejar este caso de uso. Esta técnica implica dividir los documentos en fragmentos más pequeños y manejables y luego procesar cada fragmento por separado. Luego puede combinar los resúmenes de cada fragmento para crear un meta-resumen de todo el documento.

Aquí hay un ejemplo de cómo realizar meta-resumen:

import anthropic

# Inicializar el cliente de 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):

    # Formatear los detalles a extraer para colocarlos dentro del contexto del prompt
    details_to_extract_str = '\n'.join(details_to_extract)

    # Iterar sobre fragmentos y resumir cada uno
    chunk_summaries = [summarize_document(chunk, details_to_extract, model=model, max_tokens=max_tokens) for chunk in chunk_text(text)]
    
    final_summary_prompt = f"""
    
    Está mirando los resúmenes fragmentados de múltiples documentos que están todos relacionados.
    Combine los siguientes resúmenes del documento de diferentes fuentes verídicas en un resumen general coherente:

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

    Concéntrese en estos aspectos clave:
    {details_to_extract_str})

    Proporcione el resumen en viñetas anidadas dentro del encabezado XML para cada sección. Por ejemplo:

    <partes involucradas>
    - Subarrendador: [Nombre]
    // Agregar más detalles según sea necesario
    </partes involucradas>
    
    Si alguna información no está explícitamente indicada en el documento, anótela como "No especificado". No haga preámbulos.
    """

    response = client.messages.create(
        model=model,
        max_tokens=max_tokens,
        system="Usted es un experto legal que resume notas sobre un documento.",
        messages=[
            {"role": "user",  "content": final_summary_prompt},
            {"role": "assistant", "content": "Aquí está el resumen del acuerdo de subarrendamiento: <summary>"}

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

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

La función summarize_long_document se basa en la función anterior summarize_document dividiendo el documento en fragmentos más pequeños y resumiendo cada fragmento individualmente.

El código logra esto aplicando la función summarize_document a cada fragmento de 20,000 caracteres dentro del documento original. Los resúmenes individuales se combinan luego, y se crea un resumen final a partir de estos resúmenes de fragmentos.

Tenga en cuenta que la función summarize_long_document no es estrictamente necesaria para nuestro PDF de ejemplo, ya que todo el documento cabe dentro de la ventana de contexto de Claude. Sin embargo, se vuelve esencial para documentos que exceden la ventana de contexto de Claude o cuando se resumen múltiples documentos relacionados juntos. Independientemente, esta técnica de meta-resumen a menudo captura detalles importantes adicionales en el resumen final que se perdieron en el enfoque anterior de resumen único.

Usar documentos indexados por resumen para explorar una gran colección de documentos

La búsqueda en una colección de documentos con un LLM generalmente implica generación aumentada por recuperación (RAG). Sin embargo, en escenarios que involucran documentos grandes o cuando se requiere una recuperación precisa de información, un enfoque RAG básico puede ser insuficiente. Los documentos indexados por resumen son un enfoque RAG avanzado que proporciona una forma más eficiente de clasificar documentos para recuperación, usando menos contexto que los métodos RAG tradicionales. En este enfoque, primero usa Claude para generar un resumen conciso para cada documento en su corpus, y luego usa Clade para clasificar la relevancia de cada resumen para la consulta que se está haciendo. Para más detalles sobre este enfoque, incluyendo un ejemplo basado en código, consulte la sección de documentos indexados por resumen en el libro de recetas de resúmenes.

Ajustar Claude para aprender de su conjunto de datos

Otra técnica avanzada para mejorar la capacidad de Claude para generar resúmenes es el ajuste fino. El ajuste fino implica entrenar a Claude en un conjunto de datos personalizado que se alinea específicamente con sus necesidades de resumen legal, asegurando que Claude se adapte a su caso de uso. Aquí hay una descripción general de cómo realizar el ajuste fino:

  1. Identificar errores: Comience recopilando instancias donde los resúmenes de Claude quedan cortos - esto podría incluir perder detalles legales críticos, malinterpretar el contexto o usar terminología legal inapropiada.

  2. Curar un conjunto de datos: Una vez que haya identificado estos problemas, compile un conjunto de datos de estos ejemplos problemáticos. Este conjunto de datos debe incluir los documentos legales originales junto con sus resúmenes corregidos, asegurando que Claude aprenda el comportamiento deseado.

  3. Realizar ajuste fino: El ajuste fino implica reentrenar el modelo en su conjunto de datos curado para ajustar sus pesos y parámetros. Este reentrenamiento ayuda a Claude a comprender mejor los requisitos específicos de su dominio legal, mejorando su capacidad para resumir documentos de acuerdo con sus estándares.

  4. Mejora iterativa: El ajuste fino no es un proceso único. A medida que Claude continúa generando resúmenes, puede agregar iterativamente nuevos ejemplos donde ha tenido un rendimiento inferior, refinando aún más sus capacidades. Con el tiempo, este ciclo continuo de retroalimentación resultará en un modelo que está altamente especializado para sus tareas de resumen legal.

El ajuste fino actualmente solo está disponible a través de Amazon Bedrock. Hay detalles adicionales disponibles en el blog de lanzamiento de AWS.

Was this page helpful?