コンテンツにスキップ

前処理パイプライン

文書がアップロードされると、Type Detection Lambdaがファイルタイプを検出し、必要な前処理タスクをSQSキューを通じて非同期で分配します。前処理が完了すると、Step Functionsワークフローが結果をマージしてAI分析ステージに渡します。

S3 Upload
↓ [EventBridge]
Type Detection Lambda
├─ OCR Queue → PaddleOCR (Lambda/SageMaker)
├─ BDA Queue → Bedrock Data Automation
├─ Transcribe Queue → AWS Transcribe
├─ WebCrawler Queue → Bedrock Agent Core
└─ Workflow Queue → Step Functions
├─ Segment Prep(セグメント作成)
├─ Check Preprocess Status(ポーリング)
├─ Format Parser(テキスト抽出)
├─ Segment Builder(結果マージ)
└─ → AI Analysis Pipeline

AI分析パイプライン(Segment Analyzer、Document Summarizer)の詳細はAI Analysis Pipelineを参照してください。


ファイルタイプ別前処理ルーティング

Section titled “ファイルタイプ別前処理ルーティング”
ファイルタイプ拡張子OCRBDATranscribeFormat ParserWebCrawler
PDF.pdfOO-A-
画像.png .jpg .jpeg .gif .tiff .tif .webpOO---
映像.mp4 .mov .avi .mkv .webm-OO--
音声.mp3 .wav .flac .m4a-OO--
Word文書.docx .doc---A-
プレゼンテーション.pptx .ppt---A-
スプレッドシート.xlsx .xls .csv---A-
テキスト.txt .md---A-
ウェブ.webreq----A
CAD.dxf---A-
  • A(Automatic):デフォルトで有効(自動実行)
  • O(Optional):文書アップロード時にユーザーが選択的に有効化
  • -:該当なし

OCR(use_ocr)、BDA(use_bda)、Transcribe(use_transcribe)はすべて文書アップロード時にユーザーが選択的に有効化できます。


PDFと画像からテキストを抽出します。Lambda(CPU)またはSageMaker(GPU)のデュアルバックエンドをサポートします。

項目
対象PDF、画像(DXF除外)
Lambdaモデルpp-ocrv5pp-structurev3(CPU)
SageMakerモデルpaddleocr-vl(GPU)
出力paddleocr/result.json(ページごとのテキスト + ブロック座標)

プロジェクトの言語設定に応じてOCR言語が自動マッピングされます(韓国語 → korean、日本語 → japan など)。

詳細はPaddleOCR on SageMakerを参照してください。

AWS Bedrock Data Automationを使用して文書構造(テーブル、レイアウト、画像)をマークダウン形式で分析します。映像の場合はチャプター分割と要約を実行します。

項目
対象PDF、画像、映像、音声(オフィス文書/スプレッドシート/DXF/ウェブ除外)
有効化use_bda=true(文書アップロード時に選択)
出力bda-output/(マークダウン、画像、メタデータ)

音声および映像ファイルから音声をテキストに変換します。タイムコード付きのセグメント単位トランスクリプトを生成します。

項目
対象映像(MP4、MOV、AVI、MKV、WebM)、音声(MP3、WAV、FLAC、M4A)
有効化use_transcribe=true(文書アップロード時に選択)
出力transcribe/{workflow_id}-{timestamp}.json

ファイルタイプに応じてさまざまなライブラリを使用してテキストを抽出します。Step Functionsワークフロー内で同期的に実行されます。

ファイルタイプライブラリ動作
PDFpypdfページごとのテキストレイヤー抽出(グラフィックストリッピング)
DOCX/DOCLibreOffice → pypdf + pypdfium2PDF変換後、ページごとのテキスト + PNG画像生成
PPTX/PPTpython-pptx + LibreOffice → pypdfium2スライドごとのテキスト + PNG画像生成
XLSXopenpyxlシートごとのマークダウンテーブル変換
XLSxlrdシートごとのマークダウンテーブル変換
CSVcsv(stdlib)単一シートのマークダウンテーブル変換
TXT/MD直接読み取りチャンク分割(15,000文字、500文字オーバーラップ)
DXFezdxf + matplotlibレイアウトごとのテキスト抽出 + PNGレンダリング

出力:format-parser/result.json

Bedrock Agent Coreベースのウェブクローリングエージェントが.webreqファイルに指定されたURLをクロールします。

