访问我们的摘要制作指南,查看使用Claude进行法律摘要的实例实现。

在使用Claude构建之前

决定是否使用Claude进行法律摘要

以下是一些关键指标,表明您应该使用像Claude这样的LLM来总结法律文档:

确定您希望摘要提取的详细信息

对于任何给定文档,没有单一的正确摘要。如果没有明确的指导,Claude可能难以确定应包含哪些细节。为了获得最佳结果,请确定您希望包含在摘要中的具体信息。

例如,在总结转租协议时,您可能希望提取以下关键点:

details_to_extract = [
    '相关方(转租人、承租人和原出租人)',
    '物业详情(地址、描述和允许用途)', 
    '期限和租金(开始日期、结束日期、月租金和押金)',
    '责任(水电费、维护和修理)',
    '同意和通知(房东的同意和通知要求)',
    '特殊条款(家具、停车和转租限制)'
]

建立成功标准

评估摘要质量是一项出了名的具有挑战性的任务。与许多其他自然语言处理任务不同,摘要评估通常缺乏明确、客观的指标。这个过程可能高度主观,不同的读者重视摘要的不同方面。以下是您在评估Claude执行法律摘要的表现时可能考虑的标准。

有关更多信息,请参阅我们关于建立成功标准的指南。


如何使用Claude总结法律文档

选择合适的Claude模型

在总结法律文档时,模型准确性极为重要。Claude Sonnet 3.5是此类需要高准确性的用例的绝佳选择。如果您的文档规模和数量较大,以至于成本开始成为一个问题,您也可以尝试使用像Claude Haiku 3这样的较小模型。

为了帮助估算这些成本,以下是使用Sonnet和Haiku总结1,000份转租协议的成本比较:

  • 内容大小

    • 协议数量:1,000
    • 每份协议字符数:300,000
    • 总字符数:300M
  • 估计token数

    • 输入token:86M(假设每3.5个字符1个token)
    • 每个摘要的输出token:350
    • 总输出token:350,000
  • Claude Sonnet 4估计成本

    • 输入token成本:86 MTok * $3.00/MTok = $258
    • 输出token成本:0.35 MTok * $15.00/MTok = $5.25
    • 总成本:$258.00 + $5.25 = $263.25
  • Claude Haiku 3估计成本

    • 输入token成本:86 MTok * $0.25/MTok = $21.50
    • 输出token成本:0.35 MTok * $1.25/MTok = $0.44
    • 总成本:$21.50 + $0.44 = $21.96
实际成本可能与这些估计不同。这些估计基于提示部分中强调的示例。

将文档转换为Claude可以处理的格式

在开始总结文档之前,您需要准备数据。这涉及从PDF中提取文本,清理文本,并确保它准备好被Claude处理。

以下是在示例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])

    # 移除多余的空白
    text = re.sub(r'\s+', ' ', text) 

    # 移除页码
    text = re.sub(r'\n\s*\d+\s*\n', '\n', text) 

    return text


# 从GitHub仓库创建完整URL
url = "https://raw.githubusercontent.com/anthropics/anthropic-cookbook/main/skills/summarization/data/Sample Sublease Agreement.pdf"
url = url.replace(" ", "%20")

# 将PDF文件下载到内存中
response = requests.get(url)

# 从内存加载PDF
pdf_file = BytesIO(response.content)

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

在这个例子中,我们首先下载了一份在摘要制作指南中使用的示例转租协议的PDF。这份协议来源于sec.gov网站上公开可用的转租协议。

我们使用pypdf库提取PDF的内容并将其转换为文本。然后通过移除多余的空白和页码来清理文本数据。

构建强大的提示

Claude可以适应各种摘要风格。您可以更改提示的细节,引导Claude变得更加详细或简洁,包含更多或更少的技术术语,或提供更高或更低层次的上下文摘要。

以下是如何创建一个提示的示例,确保在分析转租协议时生成的摘要遵循一致的结构:

import anthropic

# 初始化Anthropic客户端
client = anthropic.Anthropic()

def summarize_document(text, details_to_extract, model="claude-opus-4-20250514", max_tokens=1000):

    # 格式化要提取的详细信息,以便放置在提示的上下文中
    details_to_extract_str = '\n'.join(details_to_extract)
    
    # 提示模型总结转租协议
    prompt = f"""总结以下转租协议。关注这些关键方面:

    {details_to_extract_str}

    请以项目符号形式提供摘要,嵌套在每个部分的XML标题内。例如:

    <parties involved>
    - 转租人:[姓名]
    // 根据需要添加更多详细信息
    </parties involved>
    
    如果文档中未明确说明任何信息,请注明"未指定"。不要添加前言。

    转租协议文本:
    {text}
    """

    response = client.messages.create(
        model=model,
        max_tokens=max_tokens,
        system="您是一位专门研究房地产法的法律分析师,以高度准确和详细的转租协议摘要而闻名。",
        messages=[
            {"role": "user", "content": prompt},
            {"role": "assistant", "content": "以下是转租协议的摘要:<summary>"}
        ],
        stop_sequences=["</summary>"]
    )

    return response.content[0].text

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

这段代码实现了一个summarize_document函数,使用Claude来总结转租协议的内容。该函数接受文本字符串和要提取的详细信息列表作为输入。在这个例子中,我们使用前面代码片段中定义的document_textdetails_to_extract变量调用该函数。

在函数内部,为Claude生成一个提示,包括要总结的文档、要提取的详细信息以及总结文档的具体指示。提示指示Claude以嵌套在XML标题内的每个要提取的详细信息的摘要进行响应。

