PDFに質問しよう1 ~ 全体の流れ (前編: PDF Upload & Embedding) | SkillhubAI(スキルハブエーアイ)

PDFに質問しよう1 ~ 全体の流れ (前編: PDF Upload & Embedding)

PDFに質問してみよう

突然ですが、長い論文とか会社の決算説明資料とか読むの面倒ですよね?論文は英語のものが多いし、決算説明会資料とかはどうでもいい内容もとても多いです。

ということでPDFをアップロードしてAIに読ませた上で、その内容を質問できるAIアプリを作ってみましょう。「この100ページのPDFで、売上いくらって書いてある?」って聞いたら、AIが「45億円です」って答えてくれる。そんな夢のようなアプリを作っていきます!

今回のアプリは少し複雑です。でも大丈夫、一緒にゆっくり進めていきましょう。この章ではPDF Uploadの部分(赤線の流れ)を作り、次の章でQ&Aの部分を作ります。

システム全体の流れ(図をイメージしてください)

【PDF Upload フロー(今回作る部分)】
あなた
  ↓ PDFファイルをアップロード
Streamlit(Webアプリの画面)
  ↓ PDFからテキストを抽出
PyPDF2(PDF読み取りツール)
  ↓ 長い文章を適切な長さに分割
テキスト分割処理
  ↓ 文章を数値(ベクトル)に変換
OpenAI Embeddings API
  ↓ 数値化されたデータを保存
Qdrant Vectorstore(ベクトルDB)

【Q&A フロー(次回作る部分)】
ユーザー
  ↓ 質問を入力
Streamlit
  ↓ 質問をベクトル化
OpenAI Embeddings API
  ↓ 似た文書を検索
Qdrant Vectorstore
  ↓ 関連文書を取得してプロンプト作成
ChatGPT API
  ↓ 回答生成
画面に表示

この章で学ぶこと

今回は初心者の方でも必ず理解できるように、以下のことを一つずつ丁寧に学んでいきます:

  • Streamlitでページの切り替えをする方法を知る(複数画面のアプリが作れるようになります!)
  • Streamlitのファイルアップローダーの使い方をマスターする
  • PDFからテキストを取り出す方法を理解する(PyPDF2の使い方)
  • 長いテキストを適切に分割する理由と方法を学ぶ
  • OpenAI APIを直接使ってEmbeddingを作る方法を習得する
  • Qdrantというベクトルデータベースの基本を理解する

PDFに質問できる仕組み

ChatGPTに読ませて質問をする、と書きました。でも実はChatGPTは最初からあなたのPDFの内容を知りません。2023年10月までのデータで学習されているので、最近の出来事や、あなたが今アップロードするPDFの内容は知らないんです。

じゃあどうするか?ここがこのアプリのミソです。PDFの内容を事前にデータベースに保存しておいて、質問されたときに関連する部分だけを取り出してChatGPTに教えてあげるんです。まるで、カンニングペーパーを渡してテストを受けさせるような感じですね(笑)。

準備フェーズ:PDF Upload(今回作る部分)の詳細

  1. PDFをアップロード - あなたがPDFファイルを選んでアップロードします
  2. テキスト抽出 - PDFの中身(文字)を全部取り出します
  3. チャンク分割 - 長〜い文章を、適切な長さの塊(チャンク)に分けます
  4. Embedding作成 - 各チャンクを数値の列(ベクトル)に変換します
  5. DB保存 - 変換したベクトルをデータベースに保存します

語彙の補足(初心者向けに超わかりやすく説明)

せっかくなので、難しそうな用語を先に説明しておきますね。

Embedding(エンベディング)って何? 文章を数値の列に変換したものです。例えば「犬」という言葉を [0.1, 0.8, -0.3, ...] みたいな1536個の数字に変換します。すごいのは、似た意味の言葉は似た数字になること!「犬」と「猫」の数字は近くて、「犬」と「飛行機」の数字は遠くなるんです。まるで言葉に座標を与えるような感じですね。

Vectorstore(ベクトルストア)/ベクトルDBって何? Embeddingを保存して、似ているものを素早く探せる特殊なデータベースです。普通のデータベースが「名前」とか「住所」を保存するのに対して、ベクトルDBは「数値の列」を保存して、「これに似たやつある?」って検索できるんです。すごく便利!

チャンクって何? 長い文章を適切な長さに切り分けた塊のことです。100ページの本を丸ごと覚えるより、1ページずつ覚える方が楽ですよね?AIも同じなんです。

質問応答フェーズ:Q&A(次章で作る部分)の詳細

  1. 質問入力 - 「売上はいくら?」みたいな質問を入力
  2. 質問のベクトル化 - 質問文もEmbeddingに変換
  3. 類似検索 - 質問に似た内容のチャンクをDBから探す
  4. プロンプト作成 - 見つけた情報をChatGPTへの指示文に組み込む
  5. 回答生成 - ChatGPTが答えを作成
  6. 表示 - 画面に答えを表示

10ステップもあるんですが、これでも内容を端折っています。大変ですね。でも大丈夫、一つずつ理解していけば必ずできるようになります!

セマンティック検索とプロンプトについて

セマンティック検索というのは、単純なキーワード検索じゃなくて、意味で検索する技術です。例えば「車」で検索したら「自動車」「クルマ」「乗用車」も見つかる、みたいな感じです。これがEmbeddingの力なんです。

プロンプトはChatGPTへの指示文です。こんな感じで組み立てます:

以下の前提知識を用いて、ユーザーからの質問に答えてください。

==========
前提知識
・{PDFから取ってきた関連情報1}
・{PDFから取ってきた関連情報2}
・{PDFから取ってきた関連情報3}

==========
ユーザーからの質問
・{ユーザーが入力した質問}

例えば、大谷翔平選手の成績についてのPDFがあったとして:

前提知識
・大谷翔平選手の2023年6月23日時点のHR数は24本です
・大谷翔平選手の2023年6月23日時点の勝利数は6です

ユーザーからの質問
・大谷選手の成績を教えてください

回答
→ 大谷翔平選手は野手として24本のホームランを記録しており、
  投手としては6勝をあげています

こんな感じで、PDFの情報を使って答えを作るんです。賢いですよね!

必要な準備をしよう

さて、実際に手を動かしていきましょう。まずは必要なツールをインストールします。

ツールのインストール

ターミナル(Windowsの方はコマンドプロンプト、Macの方はターミナル)を開いて、以下のコマンドを実行してください:

pip install streamlit PyPDF2 openai qdrant-client tiktoken

各ツールの役割を説明しますね:

  • streamlit: Webアプリを超簡単に作れる魔法のようなツール。HTMLとか知らなくても大丈夫!
  • PyPDF2: PDFファイルを読んでテキストを取り出してくれるツール
  • openai: ChatGPTやEmbedding APIと通信するためのツール
  • qdrant-client: ベクトルデータベースを操作するツール
  • tiktoken: 文章の長さを正確に測る定規みたいなツール

OpenAI APIキーの取得

ChatGPTを使うには「APIキー」という鍵が必要です。これは有料サービスですが、今回のような実験なら数十円程度で済みます。

取得方法: 1. https://platform.openai.com にアクセス 2. アカウントを作成(無料でできます) 3. 左側のメニューから「API Keys」を選択 4. 「Create new secret key」ボタンをクリック 5. 表示されるsk-...で始まる長い文字列をコピー

⚠️ 重要な注意: このAPIキーは絶対に他人に教えないでください!GitHubにアップロードするのもダメです。お金がかかっちゃいます。