Webプレイグラウンドはデモには最適です。テキストを貼り付け、モデルがきれいな要約を生成するのを見て、タブを閉じる。しかし、それはエンジニアリングではありません。本番環境での作業には、API、エラーハンドリング、そして自分が眠っている間も動き続けるコードが必要です。会議の文字起こし、サポートチケット、研究論文などをスケジュールに従って処理する必要があるなら、パイプラインが必要です。

このガイドでは、まさにそれ、つまり Python、AWS SDK for Python (boto3)、および Amazon Bedrock を使用した、軽量で自動化されたドキュメント要約スクリプトの構築方法を詳しく説明します。テキスト要約タスクにおいて、スピードとコストのバランスが非常に優れたモデルである Anthropic の Claude 3 Haiku を使用します。

Why Bedrock and Claude 3 Haiku?

Amazon Bedrock は、単一の AWS API セットを通じて基盤モデルを提供するマネージドサービスです。外部のエンドポイントを個別に組み合わせたり、個別の請求やセキュリティモデルに苦労したりする代わりに、標準的な IAM コントロールを使用して AWS エンドポイントを呼び出すことができます。データは AWS 環境内に保持されます。

Claude 3 Haiku は、Anthropic の Claude 3 ファミリーの中で最も軽量なモデルです。レスポンスの速さと低コストを実現するように設計されており、単純な読解タスクに対して大規模なモデルのパワーにコストを支払うことなく、予測可能な出力を求める大量の要約処理に最適です。

What You Need

コードを書く前に、以下の準備ができていることを確認してください。

  • 有効な AWS アカウント。
  • ローカルにインストールされた Python 3.9 以上。
  • Bedrock モデルを呼び出す権限を持つ認証情報で設定された AWS CLI。まだ aws configure を実行していない場合は、今すぐ実行してください。後で権限エラーが発生した場合は、IAM ユーザーまたはロールに適切な Bedrock 呼び出し権限を付与する必要がある可能性があります。
  • AWS Bedrock コンソール内で、Anthropic Claude 3 Haiku に対して明示的にモデルアクセスを有効にしていること。AWS では、モデルを呼び出す前に、各モデルプロバイダーに対して明示的にオプトインする必要があります。

Step 1: Enable Model Access

Bedrock では、デフォルトのままではモデルを呼び出すことができません。まず、コンソールで設定を切り替える必要があります。

  1. AWS マネジメントコンソールにログインします。
  2. 検索バーを使用して Amazon Bedrock を検索します。
  3. 左側のナビゲーションパネルで、Model access を選択します。
  4. Modify model access をクリックします。
  5. Anthropic (Claude 3 Haiku) のボックスにチェックを入れ、リクエストを送信します。

ステータスが「Access granted」に変われば、コードからモデルを呼び出す準備は完了です。

Step 2: Set Up Your Environment

クリーンな Python 環境を使用することで、依存関係を分離し、再現性を保つことができます。ターミナルを開き、以下のコマンドを実行してください。

mkdir bedrock-summarizer && cd bedrock-summarizer
python3 -m venv venv
source venv/bin/activate
pip install boto3

Windows ユーザーは、アクティベーションコマンドを venv\Scripts\activate に置き換えてください。pip install boto3 が完了すれば、AWS API と通信するために必要なものはすべて揃います。

Step 3: Write the Script

summarize.py という名前のファイルを作成します。目標は、ディスクからドキュメントを読み込み、それを Bedrock Converse API に渡し、簡潔な要約を出力することです。

以下は、そのまま動作する完全な実装例です。Converse API を使用している理由は、モデルプロバイダーごとに異なる生の JSON フォーマットを抽象化してくれるためです。メッセージのリストと推論設定を渡すだけで済みます。

import boto3

def summarize_document(text: str) -> str:
    client = boto3.client("bedrock-runtime")
    
    model_id = "anthropic.claude-3-haiku-20240307-v1:0"
    
    messages = [
        {
            "role": "user",
            "content": [
                {
                    "text": (
                        "Provide a concise summary of the following document. "
                        "Focus on the main points and avoid unnecessary detail:\n\n"
                        f"{text}"
                    )
                }
            ]
        }
    ]
    
    response = client.converse(
        modelId=model_id,
        messages=messages,
        inferenceConfig={
            "temperature": 0.3,
            "maxTokens": 512
        }
    )
    
    summary = response["output"]["message"]["content"][0]["text"]
    return summary.strip()


