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(今回作る部分)の詳細
- PDFをアップロード - あなたがPDFファイルを選んでアップロードします
- テキスト抽出 - PDFの中身(文字)を全部取り出します
- チャンク分割 - 長〜い文章を、適切な長さの塊(チャンク)に分けます
- Embedding作成 - 各チャンクを数値の列(ベクトル)に変換します
- DB保存 - 変換したベクトルをデータベースに保存します
語彙の補足(初心者向けに超わかりやすく説明)
せっかくなので、難しそうな用語を先に説明しておきますね。
Embedding(エンベディング)って何? 文章を数値の列に変換したものです。例えば「犬」という言葉を [0.1, 0.8, -0.3, ...] みたいな1536個の数字に変換します。すごいのは、似た意味の言葉は似た数字になること!「犬」と「猫」の数字は近くて、「犬」と「飛行機」の数字は遠くなるんです。まるで言葉に座標を与えるような感じですね。
Vectorstore(ベクトルストア)/ベクトルDBって何? Embeddingを保存して、似ているものを素早く探せる特殊なデータベースです。普通のデータベースが「名前」とか「住所」を保存するのに対して、ベクトルDBは「数値の列」を保存して、「これに似たやつある?」って検索できるんです。すごく便利!
チャンクって何? 長い文章を適切な長さに切り分けた塊のことです。100ページの本を丸ごと覚えるより、1ページずつ覚える方が楽ですよね?AIも同じなんです。
質問応答フェーズ:Q&A(次章で作る部分)の詳細
- 質問入力 - 「売上はいくら?」みたいな質問を入力
- 質問のベクトル化 - 質問文もEmbeddingに変換
- 類似検索 - 質問に似た内容のチャンクをDBから探す
- プロンプト作成 - 見つけた情報をChatGPTへの指示文に組み込む
- 回答生成 - ChatGPTが答えを作成
- 表示 - 画面に答えを表示
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にアップロードするのもダメです。お金がかかっちゃいます。