Claude Platform Docs
ベストプラクティスユースケース

法律文書の要約

このガイドでは、Claudeの高度な自然言語処理機能を使用して法律文書を効率的に要約し、重要な情報を抽出して法務リサーチを迅速化する方法を説明します。Claudeを使用すると、契約書のレビュー、訴訟準備、規制対応業務を効率化し、法務プロセスにおける時間の節約と正確性の確保を実現できます。

Claudeを使用した法律文書要約の実装例については、Claude Cookbookの要約レシピをご覧ください。

Claudeで構築する前に

法律文書の要約に、Claudeのような「large language model」(大規模言語モデル)、すなわちLLMを採用すべきであることを示す主な指標は次のとおりです。

要約で抽出したい詳細を決定する

どのような文書にも、唯一の正しい要約というものは存在しません。明確な指示がなければ、Claudeがどの詳細を含めるべきかを判断するのは難しい場合があります。最適な結果を得るには、要約に含めたい具体的な情報を特定してください。

たとえば、サブリース(転貸借)契約を要約する場合、次のような要点を抽出したいと考えるかもしれません。

details_to_extract = [
    "Parties involved (sublessor, sublessee, and original lessor)",
    "Property details (address, description, and permitted use)",
    "Term and rent (start date, end date, monthly rent, and security deposit)",
    "Responsibilities (utilities, maintenance, and repairs)",
    "Consent and notices (landlord's consent, and notice requirements)",
    "Special provisions (furniture, parking, and subletting restrictions)",
]

成功基準を確立する

要約の品質を評価することは、難しいタスクとしてよく知られています。他の多くの自然言語処理タスクとは異なり、要約の評価には明確で客観的な指標が欠けていることがよくあります。このプロセスは非常に主観的になる可能性があり、読み手によって要約のどの側面を重視するかが異なります。以下は、Claudeが法律文書の要約をどの程度うまく実行できるかを評価する際に検討するとよい基準です。

詳細については、成功基準の確立に関するガイドを参照してください。


適切なClaudeモデルを選択する

法律文書を要約する際には、モデルの精度が極めて重要です。Claude Opus 5.5は、このような高い精度が求められるユースケースに最適な選択肢です。文書のサイズや量が大きく、コストが懸念され始める場合は、Claude Haiku 5.5のようなより小さなモデルを使用してみることもできます。

これらのコストを見積もる参考として、OpusモデルとHaikuモデルを使用して1,000件のサブリース契約を要約する場合のコスト比較を以下に示します。

  • コンテンツサイズ

    • 契約書の数:1,000
    • 契約書あたりの文字数:300,000
    • 合計文字数:3億
  • 推定トークン数

    • 入力トークン:1億800万、契約書あたり約108,000(約2.8文字あたり1トークン。これは、このガイドのサンプル契約書で両モデルが示した比率です)
    • 要約あたりの出力トークン(出力として課金される思考トークンを含む):Claude Opus 5.5で約6,200、Claude Haiku 5.5で約3,100
    • 合計出力トークン:Claude Opus 5.5で620万、Claude Haiku 5.5で310万
  • Claude Opus 5.5の推定コスト

    • 入力トークンのコスト:108 MTok * $4.00/MTok = $432.00 USD
    • 出力トークンのコスト:6.2 MTok * $20.00/MTok = $124.00 USD
    • 合計コスト:$432.00 + $124.00 = $556.00 USD
  • Claude Haiku 5.5の推定コスト(100,000トークンを超えるプロンプトの料金で計算)

    • 入力トークンのコスト:108 MTok * $0.50/MTok = $54.00 USD
    • 出力トークンのコスト:3.1 MTok * $2.50/MTok = $7.75 USD
    • 合計コスト:$54.00 + $7.75 = $61.75 USD

文書を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"\n\s*\d+\s*\n", "\n", text)

    # 余分な空白を削除します
    text = re.sub(r"\s+", " ", text)

    return text


# GitHubリポジトリから完全なURLを作成します
url = "https://raw.githubusercontent.com/anthropics/claude-cookbooks/main/capabilities/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])

この例では、まずClaude Cookbookの要約レシピで使用されているサンプル転貸借契約書のPDFをダウンロードします。この契約書は、sec.govウェブサイトで公開されている転貸借契約書から取得したものです。

この例では、pypdfライブラリを使用してPDFの内容を抽出し、テキストに変換します。その後、ページ番号や余分な空白を削除してテキストデータをクリーニングします。

強力なプロンプトを構築する

