Claudeを使用した法的要約の実装例については、要約クックブックをご覧ください。

Claudeで構築する前に

法的要約にClaudeを使用するかどうかを決定する

法的文書の要約にClaudeのようなLLMを採用すべき主要な指標をいくつか示します:
大規模な文書レビューは、手動で行うと時間がかかり、費用も高くなります。Claudeは膨大な量の法的文書を迅速に処理・要約でき、文書レビューに関連する時間とコストを大幅に削減できます。この機能は、デューデリジェンス、契約分析、訴訟ディスカバリーなど、効率性が重要なタスクで特に価値があります。
Claudeは、関係者、日付、契約条件、特定の条項など、法的文書から重要なメタデータを効率的に抽出・分類できます。この自動抽出により情報の整理が可能になり、大規模な文書セットの検索、分析、管理が容易になります。契約管理、コンプライアンスチェック、法的情報の検索可能なデータベース作成に特に有用です。
Claudeは、事前に決められた形式に従った構造化された要約を生成でき、法務専門家が様々な文書の要点を素早く把握しやすくします。これらの標準化された要約は、読みやすさを向上させ、文書間の比較を促進し、特に複雑な法的言語や専門用語を扱う際の全体的な理解を向上させます。
法的要約を作成する際、信頼性を確保し法的基準に準拠するために、適切な帰属と引用が重要です。Claudeは、参照されるすべての法的ポイントに対して正確な引用を含むようプロンプトでき、法務専門家が要約された情報をレビュー・検証しやすくします。
Claudeは、大量の判例法、法令、法的解説を迅速に分析することで法的調査を支援できます。関連する先例を特定し、重要な法的原則を抽出し、複雑な法的論証を要約できます。この機能により調査プロセスを大幅に高速化でき、法務専門家がより高次の分析と戦略開発に集中できるようになります。

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

どの文書にも単一の正しい要約は存在しません。明確な指示がなければ、Claudeがどの詳細を含めるべきかを判断するのは困難です。最適な結果を得るために、要約に含めたい具体的な情報を特定してください。 例えば、転貸契約を要約する際は、以下の重要なポイントを抽出したいかもしれません:
details_to_extract = [
    '関係者(転貸人、転借人、元の賃貸人)',
    '物件詳細(住所、説明、許可された用途)', 
    '期間と賃料(開始日、終了日、月額賃料、敷金)',
    '責任(光熱費、保守、修理)',
    '同意と通知(家主の同意、通知要件)',
    '特別条項(家具、駐車場、転貸制限)'
]

成功基準を確立する

要約の品質を評価することは、非常に困難なタスクとして知られています。他の多くの自然言語処理タスクとは異なり、要約の評価には明確で客観的な指標が欠けることが多いです。このプロセスは非常に主観的で、読者によって要約の異なる側面を重視します。Claudeが法的要約をどの程度うまく実行するかを評価する際に考慮したい基準をいくつか示します。
要約は、文書内の事実、法的概念、重要なポイントを正確に表現する必要があります。
用語や法令、判例法、規制への言及は正確で、法的基準に合致している必要があります。
要約は、重要な詳細を失うことなく、法的文書をその本質的なポイントに凝縮する必要があります。
複数の文書を要約する場合、LLMは各要約に対して一貫した構造とアプローチを維持する必要があります。
テキストは明確で理解しやすい必要があります。対象読者が法務専門家でない場合、要約には読者を混乱させる可能性のある法的専門用語を含めるべきではありません。
要約は、法的論証と立場の偏りのない公正な描写を提示する必要があります。
詳細については、成功基準の確立に関するガイドをご覧ください。

Claudeを使用して法的文書を要約する方法

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