因为我们决定在标签内输出摘要的每个部分,所以每个部分都可以作为后处理步骤轻松解析。这种方法可以生成结构化摘要,可以根据您的用例进行调整,以便每个摘要遵循相同的模式。

评估您的提示

提示通常需要测试和优化才能投入生产。要确定解决方案的就绪程度,请使用系统化流程结合定量和定性方法评估摘要质量。基于您定义的成功标准创建强大的实证评估将允许您优化提示。以下是您可能希望在实证评估中包含的一些指标:

部署您的提示

以下是在将解决方案部署到生产环境时需要考虑的一些额外因素。

  1. **确保无责任:**了解摘要中的错误可能导致您的组织或客户承担法律责任的法律影响。提供免责声明或法律声明,明确说明摘要是由AI生成的,应由法律专业人士审查。

  2. **处理多种文档类型:**在本指南中,我们讨论了如何从PDF中提取文本。在现实世界中,文档可能以各种格式出现(PDF、Word文档、文本文件等)。确保您的数据提取管道可以转换您预期接收的所有文件格式。

  3. **并行化对Claude的API调用:**具有大量token的长文档可能需要长达一分钟的时间让Claude生成摘要。对于大型文档集合,您可能希望并行发送API调用给Claude,以便在合理的时间内完成摘要。参考Anthropic的速率限制,确定可以并行执行的最大API调用数量。


提高性能

在复杂场景中,除了标准的提示工程技术外,考虑额外的策略来提高性能可能会有所帮助。以下是一些高级策略:

执行元摘要以总结长文档

法律摘要通常涉及处理长文档或一次处理多个相关文档,以至于超过Claude的上下文窗口。您可以使用一种称为元摘要的分块方法来处理这种用例。这种技术涉及将文档分解为更小、可管理的块,然后单独处理每个块。然后,您可以组合每个块的摘要,创建整个文档的元摘要。

以下是如何执行元摘要的示例:

import anthropic

# 初始化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-opus-4-20250514", max_tokens=1000):

    # 格式化要提取的详细信息,以便放置在提示的上下文中
    details_to_extract_str = '\n'.join(details_to_extract)

    # 迭代块并总结每一个
    chunk_summaries = [summarize_document(chunk, details_to_extract, model=model, max_tokens=max_tokens) for chunk in chunk_text(text)]
    
    final_summary_prompt = f"""
    
    您正在查看来自多个相关文档的分块摘要。
    将以下来自不同真实来源的文档摘要合并成一个连贯的整体摘要:

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

    关注这些关键方面:
    {details_to_extract_str})

    请以项目符号形式提供摘要,嵌套在每个部分的XML标题内。例如:

    <parties involved>
    - 转租人:[姓名]
    // 根据需要添加更多详细信息
    </parties involved>
    
    如果文档中未明确说明任何信息,请注明"未指定"。不要添加前言。
    """

    response = client.messages.create(
        model=model,
        max_tokens=max_tokens,
        system="您是一位总结一份文档笔记的法律专家。",
        messages=[
            {"role": "user",  "content": final_summary_prompt},
            {"role": "assistant", "content": "以下是转租协议的摘要:<summary>"}

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

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

summarize_long_document函数通过将文档分割成更小的块并单独总结每个块,构建在早期的summarize_document函数之上。

代码通过将summarize_document函数应用于原始文档中每个20,000字符的块来实现这一点。然后将各个摘要组合起来,并从这些块摘要中创建最终摘要。

请注意,对于我们的示例PDF,summarize_long_document函数并不是严格必要的,因为整个文档适合Claude的上下文窗口。然而,对于超过Claude上下文窗口的文档或当一起总结多个相关文档时,它变得至关重要。无论如何,这种元摘要技术通常能在最终摘要中捕获到早期单一摘要方法中遗漏的额外重要细节。

使用摘要索引文档探索大型文档集合

使用LLM搜索文档集合通常涉及检索增强生成(RAG)。然而,在涉及大型文档或当需要精确信息检索至关重要的情况下,基本的RAG方法可能不足够。摘要索引文档是一种高级RAG方法,提供了一种更有效的方式来对检索文档进行排名,使用比传统RAG方法更少的上下文。在这种方法中,您首先使用Claude为语料库中的每个文档生成简明摘要,然后使用Clade对每个摘要与所问查询的相关性进行排名。有关此方法的更多详细信息,包括基于代码的示例,请查看摘要制作指南中的摘要索引文档部分。

微调Claude以从您的数据集学习

提高Claude生成摘要能力的另一种高级技术是微调。微调涉及在特定符合您法律摘要需求的自定义数据集上训练Claude,确保Claude适应您的用例。以下是如何执行微调的概述:

  1. **识别错误:**首先收集Claude的摘要不足之处的实例 - 这可能包括遗漏关键法律细节、误解上下文或使用不适当的法律术语。

  2. **策划数据集:**一旦您确定了这些问题,编译这些问题示例的数据集。该数据集应包括原始法律文档以及您更正的摘要,确保Claude学习所需的行为。

  3. **执行微调:**微调涉及在您策划的数据集上重新训练模型,以调整其权重和参数。这种重新训练帮助Claude更好地理解您的法律领域的特定要求,提高其按照您的标准总结文档的能力。

  4. **迭代改进:**微调不是一次性过程。随着Claude继续生成摘要,您可以迭代地添加它表现不佳的新示例,进一步完善其能力。随着时间的推移,这种持续的反馈循环将导致一个高度专门化的模型,适用于您的法律摘要任务。

微调目前仅通过Amazon Bedrock提供。更多详细信息可在AWS发布博客中找到。