Claudeを使用した法的文書要約の実装例については、要約クックブックをご覧ください。
法的文書の要約にClaudeのような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 Opus 5は、このような高い精度が求められるユースケースに最適な選択肢です。文書のサイズや数量が大きく、コストが懸念され始める場合は、Claude Haiku 4.5のようなより小さいモデルを試すこともできます。
これらのコストを見積もるために、OpusモデルとHaikuモデルを使用して1,000件の転貸借契約書を要約するコストの比較を以下に示します。
コンテンツサイズ
推定トークン数
Claude Opus 5の推定コスト
Claude Opus 4.8の推定コスト
Claude Haiku 4.5の推定コスト
文書の要約を開始する前に、データを準備する必要があります。これには、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])この例では、まず要約クックブックで使用されているサンプルの転貸借契約書のPDFをダウンロードします。この契約書は、sec.govウェブサイトで公開されている転貸借契約書から取得したものです。
この例では、pypdfライブラリを使用してPDFの内容を抽出し、テキストに変換します。その後、ページ番号と余分な空白を削除してテキストデータをクリーニングします。
Claudeはさまざまな要約スタイルに適応できます。プロンプトの詳細を変更することで、Claudeをより詳細または簡潔にしたり、専門用語を多くまたは少なく含めたり、対象のコンテキストについてより高レベルまたは低レベルの要約を提供するように誘導できます。
転貸借契約書を分析する際に、生成される要約が一貫した構造に従うようにするプロンプトの作成例を以下に示します。
# Anthropicクライアントを初期化します
client = anthropic.Anthropic()
def summarize_document(
text, details_to_extract, model="claude-opus-5", max_tokens=1000
):
# 抽出する項目をプロンプトのコンテキストに含める形式に整形します
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に指示します。
コードは要約の各セクションをタグ内に出力するため、後処理ステップとして各セクションを簡単に解析できます。このアプローチにより、ユースケースに合わせて調整できる構造化された要約が可能になり、各要約が同じパターンに従うようになります。
プロンプトを本番環境で使用できるようにするには、多くの場合、テストと最適化が必要です。ソリューションの準備状況を判断するには、定量的手法と定性的手法を組み合わせた体系的なプロセスを使用して、要約の品質を評価します。定義した成功基準に基づいて強力な実証的評価を作成することで、プロンプトを最適化できます。実証的評価に含めることを検討すべき指標を以下に示します。
ソリューションを本番環境にデプロイする際に留意すべき追加の考慮事項を以下に示します。
法的責任がないことを確認する: 要約の誤りが組織やクライアントに法的責任をもたらす可能性があるため、その法的影響を理解してください。要約がAIによって生成されたものであり、法律専門家によるレビューが必要であることを明確にする免責事項や法的通知を提供してください。
多様な文書タイプに対応する: このガイドでは、PDFからテキストを抽出する方法について説明しています。実際には、文書はさまざまな形式(PDF、Word文書、テキストファイルなど)で提供される可能性があります。データ抽出パイプラインが、受け取ることが予想されるすべてのファイル形式を変換できることを確認してください。
ClaudeへのAPI呼び出しを並列化する: トークン数が多い長い文書の場合、Claudeが要約を生成するのに最大1分かかることがあります。大規模な文書コレクションの場合、妥当な時間内に要約を完了できるよう、ClaudeへのAPI呼び出しを並列で送信することを検討してください。並列で実行できるAPI呼び出しの最大数を判断するには、Anthropicのレート制限を参照してください。
複雑なシナリオでは、標準的なプロンプトエンジニアリング手法を超えて、パフォーマンスを向上させるための追加の戦略を検討することが有用な場合があります。高度な戦略をいくつか紹介します。
法的要約では、Claudeのコンテキストウィンドウを超えるような長い文書や多数の関連文書を一度に扱うことがよくあります。このユースケースに対応するには、メタ要約と呼ばれるチャンキング手法を使用できます。この手法では、文書をより小さく管理しやすいチャンクに分割し、各チャンクを個別に処理します。その後、各チャンクの要約を組み合わせて、文書全体のメタ要約を作成できます。
メタ要約の実行例を以下に示します。
# 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-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"""
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の要約生成能力を向上させるもう1つの高度な手法は、「fine-tuning」(ファインチューニング)です。ファインチューニングでは、法的要約のニーズに特化したカスタムデータセットでClaudeをトレーニングし、Claudeがユースケースに適応するようにします。ファインチューニングの実行方法の概要を以下に示します。
エラーを特定する: まず、Claudeの要約が不十分な事例を収集します。これには、重要な法的詳細の欠落、コンテキストの誤解、不適切な法律用語の使用などが含まれます。
データセットをキュレーションする: これらの問題を特定したら、これらの問題のある例のデータセットをまとめます。このデータセットには、元の法的文書と修正済みの要約を含め、Claudeが望ましい動作を学習できるようにします。
ファインチューニングを実行する: ファインチューニングでは、キュレーションされたデータセットでモデルを再トレーニングし、その重みとパラメータを調整します。この再トレーニングにより、Claudeは法的ドメインの特定の要件によりよく適応し、基準に従って文書を要約する能力が向上します。
反復的な改善: ファインチューニングは一度きりのプロセスではありません。Claudeが要約を生成し続ける中で、パフォーマンスが不十分だった新しい例を反復的に追加し、その能力をさらに洗練させることができます。時間の経過とともに、この継続的なフィードバックループにより、法的要約タスクに高度に特化したモデルが得られます。
Claudeを使用して契約書を要約する方法の完全に実装されたコードベースの例をご覧ください。
情報の正確性と説明可能性を確保する方法のガイダンスについては、引用クックブックのレシピをご覧ください。
Was this page helpful?