法的文書を要約する際、モデルの精度は極めて重要です。Claude Sonnet 3.5(非推奨)は、高い精度が要求されるこのようなユースケースに優れた選択肢です。文書のサイズと量が大きく、コストが懸念事項になり始める場合は、Claude Haiku 3のような小さなモデルを試すこともできます。 これらのコストを見積もるために、SonnetとHaikuの両方を使用して1,000件の転貸契約を要約するコストの比較を以下に示します:
  • コンテンツサイズ
    • 契約数:1,000
    • 契約あたりの文字数:300,000
    • 総文字数:300M
  • 推定トークン数
    • 入力トークン:86M(3.5文字あたり1トークンと仮定)
    • 要約あたりの出力トークン:350
    • 総出力トークン:350,000
  • Claude Sonnet 4.5推定コスト
    • 入力トークンコスト: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-sonnet-4-5", max_tokens=1000):

    # 抽出する詳細をプロンプトのコンテキスト内に配置するためにフォーマット
    details_to_extract_str = '\n'.join(details_to_extract)
    
    # モデルに転貸契約を要約するようプロンプト
    prompt = f"""以下の転貸契約を要約してください。これらの重要な側面に焦点を当ててください:

    {details_to_extract_str}

    各セクションのXMLヘッダー内にネストされた箇条書きで要約を提供してください。例:

    <関係者>
    - 転貸人:[名前]
    // 必要に応じてさらに詳細を追加
    </関係者>
    
    文書に明示的に記載されていない情報がある場合は、「記載なし」と記載してください。前置きは不要です。

    転貸契約テキスト:
    {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のプロンプトが生成されます。プロンプトは、XMLヘッダー内にネストされた各抽出詳細の要約で応答するようClaudeに指示します。 要約の各セクションをタグ内に出力することにしたため、各セクションは後処理ステップとして簡単に解析できます。このアプローチにより、各要約が同じパターンに従うように、ユースケースに適応できる構造化された要約が可能になります。

プロンプトを評価する

プロンプト作成は、本番環境に対応するためにテストと最適化が必要なことが多いです。ソリューションの準備状況を判断するために、定量的および定性的手法を組み合わせた体系的なプロセスを使用して要約の品質を評価してください。定義された成功基準に基づいて強力な実証的評価を作成することで、プロンプトを最適化できます。実証的評価に含めたい指標をいくつか示します:
これは、生成された要約と専門家が作成した参照要約との重複を測定します。この指標は主に再現率に焦点を当て、コンテンツカバレッジの評価に有用です。
元々機械翻訳用に開発されましたが、この指標は要約タスクに適応できます。BLEUスコアは、生成された要約と参照要約間のn-gramマッチの精度を測定します。スコアが高いほど、生成された要約が参照要約と類似したフレーズと用語を含んでいることを示します。
この指標は、生成された要約と参照要約の両方のベクトル表現(埋め込み)を作成することを含みます。これらの埋め込み間の類似度が計算され、多くの場合コサイン類似度が使用されます。類似度スコアが高いほど、生成された要約が、正確な文言が異なっていても、参照要約の意味的意味と文脈を捉えていることを示します。
この方法は、ClaudeのようなLLMを使用して、採点ルーブリックに対して生成された要約の品質を評価することを含みます。ルーブリックは特定のニーズに合わせて調整でき、精度、完全性、一貫性などの重要な要因を評価します。LLMベースの採点の実装に関するガイダンスについては、これらのヒントをご覧ください。
参照要約の作成に加えて、法務専門家は生成された要約の品質も評価できます。これは大規模では高価で時間がかかりますが、本番環境にデプロイする前の健全性チェックとして、いくつかの要約で行われることが多いです。

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

ソリューションを本番環境にデプロイする際に留意すべき追加の考慮事項をいくつか示します。
  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-sonnet-4-5", 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ヘッダー内にネストされた箇条書きで要約を提供してください。例:

    <関係者>
    - 転貸人:[名前]
    // 必要に応じてさらに詳細を追加
    </関係者>
    
    文書に明示的に記載されていない情報がある場合は、「記載なし」と記載してください。前置きは不要です。
    """

    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関数を基に構築されています。 コードは、元の文書内の20,000文字の各チャンクにsummarize_document関数を適用することでこれを実現します。個別の要約が結合され、これらのチャンク要約から最終要約が作成されます。 summarize_long_document関数は、文書全体がClaudeのコンテキストウィンドウ内に収まるため、サンプルPDFには厳密には必要ではないことに注意してください。ただし、Claudeのコンテキストウィンドウを超える文書や、複数の関連文書を一緒に要約する際には不可欠になります。それでも、このメタ要約技術は、以前の単一要約アプローチで見逃された追加の重要な詳細を最終要約で捉えることが多いです。

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

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

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

Claudeの要約生成能力を向上させるもう一つの高度な技術は、ファインチューニングです。ファインチューニングは、法的要約のニーズに特化して調整されたカスタムデータセットでClaudeを訓練し、Claudeがユースケースに適応することを保証することを含みます。ファインチューニングの実行方法の概要を以下に示します:
  1. エラーを特定する: Claudeの要約が不十分な事例を収集することから始めます - これには、重要な法的詳細の欠落、文脈の誤解、不適切な法的用語の使用が含まれる可能性があります。
  2. データセットをキュレートする: これらの問題を特定したら、これらの問題のある例のデータセットをコンパイルします。このデータセットには、元の法的文書と修正された要約を含め、Claudeが望ましい行動を学習することを保証する必要があります。
  3. ファインチューニングを実行する: ファインチューニングは、キュレートされたデータセットでモデルを再訓練して、その重みとパラメータを調整することを含みます。この再訓練により、Claudeは法的ドメインの特定の要件をよりよく理解し、基準に従って文書を要約する能力を向上させます。
  4. 反復的改善: ファインチューニングは一回限りのプロセスではありません。Claudeが要約を生成し続ける中で、パフォーマンスが低下した新しい例を反復的に追加し、その能力をさらに洗練させることができます。時間の経過とともに、この継続的なフィードバックループにより、法的要約タスクに高度に特化したモデルが生まれます。
ファインチューニングは現在Amazon Bedrockを通じてのみ利用可能です。詳細はAWSローンチブログで確認できます。