Claudeはさまざまな要約スタイルに適応できます。プロンプトの詳細を変更することで、Claudeの出力をより詳細にしたり簡潔にしたり、専門用語を増やしたり減らしたり、対象となるコンテキストについてより高レベルまたは低レベルの要約を提供させたりすることができます。

サブリース契約を分析する際に、生成される要約が一貫した構造に従うようにするプロンプトの作成例を以下に示します。

# Anthropicクライアントを初期化します
client = anthropic.Anthropic()


def summarize_document(
    text, details_to_extract, model="claude-opus-5-5", max_tokens=16000
):
    # 抽出する項目をプロンプトのコンテキストに配置できるよう整形します
    details_to_extract_str = "\n".join(details_to_extract)

    # 転貸借契約書を要約するようモデルにプロンプトを送ります
    prompt = f"""Summarize the following sublease agreement. Focus on these key aspects:

    {details_to_extract_str}

    Provide the summary in bullet points nested within the XML header for each section. For example:

    <parties involved>
    - Sublessor: [Name]
    // Add more details as needed
    </parties involved>

    If any information is not explicitly stated in the document, note it as "Not specified". Do not preamble.

    Sublease agreement text:
    {text}
    """

    response = client.messages.create(
        model=model,
        max_tokens=max_tokens,
        system="You are a legal analyst specializing in real estate law, known for highly accurate and detailed summaries of sublease agreements.",
        messages=[
            {"role": "user", "content": prompt},
        ],
    )

    return next(block.text for block in response.content if block.type == "text")


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

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

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

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

プロンプトを評価する

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

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

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

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

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

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


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

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

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

法律文書の要約では、長い文書や多数の関連文書を一度に扱うことが多く、Claudeの「context window」(コンテキストウィンドウ)を超えてしまうことがあります。このユースケースに対応するには、メタ要約(meta-summarization)と呼ばれるチャンク分割手法を使用できます。この手法では、文書をより小さく扱いやすいチャンクに分割し、各チャンクを個別に処理します。その後、各チャンクの要約を組み合わせて、文書全体のメタ要約を作成できます。

メタ要約の実行例を以下に示します。

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-5-5", max_tokens=16000
):
    # 抽出する項目をプロンプトのコンテキストに配置できるよう整形します
    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"""

    You are looking at the chunked summaries of multiple documents that are all related.
    Combine the following summaries of the document from different truthful sources into a coherent overall summary:

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

    Focus on these key aspects:
    {details_to_extract_str}

    Provide the summary in bullet points nested within the XML header for each section. For example:

    <parties involved>
    - Sublessor: [Name]
    // Add more details as needed
    </parties involved>

    If any information is not explicitly stated in the document, note it as "Not specified". Do not preamble.
    """

    response = client.messages.create(
        model=model,
        max_tokens=max_tokens,
        system="You are a legal expert that summarizes notes on one document.",
        messages=[
            {"role": "user", "content": final_summary_prompt},
        ],
    )

    return next(block.text for block in response.content if block.type == "text")


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

summarize_long_document()関数は、前述のsummarize_document()関数を基に、文書を小さなチャンクに分割して各チャンクを個別に要約します。

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

なお、サンプルのPDFでは文書全体がClaudeのコンテキストウィンドウに収まるため、summarize_long_document()関数は厳密には必要ありません。しかし、Claudeのコンテキストウィンドウを超える文書や、複数の関連文書をまとめて要約する場合には不可欠になります。いずれにしても、このメタ要約の手法では、前述の単一要約のアプローチでは見落とされていた重要な詳細が、最終的な要約に追加で含まれることがよくあります。

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

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

Claudeをファインチューニングしてデータセットから学習させる

Claudeの要約生成能力を向上させるもう1つの高度な手法が「fine-tuning」(ファインチューニング)です。ファインチューニングでは、法律文書要約のニーズに特化したカスタムデータセットでClaudeをトレーニングし、Claudeがユースケースに適応するようにします。ファインチューニングの実行方法の概要は次のとおりです。

  1. エラーを特定する: まず、Claudeの要約が不十分な事例を収集します。これには、重要な法的詳細の欠落、文脈の誤解、不適切な法律用語の使用などが含まれる可能性があります。

  2. データセットを整備する: これらの問題を特定したら、問題のある事例のデータセットを作成します。このデータセットには、元の法律文書と修正した要約を含め、Claudeが望ましい動作を学習できるようにする必要があります。

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

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

Claudeを使用して契約書を要約する方法について、完全に実装されたコードベースの例をご覧ください。

情報の正確性と説明可能性を確保する方法についてのガイダンスは、引用レシピをご覧ください。

このページは役に立ちましたか?