if __name__ == "__main__":
    with open("document.txt", "r", encoding="utf-8") as f:
        document_text = f.read()
    
    result = summarize_document(document_text)
    print("\n--- Summary ---\n")
    print(result)

ここで強調しておくべき、いくつかの実用的な詳細事項があります。

  • boto3.client("bedrock-runtime") は、推論を処理するランタイムエンドポイントを対象としています。~/.aws/config の AWS リージョンが Bedrock をサポートしており、同じリージョンで Haiku を有効にしていることを確認してください。
  • Model ID anthropic.claude-3-haiku-20240307-v1:0 は、Bedrock が期待する正確な識別子です。正確にコピーしてください。
  • Temperature を 0.3 に設定することで、出力を根拠に基づいたものに保ちます。要約の場合、創造的な装飾ではなく、一貫性と原文への忠実さが求められます。Temperature を 1.0 に近づけると、モデルは言い回しに自由を加え始め、時として詳細を捏造することがあります。
  • プロンプト自体も具体的です。「これを要約して」といった曖昧な指示で生のテキストをモデルに投げ込むのではなく、主要なポイントを明示的に求め、余計な部分は省くように指示しています。このような明確さが、使い物にならない出力と、実際に製品に組み込める出力の差を生みます。

要約したいテキストファイルを同じディレクトリに配置し、名前を document.txt にしてください。

Step 4: Run It

仮想環境を有効にした状態で、以下を実行します。

python summarize.py

認証情報とモデルアクセスが正しければ、数秒以内にターミナルに整った要約が表示されるはずです。アクセスエラーが発生した場合は、IAM 権限を再確認し、コンソールで Claude 3 Haiku を有効にしたことを確認してください。

Pushing Beyond the Script

このパイプラインは意図的にシンプルに設計されていますが、これは真の自動化に向けた基礎となるものです。余計な複雑さを加えることなく、どのように拡張できるかを以下に示します。

バッチ処理。 単一ファイルの読み込みを、ディレクトリに対するループ処理に置き換えます。50個のPDFやテキストファイルをインプットフォルダに入れ、それらを順次処理して、要約をアウトプットフォルダに書き込みます。PDFを直接取り込みたい場合は、Bedrockに渡す前にPyPDF2やpdfplumberのようなライブラリを使用して、生のテキストを抽出する前処理ステップが必要になります。

チャンキング戦略。 非常に長いドキュメントは、モデルのコンテキスト制限を超える可能性があります。その場合は、段落やセクションごとにテキストを論理的なチャンクに分割し、各チャンクを個別に要約します。その後、中間要約をモデルに再度渡して最終的な統合を行います。この2段階のアプローチにより、ドキュメント全体の網羅性を維持しながら、トークン制限内に収めることができます。

エラーハンドリング。 本番環境のコードでは、特に boto3.exceptions.ClientError をキャッチするようにすべきです。APIをあまりに頻繁に呼び出すと、AWSによってリクエストがスロットリング(制限)されることがあります。converse の呼び出しを指数バックオフ(exponential backoff)を伴うリトライループでラップするか、tenacity のようなライブラリを使用してレート制限を適切に処理してください。

プロンプトエンジニアリング。 平凡な要約と有用な要約の違いは、多くの場合プロンプトにかかっています。スキャンしやすさが必要な場合は、箇条書きを求めます。対象が経営層である場合は、1段落のエグゼクティブサマリーを求めます。さらに、「要約を3文以内に制限してください」や「topic、key_points、action_itemsのキーを持つJSON形式で出力してください」といったフォーマットの制約を渡すことも可能です。

本質的なポイント

チャットのプレイグラウンドから実用的なスクリプトへと移行することは、AIがインフラへと変わる転換点です。このパイプラインがローカルで動作するようになれば、S3へのアップロードをトリガーとするAWS Lambda関数に移行したり、ECS Fargateでスケジュール実行したり、既存のデータワークフローに組み込んだりすることができます。APIの呼び出し自体は簡単な部分です。エンジニアリングとしての価値は、ファイル、エラー、フォーマットを処理するロジックでその呼び出しを包み込み、テキストをブラウザにコピー&ペーストする必要が二度とないようにすることにあります。

このセットアップに関する詳細な背景やバリエーションについては、Dev.toの元の解説をご覧ください。AWSアーキテクチャ、LLMパイプライン、またはプロンプトエンジニアリングについて開発者コミュニティと議論したい場合は、GyaanSetu AI on Telegram で会話に参加してください。