請訪問我們的摘要指南,查看使用 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.5 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-5-sonnet-20241022", max_tokens=1000):

    # 格式化要提取的細節以放入提示的上下文中
    details_to_extract_str = '\n'.join(details_to_extract)
    
    # 提示模型總結轉租協議
    prompt = f"""總結以下轉租協議。關注這些關鍵方面:

    {details_to_extract_str}

    在每個部分的 XML 標頭內以項目符號提供摘要。例如:

    <parties involved>
    - Sublessor: [Name]
    // 根據需要添加更多細節
    </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-5-sonnet-20241022", 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>
    - Sublessor: [Name]
    // 根據需要添加更多細節
    </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 發布博客