12
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RAGで使用するPDFの前処理を検証(PDF→マークダウン形式)

Posted at

内容

Amazon Bedrockを使用したRAGシステムを構築します。ベクトルDBに情報を保存する際、事前に適切な形へチャンク分割を行い、回答精度を高めたいと思います。下記の記事ではHTMLファイルの前処理の検証について記載しましたが、今回はPDFファイルの前処理について記載をします。

仕組み

まず、サンプル用のPDFファイルを準備します。このPDFファイルをPythonのPdfReaderでページ毎に読み込んでテキスト情報を取得します。取得したテキスト情報をAmazon Bedrockに送信後、整形処理の依頼を行います。この際、マークダウン形式での出力指示を行い、出力結果としてマークダウン形式のファイルを作成します。

rag50.png

実行

まず、サンプル用のPDFファイルを準備します。下記のファイルをダウンロードしてsample.pdfという名前に変更後、下記プログラムと同じディレクトリに保存します。

下記が整形処理用のプログラムになります。まずsampl.pdfを読み込んで各ページのテキストを抽出します。

import json
from pypdf import PdfReader
import boto3

bedrock = boto3.client('bedrock-runtime')

reader = PdfReader("sample.pdf")
texts = []

for i, page in enumerate(reader.pages):
    page_text = page.extract_text(extraction_mode="layout", layout_mode_space_vertically=False)
    texts.append(page_text)

Bedrockに問い合わせるためのプロンプトを定義します。

def create_qa_payload(text):
    return {
        "messages": [
            {
                "role": "user",
                "content": (
                    "以下の入力テキストをMarkdown形式に整形してください。\n"
                    "- 出力に```markdown```などのコードブロックの記述は含めないでください。\n"
                    "- 整形されたMarkdown以外の出力(例: 承知しました、見出しの例など)は含めないでください。"
                    )
            },
            {"role": "user", "content": text}
        ],
        "anthropic_version": "bedrock-2023-05-31",
        "max_tokens": 4096
    }

各頁のテキストの整形処理を行います。テキスト情報からプロンプトを作成してBedrockに送信後、整形結果を取得します。

concatenated_text = ""

for text in texts:
    payload = create_qa_payload(text)
    
    response = bedrock.invoke_model(
        modelId="anthropic.claude-3-haiku-20240307-v1:0",
        body=json.dumps(payload),
        contentType="application/json",
        accept="application/json"
    )

    result = json.loads(response['body'].read())

    print(json.dumps(result, indent=4))
    formatted_text = result['content'][0]['text'] if 'content' in result and len(result['content']) > 0 else 'No content found'

整形結果を一つの文字列に結合後、output.mdファイルを作成します。

    concatenated_text += formatted_text + "\n"

output_file_path = "output.md"
with open(output_file_path, "w", encoding="utf-8") as f:
    f.write(concatenated_text)

print("Result saved locally to:", output_file_path)

作成されたマークダウン形式のファイルoutput.mdの出力結果の一部を記載します。

output.md
# AWSの利点

- 間違った物理機器を買ってしまい怒られるのを回避

## AWSの特徴

- AWS責任共有モデル
- AWSグローバルインフラストラクチャ
- ビルディングブロック
# 前回のお話の簡単なおさらい

- AWS責任共有モデル
  - AWSと顧客がクラウド環境を利用する上での責任区分が定義されています。
  - ハードウェアはAWSの責任範囲ですが、データやアプリケーションは顧客の責任範囲です。
# 前回のお話の簡単なおさらい

- AWSグローバルインフラストラクチャ
  - 世界各地にリージョンとAZがあり、顧客は色々な地域のデータセンターを直ぐに利用することが出来ます。
# 前回のお話の簡単なおさらい

- ビルディングブロック
  - 様々なマネージドサービスが提供されており、
  - 顧客はサービスを組合せることによりシステムを構築します。
# AWSの特徴と利点

## AWSの特徴

- 責任共有モデル
- AWSグローバルインフラストラクチャ
- ビルディングブロック

## AWSの利点

- アジリティ
- 可用性の向上
- 運用費用の削減
# オンプレでシステムを構築する際の流れ

1. ハードウェア調達
2. 設置・ケーブリング
3. OSインストール
4. アプリインストール

このうち、AWS側でやってくれる部分は以下となります。

12
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?