访问我们的 总结指南 查看使用 Claude 进行法律总结的示例实现。

在使用 Claude 之前

决定是否使用 Claude 进行法律总结

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

确定您希望总结提取的细节

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

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

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

建立成功标准

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

查看我们关于建立成功标准的指南以获取更多信息。


如何使用 Claude 总结法律文件

选择合适的 Claude 模型

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

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

  • 内容大小

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

    • 输入令牌:86M(假设每 3.5 个字符 1 个令牌)
    • 每个总结的输出令牌:350
    • 总输出令牌:350,000
  • Claude 3.7 Sonnet 估计成本

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

    • 输入令牌成本:86 MTok * 0.25/MTok=0.25/MTok = 21.50
    • 输出令牌成本:0.35 MTok * 1.25/MTok=1.25/MTok = 0.44
    • 总成本:21.50+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-3-7-sonnet-20250219", 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 调用:**具有大量令牌的长文档可能需要长达一分钟的时间让 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-3-7-sonnet-20250219", 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 发布博客

Was this page helpful?