要約クックブックにアクセスして、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
  • 推定トークン数

    • 入力トークン:86M(1トークンあたり3.5文字と仮定)
    • 要約あたりの出力トークン:350
    • 合計出力トークン:350,000
  • Claude Sonnet 4の推定コスト

    • 入力トークンコスト:86 MTok * $3.00/MTok = $258
    • 出力トークンコスト:0.35 MTok * $15.00/MTok = $5.25
    • 合計コスト:$258.00 + $5.25 = $263.25
  • Claude Haiku 3の推定コスト

    • 入力トークンコスト:86 MTok * $0.25/MTok = $21.50
    • 出力トークンコスト: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>
    - 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)

このコードは、Claudeを使用して転貸借契約の内容を要約するsummarize_document関数を実装しています。この関数は、テキスト文字列と抽出する詳細のリストを入力として受け取ります。この例では、前のコードスニペットで定義したdocument_textdetails_to_extract変数を使用して関数を呼び出しています。

関数内では、要約する文書、抽出する詳細、および文書を要約するための具体的な指示を含むプロンプトがClaudeのために生成されます。プロンプトはClaudeに、抽出する各詳細の要約をXMLヘッダー内にネストして応答するよう指示しています。

各セクションの要約をタグ内に出力することにしたため、後処理のステップとして各セクションを簡単に解析できます。このアプローチにより、ユースケースに合わせて調整できる構造化された要約が可能になり、各要約が同じパターンに従うようになります。

プロンプトを評価する

プロンプト作成は、本番環境に対応するためにテストと最適化が必要なことがよくあります。ソリューションの準備状況を判断するには、定量的手法と定性的手法を組み合わせた体系的なプロセスを使用して要約の品質を評価します。定義した成功基準に基づいた強力な経験的評価を作成することで、プロンプトを最適化できます。経験的評価に含めたい指標には以下のようなものがあります:

プロンプトをデプロイする

ソリューションを本番環境にデプロイする際に念頭に置くべき追加の考慮事項を以下に示します。

  1. 責任がないことを確認する: 要約のエラーが組織やクライアントに法的責任をもたらす可能性のある法的影響を理解してください。要約はAIによって生成されており、法律の専門家によってレビューされるべきであることを明確にする免責事項や法的通知を提供してください。

  2. 多様な文書タイプを処理する: このガイドでは、PDFからテキストを抽出する方法について説明しました。実際の環境では、文書はさまざまな形式(PDF、Word文書、テキストファイルなど)で提供される場合があります。データ抽出パイプラインが受け取ると予想されるすべてのファイル形式を変換できることを確認してください。

  3. ClaudeへのAPI呼び出しを並列化する: トークン数の多い長い文書では、Claudeが要約を生成するのに最大1分かかる場合があります。大規模な文書コレクションの場合、合理的な時間枠内で要約を完了できるように、ClaudeへのAPI呼び出しを並列に送信することをお勧めします。並列に実行できるAPI呼び出しの最大数を決定するには、Anthropicのレート制限を参照してください。


パフォーマンスを向上させる

複雑なシナリオでは、標準的なプロンプトエンジニアリング技術を超えて、パフォーマンスを向上させるための追加戦略を検討すると役立つ場合があります。以下はいくつかの高度な戦略です:

メタ要約を実行して長い文書を要約する

法的要約では、長い文書や多くの関連文書を一度に処理することが多く、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>
    - Sublessor: [Name]
    // 必要に応じて詳細を追加
    </parties involved>
    
    文書に明示的に記載されていない情報がある場合は、「記載なし」と記してください。前置きは不要です。
    """

    response = client.messages.create(
        model=model,
        max_tokens=max_tokens,
        system="あなたは1つの文書に関するメモを要約する法律の専門家です。",
        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関数を拡張しています。

このコードは、元の文書内の20,000文字ごとのチャンクにsummarize_document関数を適用することでこれを実現しています。個々の要約はその後組み合わされ、これらのチャンク要約から最終的な要約が作成されます。

summarize_long_document関数は、文書全体がClaudeのコンテキストウィンドウ内に収まるため、この例のPDFには厳密には必要ありません。ただし、Claudeのコンテキストウィンドウを超える文書や、複数の関連文書を一緒に要約する場合には不可欠になります。それにもかかわらず、このメタ要約技術は、以前の単一要約アプローチでは見落とされていた最終要約に追加の重要な詳細をしばしば捉えます。

要約インデックス付き文書を使用して大規模な文書コレクションを探索する

LLMを使用した文書コレクションの検索には、通常、検索拡張生成(RAG)が含まれます。ただし、大きな文書を含むシナリオや、正確な情報検索が重要な場合、基本的なRAGアプローチでは不十分な場合があります。要約インデックス付き文書は、従来のRAG方法よりも少ないコンテキストを使用して、検索のための文書のランク付けをより効率的に行う高度なRAGアプローチです。このアプローチでは、まずClaudeを使用してコーパス内の各文書の簡潔な要約を生成し、次にCladeを使用して各要約と問い合わせの関連性をランク付けします。このアプローチの詳細については、コードベースの例を含め、要約クックブックの要約インデックス付き文書セクションをご覧ください。

データセットからの学習のためにClaudeをファインチューニングする

Claudeの要約能力を向上させるもう一つの高度な技術は、ファインチューニングです。ファインチューニングでは、Claudeを法的要約のニーズに特に合わせたカスタムデータセットでトレーニングし、ユースケースに適応させます。ファインチューニングを実行する方法の概要は以下の通りです:

  1. エラーを特定する: Claudeの要約が不足している例を収集することから始めます - これには、重要な法的詳細の欠落、文脈の誤解、または不適切な法的用語の使用が含まれる可能性があります。

  2. データセットをキュレーションする: これらの問題を特定したら、これらの問題のある例のデータセットをコンパイルします。このデータセットには、元の法的文書と修正された要約を含め、Claudeが望ましい動作を学習できるようにする必要があります。

  3. ファインチューニングを実行する: ファインチューニングでは、キュレーションされたデータセットでモデルを再トレーニングして、その重みとパラメータを調整します。この再トレーニングにより、Claudeは法的ドメインの特定の要件をよりよく理解し、基準に従って文書を要約する能力が向上します。

  4. 反復的な改善: ファインチューニングは一度きりのプロセスではありません。Claudeが引き続き要約を生成する中で、パフォーマンスが不十分だった新しい例を反復的に追加し、その能力をさらに洗練させることができます。時間が経つにつれ、この継続的なフィードバックループにより、法的要約タスクに高度に特化したモデルが得られます。

ファインチューニングは現在、Amazon Bedrockを通じてのみ利用可能です。詳細はAWSの発表ブログでご確認いただけます。