← レッスンに戻る
第8章 · 実践プロジェクト

ドキュメント要約ツール

Document Summarizer · 約 12 分

重要キーワード

English日本語説明
Map-Reduce マップリデュース 分割→部分処理→集約 の汎用パターン
Chunk チャンク 長文を分割した単位
Long Context ロングコンテキスト 1M トークンなど巨大な入力を直接渡す方式

ドキュメント要約ツール

PDF / Markdown / テキストを要約するツール。

設計

  1. ユーザーがファイルアップロード。
  2. テキスト抽出 (pdfplumber / python-docx)。
  3. 長すぎれば チャンク分割 → 個別要約 → メタ要約
  4. 結果を Markdown で返す。

簡易実装

def summarize(text: str, style: str = "bullet") -> str:
    prompt = f'''
次の文書を {style} 形式で日本語要約してください。

<doc>
{text}
</doc>

出力フォーマット:
<summary>
{{...}}
</summary>
'''
    res = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=1024,
        messages=[{"role": "user", "content": prompt}],
    )
    return res.content[0].text

長文対策: Map-Reduce

def chunk_text(text: str, max_chars: int = 4000) -> list[str]:
    paragraphs = text.split("\n\n")
    chunks, current = [], ""
    for p in paragraphs:
        if len(current) + len(p) > max_chars:
            chunks.append(current)
            current = p
        else:
            current += "\n\n" + p
    if current:
        chunks.append(current)
    return chunks

def map_reduce_summary(chunks: list[str]) -> str:
    partials = [summarize(c, style="bullet") for c in chunks]
    combined = "\n\n".join(f"## チャンク{i}\n{p}" for i, p in enumerate(partials))
    return summarize(combined, style="overview")

Long Context で一発

Claude 4 系は 200K〜1M トークンなので、チャンク分割せず一発で渡す のも有効。 コスト・精度のトレードオフで選びます:

Map-Reduce Long Context
精度 やや低下 (情報落ちあり) 高い (全体把握)
コスト 並列分散しやすい 入力トークンが大きい
Cache 効きにくい system に置けば効く

Cache を効かせる

社内ガイドライン的な system prompt は固定して cache_control を付ける。 ファイル本体は user メッセージで送る。

長文をテンプレ化して system に置くなら 24h TTL も検討。

スタイル別プロンプト

system に切り替え可能なテンプレを集約しておくと UI 実装が楽。

引用付き要約

第 4 章で扱った Citations を組み合わせると、要約に出典付きで返せます。 法務・医療・コンプラ系では必須。

試す

要約スタイルの違いを観察。

▶ 同じ文書を 3 スタイルで
次の文書を「経営者向け 3 行」「技術者向け 5 行 bullet」「学術抄録風 100 字」の 3 スタイルで要約してください。 文書: 大規模言語モデル (LLM) は近年、自然言語処理の幅広いタスクで目覚ましい成果を上げている。とくに数百億〜数兆パラメータ規模のモデルは、文脈理解・推論・コード生成などにおいて専門家レベルに迫る性能を示し、教育・医療・ソフトウェア工学・科学研究などで導入が進んでいる。一方で、ハルシネーション・公平性・電力消費・安全性といった課題も存在し、評価指標の整備や規制動向に注目が集まっている。

演習問題

演習 1: Map-Reduce 要約スクリプト

ローカルの長い Markdown ファイル (5000 字以上) を Map-Reduce で要約するスクリプトを書いてください。

  • 4000 字ずつチャンク分割
  • 各チャンクを並列に要約 (concurrent.futures)
  • 統合要約
  • 全体トークン消費を表示
スタータープロンプト:
Python スクリプトを書いてください。
1. argv[1] から Markdown ファイル読み込み
2. 4000 字ずつチャンク分割 (パラグラフ境界で切る)
3. concurrent.futures.ThreadPoolExecutor で並列に Claude に要約依頼
4. 部分要約を結合して再度 Claude に最終要約させる
5. 出力 + 各リクエストの input/output トークン合計を表示
anthropic SDK で claude-sonnet-4-6。完全コードを示してください。
ヒントを見る

並列度を上げすぎるとレートリミットに当たります。max_workers=5 程度から試しましょう。Cache を効かせるなら system に「あなたは要約のプロです」+ cache_control を。

理解度チェック

  1. 極めて長文を扱うときの古典的手法は?
    1. Map-Reduce 要約
    2. ランダムサンプリングのみ
    3. 1 文字ずつ送る
    4. 全部削除する
  2. system に固定情報を置いてキャッシュする利点は?
    1. 繰り返し問い合わせ時のコスト削減
    2. GPU を温存できる
    3. ユーザー認証が不要に
    4. UI が綺麗になる
  3. PDF からテキスト抽出に使える Python ライブラリは?
    1. pdfplumber
    2. tensorflow
    3. matplotlib
    4. scrapy
  4. Long Context の利点として **不適切** なのは?
    1. 全体把握しやすい
    2. コンテキスト分割の手間がない
    3. 並列分散しやすい
    4. 情報落ちが少ない
解答と解説を見る
  1. A — チャンク要約 → 統合要約 (Map-Reduce) が定番です。
  2. A — Prompt caching で大幅な入力コスト削減になります。
  3. A — pdfplumber は表抽出にも強い PDF パーサです。
  4. C — 並列分散は Map-Reduce の利点。Long Context は単一コンテキストです。