項目
対象.webreqファイル
入力JSON({"url": "...", "instruction": "..."}
出力webcrawler/pages/page_XXXX.json(マルチページ)またはwebcrawler/content.md(レガシー)

PDFアップロード
Type Detection
├─ OCR Queue → PaddleOCR → paddleocr/result.json(ページごとのテキスト、オプション)
├─ BDA Queue → BDA → bda-output/(マークダウン、オプション)
└─ Workflow Queue → Step Functions
├─ Segment Prep:ページごとにPNGレンダリング(pypdfium2、150 DPI)
├─ Check Preprocess Status:OCR/BDA完了ポーリング
├─ Format Parser:pypdfでテキストレイヤー抽出
└─ Segment Builder:OCR + BDA + Format Parserをマージ
項目
セグメントタイプPAGE(ページごとに1つ)
セグメント数PDFページ数
画像ページごとのPNG(preprocessed/page_XXXX.png
自動前処理Format Parser
オプション前処理OCR、BDA
画像アップロード(PNG、JPG、TIFFなど)
Type Detection
├─ OCR Queue → PaddleOCR → paddleocr/result.json(単一テキスト、オプション)
├─ BDA Queue → BDA → bda-output/(マークダウン、オプション)
└─ Workflow Queue → Step Functions
├─ Segment Prep:元画像を使用(コピーなし)
├─ Check Preprocess Status:OCR/BDA完了ポーリング
└─ Segment Builder:OCR + BDAをマージ
項目
セグメントタイプPAGE(1つ)
セグメント数1
画像元ファイルURIを直接使用
オプション前処理OCR、BDA
映像アップロード
Type Detection
├─ BDA Queue → BDA → チャプター分割 + 要約(オプション)
├─ Transcribe Queue → AWS Transcribe → トランスクリプト(オプション)
└─ Workflow Queue → Step Functions
├─ Segment Prep:VIDEOセグメント1つ作成
├─ Check Preprocess Status:BDA/Transcribe完了ポーリング
└─ Segment Builder:BDAチャプター + Transcribeをマージ
項目
セグメントタイプVIDEO(BDA未使用時)またはCHAPTER(BDAチャプター分割時)
セグメント数1(BDA未使用)またはチャプター数(BDA使用)
画像なし
オプション前処理BDA、Transcribe
音声アップロード
Type Detection
├─ BDA Queue → BDA(オプション)
├─ Transcribe Queue → AWS Transcribe → トランスクリプト(オプション)
└─ Workflow Queue → Step Functions
├─ Segment Prep:AUDIOセグメント1つ作成
├─ Check Preprocess Status:BDA/Transcribe完了ポーリング
└─ Segment Builder:Transcribe結果をマージ
項目
セグメントタイプAUDIO
セグメント数1
画像なし
オプション前処理BDA、Transcribe
DOCX/DOCアップロード
Type Detection
└─ Workflow Queue → Step Functions
├─ Segment Prep:プレースホルダー1つ作成
├─ Format Parser:LibreOfficeでPDF変換 → ページごとのテキスト + PNG
└─ Segment Builder:Format Parser結果でセグメントを上書き
項目
セグメントタイプPAGE(ページごとに1つ)
セグメント数LibreOffice変換後のPDFページ数
画像ページごとのPNG(format-parser/slides/slide_XXXX.pngpreprocessed/page_XXXX.png
自動前処理Format Parser
非同期前処理なし(すべての前処理スキップ)
PPTX/PPTアップロード
Type Detection
└─ Workflow Queue → Step Functions
├─ Segment Prep:プレースホルダー1つ作成
├─ Format Parser:python-pptxテキスト + LibreOffice PDF変換 → PNG
└─ Segment Builder:Format Parser結果でセグメントを上書き
項目
セグメントタイプPAGE(スライドごとに1つ)
セグメント数スライド数
画像スライドごとのPNG(format-parser/slides/slide_XXXX.pngpreprocessed/page_XXXX.png
自動前処理Format Parser
テキスト抽出スライドテキスト + テーブル + スピーカーノート

スプレッドシート(XLSX/XLS/CSV)

Section titled “スプレッドシート(XLSX/XLS/CSV)”
XLSX/XLS/CSVアップロード
Type Detection
└─ Workflow Queue → Step Functions
├─ Segment Prep:プレースホルダー1つ作成
├─ Format Parser:シートごとのマークダウンテーブル変換
└─ Segment Builder:Format Parser結果でセグメントを上書き
項目
セグメントタイプTEXT(シートごとに1つ)
セグメント数シート数(CSVは1つ)
画像なし
自動前処理Format Parser
出力形式マークダウンテーブル(## Sheet: {name}\n| col1 | col2 |...
TXT/MDアップロード
Type Detection
└─ Workflow Queue → Step Functions
├─ Segment Prep:プレースホルダー1つ作成
├─ Format Parser:テキスト読み取り → チャンク分割
└─ Segment Builder:Format Parser結果でセグメントを上書き
項目
セグメントタイプTEXT(チャンクごとに1つ)
セグメント数テキスト長に応じて自動決定
画像なし
自動前処理Format Parser
チャンク設定15,000文字単位、500文字オーバーラップ、文境界優先
.webreqファイルアップロード({"url": "...", "instruction": "..."})
Type Detection
├─ WebCrawler Queue → Bedrock Agent Core → ウェブクローリング
└─ Workflow Queue → Step Functions
├─ Segment Prep:WEBプレースホルダー1つ作成
├─ Check Preprocess Status:WebCrawler完了ポーリング
└─ Segment Builder:WebCrawler結果でセグメントを上書き
項目
セグメントタイプWEB(ページごとに1つ)
セグメント数クロールされたページ数
画像なし
自動前処理WebCrawler
出力フィールドwebcrawler_contentsource_urlpage_title
DXFファイルアップロード
Type Detection
└─ Workflow Queue → Step Functions
├─ Segment Prep:プレースホルダー1つ作成
├─ Format Parser:ezdxfテキスト抽出 + matplotlib PNGレンダリング
└─ Segment Builder:Format Parser結果でセグメントを上書き
項目
セグメントタイプPAGE(レイアウトごとに1つ)
セグメント数DXFレイアウト数(Model Space + Paper Space)
画像レイアウトごとのPNG(format-parser/slides/layout_XXXX.png
自動前処理Format Parser
抽出エンティティTEXT、MTEXT、ATTRIB、DIMENSION + レイヤー/ブロックメタデータ

Segment Builderはすべての前処理結果を単一セグメントJSONにマージします。

1. ベース構造:Segment Prep(preprocessor/metadata.json)
2. OCR結果マージ:paddleocr/result.json → paddleocr、paddleocr_blocks
3. BDA結果マージ:bda-output/ → bda_indexer、bda_image_uri
4. Format Parserマージ:format-parser/result.json → format_parser、image_uri
5. Transcribeマージ:transcribe/*.json → transcribe、transcribe_segments
6. WebCrawlerマージ:webcrawler/pages/*.json → webcrawler_content、source_url

セグメント数はファイルタイプに応じて異なるソースから決定されます:

ファイルタイプセグメント数決定ソース
PDFSegment Prep(PDFページ数)
画像Segment Prep(常に1)
DOCX/DOC、PPTX/PPT、DXFFormat Parser(変換後のページ/スライド/レイアウト数)
XLSX/XLS/CSVFormat Parser(シート数)
TXT/MDFormat Parser(チャンク数)
映像Segment Prep(1)またはBDA(チャプター数)
音声Segment Prep(常に1)
ウェブWebCrawler(クロールページ数)

Segment Prepでプレースホルダーを作成した後、Segment Builderが実際の結果に基づいてセグメント数を調整し、total_segmentsを更新します。


s3://bucket/projects/{project_id}/documents/{document_id}/
├─ {original_file} # 元のアップロードファイル
├─ preprocessed/
│ ├─ metadata.json # Segment Prepメタデータ
│ ├─ page_0000.png # ページ画像(PDF、DOCX、PPTX、DXF)
│ ├─ page_0001.png
│ └─ ...
├─ paddleocr/
│ └─ result.json # OCR結果(ページごとのテキスト + ブロック)
├─ bda-output/
│ └─ {job_id}/
│ ├─ job_metadata.json # BDAジョブメタデータ
│ ├─ standard_output/
│ │ ├─ 0/result.json # BDA分析結果(マークダウン)
│ │ └─ 0/assets/ # BDA抽出画像
│ └─ ...
├─ format-parser/
│ ├─ result.json # テキスト抽出結果
│ └─ slides/ # PPTX/DOCX/DXF画像
│ ├─ slide_0000.png
│ └─ ...
├─ transcribe/
│ └─ {workflow_id}-{timestamp}.json # Transcribe結果
├─ webcrawler/
│ ├─ metadata.json # クローリングメタデータ
│ └─ pages/
│ ├─ page_0000.json # クロールページコンテンツ
│ └─ ...
└─ analysis/
├─ segment_0000.json # マージされたセグメントデータ
├─ segment_0001.json
└─ ...

前処理ステータスはDynamoDBワークフローレコードのpreprocessフィールドで管理されます。

{
"preprocess": {
"ocr": {"required": true, "status": "completed"},
"bda": {"required": false, "status": "skipped"},
"transcribe": {"required": false, "status": "skipped"},
"webcrawler": {"required": false, "status": "skipped"}
}
}

Step FunctionsワークフローのCheckPreprocessStatus Lambdaが定期的にポーリングして、すべての必須前処理が完了したかを確認します。すべての必須前処理がcompletedまたはskippedステータスになると、次のステージ(Format Parser → Segment Builder)に進みます。